Featured

11 Tutorial untuk Beginners Arduino

Jika anda baru bermula hendak berjinak-jinak bermula dengan Arduino, Tutorial kami ini telah di-design khas untuk golongan yang betul-betul baru bermula.

Tutorial ini telah di-design dengan berpegang pada prinsip:
“Copy, Paste dan Fahami Setiap Baris Coding”

Selepas melihat hasil Output dari Coding, cuba fahami setiap Line-Coding dalam sketch dan cuba hadam untuk pemahaman.

Pastikan anda dapat kenal pasti 3 Komponen Penting dalam Coding:

  • Coding yang mempunyai Maklumat-Data-Input
  • Coding yang memberi Arahan-Output
  • Coding yang memproses melalui condition

Kepentingan 3 Komponen Penting ini, anda dapat fahami dari Blog post link dibawah:

Coding Arduino 101

BAGAIMANA MENDAPATKAN KOMPONEN-KOMPONEN YANG DIPERLUKAN UNTUK TUTORIAL INI?

Semua komponen yang diperlukan untuk setiap tutorial telah disenaraikan dibahagian awal setiap Tutorial.

Anda boleh juga mendapatkan setiap komponen secara berasingan dari mana-mana pengedar/penjual komponen Arduino,
dan juga anda boleh terus membuat pembelian dari WebStore MatGyver.my di URL berikut:

Kedai Hobby MatGyver

 ATAU,

Anda boleh terus mendapatkan kit MGDiy Duino ‘A’ Starter Kit yang mengandungi semua komponen yang diperlukan untuk 11 Aktiviti Tutorial di bawah, dan harganya adalah lebih rendah berbanding dengan membeli semua komponen secara berasingan.

Kit ini boleh didapati di URL berikut:
MGDiy Duino ‘A’ Starter Kit
(atau klik pada gambar untuk terus ke WebStore)

1132549

Selamat Memulakan Perjalanan Arduino anda!

LANGKAH PERTAMA DENGAN ARDUINO

Tutorial ini membantu anda untuk menyalakan Arduino anda buat pertama kali. Antara perkara penting yang difokuskan adalah memastikan Serial Monitor berfungsi dengan baik, iaitu fungsi paling penting untuk Troubleshoot hampir semua Coding/Sketch Arduino.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

cover-photo

TUTORIAL #1: DIGITAL OUTPUT DENGAN LED

LED merupakan kaedah termudah untuk pelajari kaedah kawalan. Pelajari bagaimana mengawal LED On dan Off dari Tutorial pertama ini. Operasi On dan Off adalah asas kepada Digital Output Arduino.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

cover-photo-tutorial1

TUTORIAL #2: TRAFFIC LIGHT!

Dalam Tutorial ini, anda  akan pelajari bagaimana menggunakan Fungsi “Delay” iaitu fungsi asas timer yang pasti akan digunakan dalam hampir semua projek-projek anda. Asas kepada Traffic Light hanyalah penggunaan “Timer” atau “Delay” untuk memberi tempoh “ON” dan juga tempoh “OFF” bagi setiap LED.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

T2 - Diagram 1

TUTORIAL #3: DIGITAL INPUT DENGAN PUSH BUTTON

Asas signal Input kepada Arduino adalah Digital Input. Kaedah termudah memberi Input Digital kepada Arduino adalah melalui Push Button (butang).
Teruskan untuk mempelajari bagaimana menggunakan butang untuk projek-projek anda.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

digital-input-cf1

TUTORIAL #4: DIGITAL INPUT ADVANCE

Push Button atau Butang, tidak hanya memberi Input untuk On dan Off-kan LED, malah, dengan Arduino, anda dapat programkan aktiviti-aktiviti kompleks yang anda mahu Arduino laksanakan apabila sesuatu butang ditekan.

Dalam Tutorial ini, anda akan mula pelajari menggunakan While() Loop.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

Digital Input Advance-CF

TUTORIAL #5: DIGITAL INPUT BUTANG DAN OPERASI MATEMATIK

Antara aktiviti kompleks yang boleh dilaksanakan oleh Arduino adalah Operasi Matematik. Operasi Matematik memang satu-satunya kaedah untuk memproses maklumat dalam Arduino, seperti memproses maklumat dan signal yang diperoleh dari Sensor.

Malah, Teknologi Automasi Robotik dan Permesinan hanyalah Formula Matematik sahaja.

Dalam Tutorial ini, penggunaan Operasi Matematik digabungkan dengan penggunaan Push Button.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

Digital Input Matematik - CF

TUTORIAL #6: ANALOG INPUT DENGAN POTENTIOMETER

Potentiometer adalah Perintang-Boleh-Laras yang boleh memberikan nilai rintangan yang berbeza-beza mengikut pusingan. Secara tak langsung, ia boleh menjadi Sensor putaran yang mengesan kadar/darjah pusingan sesuatu Mekanisma.

Cara membaca input dari Potentiometer adalah berlainan dari Digital Input, dan ia dapat memaparkan nilai-nilai nombor bagi setiap pusingan.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

CF - Analog Input

TUTORIAL #7: FUNGSI MAPPING DAN ANALOG INPUT

Data yang diterima dari Sensor Analog seperti Potentiometer adalah suatu nilai dari 0~1024. Nilai ini dapat diproses dan dipermudahkan lagi dengan menggunakan Fungsi-Mapping.

Kami yakin, anda pasti akan memerlukan Fungsi-Mapping dalam hampir semua projek DIY anda.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

T7 CF - Fungsi Mapping

TUTORIAL #8: TERANG MALAP LED DENGAN PWM OUTPUT

PWM Output juga dikenali sebagai satu bentuk Analog OUTPUT.
PWM Output mampu memberikan Output yang dapat divariasikan untuk menerangkan LED atau applikasi lain, juga untuk memalapkan LED pada kadar yang anda mahukan.

PWM Output juga, merupakan asas kepada kawalan Laju/Perlahan DC Motor..

Dalam Tutorial ini, anda akan menterjemahkan pusingan Potentiometer untuk mengawal kadar PWM output bagi mengawal Terang-Malap LED secara manual.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

CF - PWM Output

TUTORIAL #9: AUTO TERANG/MALAP LED DAN FOR LOOP()

Salam satu kaedah memberikan Automasi pada project anda, adalah dengan menggunakan For() Loop. For() Loop dapat mengulang sesuatu aktiviti sebanyak mana kali yang telah kita tetapkan dalam Coding/Program.

Dalam Tutorial ini, For() Loop akan digunakan untuk mengawal Terang/Malap LED secara Automatik.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

AUTO PWM - CF

TUTORIAL #10: KAWALAN SERVO DENGAN SERVO.H LIBRARY

Bermain dengan lampu dan LED sahaja memang membosankan. Tambahkan aktiviti-aktiviti dan proses pergerakan pada projek-projek anda dengan komponen mudah seperti Servo ini. Servo adalah komponen yang paling Universal yang dapat digunakan dalam pelbagai applikasi seperti membuka selak pintu, dan macam-macam lagi pergerakan robotik.

Kawalan Servo ini tidak boleh menggunakan fungsi PWM Arduino. Ia perlu dikawal dengan sejenis bentuk PWM yang lain, yang mengawal Pulse pada peringkat Microsecond.

Kawalan ini, telah dipermudahkan oleh pihak Arduino dengan Library Servo.h
(klik gambar atau tajuk untuk terus pada Tutorial ini)

KAWALAN SERVO - CF

TUTORIAL #11: KAWALAN DC MOTOR DENGAN MODULE L298N

DC Motor tidak boleh dikawal secara direct melalui Output Pin Arduino. Potensi Motor untuk menarik current (Amp) yang tinggi dapat merosakkan chip processor Atmel Arduino.

Motor harus dikawal melalui IC-chip atau Transistor Amplifier.
Module L298N adalah Module Kawalan Motor yang termudah untuk mengawak motor-motor kecil.
(klik gambar atau tajuk untuk terus pada Tutorial ini)

KAWALAN DC MOTOR - CF
Featured

Coding Arduino 101 – Untuk Beginners

Kaedah yang betul untuk mempelajari Coding Arduino adalah dengan MEMAHAMI Struktur Asas penulisan Coding, dan MEMAHAMI maksud setiap Syntax coding.

Copy/Paste sahaja coding dari Internet/Google adalah sangat tidak efektif bila kita tidak mempunyai basic pemahaman dalam coding Arduino. Masalah akan berlaku apabila kita hendak mengubah code dari Internet kepada bentuk yang kita mahukan.

Dalam artikel ini, anda akan mempelajari asas memahami coding dalam Arduino. Artikel ini mengandungi beberapa bahasa yang advance yang menyentuh bab coding, yang telah ditulis sebagai reference untuk beginners sahaja, bagi individu yang ingin cuba memahami coding Arduino

TIPS PENTING BELAJAR CODING:
Kenalpasti 3 Kategori Coding yang mempunyai
1. Data-INPUT
2. Arahan-OUTPUT
3. Pemprosesan-Data.

Teruskan baca artikel untuk mengenalpasti.

Lain Board, Lain Coding?

arduino-comparison

Kaedah Coding untuk semua Arduino board adalah sama. Coding yang digunakan untuk Arduino UNO, boleh dipakai terus pada board-board lain seperti MEGA , NANO dan lain-lain. Cuma pemilihan BOARD dan COM Port perlu betul dalam Arduino IDE.

Apa yang perlu di ubah adalah penggunaan Nombor Pin sahaja, kerana lain board mempunyai Konfigurasi Pin berlainan. Diperingkat lebih advance, apabila anda mula menggunakan Input/Output Communication Peripherals lain seperti, I2C, SPI, Serial, ada kemungkinan sambungan komunikasi mereka berbeza.

3 Perkara Pertama Beginners Perlu Tahu!

  • ‘SKETCH’
  • ‘//’ NOTA
  • ‘{‘  ‘}’ SEMI-COLON

Pastikan anda mengetahui dengan terperinci mengenai 3 perkara ini sebelum advance lebih lanjut, ikuti artikel di bawah:

Sertai Kursus Pemantapan Asas Arduino anjuran MatGyver untuk boost pembelajaran dan pemahaman Arduino!

Struktur Asas Coding Arduino IDE

Individu yang mempunyai asas coding seperti Java, HTML, CSS dan juga asas C++, coding Arduino akan menjadi mudah sebab korang memahami Struktur Coding.

Bagi beginners pula, contoh sketch dalam artikel di atas
(3 Perkara Asas…) mungkin nampak kompleks. Namun hakikatnya, itulah antara coding paling ringkas dalam Arduino, lagi-lagi apabila dibuang semua Nota-Nota Kaki dalam coding tersebut, dan ia jadi ringkas seperti berikut:

void setup() {
 pinMode(2, OUTPUT);                     
}
void loop() {
 digitalWrite(2, HIGH); 
 delay(1000);              
 digitalWrite(2, LOW); 
 delay(1000);                                
}

Coding di atas adalah asas untuk mengelipkan satu lampu LED yang disambungkan pada Pin 2 Arduino.

Kawasan Coding dalam Arduino IDE boleh dibahagikan kepada 4 bahagian seperti berikut:

Void Setup() dan Void Loop() merupakan  2 komponen utama dalam struktur coding. IDE tidak dapat upload program dalam Arduino jika 2 komponen ini tiada.

Defining Area dan Sub-Routine Area hanya merupakan kawasan untuk coding-coding supportif dan tambahan pada penggunaan-penggunaan yang lebih advance. Terutamanya bila anda mula menggunakan Library Arduino.

Anda boleh perhatikan code mengelip lampu LED di atas, hanya mempunyai code dalam Void Setup() dan juga Void Loop(). Jika anda perhatikan betul-betul, anda juga dapat lihat, sebenarnya Void Loop() yang mengandungi Coding Utama untuk mengerlipkan LED tersebut.


(Rujuk coding penuh di bawah yang mempunyai Nota-nota Kaki untuk setiap fungsi coding)

//CONTOH: KELIPKAN LED PADA PIN 2 ARDUINO//
//coding berikut adalah untuk mengelipkan LED yang disambungkan pada pin 2
//arduino anda
//Anda boleh gunakan coding ini untuk mana-mana projek anda
//cuma pastikan anda 'TAG' kami iaitu MatGyver.my apabila
//anda 'SHARE' projek anda

void setup() {
// Setup Code di sini hanya akan berjalan sekali sahaja
pinMode(2, OUTPUT); // Declare pin 2 sebagai digital output
                    // LED disambungkan pada pin 2
}

void loop() {
// Di sini biasanya adalah code utama projek
// Code dalam void loop() akan di-loop secara infiniti

digitalWrite(2, HIGH); //digital output HIGH = 5V pada LED (ON)
delay(1000); //loop tunggu 1000 millisaat = 1s
             //bermaksud signal LED ON selama 1s
digitalWrite(2, LOW); //digital output LOW = 0V pada LED (OFF)
delay(1000); //loop tunggu 1000 millisaat = 1s
             //bermaksud signal LED OFF selama 1s   
}

Bagaimana Arduino “SCAN” Coding untuk di-Laksanakan

Berdasarkan 4 Struktur Coding yang dijalankan di atas, kita analisa, bagaimana Arduino membaca semua code yang anda tulis, BERMULA dari apabila kita Power-On atau Start Arduino.

PENTING:
Lihat Rajah di atas.
Defining/Sub-Routine dan Void Setup di bahagian atas sekali, hanya dibaca dan dilaksanakan SEKALI sahaja, steiap kali
Power ON.

Selepas itu, Void Loop akan di ULANG dengan INFINITY sehingga Power di-Offkan.

Bila Arduino dinyalakan, ia akan mula SCAN bahagian Defining Area (1 kali sahaja) , untuk melihat sebarang Library tambahan atau jika ada variable-variable yang anda declare.

Kemudian, Arduino akan SCAN Void Setup() (1 kali sahaja), bagi menetapkan penggunaan Pin dan fungsi Pin yang anda perlukan dalam coding.

PENTING!
Setiap Pin yang digunakan perlu di beritahu / Declare penggunaannya dalam Void Setup(), samada sebagai Digital Input, Digital Output, Analog Input atau Serial.

Dalam Void Setup(), coding di baca SEKALI SAHAJA, iaitu dari awal pembukaan semi-colon ‘{‘ sehingga akhir penutupan semi-colon ‘}’ .

Void Loop() pula membaca dan menjalankan coding secara INFINITE-LOOP berasaskan kelajuan frequency Chip MCU Arduino anda, hampir 100kHz.

Kelajuan bacaan ini juga di panggil “Scanning Rate”.

Setelah Arduino membaca coding dalam Void Loop() sehingga hujung penutupan semi-colon ‘}’ Void Loop(),

ia akan mulakan semula pembacaan, Round ke-2, 3 dan seterusnya, dari permulaan semi-colon ‘{‘ Void Loop() di atas semula sehingga ke-hujung ‘}’ Void Loop() sekali lagi. Dan seterusnya di ulang-ulang.

Kenapa Void Setup() ?

Void Setup() berfungsi mengikut namanya, iaitu untuk ‘Setup’ fungsi-fungsi tertentu juga paling penting untuk setup cara penggunaan Pin GPIO Arduino.

Struktur Pin dalam Arduino UNO. Sumber: http://www.TheEngineeringProjects.com

Setiap pin-pin kawalan dalam Arduino di panggil GPIO, yang bermaksud General Purpose Input Output.

GPIO ini bermaksud tiap-tiap pin mempunyai 2-3 fungsi, samada ia boleh jadi Digital Input, Digital Output, Analog Input, PWM Output, atau Komunikasi Serial.

Disebabkan pin-pin kawalan Arduino bersifat dwi-fungsi atau multi-fungsi, kita perlu tetapkan fungsi apa yang kita mahu pin-pin tersebut digunakan dalam Projek Arduino kita.

Kaedah menetapkan fungsi-fungsi Pin dalam Void Setup() adalah seperti berikut:

  • Fungsi Digital Input
    Digunakan untuk Sensor Digital yang menggunakan 3-wire,
    5V, Ground dan Digital Output Sensor.
    Contoh mudah seperti switch, butang, dan Sensor Digital Output.
    pinMode(2, INPUT); //input pada pin 2 
  • Fungsi Digital Input_Pullup
    Digunakan untuk Sensor Digital yang menggunakan 2-wire,
    Ground dan Digital Output Sensor.
    Contoh mudah seperti switch, butang, dan relay-contact 5V.
    pinMode(3, INPUT_PULLUP); //input pull-up pada pin 3 

DIGITAL INPUT/INPUT_PULLUP
Berfungsi dengan men-Detect samada voltage 5V atau 0V berada pada pin tersebut. Voltage 5V akan memberi bacaan HIGH pada pin tersebut dan 0V memberi LOW.

Jika ada butang 2-wire, satu kaki butang sambung pada pin Ground, dan satu lagi menjadi Signal Input. Pabila butang ditekan, Ground akan bersambung dengan Signal Input memberikan signal 0V atau LOW, dan bila butang dilepas, bacaan HIGH.

  • Pin Declaration – Digital Output
    Digunakan bila memerlukan Output 5V untuk mengaktifkan Device Output korang. (maksimum 20mA)
    Contoh mudah seperti LED, Motor-Kecil (100mW), ataupun Relay-Coil 5V.
    pinMode(5, OUTPUT); //Output Digital pada pin 5 

DIGITAL OUTPUT
Arahan HIGH dalam coding akan membuat pin anda mengeluarkan 5V voltage untuk mengaktifkan Device Output.
Arahan LOW, akan mengeluarkan 0V atau Ground pada pin itu.

Digital Output Arduino hanya mampu support peralatan pada voltan 5V dan arus 20mA maksimum, atau 100mW kuasa maksimum untuk setiap Pin Output.

Elakkan sambung Motor direct kepada pin Output.
Gunakan module kawalan motor.

  • Pin Declaration – Analog Output(PWM)
    Digunakan untuk mengawal Output boleh laras 0V ~ 5V. Bermakna fungsi ini boleh memberikan output 1V, 2V ataupun 3.5V untuk mengubah kekuatan Voltage yang dikeluarkan.
    Contoh mudah seperti terang-malap LED, laju-perlahan Motor-Kecil (100mW), Motor Shield yang kawal motor-motor besar.
    pinMode(7, OUTPUT); //sama seperti digital output, cuma pin 7 

    //Nota Kaki : Analog Input tidak perlu declare pin

  • Pin Declaration – Servo Motor (Library: Servo.h)
    Digunakan bagi menetapkan penggunaan Servo Motor pada pin tersebut.
    Fungsi ini perlu digunakan bersama Library Servo.
    ServoSaya.attach(3); //kawalan signal Servo pada pin 3 
  • Initiate (Memulakan) Komunikasi Serial (.begin() )
    Contoh-contoh komunikasi peripheral adalah seperti,
    Serial Hardware, Serial Software, SPI, I2C dll.
    Setiap jenis perpheral mempunyai coding yang tertentu untuk menggunakan mereka.
Serial.begin(9600); //mulakan komunikasi Serial UART-USB
                    //pin default Serial 0 & 1

Wire.begin(); //mulakan komunikasi Serial I2C
              //pin default I2C untuk UNO, A4 & A5    

SPI.begin(); //mulakan komunikasi Serial SPI
             //pin default SPI untuk UNO, 10,11,12 & 13  

radio.begin(); //mulakan komunikasi penggunaan Radio RF

lcd.begin(); //mulakan komunikasi dengan LCD Display

Penggunaan Komunikasi Peripheral adalah dikira intermediate level, kebiasaannya digunakan untuk module-module sensor, module komunikasi wireless mahupun module-module display LCD.

Apa itu Void Loop() ?

Coding Utama project korang, akan di-loop-kan secara berterusan dan secara infiniti dalam Void Loop, selagi Power masih ada.

Ini adalah kaedah Arduino membaca atau Scan Coding untuk di laksanakan.

Coding akan di baca setiap baris satu-persatu dari atas ke bawah. Coding yang berada di bahagian atas di baca dahulu, kemudian bawahnya dan seterusnya.

Semua fungsi utama seperti, On-kan LED, Off-kan LED, baca Input dari butang, baca Input dari komunikasi Serial atau SPI, timer dan kira-kira matematik, semuanya perlu diletakkan dalam Void Loop() yang menjadi asas pada fungsi utama projek Arduino korang.

Strukturkan Coding dalam Void Loop ()

Bahagian ini adalah bahagian paling penting untuk di fahami dalam Pembelajaran Coding Arduino. Pastikan anda dapat kenal-pasti, yang mana Coding Data-INPUT, yang mana Coding Arahan-OUTPUT dan yang mana Coding Pemprosesan-Data.

3 Perkara yang akan berlaku dalam Coding Utama adalah aktiviti berikut:

  1. Membaca Input
  2. Memproses Data/Maklumat
  3. Arahan Output
maklumat-proses
3 Peringkat Pemprosesan Maklumat/Data untuk mana-mana sistem automasi.

Jika tiada Aktiviti Pemprosesan berlaku, maka projek anda tidak memerlukan Arduino.

MEMBACA INPUT SIGNAL

Dalam Coding Arduino, sebarang Coding Data-INPUT akan mempunyai NILAI-DATA.

Dalam bahagian ini, pastikan anda teliti setiap coding yang mempunyai NILAI-DATA.

Disebabkan INPUT mempunyai Nilai-Data, ia dapat di print terus pada Serial Monitor, atau nilainya di SIMPAN TERUS dalam Variable.

void setup() {
 Serial.begin(9600);
 pinMode(2, OUTPUT);                     
}
void loop() {
 Serial.println(digitalRead(2));                               
}

Ikuti Tutorial Langkah Pertama kami dalam URL berikut, untuk belajar lebih lanjut mengenai Serial Monitor:

Langkah Pertama Mempelajari Arduino

Input bagi Arduino boleh datang dari berbagai sumber, dari input Digital High/Low (5V/0V) seperti butang, switch dan relay, juga terdapat beberapa jenis sensor yang mengeluarkan Digital Output (5V/0V), dari Sensor Analog yang memberikan Range-data (0~1023) ataupun sumber data Serial Input.

Berikut adalah beberapa Syntax untuk mendapatkan Data-INPUT:

Digital Input digitalRead()

Memberikan BACAAN VOLTAGE pada Digital Input di Digital-Pin, samada yang menggunakan INPUT ataupun INPUT_PULLUP. Biasa digunakan untuk penggunaan Butang, Switch, atau Sensor yang beri Signal Digital.

Bacaan akan diterima sebagai “HIGH” atau “LOW”, atau 1 dan 0.

HIGH = 1 = true (iaitu pin menerima 5V)
LOW = 0
= false (iaitu pin menerima 0V atau GND)

digitalRead(8); 
//syntax membaca Digital Input pin 8

Serial.print(digitalRead(8)); 
//syntax print-out Digital Input pin 8 pad Serial Monitor

Butang1 = digitalRead(8);
//memasukkan dan simpan nilai 1 atau 0 condition 
//dari Digital Input pin 8 ke dalam variable Butang1

PENTING!:
Disebabkan Syntax “digitalRead(pin)” mempunyai nilai 1 atau 0,
nilai 1 atau 0 ini boleh terus disimpan dalam Variable seperti coding di atas,
nilai 1 atau 0 dari bacaan digital Pin disimpan dalam variable
Butang1

Atau cara penggunaannya bersama pemprosesan:

if(digitalRead(8) == HIGH){  //jika pin 8 adalah HIGH atau ON
   digitalWrite(2, HIGH);     //nyalakan LED pada pin 2
}

Analog Input analogRead()

Memberikan bacaan Analog Input di Analog-Pin A0,A1,A2 ~ A5.
Pin Analog Ini boleh menerima Signal Input Analog dari 0V hingga 5V. Signal Voltage Analog ini akan di-Convertkan pada nilai Digital (10-bit ADC) 0~1023. Fungsi ini digunakan untuk penggunaan Potentimeter Input atau Sensor Input Analog.

Bacaan ini pula adalah dari nilai 0~1023 (10 bit maximum, abaikan bit jika tidak faham)

analogRead(A0); 
//syntax membaca Analog Input pin A0

Serial.print(analogRead(A0)); 
//syntax print-out Analog Input pin A0 pada Serial Monitor

InputAnalog1 = analogRead(A0);
//memasukkan dan simpan nilai 0 ~ 1023 condition 
//dari Analog Input pin A0 ke dalam variable InputAnalog1

PENTING!:
Disebabkan Syntax “analogRead(pin)” mempunyai nilai 0 ke 1023,
nilai ini boleh terus disimpan dalam Variable seperti coding di atas,
disimpan dalam variable
InputAnalog1

Atau cara penggunaannya bersama pemprosesan:

if(analogRead(A0) == HIGH){  //jika bacaan Analog pada A0 melebihi nilai 500
   digitalWrite(2, HIGH);     //nyalakan LED pada pin 2
}

Serial Input Serial.Read()

Memberikan Nilai-Data yang diterima dari Serial.

Serial.read(); //mendapatkan data dari sumber Serial

penggunaannya bersama pemprosesan:

if(Serial.available()){       //jika terdapat input data dari Serial
   DataInput = Serial.read(); //masukkan data ke dalam variable DataInput
}

PENTING!:
Disebabkan Syntax “Serial.Read()” mempunyai nilai data,
nilai ini boleh terus disimpan dalam Variable seperti coding di atas,
disimpan dalam variable
DataInput

Fungsi Serial.Read hanya akan mempunyai data 1 Byte (8 bit) iaitu bersamaan dengan nombor 0~255.

Nilai 0~255 ini boleh mewakili huruf dari A to Z atau nombor 0 to 9.
Anda boleh rujuk carta conversion dari link wikipedia di bawah:

https://en.wikipedia.org/wiki/File:ASCII-Table.svg

I2C Input Wire.Read()

Memberikan Nilai-Data yang diterima dari Serial I2C.

Wire.read(); //mendapatkan data dari sumber Serial I2C

if(Wire.available()){       //jika terdapat input data I2C
   DataInput = Wire.read(); //masukkan data ke dalam variable DataInput
}

PENTING!:
Sama seperti Serial.Read syntax “Wire.Read()” mempunyai nilai data, dan boleh terus disimpan dalam Variable,
DataInput

Wire.Read juga hanya akan mempunyai data 1 Byte (8 bit) iaitu bersamaan dengan nombor 0~255.

Nilai 0~255 ini boleh mewakili huruf dari A to Z atau nombor 0 to 9.
Anda boleh rujuk carta conversion dari link wikipedia di bawah:

https://en.wikipedia.org/wiki/File:ASCII-Table.svg

MEMBACA DATA DARI PENGGUNAAN LIBRARY INPUT

Jika tadi, kita menggunakan kaedah membaca input dari Fungsi Basic dalam Arduino, Digital Input, Analog Input dan Serial.

Bila anda mula menggunakan Module Sensor-sensor Tambahan pula, setiap sensor pasti akan mempunyai Protocol-Penggunaan mereka tersendiri, dan Komuniti Arduino seluruh dunia telah membuat pelbagai LIBRARY untuk Arduino supaya coding menggunakan module tersebut dapat dipermudahkan.

Yang pastinya, setiap Library Module Sensor, PASTI akan mempunyai NILAI-DATA, dan NILAI-DATA ini dapat disimpan terus dalam variable, ikuti contoh berikut:

Library TinyGPS untuk membaca maklumat Coordinat dari Satellite:

if(gpsSerial.available()){
     while (gpsSerial.available()){
         char c = gpsSerial.read();
         if (gps.encode(c)) //<--- Memanggil Fungsi Library untuk decode maklumat GPS 
           newData = true;
     }
}

if(newData){
   unsigned long age;
   gps.f_get_position(&latitude, &longitude, &age);
   //^^^ Memanggil Fungsi Library untuk memasukkan
   //maklumat latitudeGPS kedalam Variable "latitude"
   //maklumat longitudeGPS kedalam Variable "longitude"

   //TERUS PAPARKAN MAKLUMAT DALAM VARIABLE PADA SERIAL MONITOR
   Serial.print(" ");
   Serial.print(latitude, 6);
   Serial.print(" ");
   Serial.print(longitude, 6);
   Serial.println();    
}

Library DHTSensor untuk membaca maklumat Temperature dan Humidity dari Sensor DHT11:

 h = dht.readHumidity();    //<---maklumat Humidity terus disimpan dalam variable "h" 
 t = dht.readTemperature(); //<---maklumat Temperature terus disimpan dalam variable "t"

MEMPROSES DATA/MAKLUMAT

Setiap data input yang diterima seperti di atas, dapat di manipulasi  untuk menjadi asbab/sebab kepada suatu OUTPUT.

Apa yang penting, semua bentuk input yang diterima, semuanya dalam bentuk nombor digital yang tepat. Dengan nombor-nombor inilah, data tersebut dapat dimanipulasi dengan Operasi Matematik mahupun Operasi berasaskan Situasi.

Antara cara memanipulasi data input adalah seperti contoh-contoh berikut:

>> Operasi Matematik +, – , X, /, =

//contoh cara meletakkan setiap data dalam bentuk fomula matematik

Peratus_PerbezaanMasa = (MasaSekarang - MasaSebelum)/ MasaSekarang; 

if(Peratus_PerbezaanMasa > 50){ //membuat perbandingan kondisi 
   analogWrite(9, 255); //output hasil dari manipulasi data input tersebut                       
                        //PWM output bernilai max 255 pada pin 9
}

>> Perbandingan Situasi, While(), If(), For() Loop

While() Loop

while(digitalRead(3) == LOW) { //loop ini akan kekal berulang sehingga digitalRead(3) menjadi HIGH                  
  val9 = map(analogRead(A0),225, 830, 16, 160);         
  ServoSatu.write(val9);        
                           
  val10 = map(analogRead(A1),225, 830, 16, 160);         
  ServoDua.write(val10);                      
  delay(15);      
}

for() Loop

/*FOR LOOP ini mengatakan bahawa,  
* Nilai permulaan 'x' adalah 0.  
* Loop FOR akan berulang-ulang selagi nilai x tidak  
* bersamaan 5.  
* Dan setiap kali 1 cycle habis, nilai x ditambah '1'  
* Loop ini akan berulang sebanyak 5 kali sahaja.  */  

for (x = 0; x < 5; x++){ 
   digitalWrite(2, HIGH);  
   delay(1000);  
   digitalWrite(2, LOW);  
   delay(1000); 
}

If (check condition) Condition

Contoh If() condition adalah seperti contoh-contoh di atas. Namun, hampir kesemua jenis comparator dapat digunakan. Antaranya adalah, nilai sama’==’ , nilai tidak  sama ‘!=’ , lebih besar ‘>’ atau lebih kecil ‘<‘

Pelarasan Nilai, Fungsi Map

Selalunya digunakan pada data-data yang mempunyai ‘range’ seperti Analog Input.

 /*data dari analog input adalam dalam range 0~1023    
*jadi fungsi map di atas menukar dan melaraskan  
*range 0~1023 kepada range yang lebih rendah 0~255  
*ini bermakna 1023 diterjemahkan secara linear kepada  255  */

nilaiA = analogRead(potpin2);             
nilaiA = map(analogRead(potpin2),0,1023, 0, 255);

analogWrite(9, nilaiA); //analogWrite atau PWM, hanya boleh mengeluarkan 255 maksimum

ARAHAN OUTPUT

Arahan-arahan Output, selalunya mempunyai penghujung .Write() .Beberapa contoh arahan Output adalah seperti berikut:

  • Output Digital (HIGH/LOW), digitalWrite()
     digitalWrite(2, HIGH); //sama seperti kelipan LED 
  • Output Analog (0~255), analogWrite()
    analogWrite(9, 255); //analogWrite atau PWM, hanya boleh mengeluarkan nilai 255 maksimum //nilai 255 ini adalah 100% duty cycle PWM //iaitu bersamaan dengan 5V penuh    
  • Kawalan Servo (0~180), ServoSaya.Write()
    ServoSaya1.write(180); //Servo dikawal ke 180 darjah //anda boleh masukkan range dari 0~180 darjah //untuk mengawal Servo     
  • Penghataran data ke Serial , Serial.Write()
    //hantar data value pin Analog 3 pada Serial Serial.write(analogRead(A4));   //hantar data value pin Analog 3 pada Serial 
  • Penghantaran data ke Peripherals lain SPI & I2C , XXX.Write()
    Detail akan ditulis dalam blog entry lain, contoh seperti di bawah,
    SPI.transfer(); //dengan library SPI 

    Wire.write(); //dengan library I2C 

    radio.write(); //dengan library nRF24

Defining Area

Kawasan untuk declare ‘variable-variable’ custom anda, juga kawasan untuk memanggil ‘library-library’ tambahan yang diperlukan.

‘Variable’ adalah Nama-Custom yang kita berikan, untuk menyimpan sebarang bentuk nombor atau data dari Input ataupun nombor yang kita tetapkan, sama seperti dalam Matematik Algebra:

X = Y + 10

Lihat contoh coding berikut:

int LED_Hijau = 2;

void setup() {
pinMode(LED_Hijau, OUTPUT);
}

void loop() {
digitalWrite(LED_Hijau, HIGH);
delay(1000);
digitalWrite(LED_Hijau, LOW);
delay(1000);
}

Coding di atas adalah sama seperti kelip LED yang awal, cuma nombor pin 2 telah digantikan dengan ‘variable’ LED_Hijau. Lebih mudah untuk kita tulis coding begini. Namun, penggunaan setiap variable, perlu di-declare di-‘Defining Area’ seperti di atas.
(Rujuk artikel berikut untuk mengetahui jenis-jenis variable yang ada)

Coding berikut pula, akan menunjukkan contoh coding memanggil ‘library-library’ tambahan, semuanya menggunakan simbol ‘#’ dipermulaan:

#include <SPI.h> //memanggil Library unutk SPI
#include <Wire.h> //memanggil Library unutk I2C
#include <nRF24L01.h> //memanggil Library untuk module nRF24L01
#include <RF24.h> //memanggil Library untuk module RF24
#include <Servo.h> //memanggil Library untuk Servo

Mengapa Perlu Panggil Library Tambahan?

Untuk memudahkan penulisan coding mengikut PROTOCOL setiap Module.

Setiap Module yang ditambah dan disambungkan pada Arduino, pasti mempunyai PROTOCOL penggunaan mereka sendiri.

Di sebabkan Module ada Protocol, sebagai contoh jika hendak membaca bacaan Temeperature dari Module Sensor DHT11, coding yang ditulis dari
RAW, pasti akan panjang berjela-jela bagi memastikan protocol module tersebut diikuti.

Dengan menggunakan Library DHT, pembacaan nilai Temperature dari module tersebut dipermudahkan sehingga hanya perlu letak 1 Syntax sahaja untuk mendapatkan Temperature.

Sub-Routine Area

Dalam kawasan Auxillary pula, kebiasaannya digunakan untuk meletakkan fungsi-fungsi custom anda sendiri. Tidak semua orang menggunakan fungsi custom. Tetapi apabila anda sudah biasa, ia akan membuatkan coding anda nampak lebih kemas dan teratur.

Tambahan pula, ia sangat sesuai digunakan untuk coding-coding yang berulang.
Dengan menggunakan contoh Kelip LED juga, kita lihat bagaimana membuat fungsi custom seperti contoh berikut:

void setup() {
pinMode(2, OUTPUT);
}

void loop() {
kelipkelip();
delay(5000);
kelipkelip();
delay(3000);
}

void kelipkelip(){
 digitalWrite(2, HIGH);
 delay(1000);
 digitalWrite(2, LOW);
 delay(1000);
}

Semua coding untuk kelip telah diletakkan dalam fungsi custom kita yang dipanggil kelipkelip() . Mengikut kaedah di atas, hanya perlu beri nama anda sendiri dan tambahkan ‘()’ dihujung.

Jangan Takut Untuk Bermula

Penerangan di atas hanyalah sebagai panduan. Anda tidak perlu menulis coding anda sendiri untuk peringkat awal.

Untuk peringkat permulaan, anda pasti akan dapat belajar dengan cepat dengan kaedah copy/paste. Setiap tutorial yang kami sediakan di MaGyver.my telah disediakan pelan pendawaian (wiring) serta ‘Sketch’ coding yang berfungsi.

Copy/Paste dan kaji coding, wiring serta output yang terhasil.

Kemudian perlahan-lahan cuba ingat dan fahami maksud setiap coding. Ia tidaklah begitu susah. Apabila sudah biasa, ia pasti berada di hujung minda sahaja.

Kami syorkan anda terus ke artikel berikut untuk mula menguji Arduino tanpa perlu tahu mengenai coding:

Lebih Lanjut Mengenai Coding Arduino

Untuk mengetahui lebih lanjut dan detail mengenai command-command syntax dalam Arduino IDE, anda boleh layari URL berikut dari Arduino.cc yang menerangkan mengenai setiap command arahan:

Beberapa Artikel bacaan lain yang kami syorkan:

Featured

nRF24L01+ : DIY Remote Control Mudah | Project MatGyver.my

Remote Control dengan nama lainnya hanyalah komunikasi Wireless antara 2 Microchip, di mana, terdapat satu pihak yang menghantar data dan satu pihak yang menerima data. Terdapat pelbagai jenis komunikasi Wireless seperti berikut:

  • Bluetooth
  • WiFi
  • Radio Frequency

WiFi dan Bluetooth sebenarnya juga merupakan sejenis Radio Frequency wireless tetapi mereka telah di protocolkan teknik penghantaran-penerimaan data untuk kegunaan yang lebih meluas.

Sebelum memulakan Tutorial Project ini, kami sarankan anda membuat pembacaan asas mengenai Module Radio Frequency nRF24L01+ yang akan digunakan dalam project ini.

nRF24 DIY Remote Control
Belah kiri merupakan module nRF24L01+ bersama SMA Antenna dan Power-Amplifier yang dapat mencapai jarak sehingga 1km, manakala belah kanan merupakan module nRF24L01+ yang hanya mempunyai PCB-Antenna, boleh mencapai jarak <50m.

Gambar di atas merupakan antara 2 jenis module nRF24L01+ yang boleh didapat di pasaran dan juga di WebStore kami, MatGyver.my.

Anda boleh lihat 2 jenis module nRF24L01+ yang mempunyai jarak pengendalian yang berbeza:

Xbee merupakan competitor tegar kepada module nRF24L01+. Namun disebabkan harga Xbee yang terlalu mahal, banyak pihak telah berubah kepada module nRF24L01+ kerana harganya yang jauh lebih murah untuk tujuan hobby DIY ini.

Digabungkan dengan Libray nRF24 yang telah dibangunkan oleh TMRH20, ia telah mempermudahkan lagi golongan beginners untuk belajar mengapplikasi module Radio dalamhobby dan prototype mereka.

Dalam Tutorial-Projek ini, kami akan menunjukkan bagaimana 2 unit Arduino dapat berkomunikasi, menghantar-terima data melalui module Radio nRF24L01+ .

LANGKAH PERMULAAN

PERSEDIAAN MENGGUNAKAN Module nRF24L01

  1. Download Library nRF24L01.h
  2. Install Library nRF24L01.h

KOMPONEN-KOMPONEN YANG DIPERLUKAN

  1. Arduino UNO atau Nano  :  2x Unit
  2. Module nRF24L01+   :  2x Unit
  3. Push Button  :  1x Unit
  4. Jumper Cable yang berkaitan

SAMBUNGAN DIAGRAM
(Unit Transmitter)

NodeTransmitter_bb

Dalam unit transmitter ini, kita hanya akan menghantar data digital dari satu unit butang sahaja yang disambungkan pada pin Digital 4 Arduino NANO/UNO.

SKETCH CODING ARDUINO 
(Unit Transmitter)

Copy, Paste dan Uploadkan sketch di bawah ke dalam unit Arduino-Transmitter anda. Atau anda boleh Download file .ino untuk coding tersebut melalui URL di bawah:

Dalam Sketch ini, status butang Push-Button  akan di-convertkan kepada nilai byte, lihat keratan algorythm di bawah yang menggunakan IF function:

if(digitalRead(4) == LOW){ //jika butang ditekan, send nilai 255 pada radio
 data.but1 = 255;}
if(digitalRead(4) == HIGH){//jika butang dilepas, send nilai 0 pada radio
 data.but1 = 0;}

Apabila Butang digunakan dengan menggunakan INPUT_PULLUP , ia akan dibaca sebagai signal LOW dalam Arduino, dan kita convertkan signal ini kepada nilai 255, dan apabila butang dilepas, bacaan HIGH akan di convertkan kepada nilai 0.

Nilai byte 255 dan 0 ini akan dihantar dalam bentuk Data-Binary-Array melalui module nRF24L01 untuk diterima-baca oleh unit penerima.

PERHATIAN! :
Anda hanya boleh menghantar data binary SAHAJA melalui module nRF24L01 ini. Data binary adalah dalam range 0~255 dalam bentuk byte.

//Project : DIY Remote Control Mudah dengan nRF24L01+
//Perinci : Transmitter Unit
//Code disediakan oleh MatGyver.my

#include <SPI.h>       //masukkan library SPI, nRF menggunakan komunikasi SPI
#include <nRF24L01.h>  //masukkan library nRF24L01
#include <RF24.h>      //masukkan library RF24L

const uint64_t pipeOut = 0xA8A8F6F6E1LL; //address/alamat unik ditentukan oleh pengguna

RF24 radio(9, 10); //pin CE(9) & CSN(10)
//MOSI(11) , SCK(13) , MISO(12)

//Struktur Data-Array yang akan di transmit setiap cycle
//data dinamakan MyData
struct MyData {
 byte but1;     //1 byte data digunakan untuk menghantar status butang
};               // boleh hantar sehingga 32 byte data dalam satu cycle penghnataran data

MyData data; //prefix "data" diletakkan kepada setiap individu-array dalam MyData

void setup(){ //PERMULAAN VOID SETUP
 pinMode(4, INPUT_PULLUP); //butang disambung pada digital pin 4

 delay(100);

 Serial.begin(9600);  //Serial untuk debug/check coding output
 
 radio.begin();                   //memulakan radio nRF
 radio.setAutoAck(false);         
 radio.setDataRate(RF24_250KBPS); //kelajuan penghantaran data nRF

 radio.openWritingPipe(pipeOut);  //set module nRF sebagai transmitter(pipeOut)

 data.but1 = 0;                   //nilai permulaan variable untuk butang bersamaan 0

 delay(300);
} //PENUTUP VOID SETUP

//PROGRAM UTAMA
void loop(){ //permulaan void loop 
 if(digitalRead(4) == LOW){  //jika butang ditekan, send nilai 255 pada radio
   data.but1 = 255;
 }
 if(digitalRead(4) == HIGH){ //jika butang dilepas, send nilai 0 pada radio
   data.but1 = 0;
 }
 
 radio.write(&data, sizeof(MyData)); //send semua data set array MyData kepada penerima

 checkserial();  //check data pada serial monitor adakah butang berfungsi
}

//
void checkserial(){ //seria print untuk debug
 Serial.print("Butang 1: ");  //serial print nilai butang
 Serial.println(data.but1);   //serial print nilai butang
}

Anda boleh semak jika, butang anda berfungsi, dengan melihat dalam Serial Monitor, dan paparan output adalah seperti berikut:

Transmit-Off
Output nilai ‘0’ ketika butang Off

Transmit-On
Output Nilai 255 ketika butang ON

Namun, anda tidak dapat semak jika data tersebut berjaya ditransmit melalui module nRF24 atau tidak, jika anda tidak mempunyai Unit Receiver.

SAMBUNGAN DIAGRAM
(Unit Receiver)

Home Security Central Receiver Test_bb

SKETCH CODING ARDUINO 
(Unit Receiver)

Copy, Paste dan Uploadkan sketch di bawah ke dalam unit Arduino-Receiver anda. Atau anda boleh Download file .ino untuk coding tersebut melalui URL di bawah:

//Project : DIY Remote Control Mudah dengan nRF24L01+
//Perinci : Receiver Unit
//Code disediakan oleh MatGyver.my

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const uint64_t pipeIn = 0xA8A8F6F6E1LL;//address/alamat unik ditentukan oleh pengguna
                                      //alamat ini perlu sama dengan unit Transmitter
                                      
RF24 radio(9, 10); //pin CE(9) & CSN(10)
//MOSI(11) , SCK(13) , MISO(12)

//Struktur Data-Array yang akan di transmit setiap cycle
//data dinamakan MyData
struct MyData {
 byte inbut1;  //namakan data array
}; // Jumlah size data adalah 1 byte, masih ada 31 lagi kekosongan

MyData data; //prefix "data" diletakkan kepada setiap individu-array dalam MyData

void setup(){  //PERMULAAN VOID SETUP
 Serial.begin(9600);

 radio.begin();                    //memulakan radio nRF
 radio.setAutoAck(false);
 radio.setDataRate(RF24_250KBPS);  //kelajuan penghantaran data nRF

 radio.openReadingPipe(1,pipeIn);  //set module nRF sebagai Receiver(pipeIn)
                                   //pilih pipe nombor 1. boleh terima sehingga 6 pipe
                                   
 radio.startListening();           //bersedia untuk menerima sebarang data/signal

 delay(100);

 data.inbut1 = 0; //default value pada input variable

 delay(500);
}

/************************************************/
unsigned long lastRecvTime = 0; //declare variable  untuk check cycle time

void loop()
{  

 
 while ( radio.available() ) {        //check jika ada sebarang input dari Transmitter     
   radio.read(&data, sizeof(MyData)); //read data dan susun dalam array MyData
   lastRecvTime = millis();           //declare permulaan masa data di-check
 }
 
 unsigned long now = millis();        //masa selepas input diterima
 if ( now - lastRecvTime > 1000 ) {   //FAIL-SAFE jika masa melebihi 1 saat
   data.inbut1 = 0;                   //FAIL-SAFE data jika RF module tidak terima data
 }                                    //data akan beri default value 0

 byte But1 = data.inbut1;           //simpan data dalam algo baru But1

 Serial.print("Butang Input: ");    //check input dengan serial
 Serial.println(But1);
}

Dalam coding ini, data Binary-Array yang diterima melalui module nRF24L01, akan disusun ke dalam array dalam Algorythm MyData.

Data yang diterima hanyalah dalam range nombor binary 0~255 sahaja untuk setiap byte yang diterima.

Jika butang pada transmitter ditekan, Transmitter akan menghantar nilai 255 ke dalam Channel inbut1.

Anda dapat semak jika Unit-Receiver menerima data dari Unit-Transmitter melalui Serial Monitor, seperti berikut:

Receive-Off
Bacaan apabila butang TIDAK ditekan.

Receive-On
Bacaan 255 apabila butang ditekan!

Pastikan kedua-dua unit Transmitter dan Receiver disambungkan dan dinyalakan.

Apabila output dari unit Receiver dapat di paparkan seperti di atas, bermakna anda  berjaya membuat Remote Control mudah pertama anda!

Bukan sahaja data dari butang dapat dihantar melalui module nRF24L ini, malah anda dapat hantar data Analog dari sensor-sensor anda mahupun dari potentiometer dengan menggunakan fungsi MAP untuk menukar nilai sensor dari 1023 (potentiometer) kepada 255(byte binary).

Kami sarankan anda ikuti artikel-artikel berikut:

  • Menggunakan Module nRF24L01+ sebagai RF Transceiver
  • Menggunakan Bluetooth Module HC-05/HC-06
  • Menggunakan Wifi Module ESP8266

Jika anda dapati artikel ini membantu korang dan project korang, jangan lupa untuk sumbangkan “Like” pada artikel, atau kongsikan artikel ini supaya kami lebih bersemangat untuk kongsikan artikel-artikel yang lebih mantap!

Disclaimer: Tentang MatGyver.my

Artikel-artikel di MatGyver.my ditulis khas untuk DIY-ers dan Hobbyist yang tiada latar belakang Electronics Engineering mahupun Mechanical Engineering. Setiap artikel MatGyver.my diolah dan digubah semudah yang mungkin bertujuan untuk mempermudahkan pemahaman dan penggunaan sesuatu komponen teknikal untuk aktiviti DIY. Artikel-artikel di MatGyver.my tidak sesuai untuk pembaca yang memerlukan info yang terlalu detail dan sangat mendalam sehingga boleh mendapat segulung Ijazah Sarjana Muda Electronics Engineering atau Mechanical Engineering.

Namun, kami alu-alukan anda-anda yang hebat untuk memberi penjelasan yang lebih terperinci pada mana-mana persoalan yang timbul tentang 2 topik utama di atas.

Featured

Menyalakan Arduino Pertama Kali – Belajar Arduino 101

(Step #1) Jika anda baru sahaja membeli satu unit Arduino, langkah pertama yang anda patut lakukan adalah dengan menguji Arduino tersebut untuk memastikan ia tidak rosak ketika penghantaran POS dan ia berfungsi dengan baik, SEBELUM memulakan sesuatu projek.

(Step ke-2) adalah menguji setiap module-module yang anda beli, secara INDIVIDU untuk memastikan module-module tersebut berfungsi dengan baik.

AMARAN! : Jangan uji module dengan coding projek yang sudah panjang berjela. Uji satu-satu module dan hardware dahulu dengan coding-coding simple.
Contoh nya, LED patut boleh ON dan OFF, atau, Sensor patut boleh detect ON dan OFF atau Sensor Temperature patut dapat memberikan bacaan suhu.

Jika anda skip 2-Langkah ini, pasti akan mengalami masalah apabila hendak troubleshoot program penuh. Sebabnya adalah, sesuatu masalah yang dihadapi dalam seusatu bukanlah HANYA disebabkan coding, ia juga berkait rapat dengan kaedah wiring (pendawaian) dan juga keadaan Module dan Arduino.

Kadangkala, bila kita troubleshoot project kita, yang memakan masa sampai berhari-hari dan berminggu-minggu sehingga kita BUNTU dan FRUST, tetapi, rupa-rupanya masalah sebenarnya adalah hardware yang rosak.

Untuk mengelakkan FRUST, pastikan kita cek dahulu keadaan hardware-hardware yang terlibat.

“Pembelian di store.MatGyver.my mempunyai Warranty-Gantian, 7 hari dari tarikh penerimaan bungkusan, jika sebarang komponen tidak berfungsi-baik”

Tutorial ini membantu geng-geng yang tidak ada apa-apa pengetahuan mengenai Arduino, dan mahu Menguji Keadaan Arduino yang baru di beli, adakah ia berfungsi dengan baik atau tidak.

Mari Mulakan

Secara ringkasnya, ada 3 aktiviti utama yang terlibat dalam menggunakan Arduino:

  1. Sambungan Komponen Electroniks
  2. Aktiviti Programming dan Coding
  3. Pemasangan pada penggunaan (jika ada sahaja)

Ikuti sahaja langkah-langkah berikut untuk menguji Arduino anda, dan lihat samada ia berfungsi atau perlu ditukar.

Aktiviti ini boleh digunakan untuk hampir semua jenis Arduino termasuk, UNO, NANO, MEGA 2560 danyang seangkatan dengannya.

LANGKAH #1 : Komponen(Hardware) Yang Perlu Ada 

Komponen Perlu Ada.jpg

Anda hanya perlu ada 3 komponen seperti di atas untuk menghidupkan Arduino buat pertama kali:

  1. Laptop/Komputer Peribadi
  2. Arduino Board (UNO, NANO, MEGA 2560, atau yang lain2)
  3. USB Programming Cable

Pastikan anda mempunyai programming cable yang bersesuaian untuk Arduino Board anda. Mana-mana USB cable yang terdapat dalam pasaran boleh digunakan, cuma pastikan Header-nya bersesuaian dengan Arduino Board anda.

USBConnectorsCommon.jpg
Jenis-jenis USB cable dalam pasaran.

USB Type B
Header Type-B adalah sesuai untuk Arduino UNO dan MEGA 2560

Mini USB
Header Mini USB adalah sesuai untuk Arduino NANO

Micro USB
Header Micro USB digunakan untuk sesetengah module-module programming yang berasingan.

LANGKAH #2 : Software Arduino IDE 

software-arduino-1

IDE atau dengan nama penuh canggihnya, Integrated Development Environment (IDE), hanyalah software yang menukarkan input coding C/C++ kepada coding asas Binary Microprocessor. (baca di sini untuk mengetahui lanjut mengenai Arduino IDE)

Software ini boleh di download dengan percuma dari website official Arduino di URL di bawah:

https://www.arduino.cc/en/Main/Software

Ikuti Video Tutorial berikut untuk step-by-step guide bagi meng-Install Software IDE, dan meneruskan dengan Tutorial ini.

[Video]

LANGKAH #3 : Sambungkan Arduino Pada PC/Laptop 

Langkah seterusnya, selepas install software, terus sambungkan Arduino anda pada Laptop/PC dengan menggunakan USB cable.

Sambung Arduino.jpg
Sambung sahaja terus seperti mana-mana USB device yang lain.
Lampu Arduino menyala.jpg
Setelah sambung USB dibuat, LED Hijau “ON” akan menyala consistent.

Lampu Hijau “ON” menandakan Arduino telah diberi kuasa.

LANGKAH #4 : Pastikan Port Komunikasi Dikesan

port-not-connected
“Port” berwarna kelabu dan tidak boleh dipilih.

Di Top-Menu, pilih “Tools” dan lihat bahagian “Port”.
“Port” akan berwarna kelabu dan tidak dapat dipilih jika Arduino tidak disambungkan.

Jika Arduino telah disambungkan dan masih kelabu, tunggu beberapa saat sehingga ia menjadi hitam.

Jika selepas beberapa minit, ia masih kelabu, ini bermakna ada kemungkinan masalah hardware atau teknikal.

port-bersambung
“Port” menjadi solid hitam apabila sambungan berjaya.

Apabila komputer dapat mengesan Arduino Board, “Port” akan bertukar menjadi Hitam-solid dan ia boleh dipilih. Mana-mana Arduino Board  akan dikenali sebagai COMx, atau apa-apa nombor lain seperti COM5, COM6 dan nombor-nombor lain.

Tekan ‘tick’ pada COMx tersebut.

COM4 ini adalah nama lainnya, Communication Port. Kebiasaanya COM4 menunjukkan jenis sambungan “Serial” telah disambungkan pada komputer anda.

Arduino berkomunikasi dengan komputer melalui Serial-Communication, dimana segala data ditransfer melalui aliran stream data binary dalam bentuk serial.
(Anda boleh ikuti artikel di sini untuk mengetahui lebih lanjut mengenai Serial-Communcation)

PENTING! : Pastikan anda memilih Board yang betul dalam pilihan “Board”

pilih-board
Di bahagian “Tools” pilih Board yang anda akan gunakan.

Dalam pilihan “Board”, pilih board anda:

  • Arduino\Genuino UNO – untuk Arduino UNO
  • Arduino\Genuino Nano – untuk Arduino NANO
  • Arduino\Genuino Mega or Mega 2560 – untuk Arduino MEGA

LANGKAH #5 : Uji Arduino Anda Dengan ‘Sketch’ Yang Mudah

Dalam komuniti Arduino, program atau coding yang ditulis dalam Software Arduino IDE dipanggil ‘Sketch’.

Anda boleh mencuba antara 2 sketch mudah dibawah:

Sketch #1: “Hello World” – Void Setup

void setup() {
 // bahagian untuk setup code
Serial.begin(9600);  //Line #1
Serial.print(" Hello World ");  //Line #2
}

void loop() {
 // main code yang akan berulang-ulang

}

Ini adalah antara sketch yang paling simple untuk menguji Arduino.
Sketch atau code ini akan mengeluarkan ayat “Hello World” di dalam Serial Monitor, sekali sahaja!
(kerana coding utama berada dalam “Void Setup” sahaja)

monitor-setup
Hello World muncul sekali sahaja, kerana Void Setup berjalan sekali sahaja.

Ikuti Langkah #6 untuk ketahui bagaimana melihat Serial Monitor.

Sketch #2: “Hello World” – Void Loop

void setup() {
 // bahagian untuk setup code
Serial.begin(9600);  //Line #1

}

void loop() {
 // main code yang akan berulang-ulang
Serial.println(" Hello World ");  //Line #2
}

Sketch ini pula, akan mengeluarkan ayat “Hello World” di dalam Serial Monitor, berkali-kali!
(kerana coding utama berada dalam “Void Loop” sahaja)

monitor-loop
Hello World muncul berkali-kali kerana Void Loop loop secara infinity.

Copy mana-mana code di atas, dan paste-kan (padam apa yang ada dalam IDE dulu) di dalam ruangan programming.

Pastikan anda save dahulu Sketch yang telah dipaste tadi.
Pilih File > Save As , dan window save akan pop-up.

Berikan nama pada file sketch tadi, dan save.

save-as
Window Save As

Kemudian, upload Sketch tadi ke dalam Arduino anda dengan semudah menekan butang  “Upload” seperti dalam gambar di bawah:

upload

Ketika upload, bahagian notification akan mengatakan “Compiling Sketch” dahulu, kemudian barulah ia akan menunjukkan “Uploading”. Status Bar juga akan bergerak.

Setelah selesai Upload Sketch, bahagian notification akan menunjukkan
“Done Uploading” dan Arduino anda akan mula menggunakan Sketch baru tersebut.

LANGKAH #6 : Gunakan ‘Serial Monitor’ Untuk Melihat Keluaran Dari Sketch Anda

Serial Monitor dapat dibuka dengan semudah menekan icon Serial Monitor di atas-kanan window.

Serial Monitor.jpg

Apabila, “Hello World” terpapar dalam Serial Monitor anda, bermakna Arduino andadapat berfungsi dengan baik.

Anda boleh tinggalkan sebarang persoalan dalam ruangan comment jika anda memerlukan bantuan mengenau Arduino atai DIY.

Beberapa Tutorial  yang kami sediakan untuk Beginners tanpa latar-belakang programming ada seperti berikut:

Beberapa Artikel bacaan yang kami syorkan diperingkat awal.

Featured

IoT (Blynk) : Home Security Simple dengan Blynk + Arduino | MatGyver.my

Ini merupakan satu konsep Home Security sistem mudah untuk para beginners.

Gabungan ESP8266 beserta module nRF24L01+ membuatkan project ini mempunyai potensio besar untuk diguna pakai dalam Home Security sekarang.

KOMPONEN-KOMPONEN YANG DIPERLUKAN

  1. Arduino UNO atau Nano  :  2x Unit
  2. Module nRF24L01+   :  2x Unit
  3. Module WiFi ESP8266   :  1x Unit
  4. Push Button  :  1x Unit
  5. Jumper Cable yang berkaitan

LANGKAH PERMULAAN

Beberapa Tutorial yang disarankan untuk anda cuba bagi mempermudahkan anda memahami Project ini dan juga mempermudahkan proses ‘DEBUG’ :

Tutorial link ini akan memastikan module Radio RF nRF24L01+ dapat berfungsi dengan baik, disamping anda dapat biasakan diri dengan coding untuk module ini,

Tutorial berikut pula, anda dapat pelajari asas menggunakan Blynk App pada smartfon, bersama kaedah coding yang mudah. Paling penting, anda akan pelajari bagaiman menggunakan module WiFi ESP8266.

Senarai Library yang diperlukan:

  1. Download dan install Library nRF24L01.h
  2. Download dan install Library Blynk

 

SAMBUNGAN DIAGRAM
(Unit Transmitter)

Transmitter Circuit

SKETCH CODING ARDUINO 
(Unit Transmitter)

Copy, Paste dan Uploadkan sketch di bawah ke dalam unit Unit-Transmitter anda. Atau anda boleh Download file .ino untuk coding tersebut melalui URL di bawah:

//Project : Home Security Node Transmitter
//Perinci : Transmitter Unit
//Code disediakan oleh MatGyver.my

#include <SPI.h>       //masukkan library SPI, nRF menggunakan komunikasi SPI
#include <nRF24L01.h>  //masukkan library nRF24L01
#include <RF24.h>      //masukkan library RF24L

const uint64_t pipeOut = 0xA8A8F6F6E1LL; //address/alamat unik ditentukan oleh pengguna

RF24 radio(9, 10); //pin CE(9) & CSN(10)
//MOSI(11) , SCK(13) , MISO(12)

//Struktur Data-Array yang akan di transmit setiap cycle
//data dinamakan MyData
struct MyData {
 byte but1;     //1 byte data digunakan untuk menghantar status butang
};               // boleh hantar sehingga 32 byte data dalam satu cycle penghnataran data

MyData data; //prefix "data" diletakkan kepada setiap individu-array dalam MyData

void setup(){ //PERMULAAN VOID SETUP
 pinMode(4, INPUT_PULLUP); //butang disambung pada digital pin 4

 delay(100);

 Serial.begin(9600);  //Serial untuk debug/check coding output
 
 radio.begin();                   //memulakan radio nRF
 radio.setAutoAck(false);         
 radio.setDataRate(RF24_250KBPS); //kelajuan penghantaran data nRF

 radio.openWritingPipe(pipeOut);  //set module nRF sebagai transmitter(pipeOut)

 data.but1 = 0;                   //nilai permulaan variable untuk butang bersamaan 0

 delay(300);
} //PENUTUP VOID SETUP

//PROGRAM UTAMA
void loop(){ //permulaan void loop 
 if(digitalRead(4) == LOW){  //jika butang ditekan, send nilai 255 pada radio
   data.but1 = 255;
 }
 if(digitalRead(4) == HIGH){ //jika butang dilepas, send nilai 0 pada radio
   data.but1 = 0;
 }
 
 radio.write(&data, sizeof(MyData)); //send semua data set array MyData kepada penerima

 checkserial();  //check data pada serial monitor adakah butang berfungsi
}

//
void checkserial(){ //seria print untuk debug
 Serial.print("Butang 1: ");  //serial print nilai butang
 Serial.println(data.but1);   //serial print nilai butang
}

Anda boleh semak jika, butang anda berfungsi, dengan melihat dalam Serial Monitor, dan paparan output adalah seperti berikut:

Anda boleh semak jika, butang anda berfungsi, dengan melihat dalam Serial Monitor, dan paparan output adalah seperti berikut:

Transmit-Off
Output nilai ‘0’ ketika butang Off

Transmit-On
Output Nilai 255 ketika butang ON

Namun, anda tidak dapat semak jika data tersebut berjaya ditransmit melalui module nRF24 atau tidak, jika anda tidak mempunyai Unit Receiver.

SETTING BLYNK APP
(Unit Receiver)

Buka App Blynk dalam Smart-Fon dan ikuti langkah-langkah berikut:

BLYNK 1

STEP 1: Create projek baru dengan menekan icon “+ New Project”.
Juga, anda boleh berikan nama kepada project seperti “Home Security”.

STEP 2: Pilih setting komponen Arduino anda.
Anda boleh berikan nama pada projek anda pada ruang “Project Name”.
Pilih “Arduino UNO” pada CHOOSE DEVICE.
Pilih “WiFi” pada CONNECTION TYPE.
Tekan butang CREATE.

STEP 3: Selepas berjaya Create Project, Blynk akan menghantar email dengan code Auth Token. Token ini perlu dicatit dan dimasukkan dalam coding nanti.

BLYNK 2

STEP 4: Anda boleh cek email untuk menyemak dan salin code Auth Token.

STEP 5: Cari icon “+” di atas-kanan untuk menambahkan komponen-widget dalam project.

STEP 6: Pastikan anda masukkan 3 Widget seperti dalam rajah di atas.

  1. LCD Widget (tengah atas)
  2. LED Widget (kiri bawah)
  3. BUTTON Widget (kanan bawah)

PERHATIAN: Bilangan Widget yang boleh digunakan dalam App Blynk adalah bergantung pada jumlah “ENERGY” anda. Blynk memberi 2000 Energy Percuma pada awalnya. Energy ini boleh di-claim semula apabila mana-mana project di-delete. Anda juga boleh membeli Energy untuk projek-projek yang lebih kompleks yang menggunakan banyak widgets.

BLYNK3

STEP 7: Untuk setting Widget LED , letakkan input V1 (Virtual V1).

STEP 8: Untuk setting Widget LCD , letakkan input V2 (Virtual V2).

STEP 9: Untuk setting Widget Button , letakkan input V3 (Virtual V3).

BLYNK4

STEP 10: Sesudah seting, tekan butang “RUN” yang berbentuk segitiga di atas-kanan untuk RUN App anda.

STEP 11: Apabila coding di bawah sudah dimasukkan, anda akan mendapat paparan seperti dalam STEP 11.

STEP 12: Apabila Butang ditekan, anda akan mendapat paparan ALARM seperti dalam rajah STEP 12.

Kemudian masukkan coding/sketch untuk projek ini, seperti di bawah.

SAMBUNGAN DIAGRAM
(Unit Receiver)

Receiver Circuit

SKETCH CODING ARDUINO 
(Unit Receiver)

Copy, Paste dan Uploadkan sketch di bawah ke dalam unit Arduino-Receiver anda. Atau anda boleh Download file .ino untuk coding tersebut melalui URL di bawah:

//Project : Home Security Node Transmitter
//Perinci : Transmitter Unit
//Code disediakan oleh MatGyver.my

/*************************************************************
  Blynk is a platform with iOS and Android apps to control
  Arduino, Raspberry Pi and the likes over the Internet.
  You can easily build graphic interfaces for all your
  projects by simply dragging and dropping widgets.

    Downloads, docs, tutorials: http://www.blynk.cc
    Blynk community:            http://community.blynk.cc
    Social networks:            http://www.fb.com/blynkapp
                                http://twitter.com/blynk_app

  Blynk library is licensed under MIT license
  This example code is in public domain.

 *************************************************************
  WARNING!
    It's rather tricky to get it working, please read this article:
    https://github.com/blynkkk/blynk-library/wiki/ESP8266-with-AT-firmware

  Blynk using a LED widget on your phone!

  App project setup:
    LED widget on V3

  WARNING :
  For this example you'll need SimpleTimer library:
    https://github.com/jfturcot/SimpleTimer
  Visit this page for more information:
    http://playground.arduino.cc/Code/SimpleTimer
 *************************************************************/

#define BLYNK_PRINT Serial

#include <ESP8266_Lib.h>                //library untuk module WiFi ESP8266
#include <BlynkSimpleShieldEsp8266.h>   //library untuk Blynk
#include <SimpleTimer.h>

#include <SPI.h>                        //library untuk mdule nRF24
#include <nRF24L01.h>                   //library untuk mdule nRF24
#include <RF24.h>                       //library untuk mdule nRF24

// Setting untuk auth token yang didapati dalam email
char auth[] = "4fb6252baaa447af9b6aeb674982d5e0"; //masukkan code auth token anda di sini

// Maklumat WiFi
// Set password pada "" untuk network tanpa password.
char ssid[] = "********";  //letakkan nama WiFi Network di sini
char pass[] = "*******"; //letakkan PASSWORD WiFi Network di sini

//Setting untuk Software Serial Uno atau Nano...
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(2, 3); // RX, TX

//SETTING ESP8266
// Kelajuan Baud Rate Module ESP8266:
#define ESP8266_BAUD 9600

ESP8266 wifi(&EspSerial);

//SETTING/DECLARE WIDGET LED
WidgetLED led3(V1); //Virtul LED dalam blynk pada pin V1

//SETTING/DECLARE WIDGET LCD
WidgetLCD lcd(V2); //pin Virtual V2 sebagai input pada Blynk LCD

//SETTING MODULE NRF24
struct MyData {     //data-array untuk input dari nRF24
 byte inbut1;
};

MyData data;        //data-array untuk input dari nRF24

const uint64_t pipeIn = 0xA8A8F6F6E1LL;

RF24 radio(9, 10); //pin CE & CN (pin data)

//VARIABLE UNTUK MEMBACA DATA INPUT BUTANG RESET
int statbut1 = 0; //initial value of Virtual RESET PIN in Blynk

//CODING/SETTING WAJIB UNTUK MENGGUNAKAN BUTANG VIRTUAL DALAM BLYNK APP
boolean btnState = false;

BLYNK_WRITE(3) //virtual pin V3 declare sebagai input
{
 int pinValue = param.asInt();
 if (pinValue == 1) {
 statbut1 = 100; //jika Virtual button V1 ON, letak value 100
 }
 else {
 statbut1 = 0;   //jika Virtual button V1 ON, letak value 0
 }
}

void setup()
{
 ///**STARTUP RADIO**///
 radio.begin();
 radio.setAutoAck(false);
 radio.setDataRate(RF24_250KBPS);

 radio.openReadingPipe(1,pipeIn);
 radio.startListening();
 ///**STARTUP RADIO**///

 delay(100);

 ///**DECLARE INPUT RF DATA**///
 data.inbut1 = 0;
 ///**DECLARE INPUT RF DATA**///

 delay(500);
 
 //MULAKAN SERIAL MONITOR UNTUK SEMAK/DEBUG
 Serial.begin(9600);

 //MULAKAN DAN SET MODULE WiFi ESP8266
 EspSerial.begin(ESP8266_BAUD);
 delay(10);

 //MULAKAN BLYNK LIBRARY
 Blynk.begin(auth, wifi, ssid, pass);

 //PERMULAAN DISPLAY LCD
 lcd.clear();
 lcd.print(4, 0, "SISTEM");    //DATA PADA BARIS PERTAMA
 lcd.print(4, 1, "START...");  //DATA PADA BARIS KEDUA 

 delay(2000);

 lcd.clear(); //CLEARKAN LCD
}

unsigned long lastRecvTime = 0;

void loop()
{
 while ( radio.available() ) {        //CHECK DATA INPUT DARI NRF24
   radio.read(&data, sizeof(MyData));
   lastRecvTime = millis();
 }

 unsigned long now = millis();        //FAIL-SAFE VALUE JIKA TIADA DATA RECEPTION
 if ( now - lastRecvTime > 1000 ) {
   data.inbut1 = 0;
 }
 
 byte But1 = data.inbut1;             //SIMPAN DATA INPUT DARI NRF24 DALAM But1

 //KONDISI APABILA BUTANG TIDAK DITEKAN
 if (data.inbut1 == 0){               
 NormalCondition();        //AKTIFKAN FUNGSI NORMAL JIKA TIADA INPUT BUTANG
 }

 if (data.inbut1 == 255){
 AlarmCondition();         //AKTIFKAN FUNGSI ALARM JIKA TIADA INPUT BUTANG
 }

 checkserial();            //SERIAL PRINT INPUT DARI BUTANG UNTUK DEBUG
 
 Blynk.run();              //PASTIKAN BLYNK SENTIASA ACTIVATE
 
}

//CODING UNTUK FUNGSI NORMAL
void NormalCondition(){
 lcd.print(0, 0, "Rumah Anda");
 lcd.print(0, 1, "Selamat");
}

//CODING UNTUK FUNGSI ALARM
void AlarmCondition(){
 lcd.clear();

 //CODING/CYCLE UNTUK ALARM CONDITION
 while(statbut1 == 0){
    lcd.print(0, 0, "!!!PERHATIAN!!!");
    lcd.print(0, 1, "PINTU TERBUKA!!!");
    led3.on();
    delay(300);   //DELAY MENYALA
    lcd.clear();
    led3.off();
    delay(200);   //DELAY OFF
    Blynk.run();                      //PASTIKAN BLYNK SENTIASA ACTIVATE
    Blynk.syncVirtual(V3);            //CODING UNTUK MEMASTIKAN BUTANG RESET DAPAT DI BACA
    checkserial();
    }

    //CODING UNTUK KONDISI RESET
    lcd.clear();
    delay(500);
    lcd.print(0, 0, "ADMIN RESET");
    lcd.print(0, 1, "Sila Tunggu...");
    delay(1500);
    lcd.clear();
    lcd.print(0, 0, "Keadaan");
    lcd.print(0, 1, "Normal");
    delay(800);
    lcd.clear();
}

//CODING UNTUK CHECK SERIAL INPUT
void checkserial()
{
 Serial.print(" But1:");
 Serial.println(data.inbut1);
}

AKAN BERSAMBUNG….

 

Jika anda dapati artikel ini membantu korang dan project korang, jangan lupa untuk sumbangkan “Like” pada artikel, atau kongsikan artikel ini supaya kami lebih bersemangat untuk kongsikan artikel-artikel yang lebih mantap!

DISCLAIMER: TENTANG MATGYVER.MY

Artikel-artikel di MatGyver.my ditulis khas untuk DIY-ers dan Hobbyist yang tiada latar belakang Electronics Engineering mahupun Mechanical Engineering. Setiap artikel MatGyver.my diolah dan digubah semudah yang mungkin bertujuan untuk mempermudahkan pemahaman dan penggunaan sesuatu komponen teknikal untuk aktiviti DIY. Artikel-artikel di MatGyver.my tidak sesuai untuk pembaca yang memerlukan info yang terlalu detail dan sangat mendalam sehingga boleh mendapat segulung Ijazah Sarjana Muda Electronics Engineering atau Mechanical Engineering.

Namun, kami alu-alukan anda-anda yang hebat untuk memberi penjelasan yang lebih terperinci pada mana-mana persoalan yang timbul tentang 2 topik utama di atas.

Hantar Data ke Google Sheets | NodeMCU/ESP32

Dalam Tutorial ini, MatGyver akan menerangkan kaedah menghantar data dari NodeMCU / ESP32 ke Google Sheets menggunakan API dan Google Apps Script.

Ini merupakan satu kaedah mudah untuk anda menyimpan rekod data-data sensor atau project secara CLOUD di Online, dan anda boleh akses data pada bila-bila masa serta convert file Google Sheets TERUS kepada file .XLS

GOOGLE APPS SCRIPT

Carta-alir komunikasi Data ke Google Sheets

Sebagaimana Ms Excel boleh diprogramkan/automasikan menggunakan Macro/VB-Programming, Google Sheets juga boleh diprogramkan dimana Google Apps Script menjadi base programming platformnya.

Google Apps Script telah disediakan oleh Google sebagai Platform Programming Automasi untuk kegunaan kesemua Applikasi dalam Google Workspace, seperti, Gmail, Google Sheets, Google Meet, Google Calendar dan lain-lainnya.

Dalam carta-alir di atas, CLIENT atau NodeMCU akan menghantar API Request kepada Google Apps Script, dan Google Apps Script akan menerima dan menyusun data ke dalam Google Sheets.

HARDWARE – NODEMCU / ESP32

NodeMCU ESP8266
ESP32

Dalam tutorial ini, kita akan menggunakan NodeMCU ESP8266, dan anda juga boleh menggunakan ESP32 dengan menggunakan kaedah yang sama diterangkan dalam artikel ini.

STEP 1: CIPTA SPREADSHEET

Bagi memulakan tutorial, kita akan mencipta SpreadSheet baru dalam Google Sheets.

NEW > Google Sheets > Blank Spreadsheet

Berikan nama Sheet ini DHTSensor atau nama yang anda mahukan.

Cipta 4 Nama Data; “name“, “id, “temperature” dan “humidity“.

Ini hanyalah 4 contoh nama data sebagai contoh simulasi sahaja. Setelah anda memahami kaedah yang betul penghantaran data, anda boleh menggunakan apa nama sekali-pun.

Setelah selesai, pastikan anda savekan Spread Sheet.

STEP 2: SIMPAN URL SPREADSHEET

Pastikan anda menyimpan URL Spreadsheet anda yang bermula dengan docs.google.com dan berakhir dengan #gid=0.

URL ini diperlukan untuk kegunaan Google Apps Script selepas ini.

STEP 3: CIPTA NEW PROJECT – GOOGLE APPS SCRIPT

Seterusnya, kita akan mencipta New Project dalam Google Apps Script.

NEW > More > Google Apps Script

Paparan Apps Script adalah seperti di atas, dan anda boleh terus berikan Nama untuk Project Apps Script ini, contohnya sendData.

STEP 4: SETUP & CODE APP SCRIPT

Berikut adalah Coding Penuh yang anda perlu PASTE dalam App Script.

function doGet(e) { 

var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
var sheet = ss.getSheetByName("Sheet1");

  addData(e,sheet);
}

function doPost(e) { 
  var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
  var sheet = ss.getSheetByName("Sheet1"); 
  
  addData(e,sheet);
}


function addData(e,sheet) {
  var name = e.parameter.name ; 
  var id = e.parameter.id ;
  var temperature = e.parameter.temperature;
  var humidity = e.parameter.humidity;

  sheet.appendRow([name,id,temperature,humidity]);
}

Dalam code ini terdapat 2 Code Function API untuk fungsi POST dan GET.
Ini bermakna, Script ini boleh menerima samada POST Request atau GET Request.

Function ke-3, addData(e,sheet) akan menyusun data ke dalam Google Sheets.

“URL Google Sheets Anda”

function doGet(e) { 

var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
var sheet = ss.getSheetByName("Sheet1");

  addData(e,sheet);
}

function doPost(e) { 
  var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
  var sheet = ss.getSheetByName("Sheet1"); 
  
  addData(e,sheet);
}

Dalam Code Script, gantikan “URL Google Sheets Anda” kepada URL yang telah anda copy dalam STEP 2.

“Sheet1”

Dalam Code Script, pastikan “Sheet1” adalah SAMA dengan SHEET yang aktif dalam Google Sheets anda. Pastikan ejaan Huruf-Besar dan Huruf-Kecilnya sama.

CONTOH CODE PENUH APP SCRIPT

App Script anda perlu kelihatan seperti contoh di atas ini.

STEP 5: VARIABLE PENTING APP SCRIPT

Bahagian addData() adalah bahagian terpenting bagi membolehkan fungsi penerimaan data dari device, kemudian penghantaran data ke Google Sheets.

function addData(e,sheet) {
  var name = e.parameter.name ; 
  var id = e.parameter.id ;
  var temperature = e.parameter.temperature;
  var humidity = e.parameter.humidity;

  sheet.appendRow([name,id,temperature,humidity]);
}

Jika anda perhatikan, terdapat 4 Variable yang mewakili 4 data yang bakal kita hantar ke Google Sheets.

name, id, temperature, humidity

Setiap variable ini perlu wujud 3 kali dalam Function ini.

Berikut di bawah, adalah CONTOH sahaja, jika anda mempunyai tambahan variable lain, hanya untuk rujukan. Pastikan anda teliti dan perhatikan struktur perletakan setiap variable di 3 lokasi.

function addData(e,sheet) {
  var name = e.parameter.name ; 
  var id = e.parameter.id ;
  var temperature1 = e.parameter.temperature1;
  var temperature2 = e.parameter.temperature2;
  var humidity1 = e.parameter.humidity1;
  var humidity2 = e.parameter.humidity2;

  sheet.appendRow([name,id,temperature1,temperature2,humidity1,humidity2]);
}

STEP 6: SAVE & AKTIFKAN / DEPLOY SCRIPT

Setelah selesai membina coding App Script, teruskan untuk DEPLOY (aktifkan).
DEPLOY > NEW DEPLOYMENT

Dalam Window “New Deployment” klik butang konfigurasi dan pilih Web App sebagai kaedah deployment.

Di bahagian “Who has access” klik pilihan ANYONE.
Kemudian klik butang DEPLOY.

Seterusnya, AUTHORIZE ACCESS diperlukan sebagai sekuriti.

Pilih Google Account yang akan digunakan bersama App Script ini.

Di window Google Verification, teruskan dengan menekan ADVANCED, dan teruskan ke “Go to <Nama App Script> (unsafe)”.

Langkah terakhir deployment adalah dengan menekan butang ALLOW.

Setelah App Script berjaya di deploy, Window ini akan terpapar.
2 maklumat akan diberikan, iaitu:

  • Deployment ID
  • Web App URL

Copy dan simpan kedua-dua maklumat dalam Notepad, bagi kegunaan coding untuk NodeMCU.

STEP 7: SEMAK KEWUJUDAN APP SCRIPT PROJECT DALAM DRIVE

Setelah berjaya deploy App Script, anda boleh semak kesemua App Script Project yang telah anda cipta . Rujuk rajah berikut.

STEP 1 : Tekan logo App Script
STEP 2 : Tekan “My Projects”

Kemudian anda dapat lihat senara App Script Project yang telah anda cipta.

STEP 8: CODING NODEMCU / ESP32

Coding untuk NodeMCU ESP8266

Perhatikan 2 Library (Untuk NodeMCU ESP8266) :

  • ESP8266WiFi.h
  • WiFiClientSecure.h

Kedua-dua library ini TIDAK PERLU DIDOWNLOAD kerana mereka TELAH DI-INSTALL semasa Library Board NodeMCU di tambahkan dalam Arduino IDE.

Berikut adalah Library untuk ESP32:

  • WiFi.h
  • WiFiClientSecure.h

Juga, library TELAH DI-INSTALL semasa penambahan Board Library ESP32.

//Code Program Prepared by matgyver.my
//June 2022

//UNTUK ESP832
//#include <WiFi.h>
//#include <WiFiClientSecure.h>

//UNTUK NODEMCU ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSID WiFi";                //tukar
const char* password = "Password Wifi";        //tukar
const char* host = "script.google.com";        
String SCRIPT_ID = "APP Script Deployment ID"; //tukar

WiFiClientSecure client;

void setup() {
  //SETUP SERIAL MONITOR COMMUNICATIONS
  Serial.begin(9600);

  //SETUP WIFI CONNECTION
  Serial.println();
  Serial.print("Connecting to WiFi ");
  Serial.println(ssid);

  //INITIALIZE WIFI RADIO
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  //CONNECT WIFI
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
    
}//END VOID SETUP

void loop() {
/*************SIMULASI SENSOR*****************/  
int temperature = random(25, 38); //simulasi temperature dengan random nombor 25-38
int humidity = random(55, 83);    //simulasi humidty dengan random nombor 55-83

/*************PENGHANTARAN DATA*****************/  
  //SET CONNECTION TO INSECURE HTTPS
  client.setInsecure();

  //CONNECT TO HOST SERVER
  Serial.print("Connecting to ");
  Serial.println(host);
  
  if (!client.connect(host, 443)) {      // HTTPS Connection pada Port 443
    Serial.println("Connection failed");
    return;                              //Stop Process jika connection failed
  }
  delay(10);

  //SET STRING UNTUK DATA
  String data1 = "Muhammad";
  String data2 = "767628-09-1999";
  String data3 = String(temperature); //convert temperature kepada format data String
  String data4 = String(humidity);    //convert humidity kepada format data String
  
  //KOMBINASI SEMUA DATA DALAM 1 STRING
  String data = "name="+data1+"&id="+data2+"&temperature="+data3+"&humidity="+data4;

  //SET STRING URL UNTUK REQUEST
  String url = "/macros/s/" + SCRIPT_ID + "/exec?" + data;
  Serial.print("Requesting URL: ");
  Serial.println(url);

  //HANTAR GET API Request
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266-Saya\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("Request sent");
  delay(300);

  //VARIABLE MENYIMPAN SERVER REPLY
  String fullResponse;
  String htmlResponse;
  String responseHeader;
  String responseBody;
  
  //WHILE/TUNGGU REPLY CONTENT DARI SERVER
  while (client.connected()) { //Response Code
    htmlResponse = client.readStringUntil('\r'); //Simpan Reply dalam String "line"
    break;
    //fullResponse = client.readString(); //Uncomment untuk lihat semua HTTP Response
  }//end While Client
  
  while (client.connected()) { //Response Header
    String responseHeader = client.readStringUntil('\n');
    if(responseHeader == "\r"){
      //Serial.println("Header diTerima");
      break;
    }
  }
  responseBody = client.readStringUntil('<'); //Response Body

  //CHECK/SEMAK RESPONSE CODE
  if(htmlResponse == "HTTP/1.1 200 OK"){
    Serial.println("Request diTerima Server");
  }
  else{
    Serial.println("Request ERROR");
  }

  client.stop(); //DISCONNECT HTTPS connection (Wajib Disconnect)

//DELAY UNTUK TIDAK FLOODING SERVER 
delay(10000);
  
}//END VOID LOOp

Struktur API GET yang di Hantar

GET /macros/s/<Script-ID>/exec?name=data1&id=data2.. HTTP/1.1

Host: script.google.com
User-Agent: ESP8266-Saya
Connection: close

Struktur URL untuk Request

https://script.google.com/macros/s/<Script-ID>/exec?name=Ahmad&id=9968&temperature=36.8

....exec?data1=nilai1&data2=nilai2&data3=nilai3&data4=nilai4

Struktur data adalah dalam URLselepas /exec? , dan anda perlu pastikan NAMA setiap data adalah MATCHING dengan nama data dalam App Script.

Sebagai contoh, yang kita gunakan untuk tutorial ini adalah:
name, id, temperature, humidity

5 SAAT – DATA INTERVAL

Seperti mana-mana applikasi IoT, penghantaran Data ke Google Sheets atau Cloud tidak boleh pada kadar yang tinggi.

Sebaiknya, hantarkan pada interval 5 saat atau 10 saat.

HASIL OUTPUT

Hasil di Google Sheets

Paparan Serial Monitor

CODING NODEMCU YANG LEBIH BERSIH

Penggunaan Sub-Routine Function

//Code Program Prepared by matgyver.my
//June 2022

//Untuk ESP32
//#include <WiFi.h>
//#include <WiFiClientSecure.h>

//Untuk NodeMCU ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSID WiFi";                //tukar
const char* password = "Password WiFi";        //tukar
const char* host = "script.google.com";        
String SCRIPT_ID = "APP Script Deployment ID"; //tukar

WiFiClientSecure client;

int temperature; 
int humidity;  

void setup() {
  //SETUP SERIAL MONITOR COMMUNICATIONS
  Serial.begin(9600);

  //SETUP WIFI CONNECTION
  Serial.println();
  Serial.print("Connecting to WiFi ");
  Serial.println(ssid);

  //INITIALIZE WIFI RADIO
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  //CONNECT WIFI
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
    
}//END VOID SETUP

void loop() {
/*************SIMULASI SENSOR*****************/  
temperature = random(25, 38); //simulasi temperature dengan random nombor 25-38
humidity = random(55, 83);    //simulasi humidty dengan random nombor 55-83

/*************PENGHANTARAN DATA*****************/  
sendToGoogleSheets();  

//DELAY UNTUK TIDAK FLOODING SERVER 
delay(10000);
  
}//END VOID LOOP


void sendToGoogleSheets(){
  //SET CONNECTION TO INSECURE HTTPS
  client.setInsecure();

  //CONNECT TO HOST SERVER
  Serial.print("Connecting to ");
  Serial.println(host);
  
  if (!client.connect(host, 443)) {      // HTTPS Connection pada Port 443
    Serial.println("Connection failed");
    return;                              //Stop Process jika connection failed
  }
  delay(10);

  //SET STRING UNTUK DATA
  String data1 = "Muhammad";
  String data2 = "767628-09-1999";
  String data3 = String(temperature); //convert temperature kepada format data String
  String data4 = String(humidity);    //convert humidity kepada format data String
  
  //KOMBINASI SEMUA DATA DALAM 1 STRING
  String data = "name="+data1+"&id="+data2+"&temperature="+data3+"&humidity="+data4;

  //SET STRING URL UNTUK REQUEST
  String url = "/macros/s/" + SCRIPT_ID + "/exec?" + data;
  Serial.print("Requesting URL: ");
  Serial.println(url);

  //HANTAR GET API Request
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266-Saya\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("Request sent");
  delay(300);

  //VARIABLE MENYIMPAN SERVER REPLY
  String fullResponse;
  String htmlResponse;
  String responseHeader;
  String responseBody;
  
  //WHILE/TUNGGU REPLY CONTENT DARI SERVER
  while (client.connected()) { //Response Code
    htmlResponse = client.readStringUntil('\r'); //Simpan Reply dalam String "line"
    break;
    //fullResponse = client.readString(); //Uncomment untuk lihat semua HTTP Response
  }//end While Client
  
  while (client.connected()) { //Response Header
    String responseHeader = client.readStringUntil('\n');
    if(responseHeader == "\r"){
      //Serial.println("Header diTerima");
      break;
    }
  }
  responseBody = client.readStringUntil('<'); //Response Body

  //CHECK/SEMAK RESPONSE CODE
  if(htmlResponse == "HTTP/1.1 200 OK"){
    Serial.println("Request diTerima Server");
  }
  else{
    Serial.println("Request ERROR");
  }

  client.stop();//DISCONNECT HTTPS Connection
  
}//END sendToGoogleSheets

PENAMBAHAN TIMESTAMP – Untuk Maklumat Masa Data

TimeStamp atau maklumat masa data diperlukan untuk Data Acquisition yang tepat.

Terdapat beberapa kaedah mendapatkan maklumat masa untuk TimeStamp:

  1. Menggunakan RTC Module sebagai Module yang menyimpan maklumat masa. Kemudian hantarkan masa tersebut dari NodeMCU.
  2. Menggunakan Library Time NTP Server, di mana masa diambil dari Server NTP tanpa menggunakan RTC module, dan dihantar dari NodeMCU.
  3. Menggunakan Google Server timeStamp yang boleh dipanggil terus dari AppScript.

Contoh berikut akan menggunakan kaedah ke-3, iaitu kita memanggil maklumat TimeStamp dari AppsScript.

STEP #1: Ubah Google Sheets

Tambahkan satu lagi COLUMN disebelah kiri Sheets untuk maklumat timeStamp dan berikan nama timeStamp.

STEP #2: Ubah Apps Script

Dalam script di bawah, hanya terdapat perubahan kecil sahaja di bahagian Function addData().

function doGet(e) { 

var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
var sheet = ss.getSheetByName("Sheet1");

  addData(e,sheet);
}

function doPost(e) { 
  var ss = SpreadsheetApp.openByUrl("URL Google Sheets Anda");
  var sheet = ss.getSheetByName("Sheet1"); 
  
  addData(e,sheet);
}


function addData(e,sheet) {
  var name = e.parameter.name ; 
  var id = e.parameter.id ;
  var temperature = e.parameter.temperature;
  var humidity = e.parameter.humidity;

  var timeStamp = Utilities.formatDate(new Date(), "Asia/Kuala_Lumpur", "yyyy-MM-dd HH:mm:ss"); 
  // "yyyy-MM-dd'T'HH:mm:ss'Z'"

  sheet.appendRow([timeStamp,name,id,temperature,humidity]);
}

timeStamp dalam code ini adalah untuk region Malaysia/Kuala Lumpur yang diambil dari server.

STEP #3: Deploy Semula Apps Script

Selepas RE-DEPLOY, ID Template Apps Script yang baru akan di jana.
Rujuk penerangan sebelum ini.

STEP #4: Coding NodeMCU

Gantikan Apps Script ID di Coding NodeMCU dengan ID yang baru.
Dan modifikasi selesai untuk TimeStamp.

CODING UNTUK ESP32

Bagi ESP32 pula, coding adalah sama.
Perubahan hanyalah pada penukaran #include <ESP8266WiFi.h> kepada #include <WiFi.h>

Coding yang lain adalah sama.

//Code Program Prepared by matgyver.my
//June 2022

#include <WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSID WiFi";                //tukar
const char* password = "Password WiFi";        //tukar
const char* host = "script.google.com";        
String SCRIPT_ID = "APP Script Deployment ID"; //tukar

WiFiClientSecure client;

int temperature; 
int humidity;  

void setup() {
  //SETUP SERIAL MONITOR COMMUNICATIONS
  Serial.begin(9600);

  //SETUP WIFI CONNECTION
  Serial.println();
  Serial.print("Connecting to WiFi ");
  Serial.println(ssid);

  //INITIALIZE WIFI RADIO
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  //CONNECT WIFI
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
    
}//END VOID SETUP

void loop() {
/*************SIMULASI SENSOR*****************/  
temperature = random(25, 38); //simulasi temperature dengan random nombor 25-38
humidity = random(55, 83);    //simulasi humidty dengan random nombor 55-83

/*************PENGHANTARAN DATA*****************/  
sendToGoogleSheets();  

//DELAY UNTUK TIDAK FLOODING SERVER 
delay(10000);
  
}//END VOID LOOP


void sendToGoogleSheets(){
  //SET CONNECTION TO INSECURE HTTPS
  client.setInsecure();

  //CONNECT TO HOST SERVER
  Serial.print("Connecting to ");
  Serial.println(host);
  
  if (!client.connect(host, 443)) {      // HTTPS Connection pada Port 443
    Serial.println("Connection failed");
    return;                              //Stop Process jika connection failed
  }

  //SET STRING UNTUK DATA
  String data1 = "Muhammad";
  String data2 = "767628-09-1999";
  String data3 = String(temperature); //convert temperature kepada format data String
  String data4 = String(humidity);    //convert humidity kepada format data String
  
  //KOMBINASI SEMUA DATA DALAM 1 STRING
  String data = "name="+data1+"&id="+data2+"&temperature="+data3+"&humidity="+data4;

  //SET STRING URL UNTUK REQUEST
  String url = "/macros/s/" + SCRIPT_ID + "/exec?" + data;
  Serial.print("Requesting URL: ");
  Serial.println(url);

  //HANTAR GET API Request
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266-Saya\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("Request sent");
  delay(300);

  //VARIABLE MENYIMPAN SERVER REPLY
  String fullResponse;
  String htmlResponse;
  String responseHeader;
  String responseBody;
  
  //WHILE/TUNGGU REPLY CONTENT DARI SERVER
  while (client.connected()) { //Response Code
    htmlResponse = client.readStringUntil('\r'); //Simpan Reply dalam String "line"
    break;
    //fullResponse = client.readString(); //Uncomment untuk lihat semua HTTP Response
  }//end While Client
  
  while (client.connected()) { //Response Header
    String responseHeader = client.readStringUntil('\n');
    if(responseHeader == "\r"){
      //Serial.println("Header diTerima");
      break;
    }
  }
  responseBody = client.readStringUntil('<'); //Response Body

  //CHECK/SEMAK RESPONSE CODE
  if(htmlResponse == "HTTP/1.1 200 OK"){
    Serial.println("Request diTerima Server");
  }
  else{
    Serial.println("Request ERROR");
  }
}//END sendToGoogleSheets


Selamat Mencuba!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.

end

IR(infrared) Receive dan Send dengan Arduino

Remote TV, Remote Aircond, Remote Kipas, semua remote kebanyakannya berasaskan komponen Infrared LED Transmitter dan Receiver.

Hanya terdapat beberapa jenama kipas sahaja yang menggunakan kaedah Transmisi Radio Frequency, yang mana TIDAK menggunakan Sistem IR LED.

Dalam Tutorial ini, kami akan menerangkan bagaimana MENERIMA serta MENGHANTAR Signal IR Remote menggunakan Arduino/NodeMCU dengan menggunakan Library IR Remote.

LIBRARY UPDATE 2021

Kali terakhir kami menggunakan Library IR Remote adalah pada tahun 2019, sewaktu menghasilkan video di bawah, mengawal Aircond melalui Blynk App.

Library IR Remote pada 2019 adalah tidak SOLID dan tidak STABIL berbanding Library IR Remote 2021. Mendapatkan Data dari Aircond telah melibatkan kerja-kerja pengubahsuaian Library dan sebagainya.

Tahun 2021, Library IR Remote, telah di RE-VAMP oleh komuniti GitHub, menjadikannya lebih padu, tetapi penggunaanya adalah kompleks terutamanya bagi Beginners yang tidak faham maksud-masud syntax coding. Tanpa pemahaman syntax coding dan kaedah penggunaan, Library iniakan menjadi sangat sukar.

Beberapa Project yang dapat di hasilkan menggunakan Library IR Remote 2021 adalah:

  • Custom Remote Control IR
  • Kawal Project anda dengan Remote IR sedia ada

AMARAN!
Project berkaitan Arduino bukan semudah Copy-Paste. Pengguna perlu FAHAM Konsep, Fizik, Mekanisma disebalik setiap applikasi dan sensor. Sila baca SEMUA INFO yang terdapat dalam artikel ini untuk mendapat gambaran dan pemahaman yang jelas.
Pemahaman penting untuk memahami sebarang masalah yang bakal berlaku ketika membuat project yang berkaitan.

SISTEM INFRARED LED TRANSMIT/RECEIVE

Sistem Infrared (IR) Remote

Setiap device Remote Infrared pasti akan mempunyai sekurang-kurangnya 2 Komponen Utama, iaitu MicroController dan juga IR LED, untuk Transmit Data.

IR LED

Infrared (IR) LED merupakan medium utama penghantaran DATA, iaitu melalui Cahaya Infrared yang dihasilkan oleh LED.

WAVELENGTH
Wavelength untuk Infrared LED yang biasa dijual adalah dalam lingkungan 800nM~900nM.

JENIS DAN JARAK TRANSMISI
Jarak penghantaran Data Transmisi untuk sistem Infrared bergantung pada Kepadatan-Cahaya-Infrared dan juga pada Power-Transmisi LED yang biasanya dalam lingkungan 15mW/Sr ~ 25mW/Sr.
mW/Sr adalah Unit Radiant Intensity Power dalam unit milliwatt per Steradian.

LED yang biasa dijual, dan mudah didapati HANYAlah dalam lingkungan 15mW/Sr ~ 25mW/Sr yang boleh memberikan jarak transmisi sehingga 3m~5m.

Terdapat juga jenis LED IR yang mempunyai sehingga 600mW/Sr, tetapi sangat sukar untuk didapati dari penjual/kedai-kedai biasa.

Kaedah mudah untuk meningkatkan Jarak-Transmisi adalah melalui penggunaan Reflector di bahagian belakang LED atau penambahan Kanta untuk memfokuskan Cahaya-Transmisi.
Boleh rujuk artikel berikut untuk mendapat gambaran yang lebih jelas:
https://www.wikihow.com/Improve-Remote-Control-Effectiveness

MENGAPA CAHAYA INFRARED ?
Cahaya Infrared tidak TAMPAK dengan mata kasar. Oleh itu, Transmisi Infrared tidak akan mengganggu penglihatan manusia. Jika ia tampak, maka sekeliling kita dalam rumah contohnya, akan penuh dengan sinar-sinar cahaya yang tidak diingini menyala dan berkelip.

Dalam masa yang sama, LED adalah antara komponen termurah dan termudah untuk di hasilkan. Dengan itu, sistem Remote dapat dihasilkan dengan Kos yang sangat rendah.

MICROCONTROLLER

MENGAPA PERLU MICROCONTROLLER ?
MicroController adalah peranti yang akan mengawal 2 perkara penting:

  • MengSTRUKTURkan DATA yang dihantar
  • Mengawal MODULASI FREQUENCY Transmisi Infrared
Contoh Signal Data Infrared yang lebih perinci

PENGHANTARAN DATA
Jika diperhatikan contoh data ringkas di atas, terdapat 8-bit Signal iaitu 01001101 yang juga mewakili Huruf “M”dalam sistem Data International, ASCII. Bagi mengstrukturkan Signal supaya data 8-bit dapat dihantar dengan tepat, MicroController perlu digunakan.
(American Standard Code for Information Interchange)

ASCII TABLE DATA
Standard Data ASCII adalah standard yang diguna-pakai untuk hampir kesemua device, seperti Internet, USB, WhatsApp, komputer, dan semua device-device intelligent, semua, menggunakan Standard Data ASCII bagi membuat komunikasi.

Terdapat 3 Jenis-Format data yang boleh dihasilkan dari 1 set binary 8-bit.
Jika 01001101 adalah ASCII “M”.
Ia juga boleh bererti:

  • 77 dalam format Decimal
  • 4D dalam format Hexadecimal

Apakah format yang diguna-pakai dalam setiap Jenama brand ?
Jadi, format apa yang digunakan tidak penting. Yang penting kita tahu data yang di hantar, supaya dapat digunakan semula untuk membuat Replikasi Penghantaran.

MODULASI FREQUENCY
Kepentingan Modulasi Frequency adalah untuk membezakan antara Cahaya Infrared yang terdapat pada Cahaya Matahari, Mentol, dan juga perkakas lain.
Dengan adanya modulasi frequency, Signal Infrared dapat di hantar pada frequency tertentu yang berbeza dan unik, supaya tiada gangguan penghantaran data.

Modulasi Frequency yang digunakan oleh Sistem IR Remote adalah pada 38kHz. Bagi menghasilkan modulasi yang laju dan tepat sebegini, penggunaan MicroController amat diperlukan.

INFRARED RECEIVER

Terdapat 2 jenis Infrared Receiver Diode yang biasa digunakan dalam applikasi Infrared Remote:

TSOP38238 dan VS1838B

Nombor-Komponen ini amat penting kerana 2 model ini mempunyai Built-In Frequency Filter 38kHz. Nombor-Komponen yang berlainan akan mempunyai Frequency-Filter yang berlainan.

38kHz merupakan STANDARD yang digunakan oleh hampir semua Device Infrared Remote.

PROTOCOL DATA BERLAINAN BRAND/JENAMA

SETIAP BRAND seperti Sony, Samsung, DEKA, York dan lain-lain, mempunyai PROTOCOL DATA yang berlainan, namun, menggunakan Format-Binary yang sama. Ini penting untuk diketahui sebelum memulakan project Infrared, kerana terdapat SETTING yang terlibat dalam Coding Arduino bagi melaraskan Sistem untuk menerima data yang sesuai.

Dalam masa yang sama, setiap BRAND ini kebanyakannya TIDAK mengkongsikan Struktur Data mereka kepada umum. Kebanyakan struktur data mereka hanya diketahui selepas Kajian-Reverse-Engineering dari para Hobbyist.

Senarai Remote IR yang telah kami Testing
Format Data Remote yang telah kami Test

Jadual Data di atas adalah hasil testing yang kami jalankan menggunakan Library IR Remote.h , yang akan diterangkan selepas ini.

UNKNOWN DATA – TIDAK BERJAYA

Dari jadual, kita dapat lihat ada kemungkinan Protocol yang dikesan dari Library Arduino adalah bersifat UNKNOWN, yang mana bentuk data 8-bit nya tidak dapat dikesan.
Dalam masa yang sama, TIDAK SEMUA Remote dapat dibaca semua data.

Jika anda lihat, terdapat 2 Remote yang kami tidak dapat kesan bentuk datanya berlabel “Tidak Berjaya”. Jika ini berlaku, kita TIDAK DAPAT TRANSMIT-SEMULA signal tersebut.

RAW PULSE

Terdapat juga data yang berada dalam bentuk RAW-PULSE, yang mana, data 8-bitnya dapat dikesan, tetapi struktur data tidak diketahui.
Untuk kes sebegini, datanya dapat di-Hantar Semula.

SIZE DATA DAN MAKLUMATNYA

Bagi setiap Brand, Size Data yang di-Transmit adalah tidak sama, TERUTAMANYA untuk Remote Aircond. Remote Aircond kebiasaannya akan mempunyai size data yang tersangat besar, dari 100bit sehingga 700bit, bergantung pada Jenis/Jenama.

Contoh: Analisa data jenis-jenis remote

Contoh Analisa-Data di atas hanya untuk rujukan sahaja dan bukanlah data yang sebenar.

Jika dilihat dari contoh di atas, Data Remote Aircond York adalah sehingga 139bit, yang mana hampir ke-SEMUA SETTING dan MODE, perlu dihantar dalam Satu-Transmisi.

AMARAN!
Bagi membaca IR Data dari Remote Aircond, Arduino UNO/MEGA/NANO TIDAK BOLEH digunakan kerana mereka mempunyai saiz memory yang kecil.
Di sini, penggunaan Board NodeMCU ESP8266 atau NodeMCU ESP32 PERLU digunakan, kerana mereka mempunyai Saiz Memori yang Besar dan juga mempunyai Processor yang laju ~200MHz berbanding UNO (8MHz/16MHz) .

LIBRARY IR Remote.h

Git Hub > IR Remote > Code > DownloadZIP

Link GitHub adalah berikut untuk Library IR Remote.h.

DOWNLOAD .zip FILE DARI FORUM GITHUB

Download Library, dan Install-kan dalam Arduino IDE sebelum boleh digunakan dalam coding.

SAMBUNGAN WIRING

Jadual Ringkasan Sambungan Wiring

Jadual di atas, adalah ringkasan sambungan Pin yang diambil dari Library IR Remote.h.
Pin Input IR adalah Pin untuk Receiver Diode IR.
Pin Output IR adalah Pin untuk IR LED Emitter.

Kedudukan Pin ini adalah tetap, dan tidak boleh diubah.

Dalam setiap EXAMPLE code yang diberikan dari Library ini, terdapat TAB yang berlabel PinDefinitionsAndMore.h . Di sini, anda boleh lihat list Pin untuk Board-board lain.

SAMBUNGAN WIRING RECEIVER DIODE IR

Komponen dan wiring untuk RECEIVING adalah sangat Straight-Forward. IR Receiver diode, TERUS disambung pada pin-pin di atas tanpa komponen lain.

Anda boleh menggunakan antara 2 model yang dinyatakan di atas, samada TSOP38238 atau VS1838B, kedua-duanya berfungsi sama.

SAMBUNGAN WIRING LED TRANSMITTER IR (Low Power)

Bagi Circuit wiring untuk Transmitter-LED, cuma 2 komponen sahaja diperlukan untuk Circuit Low-Power:

  • IR LED Transmitter
  • Resistor 220Ohm

Kegunaan resistor adalah untuk memastikan LED tidak MENARIK-CURRENT MELEBIHI Current-Rating Pin MicroController, iaitu sebanyak 20-40mA maksimum.

Low Power = Short Distance

SAMBUNGAN WIRING LED TRANSMITTER IR (High Power)

Dalam Circuit High-Power di atas, Transistor 2N2222 digunakan untuk AMPLIFY signal keluaran dari MicroController, seterusnya JARAK transmisi dapat ditingkatkan.

Senarai Komponen:

  • Infrared LED x1
  • Resistor 1 kOhm x1
  • Resistor 30~100 Ohm x1 (30Ohm jika ada)
  • Butang ( jika diperlukan)

BOARD ARDUINO / NODEMCU ?

Jika Aircond terlibat dalam Project anda, maka anda TERPAKSA menggukan samada NodeMCU ESP8266 atau ESP32.
Arduino UNO/NANO tidak dapat membaca ataupun menghantar Signal Aircond.

CODING – TERIMA DATA (Receive) DAN DECODE

Di bawah ini, adalah coding lengkap supaya Arduino dapat membaca Signal IR dari mana-mana remote, kecuali Aircond. Kami akan terangkan seterusnya, bagaimana menerima Signal dari Remote Aircond.

//SENARAI PROTOCOL YANG BOLEH DIGUNA-PAKAI (Disable sahaja jika tidak faham)

//#define DECODE_DENON        // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
//#define DECODE_NEC          // Includes Apple and Onkyo (DEFAULT ENABLED)
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6
//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

#define DECODE_DISTANCE     // universal decoder for pulse width or pulse distance protocols
//#define DEBUG // Activate this for lots of lovely debug output from the decoders.
//#define INFO                // (DEFAULT OFF) To see valuable informations from universal decoder for pulse width or pulse distance protocols
//#define DECODE_HASH         // special decoder for all protocols

/********************Struktur Jangan DiUbah******************/
#include <Arduino.h>

//PENTING!
//Define saiz Data Buffer, Terutamanya untuk remote Aircond
#if !defined(RAW_BUFFER_LENGTH)
#define RAW_BUFFER_LENGTH  100  //Size Data Standard kebanyakan IR Remote - 48 bit.(Boleh Gunakan UNO/NANO/MEGA)
//#define RAW_BUFFER_LENGTH  750  //750 bit untuk kebanyakan Aircond Remote (Gunakan ESP8266/ESP32 Sahaja!)
#endif

#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp>
/*********************************************************/

//DECLARE LIBRARY & VARIABLE LAIN DI SINI


void setup() {
    //MULAKAN SERIAL MONITOR
    Serial.begin(9600);
    
    //Enable di bawah untuk lihat version Library (TidakPenting)
    //Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_IRREMOTE));

    //Initialize IR RECEIVER Library. Default Feedback Pin adalah pin LED built-in Arduino
    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);

    //NOTA DALAM SERIAL MONITOR
    Serial.println("IR Remote Ready!");
    
}//END VOID SETUP

void loop() {
    
    //Mulakan Data Decode Jika ada data IR diterima
    //Jangan ada sebarang "DELAY" dalam set coding ini
    if (IrReceiver.decode()) {

        //Print Data IR yang diterima
        IrReceiver.printIRResultShort(&Serial);

        //Jika Protocol IR yang diterima bukan antara yang universal
        if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
            //Print info untuk data yang UNKNOWN
            Serial.println("UNKNOWN PROTOCOL:");
            IrReceiver.printIRResultRawFormatted(&Serial, true);
        }
        Serial.println();

        //ENABLE semula penerimaan IR Data. Penting untuk aktifkan semula selepas decode data.
        IrReceiver.resume(); // Enable receiving of the next value

        /*********Boleh Enable di bawah jika mahu membuat sesuatu dengan data yang diterima***********/
        //BUAT SESUATU JIKA MENERIMA DATA "ADDRESS"
        //if(IrReceiver.decodedIRData.address == 0x10) {
           //Serial.println("Address Received");
           //BUAT SESUATU DI SINI


           //KOSONGKAN MAKLUMAT ADDRESS SELEPAS MELAKSANAKAN SESUATU
           //IrReceiver.decodedIRData.address = 0;
        //}
        
        //BUAT SESUATU JIKA MENERIMA DATA "COMMAND"
        //if(IrReceiver.decodedIRData.command == 0x68) {
           //Serial.println("Command Received");
           //BUAT SESUATU DI SINI

           
           //KOSONGKAN MAKLUMAT COMMAND SELEPAS MELAKSANAKAN SESUATU
           //IrReceiver.decodedIRData.command = 0;
        //}
        /*********End Control Sesuatu***********/
           
    }//end IR Decode
    
}//END VOID LOOP

REMOTE AIRCOND

Bagi menerima Signal dari Remote Aircond, terdapat 2 perkara yang perlu dilaksanakan:

  • Perlu gunakan Board NodeMCU ESP8266/ ESP32 dan tidak boleh menggunakan UNO/NANO/MEGA
  • Perlu UBAH satu baris di dalam coding yang di tunjukkan di bawah.
//PENTING!
//Define saiz Data Buffer, Terutamanya untuk remote Aircond
#if !defined(RAW_BUFFER_LENGTH)
//#define RAW_BUFFER_LENGTH  100  //Size Data Standard kebanyakan IR Remote - 48 bit.(Boleh Gunakan UNO/NANO/MEGA)
#define RAW_BUFFER_LENGTH  750  //750 bit untuk kebanyakan Aircond Remote (Gunakan ESP8266/ESP32 Sahaja!)
#endif

Aktifkan Syntax-Coding RAW_BUFFER_LENGTH 750, dan padamkan RAW_BUFFER_LENGTH 100.

ESP8266 dan ESP32 mempunyai kapasiti Internal Memory yang besar yang mampu untuk DECODE Signal Aircond yang besar dan panjang.

REMOTE LAIN-LAIN

Jika menggunakan Board UNO/NANO/MEGA, hanya RAW_BUFFER_LENGTH 100 sahaja dapat digunakan, Signal IR Remote Aircond tidak dapat dibaca.

//PENTING!
//Define saiz Data Buffer, Terutamanya untuk remote Aircond
#if !defined(RAW_BUFFER_LENGTH)
#define RAW_BUFFER_LENGTH  100  //Size Data Standard kebanyakan IR Remote - 48 bit.(Boleh Gunakan UNO/NANO/MEGA)
//#define RAW_BUFFER_LENGTH  750  //750 bit untuk kebanyakan Aircond Remote (Gunakan ESP8266/ESP32 Sahaja!)
#endif

IrReceiver.begin()

Syntax .begin() bagi Receiver dan Transmitter adalah berbeza. Jika perlu menggunakan kedua-dua Receive dan Transmit serentak, pastikan 2 .begin() digunakan, satu untuk Receive, dan satu lagi untuk Transmit.
Rujuk seterusnya untuk coding Transmit.

DECODE PROTOCOL SPECIFIC

//#define DECODE_DENON        // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
//#define DECODE_NEC          // Includes Apple and Onkyo (DEFAULT ENABLED)
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6
//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

Jika anda mengetahui jenis protocol remote yang anda gunakan, anda boleh aktifkan mana-mana setting DECODE dibahagian atas coding. Namun, dari Testing kami, coding yang kami sediakan sudah mampu membaca hampir kebanyakan Remote.

CONTOH DAPATAN SERIAL MONITOR

3 Data Penting yang anda perlu perhatikan dari Dapatan Serial Monitor selepas scan IR Remote adalah:

  • Protocol
  • Address
  • Command

3 ini diperlukan untuk membuat Penghantaran Semula.

DATA TV SHARP

DATA ANDROID BOX

DATA KIPAS DEKA

Kipas Deka tidak dapat dikesan jenis Protocolnya, maka Library akan memberikan RAW DATA sebesar 12 Bit dalam bentuk Signal-MicroSeconds, yang boleh dihantar semula dengan fungsi .sendRaw().

DATA AIRCOND YORK

Aircond York dan juga mana-mana Aircond tidak akan dapat dikesan jenis Protocolnya kerana data yang terlalu besar sehingga 100~700 bit. Library akan memberikan RAW DATA dalam Signal Microseconds juga.

LANGKAH PENTING UNTUK AIRCOND

Data Aircond perlukan kesabaran kerana proses menggunakan RAW DATA Aircond dari Library sukar dan rumit. Rujuk gambar di bawah, Data Aircond perlu diubah struktur sebelum dapat digunakan untuk proses penghantaran.

Bagi menggunakan Data Aircond untuk dihantar semula, satu langkah penting yang perlu dilakukan adalah mengikut STEP-STEP berikut:

  • Copy Data Dapatan dari Serial Monitor
  • Pastekan dalam NotePad atau NotePad++
  • Delete dan buang simbol-simbol ‘+’ dan ‘-‘
  • Susun dan rapatkan semua data
  • Pastikan semua data mempunyai perantara komma ‘,’

NOTA PENTING:
Data perlu diubah dengan berhati-hati supaya tidak ada DATA yang TER-delete atau hilang.

CODING – HANTAR DATA TRANSMISI

WIRING DAN KOMPONEN

Dalam contoh coding berikut, Circuit High-Power telah digunakan bersama NodeMCU.

CODING TRANSMIT

/**********Declaration Library IR Remote***************/
#include <Arduino.h>
#include "PinDefinitionsAndMore.h"

//Define yang tidak diperlukan
//#define SEND_PWM_BY_TIMER
//#define USE_NO_SEND_PWM

#include <IRremote.hpp>
/******************************************************/

//DEFINE LIBRARY LAIN DI SINI


//VARIABLE UNTUK PENGUNAAN BUTANG
bool Butang1X = false;
bool Butang2X = false;
bool Butang3X = false;
bool Butang4X = false;


//VARIABLE UNTUK MENYIMPAN RAW DATA, TERUTAMANYA REMOTE AIRCOND
//(Jika ada Hex Data, ini tidak diperlukan)

//Contoh Data untuk Remote Aircond 139bit - BUTANG ON
//Nota Kaki: Signal Aircond yang panjang hanya boleh dihantar dengan ESP8266/ESP32
//Tidak boleh menggunakan Board UNO/NANO
const uint16_t irSignal1[] = {3100,3050,3100,4400,650,1600,600,1600,600,550,600,550,550,
1600,600,550,600,1600,600,550,550,550,550,1650,600,1650,600,1600,600,550,550,1650,600,
1600,600,550,600,500,600,550,550,550,550,550,550,550,600,500,600,550,550,550,550,550,
550,550,600,550,550,550,550,550,550,550,550,550,600,550,550,550,550,1650,600,550,550,
1600,600,550,600,500,600,550,550,1650,600,500,600,550,550,1600,600,550,600,550,550,550,
550,550,550,550,600,500,600,550,550,550,550,550,550,550,600,500,600,550,550,550,550,550,
550,550,600,1600,600,550,550,550,600,500,600,550,550,550,550,550,550,550,600,550,550,550,
550,550,550,550,550,550,600,550,550,550,550,550,550,550,550,550,600,550,550,550,550,550,
550,550,600,500,600,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,550,550,
600,550,550,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,600,500,600,550,
550,1600,600,550,600,1600,600,1650,600,1600,600,550,550,1650,600,550,550,1650,600,1600,
600,550,550,1650,600,1600,600,1650,600,1650,600,500,600,1600,600,550,550,550,600,550,550,
550,550,550,550,550,600,500,600,550,550,550,550,550,550,1650,600,1600,600,1650,600,1600,
600,550,600,1600,600,550,550,550,600};

//Contoh Data untuk Remote Aircond 139bit - BUTANG OFF
//Nota Kaki: Signal Aircond yang panjang hanya boleh dihantar dengan ESP8266/ESP32
//Tidak boleh menggunakan Board UNO/NANO
const uint16_t irSignal2[] = {3100,3050,3100,4400,650,1600,600,1600,600,550,600,550,550,
1600,600,550,600,1600,600,550,550,550,600,1600,600,1650,600,1600,600,550,550,1650,600,
1600,600,550,600,500,600,550,550,550,550,550,550,550,600,500,600,550,550,550,550,550,550,
550,600,550,550,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,600,1600,600,
550,550,550,550,550,600,1600,600,550,550,550,600,1600,600,550,550,550,600,500,600,550,
550,550,550,550,550,550,600,550,550,550,550,550,550,550,550,550,600,550,550,550,550,550,
550,1650,600,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,600,500,600,550,
550,550,550,550,550,550,600,500,600,550,550,550,550,550,550,550,600,550,550,550,550,550,
550,550,550,550,600,550,550,550,550,550,550,550,600,500,600,550,550,550,550,550,550,550,
600,500,600,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,550,550,600,1600,
600,550,550,1650,600,1600,600,550,600,550,550,1600,600,550,600,1600,600,1650,600,550,550,
1600,600,1650,600,1600,600,1650,600,550,550,1650,600,550,550,550,550,550,550,550,550,550,
600,550,550,550,550,550,550,550,600,500,600,1600,600,1650,600,1600,600,1650,600,550,550,
1650,600,500,600,550,550};


void setup() {
    //INITIALIZE LED UNTUK TUNJUKKAN PENGHANTARAN DATA SEDANG BERLAKU
    pinMode(LED_BUILTIN, OUTPUT);
    
    //INITIALIZE SERIAL MONITOR
    Serial.begin(9600);

    //4 BUTANG DIGUNAKAN UNTUK MENGHANTAR DATA
    pinMode(D7, INPUT_PULLUP);  //Butang1 untuk Data1
    pinMode(D3, INPUT_PULLUP);  //Butang2 untuk Data2
    pinMode(D2, INPUT_PULLUP); //Butang3 untuk Data3
    pinMode(D1, INPUT_PULLUP); //Butang4 untuk Data4
    /******Anda boleh menggunakan butang yang banyak untuk fungsi yang banyak***********/
    /******Mengikut kapasiti MicroController yang andagunakan***************************/

    //Initialize IR SENDER Library. 
    IrSender.begin(); 

    //Sekadar nota dalam Serial Monitor
    Serial.print("Ready menghantar Signal!");
    
}//END VOID SETUP

void loop() {
    /****Penggunaan dengan Butang Pertama****/
    //Contoh menghantar Data Aircond 139 bit - ON AIRCOND
    if(digitalRead(D7) == LOW && Butang1X == false){
      Butang1X = true;

      //Data Aircond 139bit di irSignal1
      IrSender.sendRaw(irSignal1, sizeof(irSignal1) / sizeof(irSignal1[0]), NEC_KHZ);
      //Sekadar Nota dalam Serial Monitor 
      Serial.println("Sent");
    }
    //If Statement untuk pastikan Fungsi Butang berlaku SEKALI sahaja
    if(digitalRead(D7) == HIGH && Butang1X == true){
      Butang1X = false;
    }
    
    /****Penggunaan dengan Butang Kedua****/
    //Contoh menghantar Data Aircond 139 bit - ON AIRCOND
    if(digitalRead(D3) == LOW && Butang2X == false){
      Butang2X = true;
      //Data Aircond 139bit di irSignal2
      IrSender.sendRaw(irSignal2, sizeof(irSignal2) / sizeof(irSignal2[0]), NEC_KHZ);
      //Sekadar Nota dalam Serial Monitor
      Serial.println("Sent");
    }
    //If Statement untuk pastikan Fungsi Butang berlaku SEKALI sahaja
    if(digitalRead(D3) == HIGH && Butang2X == true){
      Butang2X = false;
    }
    
    /****Penggunaan dengan Butang Ketiga****/
    if(digitalRead(D2) == LOW && Butang3X == false){
      Butang3X = true;
      //Data Remote TV Sharp (<Address>,<Command>,<Ulangan>)
      IrSender.sendSharp(0x10,0x68, 1);
      //Sekadar Nota dalam Serial Monitor
      Serial.println("Sent");
    }
    //If Statement untuk pastikan Fungsi Butang berlaku SEKALI sahaja
    if(digitalRead(D2) == HIGH && Butang3X == true){
      Butang3X = false;
    }
    
    /****Penggunaan dengan Butang Keempat****/
    if(digitalRead(D1) == LOW && Butang4X == false){
      Butang4X = true;
      //Data Remote Android Box (<Address>,<Command>,<Ulangan>)
      IrSender.sendNEC(0x1,0x11,1);
      //Sekadar Nota dalam Serial Monitor
      Serial.println("Sent");
    }
    //If Statement untuk pastikan Fungsi Butang berlaku SEKALI sahaja
    if(digitalRead(D1) == HIGH && Butang4X == true){
      Butang4X = false;
    }
    /***************/
    
}//END VOID LOOP

Syntax IrSender.send<PROTOCOL>

Perhatikan coding di atas, bagi setiap Data yang DAPAT dikesan PROTOCOL-nya, kaedah SEND perlu menggunakan format SEND masing-masing.

  • IrSender.sendSharp(<Address>,<Command>,<ulangan>)
  • IrSender.sendSony(<Address>,<Command>,<ulangan>)
  • IrSender.sendNEC(<Address>,<Command>,<ulangan>)
  • IrSender.sendRC6(<Address>,<Command>,<ulangan>)
  • IrSender.sendSamsung(<Address>,<Command>,<ulangan>)

3 data yang perlu diletakkan adalah:

  • Address
  • Command
  • Ulangan : berapa bilangan transmisi ( 1 mencukupi, 2 atau 3 boleh diulang untuk ketepatan)

Syntax IrSender.sendRAW

IrSender.sendRAW perlu digunakan untuk data-data UNKNOWN seperti Aircond. Data perlu disusun dahulu dan diubah strukturnya seperti yang diterangkan sebelum ini.

NOTA PENTING:
Bagi Transmisi Data Aircond, ia hanya dapat di hantar dengan Board ESP8266 atau ESP32. Arduino UNO/NANO tidak mempunyai kapasiti untuk menghantar 139 bit data Aircond yang besar.

Selamat Mencuba!

PERSEDIAAN UNTUK KE CODING ARDUINO

Jika anda menghadapi kesukaran dalam menggunakan atau memahamkan Arduino dan Coding, kami sarankan anda ikuti E-Learning E-Kursus Pemantapan Asas Arduino MatGyver ini.

Sebelum membuat sebarang Project Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Membuat Project Electric-Drum!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


ESP32 Guide Lengkap | serta Pantang-Larang

Dalam Tutorial ini, MatGyver akan menerangkan bagaimana MEMAHAMI Board ESP32.
Antara tujuan artikel ini ditulis, adalah kerana Board ESP32 adalah antara Board yang terdapat TERLALU-BANYAK Pantang-Larang yang tidak diterangkan dengan jelas, dan tidak di-COMPILE-kan dalam satu rujukan.

JADUAL RINGKASAN PANTANG-LARANG PIN ESP32

Jadual di bawah, menerangkan secara keseluruhan berkenaan PANTANG-LARANG menggunakan ESP32. Perincian berkenaan jadual ini, akan kita terangkan dengan lebih lanjut.

Hak Milik MatGyver.my : Dikeluarkan 15 December 2021

Bagi memulakan tutorial artikel ini, kita akan sentuh dahulu berkenaan SPESIFIKASI serta KAEDAH-INSTALL Board ESP32 dalam Arduino IDE.

SPESIFIKASI BOARD ESP32 (DEV KIT V1 DOIT)

Spesifikasi ESP32Arduino UNO
Bilangan Core CPU2 (Dual-Core)1 (Single-Core)
Built-In WiFi2.4GHzTIADA
Built-In BluetoothBLE dan Legacy BluetoothTIADA
CPU Clock Frequencysehingga 240MHz16MHz
CPU Architecture32-bit8-bit
RAM512 KB2 KB
EEPROM4 KB1 KB
Flash Memory4 MB32 KB
Digital/Analog Pins30~36pin19 pin
Analog-In Pins14 (rujuk carta Pantang-Larang)6 pin
Hardware Serial21
I2C Port11
SPI Port21
Capacitive Touch Pin10TIADA

CPU / Frequency / Core

ESP32 mempunya 2 (Dual-Core) CPU, bermakna kita seolah-olah dapat menggunakan 2 VOID-LOOP yang dapat saling berinteraksi antara satu-sama lain. Ini boleh menjadi SOLUSI MULTI-TASKING yang sering dihadapi bila menggunakan UNO. Namun, penggunaan dan programming 2 VOID-LOOP adalah amat sukar untuk beginners, dan terma yang biasa digunakan untuk Multi-Core Programming adalah RTOS (RealTime Operating System).

Penggunaan Multi-Core boleh menjadi solusi untuk sistem-sistem yang mengawal STEPPER MOTOR kerana kawalan Stepper Motor mementingkan Precise-Frequency Execution.

Kelajuan CPU 240MHz berbanding 16MHz juga merujuk kepada kelajuan Void-Loop dibaca oleh CPU. Ini antara aspek penting yang dapat dimanfaatkan untuk applikasi-applikasi IoT yang sangat padat dengan Line-Line Coding String HTML/JAVA/JSON dan sebagainya.

Dalam masa yang sama, kelajuan CPU 240MHz juga dapat dimanfaatkan oleh applikasi STEPPER-MOTOR dimana, MAX-RPM Stepper Motor dapat ditingkatkan berbanding penggunaan Arduino UNO.

Built-In WiFi

AMARAN!
WiFi dan Bluetooth TIDAK boleh digunakan kedua-dua dalam SATU MASA.

Built-In Bluetooth

AMARAN!
WiFi dan Bluetooth TIDAK boleh digunakan kedua-dua dalam SATU MASA.

RAM / EEPROM / Flash Memory

PANTANG-LARANG ESP32

Hak Milik MatGyver.my : Dikeluarkan 15 December 2021

PENGGUNAAN SERVO UNTUK ESP32

Library default yang biasa digunakan <Servo.h> TIDAK boleh digunakan bersama Board ESP32.

Oleh itu, Library pengganti yang boleh digunakan adalah

ServoESP32 by RoboticsBrno

Library tersebut boleh didapatkandi URL GitHub berikut:

https://github.com/RoboticsBrno/ServoESP32

Kaedah penulisan dan penggunaan Library ServoESP32 adalah sama sahaja seperti library <Servo.h>

INPUT_PULLUP BUKAN UNTUK SEMUA PIN

Fungsi INPUT_PULLUP adalah sangat menyenangkan, namun tidak semua pin pada ESP32 membenarkan fungsi ini digunakan.

Senarai Pin yang boleh menggunakan INPUT_PULLUP pada ESP32 adalah:

16, 17, 18, 19, 21, 22, 23

OUTPUT BUKAN UNTUK SEMUA PIN

Senarai Pin yang TIDAK boleh menggunakan OUTPUT pada ESP32 adalah:

Pin 6 hingga 11, dan juga 34,35,36 dan 39

ELAKKAN PENGGUNAAN Pin 12

Pin 12 biasa digunakan untuk process mengupload coding.

Sebarang device yang bersambung pada Pin 12 boleh mengganggu process upload coding dan mengeluarkan ERROR berikut:

A fatal error occurred: Timed out waiting for packet content

SAMBUNGAN i2C dan Library

Pin DEFAULT untuk i2C hardware pada ESP32 adalah pada pin 21 dan pin 22, di mana;

  • Pin 21 = SDA
  • Pin 22 = SCL

Penulisan code , Wire.begin()

Untuk mengubah pin i2C pin yang boleh digunakan adalah seperti berikut:

  • Pin16 dan Pin17
  • asdasd

Penulisan code , Wire.begin(16, 17)

Senarai gabungan pin yang TIDAK boleh digunakan.

  • Pin15 dan Pin2

AMARAN:

I2C pin 21 dan juga pin 22 tidak boleh digunakan bersama SPI communication. Dalam keadaan ini, gunakan gabungan pin lain selain pin 21 dan 22 untuk I2C

GURU MEDITATION ERROR: Core 1 panic’ed…

Bagi sesiapa yang pernah membuat pelbagai project dengan ESP32, Error: Guru Meditation ini pasti pernah muncul beberapa kali.

Namun bagi beginners, pasti akan keluh untuk mencari penyelesaian bagi error ini.

Kami hanya dapat “highlight” beberapa punca UTAMA error ini, namun adakalanya, error ini boleh berpunca dari masalah lain.

Punca #1 : Current supply yang tidak mencukupi

Seperti gambar di atas, kebiasaan anda memberi kuasa pada board ESP32 melalui port USB. Kebiasaan USB-Port/Plug/Charger HANYA mampu mengeluarkan 5V voltage pada CURRENT 500mA SAHAJA!

ESP32 sendiri boleh consume sehingga 150mA current.

500mA ini TIDAK MENCUKUPI untuk sesetengah module seperti di bawah.
Secara tidak langsung, semasa module-module ini dinyalakan, ia menyebabkan CURRENT-SUPPLY pada ESP32 TIDAK MENCUKUPI dan menyebabkan ESP32 Restart dan mengeluarkan Error: Meditation Core

GSM SIM900 / SIM800

Module Sim900 atau Sim800 biasanya mempunyai consumption sehingga 2A ketika network connection.

SERVO MOTOR

Rujuk current-current consumption untuk setiap servo yang anda gunakan dalam project.

PENYELESAIAN : VOLTAGE REGULATOR / POWER SUPPLY

Salah satu penyelesaian bagi kekurangan current supply adalah dengan kaedah menambahkan Voltage Regulator LM2596 (Rating 2A) seperti dalam rajah di bawah.

Punca #2 : Penggunaan Interrupt-Pin yang tidak sesuai

Seperti yang diterangkan di Jadual-Pin di atas, walaupun ESP32 mempunyai banyak pin, namun kebanyakan pin berkongsi fungsi dengan fungsi-fungsi hardware utama ESP32 seperti Bluetooth dan juga WiFi.

Oleh itu, adakalanya pin-interrupt yang digunakan perlu dipilih dengan betul supaya tidak bercanggah dengan fungsi WiFi dan Bluetooth.

Punca lain-lain

Bagi punca-punca lain yang tidak diterangkan di atas, tuan-tuan perlu membuat rujukan lanjut di blog-blog atau tutorial lain di Google.

To Be Continued….


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.

end

Send/Receive Data ke Ms Excel dari Arduino | PLX-DAQ Data-Acquisition

Dalam Guide ini, kami akan tunjukkan, bagaimana anda dapat membuat sebuah Data-Acquisition Sistem mudah dan murah dengan menggunakan Arduino dan bantuan PLX-DAQ untuk rekodkan data ke dalam Microsoft Excel.

Data Acquisition kebiasaannya diperlukan oleh Researcher untuk dapatkan TREND-DATA yang bersiri untuk menganalisa Data secara terperinci.

Sebelum ini, beberapa solusi untuk Data Logging atau Data Acquistion adalah seperti berikut:

MENGGUNAKAN DATA ACQUISITION MODULE

Ini ada adalah contoh Data Acquisition module yang biasa digunakan dalam lab-lab makmal Universiti. Harga Module seperti ini boleh mencecah RMXxx sehingga RMX,xxx.

SIMPAN DATA CLOUD-SERVER/CLOUD-APP

Teknik ini memerlukan pengetahuan dalam IoT dan Cloud-App/Server. Ini kaedah terbaik cuma perlukan pengetahuan lebih dalam setiap App tertentu.

SIMPAN DATA DALAM SD CARD

Dalam kaedah ini, menggunakan Module SD Card, kemudian data direkodkan dalam bentuk file .TXT atau .CSV ke dalam SD Card.

Kemudian apabila hendak melihat data, perlu transferkan data dari SD Card ke dalam Computer dan masukkan dalam Excel.

HANTAR DATA TERUS KE MICROSOFT EXCEL

Dalam guide ini, kami tunjukkan kaedah menghantar data TERUS ke Ms Excel, melalui USB, TANPA memerlukan sebarang pengantara/module mahupun SD Card.

Microsoft Excel 365

Dalam Microsoft Excel 365 yang terbaru, fungsi menghantar Data terus ke Excel-Sheet telah berada dalam sistem, melalui fungsi Add-On Data Streaming. Guide ini tidak akan menyentuh atau menerangkan berkenaan Data-Streaming.

Walaubagaimanapun, anda boleh rujuk video guide dari YouTube berikut untuk mengetahui lebih lanjut berkenaan Fungsi Data-Streamer Excel 365.

Microsoft Excel versi Lebih Awal (2013 -2016)

Majoriti dari komuniti kita hanya mempunyai MicroSoft Excel versi yang lebih awal (2013-2016). Versi awala tidak mempunyai fungsi Data-Streaming.

Dengan itu, solusi Universal untuk versi Excel awal, adalah dengan menggunakan PLX-DAQ.

APA ITU PLX-DAQ ?

Dalam MicroSoft Excel, kita boleh menambahkan pelbagai fungsi khusus dan custom kita sendiri dengan mengaktifkan fungsi MACRO.

Dalam fungsi MACRO, kita boleh menambahkan PROGRAMMING/CODE TAMBAHAN kepada sesuatu SpreadSheet melalui Programming Visual Basic, dan dalam Solusi PLX-DAQ, yang penting adalah SpreadSheet yang TELAH mempunyai Fungsi MACRO tersebut.

Contoh Paparan Window VB Programming dalam Ms Excel
Sumber : https://i.ytimg.com/vi/1lQbzmjZQb0/maxresdefault.jpg

DOWNLOAD PLX-DAQ

Solusi PLX-DAQ ini telah dibangunkan oleh tuan NetDevil dan telah dikongsikan sepenuhnya dalam Forum Arduino , dan sehingga hari ini telah banyak dimanfaatkan oleh komuniti.

Untuk dapatkan PLX-DAQ, anda perlu download Package PLX-DAQ terlebih dahulu.
(terbaru 2021, PLX-DAQ Version 2.11, pastikan dapatkan versi terbaru)

DOWNLOAD DARI FORUM ARDUINO

DOWNLOAD DARI GOOGLE DRIVE

Selepas Package PLX-DAQ di-Download, pastikan di-Extract, dan anda patut mempunyai 4 File seperti gambar di bawah:

Senarai File dalam Package PLX-DAQ v2.11

User Manual – Beginners Guide to PLX-DAQ

Beginners Guide User Manual

Version 2.11 ini version terbaru yang dilengkapkan dengan User Manual yang serba lengkap untuk panduan Beginners. Anda patut membaca User Manual ini untuk mengetahui tentang ke-semua fungsi-fungsi yang boleh dilaksanakan dengan PLX-DAQ.

Default Sketch – Contoh Program

PLX-DAQ-v2-DefaultSketch.ino

Package ini hanya membekalkan satu File Coding/Sketch Arduino untuk rujukan, dan hampir kesemua fungsi PLX-DAQ ada dalam file tersebut. Namun, untuk Beginners, terlalu banyak info dibekalkan dalam File ini.

Jadi anda boleh ikuti guide kami ini untuk melihat fungsi-fungsi simple yang kami highlight.

File Excel : PLX-DAQ-v.211

Ini merupakan FILE TERPENTING yang membolehkan Data diterima dari USB dihantar terus ke Excel. File ini anda boleh Dupplicate dan Save As atas nama lain untuk Project-project yang berlainan.
Pastikan anda sentiasa menggunakan fungsi Save As, supaya Code VB PLX-DAQ sentiasa berada dalam File Excel anda.

Pertama kali membuka File PLX-DAQ, akan ada paparan AMARAN untuk Enable Content atau Enable Macro.
Pastikan anda menekan ENABLE.

MENGGUNAKAN FILE EXCEL PLX_DAQ

Data sedia ada di Column A, B, C dan D adalah contoh sahaja, dan boleh didelete bila-bila masa sahaja.

PLX-DAQ UI PANEL (User Interface)

Dalam File Excel PLX-DAQ, User Interface Panel perlu diaktifkan dahulu.
Tekan butang OPEN PLX-DAQ UI untuk aktifkan User Interface.

PLX-DAQ User Interface

Dalam User Interface ada 4 komponen yang perlu di setting:

  • #1 Port : Pastikan Nombor Port matching dengan Port COM Arduino yang dikesan oleh komputer
  • #2 Baud : Nilai 9600 perlu matching dengan setting Baud Rate speed dalam Coding Arduino
  • #3 Sheet name to post to : Di sini, anda perlu pilih NAMA SPREADSHEET yang akan menyimpan rekod data
  • #4 Connect : Tekan butang ini untuk mula menerima data dari Arduino

STRUKTUR DATA

Data yang masuk akan bermula dari COLUMN A dan ROW 2, dan seterusnya.

MENGUBAH/MENAMAKAN COLUMN & ROW

Nama atau Label Column, boleh diubah bila-bila masa.

MENGHANTAR DATA DARI ARDUINO

Kaedah penghantaran data oleh Arduino kepada Excel PLX-DAQ, menggunakan Fungsi SERIAL yang biasa digunakan oleh Serial Monitor.

Oleh itu, semasa penghantaran data, Serial Monitor TIDAK BOLEH DIBUKA dan tidak dapat digunakan, kerana ia akan mengganggu proses penghantaran data kepada PLX-DAQ.

SYNTAX VOID SETUP

Syntax yang patut dimulakan dalam Void Setup untuk penggunaan PLX-DAQ adalah sama sahaja seperti penggunaan Serial Monitor.

void setup() {
  Serial.begin(9600);

}//END VOID SETUP

Pastikan nilai Baud Rate adalah sama dengan Baud Rate di PLX-DAQ User Interface.

SYNTAX VOID LOOP (Paling Asas)

void loop() {
  //CODING LAIN
  //CODING LAIN
  //CODING LAIN
  Temperature = sensor.DataTemp();

  Serial.println( (String) "DATA,DATE,TIME," + Temperature);

}//END VOID LOOP

Ini adalah struktur Syntax penghantaran data ke PLX-DAQ yang paling mudah, di mana, hanya satu maklumat Variable TEMPERATURE sahaja yang dihantar kepada Excel.

Jika diperhatikan struktur coding ini, 3 Syntax awala iaitu DATA,DATE,TIME adalah 3 syntax wajib yang patut berada dalam coding tersebut.

SYNTAX VOID LOOP – 2 Data

void loop() {
  //CODING LAIN
  //CODING LAIN
  //CODING LAIN
  Temperature = sensor.DataTemp();
  Humidity = sensor.DataHumid();

  Serial.println( (String) "DATA,DATE,TIME," + Temperature + "," + Humidity);

}//END VOID LOOP

Ini struktur Syntax untuk menghantar 2 maklumat variable.
PERHATIKAN penggunaan koma “,” dan juga penggunaan tanda “+”
Tanda-tanda ini penting untuk distrukturkan betul.

SYNTAX VOID LOOP – 3 Data

void loop() {
  //CODING LAIN
  //CODING LAIN
  //CODING LAIN
  Temperature = sensor.DataTemp();
  Humidity = sensor.DataHumid();
  Force = sensor.DataForece();

  Serial.println( (String) "DATA,DATE,TIME," + Temperature + "," + Humidity + "," + Force);

}//END VOID LOOP

Ini pula struktur Syntax untuk menghantar 3 data Variable.
Jika anda faham kaedah syntax untuk 3 variable, anda boleh terus ubah syntax ini untuk penghantaran maklumat data variable yang lebih banyak.

MENGHANTAR DATA KE CELL TERTENTU

Serial.println("CELL,SET,G10," + Temperature);

Syntax ini pula, menghantar data Temperature, kepada cell G10 dalam Excel.

MENERIMA/DAPATKAN DATA DARI CELL TERTENTU

MAKLUMAT INT

Serial.println("CELL,GET,FROMSHEET,Simple Data,E,4");
int readvalue = Serial.readStringUntil(10).toInt(); //biarkan 10

Syntax ini pula, adalah untuk mendapatkan maklumat Nilai/Data INT dari:

  • Spread Sheet Name : Simple Data
  • Column : E
  • Row : 4

Anda hanya perlu ubah Nama Spread Sheet jika perlu, dan ubah Nombor Colum/Row Cell.
Dan ini antara fungsi yang amat berguna jika anda perlu berinteraksi dengan maklumat dalam sheet excel.

AMARAN

Data yang diterima dari Excel adalah dalam bentuk STRING.
Itulah fungsi syntax .toInt() yang mengubah data String kepada bentuk INT

MAKLUMAT FLOAT (Titik Perpuluhan)

Serial.println("CELL,GET,FROMSHEET,Simple Data,E,4");
int readvalue = Serial.readStringUntil(10).toFloat(); //biarkan 10

Di sini, syntax .toFloat() digunakan untuk mengubah data String dari Excel ke bentuk FLOAT

ARAHAN SAVE FILE DAN BERI NAMA FILE

Serial.println("SAVEWORKBOOKAS,File-Data-Logging-Saya");

Syntax ini, boleh memberi arahan pada Excel untuk Save File As nama file File-Data-Logging-Saya.

Terdapat pelbagai lagi fungsi tambahan HANTAR-KELUAR-MASUk DATA yang boleh dilakukan dengan PLX-DAQ ini. Namun, kami hanya berikan guide untuk yang basic sahaja dalam tutorial ini.

Untuk fungsi-fungsi tambahan, anda boleh kaji User Manual yang telah dibekalkan bersama Package PLX-DAQ dalam file .DOC.

PERSEDIAAN UNTUK KE CODING ARDUINO

Jika anda menghadapi kesukaran dalam menggunakan atau memahamkan Arduino dan Coding, kami sarankan anda ikuti E-Learning E-Kursus Pemantapan Asas Arduino MatGyver ini.

Sebelum membuat sebarang Project Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Membuat Project Electric-Drum!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


Contactless Infrared (IR) Temperature Sensor MLX90614

Dalam Guide ini, kami akan tunjukkan, bagaimana menggunakan sensor Contactless Infrared (IR) Temperature MLX90614.

SENSOR MLX90614

Jenis-jenis Sensor MLX90614

Gambar di atas adalah 3 jenis Module Sensor MLX90614 yang ada di pasaran. Pastikan beli module sebegini, kerana ia sudah ada Circuit penting di atas Board PCB. Perbezaan antara ketiga-tiga model ini hanyalah JARAK pengesananan suhu.

  • MLX90614-BAA : Jarak 2cm ~ 5cm
  • MLX90614-BCC : Jarak ~10cm
  • MLX90614-DCI : Jarak sehingga 60cm
Gambar Sensor MLX90614 tanpa PCB Board

MLX90614 perlukan beberapa komponen tambahan untuk berfungsi dengan baik. Pastikan anda membeli Module Sensor yangn mempunyai PCB Board.

Anda boleh dapatkan sensor ini di Online berikut:

Cyntron Technologies Malaysia

QQ Online Trading (Jalan Pasar)

WIRING-DIAGRAM

VOLTAGE INPUT

Mengikut spesifikasi MLX90614, ia boleh menerima samada 3V sehingga 5V untuk di power-kan.

SIGNAL OUTPUT

Signal Komunikasi Output sensor ini, menggunakan I2C. Jadi anda hanya perlu sambungkan sensor ini pada Port SDA dan SCL I2C pada mana-mana Board Arduino atau NodeMCU/ESP32.

LIBRARY ADAFRUIT MLX90614

Library untuk MLX90614, boleh terus didapatkan didalam LIBRARY MANAGER Arduino IDE.
Hanya navigasi ke:

Sketch > Include Library > Mange Libraries

Di dalam ruangan SEARCH Library Manager, hanya search MLX90614.
Kemudian Install sahaja.

CODING #1 – BASIC CODING DALAM EXAMPLE

Di bawah ini, adalah coding yang diberikan dalam example:

/***************************************************
  This is a library example for the MLX90614 Temp Sensor

  Designed specifically to work with the MLX90614 sensors in the
  adafruit shop
  ----> https://www.adafruit.com/products/1747 3V version
  ----> https://www.adafruit.com/products/1748 5V version

  These sensors use I2C to communicate, 2 pins are required to
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  Serial.begin(9600);

  Serial.println("Adafruit MLX90614 test");

  if (!mlx.begin()) {
    Serial.println("Error connecting to MLX sensor. Check wiring.");
    while (1);
  };
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF());
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");

  Serial.println();
  delay(500);
}

CODING #2 – CODING RINGKAS SAHAJA

Di bawah ini, adalah coding yang telah kami ringkaskan, khas untuk dapatkan suhu Darjah Celcius sahaja.

#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

float Temperature;

void setup() {
  Serial.begin(9600);

  if (!mlx.begin()) {
    Serial.println("Error connecting to MLX sensor. Check wiring.");
    while (1);
  };
}//END VOID SETUP

void loop() {
  Temperature = mlx.readObjectTempC();

  Serial.print("Suhu: ");
  Serial.print(Temperature);
  Serial.print(" C");
  Serial.println();
  delay(100);
}//END VOID LOOP

CODING #3 – CODING PAPARAN DALAM EXCEL (PLX-DAQ)

Untuk persediaan coding ini, pastikan anda rujuk GUIDE PENUH penggunaan PLX-DAQ yang berikut:

Guide Penuh Penggunan Excel PLX-DAQ

Dari guide PLX-DAQ, anda perlu download .ZIP file PLX-DAQ.

Apa yang penting dalam file ini adalah file Excel yang bernama PLX-DAQ.xlms

File excel ini mempunyai CONSOLE yang telah diprogramkan melalui embedded VB-Macro Excel.
File ini boleh didupplikasi untuk project-project lain.
Yang penting DUPPLICATE dan jangan Create New Excel File.

Untuk membuka CONSOLE PLX-DAQ, tekan butang yang bernama OPEN PLX DAQ UI.
Selepas tekan, window CONSOLE yang berwarna PURPLE akan keluar.

CONSOLE-PORT

Dalam bahagian PORT dalam console, pastikan anda pilih Port Number yang MATCHING dengan COM-Port Arduino.

CONSOLE-BAUD

Baud-rate Console mesti diubah, matching dengan Baud Rate Serial Monitor Arduino dalam coding.

MULAKAN PENGHANTARAN DATA KE EXCEL

Untuk mula menerima Data dari Arduino, terus tekan sahaja butang CONNECT.
Dan data sepatutnya terus masuk dalam cell-cell Arduino.

Untuk hentikan penghantara data, hanya perlu tekan DISCONNECT.

AMARAN

Penggunakan PLX-DAQ, tidak boleh menggunakan SERIAL MONITOR dalam masa yang sama.
Ia akan mengganggu proses penghantaran data.

#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

float Temperature;

void setup() {
  Serial.begin(9600);

  if (!mlx.begin()) {
    Serial.println("Error connecting to MLX sensor. Check wiring.");
    while (1);
  };
}//END VOID SETUP

void loop() {
  Temperature = mlx.readObjectTempC();

  //WARNING : SERIAL MONITOR TIDAK BOLEH DIGUNAKAN
  //APABILA MENGGUNAKAN PLX-DAQ EXCEL
  Serial.println( (String) "DATA,DATE,TIME," + i++ + "," + Temperature + ",AUTOSCROLL_20");
  delay(100);
}//END VOID LOOP

PERSEDIAAN UNTUK KE CODING ARDUINO

Jika anda menghadapi kesukaran dalam menggunakan atau memahamkan Arduino dan Coding, kami sarankan anda ikuti E-Learning E-Kursus Pemantapan Asas Arduino MatGyver ini.

Sebelum membuat sebarang Project Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Membuat Project Electric-Drum!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


DIY Electric MiDi Drum – Piezo-Electric

Dalam Guide ini, kami akan tunjukkan, bagaimana membuat DIY Electric-Drum dengan menggunakan Piezo-Ceramic dan Arduino.

PIEZO-CERAMIC

Piezo-Ceramic adalah sejenis device yang mempunyai Dwi-Fungsi:

  • Menghasilkan Bunyi buzzer apabila diberi Current/Voltage
  • Menghasilkan Current apabila diberi Getaran Mechanical

Dalam konsep Drum Electric ini, Piezo ini boleh dilekatkan dengan Tape pada apa-apa permukaan yang akan diketuk. Getaran akan menyebabkan Piezo-Ceramic ini menghasilkan Current-Signal dalam lingkungan 0.000001A sehingga 0.000005A.

WIRING-DIAGRAM

Dengan penambahan Resistor 1M Ohm secara SELARI dengan Piezo, Signal Current akan diubah kepada Signal Voltage 0~5V yang boleh terus diterima oleh Input Analog Arduino.

Dalam masa yang sama, anda boleh menambahkan 5.1V Zener Diode sebagai komponen tambahan untuk melindungi Arduino daripada OVERVOLTAGE yang mungkin berlaku apabila Piezo diketuk terlalu kuat yang menghasilkan Voltage LEBIH-BESAR dari 5V.

Sambungkan semua Piezo pada Input Analog Arduino dan juga pada Pin Ground.

STEP #1 – LIBRARY MIDI

Library MIDI diperlukan untuk Project ini.
Anda boleh terus download Library MIDI dari URL berikut:

Arduino MIDI Library by FortySevenEffects

Disebabkan Library ini dalam bentuk file .zip , gunakan fungsi Add .ZIP Library dalam Arduino IDE, untuk install/tambahkan library ini dalam computer.

STEP #2 – SETUP ARDUINO UNO SEBAGAI MIDI DEVICE

JENIS BOARD ARDUINO UNO

Untuk Step ini, anda TIDAK boleh menggunakan Board Arduino yang menggunakan chip CH340.

PASTIKAN, anda menggunakan Arduino UNO yang mempunyai chip Atmega8U2 atau Atmega16U2, kerana dalam proses ini, FIRMWARE Atmega16U yang akan diubah untuk menjadi MIDI Device.

Ini adalah jenis Arduino UNO yang mempunyai chip Atmega16U2
Ini adalah chip Atmega16U2 yang berada atas Board Arduino UNO

BY-DEFAULT, Atmega16U2 bertindak sebagai USB-to-Serial TTL converter dengan Firmware sedia ada. Firmware asal, membolehkan Arduino UNO dikenali oleh PC sebagai device COMX (Arduino UNO).

FLASH FIRMWARE ATMEGA16U2 jenis mocuLUFA

Bagi membolehkan PC mengenali Arduino UNO ini sebagai sebuah MIDI-DEVICE, Firware di dalam Atmega16U2 perlu ditukar baru.

Rujuk link URL berikut (di bahagian USB MIDI Setup) untuk maklumat berkenaan cara flash mocuLUFA Firmware:

USB MIDI Setup – mocuLUFA Firmware

Dalam kaedah di link ini, kita akan flash Atmega16U2 dengan Dual-Firmware, yang membolehkan kita menukar MODE Arduino UNO samada kepada Arduino UNO Serial, ataupun MIDI DEVICE.

PROCEDURE JUMPER SEMASA UPLOAD PROGRAM

Merujuk pada gambar di atas, satu JUMPER PERLU dipasang di bahagian berpetak HIJAU, jika mode Arduino UNO Serial ingin digunakan selepas proses Flash Firmware.

Bagi menggunakan Arduino UNO sebagai MIDI DEVICE, hanya perlu tanggalkan jumper (semasa Arduino OFF), dan pasang USB semula. PC akan terus kenali Arduino UNO sebagai MIDI DEVICE dan anda boleh semak dalam Device Manager.

CODING #1 – CHECK INPUT ANALOG

int input0;
int input1;
int input2;
int input3;
int input4;
int input5;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
}//END VOID SETUP

void loop() {
  // put your main code here, to run repeatedly:

  input0 = analogRead(A0);
  input1 = analogRead(A1);
  input2 = analogRead(A2);
  input3 = analogRead(A3);
  input4 = analogRead(A4);
  input5 = analogRead(A5);

  Serial.print(" A0:");
  Serial.print(analogRead(A0));
  Serial.print(" A1:");
  Serial.print(analogRead(A1));
  Serial.print(" A2:");
  Serial.print(analogRead(A2));
  Serial.print(" A3:");
  Serial.print(analogRead(A3));
  Serial.print(" A4:");
  Serial.print(analogRead(A4));
  Serial.print(" A5:");
  Serial.print(analogRead(A5));
  
  Serial.println();
}//END VOID LOOP

ABLETON LIVE – INSTALLATION

Software MIDI Sythetizer yang digunakan untuk project ini adalah Ableton Live 11 (trial Version).

Ia adalah software berbayar. Walaubagaimanapun, tempoh trial version adalah selama 90 hari atau 3 bulan, yang agak cukup memadai untuk membuat beberapap Project atau Experiment.

Anda boleh dapatkan dan download software Ableton Live 11 (Trial Version) di URL berikut:

Ableton Live 11 (Trial Version)

ABLETON LIVE – DRUM RACK SETUP

(Refer Video)

ABLETON LIVE – MIDI INPUT SETUP

(Refer Video)

CODING #2 – FINAL MIDI CODING

#include <MIDI.h>

int inputHiHat;
int inputSnare;
int inputTomHi;
int inputTomMid;
int inputTomLow;
int inputKick;

MIDI_CREATE_DEFAULT_INSTANCE(); //use default MIDI settings

bool KickX = false;
bool SnareX = false;
bool HihatX = false;
bool TomLX = false;
bool TomMX = false;
bool TomHX = false;

long timerA,timerB,timerC,timerD,timerE,timerF;

//UBAH DI SINI IKUT STARTING SENSITIVY
int KickStartSens = 200;
int SnareStartSens = 80;
int HiHatStartSens = 80;
int TomHStartSens = 80;
int TomMStartSens = 80;
int TomLStartSens = 80;

//UBAH DI SINI IKUT STOP SENSITIVY
int KickStopSens = 50;
int SnareStopSens = 30;
int HiHatStopSens = 30;
int TomHStopSens = 30;
int TomMStopSens = 30;
int TomLStopSens = 30;

void setup() {
  // put your setup code here, to run once:
  MIDI.begin(); 
  
}//END VOID SETUP

void loop() {
  //INPUT SIGNAL ANALOG
  inputHiHat = analogRead(A0);
  inputSnare = analogRead(A4);
  inputTomHi = analogRead(A1);
  inputTomMid = analogRead(A2);
  inputTomLow = analogRead(A3);
  inputKick = analogRead(A5);

  //SNARE - D1
  if(inputSnare > SnareStartSens && SnareX == false){
    timerA = millis();
    MIDI.sendNoteOn(38, 110, 1); //F#1
    SnareX = true;
  }
  if(inputSnare < SnareStopSens && SnareX == true && (millis()-timerA)>80){
    timerA = 0;
    MIDI.sendNoteOff(38, 0, 1);
    SnareX = false;
  }

  //HIHAT - F#1
  if(inputHiHat > HiHatStartSens && HihatX == false){
    timerB = millis();
    MIDI.sendNoteOn(42, 110, 1); //F#1
    HihatX = true;
  }
  if(inputHiHat < HiHatStopSens && HihatX == true && (millis()-timerB)>110){
    timerB = 0;
    MIDI.sendNoteOff(42, 0, 1);
    HihatX = false;
  }

  //TOM HI - A1
  if(inputTomHi > TomHStartSens && TomHX == false){
    timerC = millis();
    MIDI.sendNoteOn(45, 110, 1); //F#1
    TomHX = true;
  }
  if(inputTomHi < TomHStopSens && TomHX == true && (millis()-timerC)>100){
    timerC = 0;
    MIDI.sendNoteOff(45, 0, 1);
    TomHX = false;
  }

  //TOM MID - G1
  if(inputTomMid > TomMStartSens && TomMX == false){
    timerD = millis();
    MIDI.sendNoteOn(43, 110, 1); //F#1
    TomMX = true;
  }
  if(inputTomMid < TomMStopSens && TomMX == true && (millis()-timerD)>100){
    timerD = 0;
    MIDI.sendNoteOff(43, 0, 1);
    TomMX = false;
  }

  //TOM LOW - F1
  if(inputTomLow > TomLStartSens && TomLX == false){
    timerE = millis();
    MIDI.sendNoteOn(41, 110, 1); //F#1
    TomLX = true;
  }
  if(inputTomLow < TomLStopSens && TomLX == true && (millis()-timerE)>100){
    timerE = 0;
    MIDI.sendNoteOff(41, 0, 1);
    TomLX = false;
  }

  //KICK - C1
  if(inputKick > KickStartSens && KickX == false){
    timerF = millis();
    MIDI.sendNoteOn(36, 110, 1); //F#1
    KickX = true;
  }
  if(inputKick < KickStopSens && KickX == true && (millis()-timerF)>150){
    timerF = 0;
    MIDI.sendNoteOff(36, 0, 1);
    KickX = false;
  }

}//END VOID LOOP

MIDI NOTES REFERENCE

PERSEDIAAN UNTUK KE CODING ARDUINO

Jika anda menghadapi kesukaran dalam menggunakan atau memahamkan Arduino dan Coding, kami sarankan anda ikuti E-Learning E-Kursus Pemantapan Asas Arduino MatGyver ini.

Sebelum membuat sebarang Project Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Membuat Project Electric-Drum!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


RTC Module (DS3231) – Fungsi Jam Arduino

RTC Module adalah Module yang dapat menyimpan MAKLUMAT MASA.
Tidak semua MicroController Arduino (UNO/NANO/MEGA/ESP32/ESP8266) mampu menyimpan maklumat masa, kecuali board-board yang advance seperti Arduino Due dan lain-lain.

Ini adalah kerana, apabila Arduino di-Power-Off, semua sistemnya akan terpadam.

RTC Module mempunyai battery tersendiri yang mampu menyalakan unit RTC walaupun Power sudah dipadamkan. Tambahan pula, RTC Module mempunyai Clock-Crystal dalaman yang mampu menyimpan DETIK-MASA ketika Power di-Offkan.

Bagi Board WiFi seperti NodeMCU ESP8266 dan ESP32 pula, RTC Module tidak diperlukan kerana mereka dapat mengambil masa dari internet dengan Time Library. Kecuali, jika WiFi tidak digunakan atau tiada sambungan internet.

RTC MODULE DS3231

Terdapat pelbagai jenis model Module RTC dan fungsi mereka sehampirnya sama.
Dalam guide ini, kami akan menunjukkan kaedah menggunakan RTC Module DS3231.

DISCLAIMER:

Isi kandung Blog-Content ini, diolah dari rujukan web www.create.arduino.cc untuk memberi pemahaman lebih pada Komuniti Arduino Malaysia.

Link Rujukan: https://create.arduino.cc/projecthub/electropeak/interfacing-ds1307-rtc-module-with-arduino-make-a-reminder-08cb61

Module RTC DS3231, mempunyai Bateri jenis 2025 di belakang.

WIRING & CONNECTION

Jika dilihat pada Pin Module RTC ini, terdapat hanya 4 pin penting.

  • Pin VCC – Power 5V
  • Pin GND – Ground
  • SDA – I2C Connection
  • SCL – I2C Connection

Pin-pin lain tidak diperlukan.

I2C PORT PADA BOARD ARDUINO

Pada Board Arduino UNO dan NANO, pin I2C adalah pada A4 (SDA) dan A5 (SCL).

Pada Board Arduino MEGA pula, pin I2C adalah pada D20 (SDA) dan D21 (SCL).

Dengan itu kaedah sambunganya hanyalah:

  • SDA RTC – SDA Board
  • SCL RTC – SCL Board

I2C ADDRESS MODULE RTC DS3231

By default, I2C Address untuk semua Module DS3231 adalah sama, iaitu 0x68.
Oleh itu, dalam coding, address ini telah diletakkan secara default dalam Library.

LIBRARY RTCLib (Edited oleh MatGyver)

Terdapat pelbagai Version Library RTC atau Library DS3231 dalam internet. Untuk beginners ia banyak menimbulkan kekeliruan, dan terdapat fungsi-fungsi dan syntax-syntax yang berbeza untu ksetiap Library.

Namun, hasil kajian kami, Library berikut adalah antara Library termudah untuk diikuti bersam Example yang jelas.
(Klik untuk download Library)

Library RTCLib

Kami telah menambahkan example coding yang Beginner-Friendly.

Disebabkan Library ini dalam bentuk file .zip , gunakan fungsi Add .ZIP Library dalam Arduino IDE, untuk install/tambahkan library ini dalam computer.

MENGGUNAKAN LIBRARY RTCLib

File > Examples > RTCLib > DS3231_Set_Time_PC

Apabila Library telah berjaya di-Install, navigasi ke example code di atas
DS3231_Set_Time_PC

Berikut ada isi kandung library tersebut:

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
//Edited Oleh : MatGyver

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

//Variable di bawah diperlukan untuk memberi tahu Hari
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  //Mulakan Serial Monitor 9600 BaudRate
  Serial.begin(9600);

  //Sedikit Delay
  delay(100); //Tidak Wajib

  //Memulakan RTC dan memberikan notifikasi jika RTC tidak dijumpai
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1); //Constant loop, sila restart Arduino
  }

  //RTC.LostPower digunakan untuk check samada 
  //RTC kehilangan power atau tidak ketika Arduino Start
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    
    //Syntax berikut setkan masa dan tarikh RTC dari PC
    //mengikut waktu Program diUpload
    //pastikan computer mempunyai masa yang betul
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    //Untuk mengubah masa dan tarikh secara manual
    //Gunakan syntax di bawah
    //Contoh :January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  
}//END VOID SETUP

void loop () {
    //Dapatkan masa terkini dan simpan dalam Object "now"
    DateTime now = rtc.now();

    //Print/Paparkan maklumat masa/tarikh pada Serial Monitor
    Serial.print(now.year(), DEC);  //Nombor Tahun (2021)
    Serial.print('/');              //Tanda sempadan
    Serial.print(now.month(), DEC); //Nombor Tahun (6)
    Serial.print('/');              //Tanda sempadan
    Serial.print(now.day(), DEC);   //Nombor Tahun (17)
    
    Serial.print(" (");             //Kurungan untuk hari
    Serial.print(daysOfTheWeek[now.daysOfTheWeek()]); //Print hari
    Serial.print(") ");             //Kurungan untuk hari
    
    Serial.print(now.hour(), DEC);  //Nombor Jam 
    Serial.print(':');              //Tanda sempadan
    Serial.print(now.minute(), DEC);//Nombor Minit 
    Serial.print(':');              //Tanda sempadan
    Serial.print(now.second(), DEC);//Nombor Saat 
    Serial.println();
    
    Serial.println();
    delay(3000);
    
}//END VOID LOOP

MENTAPKAN MASA DAN TARIKH

Module RTC yang baru pertama kali dinyalakan, tidak akan mempunyai Tarikh dan Masa yang terkini.

Oleh itu, jika anda perhatikan dalam coding di atas, terdapat syntax seperti berikut:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Ini adalah suatu kelainan, berbanding library-library lain, di mana, fungsi F(__DATE__) dan juga F(__TIME__) sangat mudah, ia merujuk kepada masa PC kita sewaktu Program Arduino di upload.

Dengan 2 syntax ini, setiap kali program diupload, RTC akan diupdate dengan maklumat MASA dan TARIKH yang terkini dari PC Computer.

Walaubagaimanapun, terdapat juga Kaedah Alternatif untuk menetapkan Masa dan Tarikh secara manual, melalui syntax di bawah:

rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Syntax di atas, akan menetapkan maklumat masa dan tarikh dalam bentuk berikut:

January 21, 2014 at 3:00 am

MEMANGGIL MAKLUMAT MASA DAN TARIKH TERKINI

Setiap kali maklumat masa dan tarikh terkini ingin dipanggil, syntax berikut perlu dipanggil:

DateTime now = rtc.now();

Syntax ini, akan Update Object-Variable now , dengan maklumat terkini.

MEMANGGIL MAKLUMAT TERPERINCI

Selepas memanggil maklumat terkini, kesemua maklumat Tahun, Bulan, Hari, Jam, Minit dan saat, boleh dipanggil secara individu dengan Syntax-syntax berikut:

tahun = now.year();
bulan = now.month();
hari = now.day();
jam = now.hour();
minit = now.minute();
saat = now.second();

Kesemua variable tahun,bulan, hari,jam... perlu di-Declare sebelum digunakan.

PERSEDIAAN UNTUK KE CODING ARDUINO

Jika anda menghadapi kesukara dalam menggunakan atau memahamkan Arduino dan Coding, kami sarankan anda ikuti E-Learning E-Kursus Pemantapan Asas Arduino MatGyver ini.

Sebelum membuat sebarang Project Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Mempelajari Module RTC DS3231!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


Arduino Baca Signal PPM Remote RC Receiver

Dalam tutorial ini, MatGyver akan tunjukkan Step-by-Step bagaimana menggunakan Arduino UNO untuk membaca Signal PPM dari Radio RC jenis FlySky.

RADIO SISTEM FLYSKY FS-I6

Dalam Tutorial ini, kami akan gunakan Model Transmitter FS-i6 (atau FS-i10) dan Receiver FS-iA6B.

Penting untuk menggunakan Receiver Model FSiA6B kerana ia mempunyai Fungsi-Signal-Protocol PPM , yang akan kita gunakan untuk mendapatkan bacaan signalnya melalui Arduino.

Model lain juga boleh digunakan, selagi Receivernya mempunyai fungsi PPM.

Seperti gambar di atas, Model Receiver FS-iA6 TIDAK mempunyai Fungsi- Protocol PPM.

WIRING CONNECTION

Mungkin masih ramai yang tidak tahu berkenaan komponen-komponen Chip di atas sebuah Board Arduino.

Channel 1 dari Receiver berkongsi dengan Port PPM.
Jadi mengikut setup wiring di atas, Pin Tengah kita sambung pada punca 5V Arduino untuk memberi Power kepada receiver, Ground pada Ground Arduino, dan Pin Signal CH1, kita sambungkan pada Pin Digital 3 Arduino UNO.

LIBRARY PPM RECEIVER & LIBRARY INTERRUPT

Terdapat 2 Library yang perlu kita download untuk membaca signal PPM pada Arduino.
(Klik untuk download Library)

Library PPMReader

Library Interrupt Handler

2 Library ini berasal dari GITHUB dan dibuat oleh Nikkilae. Boleh rujuk source library asal dari link GitHub di bawah:

https://github.com/Nikkilae/PPM-reader

Kami terpaksa buat beberapa perubahan MINOR pada Library Nikkilae, supaya ia lebih Beginner-Friendly. Library yang asal, terdapat kekeliruan dari segi kaedah install, dan tambahan pula tiada Example-Coding.

Kami telah menambahkan example coding yang Beginner-Friendly.

Disebabkan Library ini dalam bentuk file .zip , gunakan fungsi Add .ZIP Library dalam Arduino IDE, untuk install/tambahkan library ini dalam computer.

PERSEDIAAN UNTUK KE CODING ARDUINO

Project ini, kami TIDAK sarankan untuk mereka yang TIADa langsung Asas atau Fundamental Arduino, untuk terus lompat buat project ini.

Ini kerana, dalam menggunakan Arduino, kita perlu tahu dahulu Fundamental Hardware dan juga Fundamental C++ Coding supaya kita dapat kenal-pasti sebarang masalah atau error-error basic yang bakal terjadi ketika membuat project ini.

CODING BASIC MEMBACA PPM

Coding basic bagi menggunakan Library ini ada dalam bahagian example Library.
Hanya perlu navigasi ke:

File > Examples > PPMReader > PPM_Receiver_6CH

Ataupun, anda boleh terus Copy dan Paste coding di bawah ini, hanya selepas Library telah di-Install.

#include <PPMReader.h>

// Initialize a PPMReader on digital pin 3 with 6 expected channels.
int interruptPin = 3; //untuk Arduino UNO/NANO gunakan pin 3
int channelAmount = 6;
PPMReader ppm(interruptPin, channelAmount); //PPM Library Object


//VARIABLE SIMPAN DATA CHANNEL
int CH1 = 1500;
int CH2 = 1500;
int CH3 = 1500;
int CH4 = 1500;
int CH5 = 1500;
int CH6 = 1500;

void setup() {
  //MULAKAN SERIAL MONITOR
  Serial.begin(9600);
    
}//END VOID SETUP

void loop() {
 
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/
  CH1 = ppm.latestValidChannelValue(1, 0);
  CH2 = ppm.latestValidChannelValue(2, 0);
  CH3 = ppm.latestValidChannelValue(3, 0);
  CH4 = ppm.latestValidChannelValue(4, 0);
  CH5 = ppm.latestValidChannelValue(5, 0);
  CH6 = ppm.latestValidChannelValue(6, 0);
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/

  //LAKUKAN SEBARANG AKTIVITI PROJECT SELEPAS DATA CHANNEL DITERIMA
  //>Code di sini
  //>Code di sini
  //>Code di sini
  //>Code di sini
  
  
  //SERIAL MONITOR/PRINT SEMUA MAKLUMAT CHANNEL
  //Serial Print sebarang aktiviti selepas semua pemprosesan selesai
  Serial.print("CH1:");
  Serial.print(CH1);
  Serial.print(" CH2:");
  Serial.print(CH2);
  Serial.print(" CH3:");
  Serial.print(CH3);
  Serial.print(" CH4:");
  Serial.print(CH4);
  Serial.print(" CH5:");
  Serial.print(CH5);
  Serial.print(" CH6:");
  Serial.print(CH6);
  Serial.println();
}//END VOID LOOP

Selepas Coding telah diUpload,
nyalakan Transmitter dan buka Serial Monitor.

Serial Monitor patut menunjukkan bacaan Signal-PWM untuk setiap channel RC dari CH1 sehingga CH6.

CODING UNTUK AKTIFKAN RELAY

Dalam aktiviti ini, 2 relay disambungkan pada Digital Pin 4 dan Digital Pin 5 Arduino.

#include <PPMReader.h>

// Initialize a PPMReader on digital pin 3 with 6 expected channels.
int interruptPin = 3; //untuk Arduino UNO/NANO gunakan pin 3
int channelAmount = 6;
PPMReader ppm(interruptPin, channelAmount); //PPM Library Object


//VARIABLE SIMPAN DATA CHANNEL
int CH1 = 1500;
int CH2 = 1500;
int CH3 = 1500;
int CH4 = 1500;
int CH5 = 1500;
int CH6 = 1500;

void setup() {
  //MULAKAN SERIAL MONITOR
  Serial.begin(9600);

  //DECLARE PIN RELAY
  digitalWrite(4, HIGH); //OFFKAN RELAY
  digitalWrite(5, HIGH); //OFFKAN RELAY
  
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

    
}//END VOID SETUP

void loop() {
 
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/
  CH1 = ppm.latestValidChannelValue(1, 0);
  CH2 = ppm.latestValidChannelValue(2, 0);
  CH3 = ppm.latestValidChannelValue(3, 0);
  CH4 = ppm.latestValidChannelValue(4, 0);
  CH5 = ppm.latestValidChannelValue(5, 0);
  CH6 = ppm.latestValidChannelValue(6, 0);
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/

  //LAKUKAN SEBARANG AKTIVITI PROJECT SELEPAS DATA CHANNEL DITERIMA
  //>Code di sini
  //>Code di sini
  //RELAY 1 PADA PIN 4
  if(CH5 < 1400){
    digitalWrite(4, LOW); //ONKAN RELAY
  }
  if(CH5 > 1600){
    digitalWrite(4, HIGH); //OFFKAN RELAY
  }

  //RELAY 2 PADA PIN 5
  if(CH6 < 1400){
    digitalWrite(5, LOW); //ONKAN RELAY
  }
  if(CH6 > 1600){
    digitalWrite(5, HIGH); //OFFKAN RELAY
  }
  
  
  //SERIAL MONITOR/PRINT SEMUA MAKLUMAT CHANNEL
  //Serial Print sebarang aktiviti selepas semua pemprosesan selesai
  Serial.print("CH1:");
  Serial.print(CH1);
  Serial.print(" CH2:");
  Serial.print(CH2);
  Serial.print(" CH3:");
  Serial.print(CH3);
  Serial.print(" CH4:");
  Serial.print(CH4);
  Serial.print(" CH5:");
  Serial.print(CH5);
  Serial.print(" CH6:");
  Serial.print(CH6);
  Serial.println();
}//END VOID LOOP

CODING UNTUK GERAKKAN DC MOTOR LAIN DENGAN CONTROLLER

Komponen untuk bahagian ini adalah:

  • DC Motor
  • L298N Motor Controller
  • Battery 7V atau 12V
  • Arduino UNO
  • beberapa Jumper Cable

Pastikan Connection-Wiring dibuat mengikut diagram di bawah.

Untuk sesiapa yang belum mempunyai pengalaman mengawal DC Motor dengan Arduino, kami sarankan anda baca dan buat tutorial di bawah ini dahulu, sebelum mencuba untuk gandingkan dengan Remote Flysky.

Coding ini, akan mengawal Forward dan Reverse DC Motor, termasuk mengawal KADAR-KELAJUAN bahagian reverse serta bahagian forward.

#include <PPMReader.h>

// Initialize a PPMReader on digital pin 3 with 6 expected channels.
int interruptPin = 3; //untuk Arduino UNO/NANO gunakan pin 3
int channelAmount = 6;
PPMReader ppm(interruptPin, channelAmount); //PPM Library Object


//VARIABLE SIMPAN DATA CHANNEL
int CH1 = 1500;
int CH2 = 1500;
int CH3 = 1500;
int CH4 = 1500;
int CH5 = 1500;
int CH6 = 1500;

//VARIABLE MOTOR CONTROLLER
#define ENA 6
#define IN1 5
#define IN2 4

int MotorPWM;

void setup() {
  //MULAKAN SERIAL MONITOR
  Serial.begin(9600);

  //OFFKAN SEMUA KAWALAN MOTOR
  digitalWrite(ENA, LOW); //OFFKAN CONTROLLER
  digitalWrite(IN1, LOW); //OFFKAN CONTROLLER
  digitalWrite(IN2, LOW); //OFFKAN CONTROLLER

  //DECLARE PIN MOTOR CONTROLLER
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
 
}//END VOID SETUP

void loop() {
 
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/
  CH1 = ppm.latestValidChannelValue(1, 0);
  CH2 = ppm.latestValidChannelValue(2, 0);
  CH3 = ppm.latestValidChannelValue(3, 0);
  CH4 = ppm.latestValidChannelValue(4, 0);
  CH5 = ppm.latestValidChannelValue(5, 0);
  CH6 = ppm.latestValidChannelValue(6, 0);
  /***DAPATKAN MAKLUMAT PPM UNTUK SETIAP CHANNEL***/

  //LAKUKAN SEBARANG AKTIVITI PROJECT SELEPAS DATA CHANNEL DITERIMA
  //>Code di sini
  //>Code di sini

  if(CH2 > 1550){
    MotorPWM = map(CH2, 1550,2000,0,255);
    forward();
  }
  if(CH2 < 1450){
    MotorPWM = map(CH2, 1000,1450,255,0);
    reverse();
  }
  if(CH2 > 1450 && CH2 < 1550){
    brake();
  }
  
  //SERIAL MONITOR/PRINT SEMUA MAKLUMAT CHANNEL
  //Serial Print sebarang aktiviti selepas semua pemprosesan selesai
  Serial.print("CH1:");
  Serial.print(CH1);
  Serial.print(" CH2:");
  Serial.print(CH2);
  Serial.print(" CH3:");
  Serial.print(CH3);
  Serial.print(" CH4:");
  Serial.print(CH4);
  Serial.print(" CH5:");
  Serial.print(CH5);
  Serial.print(" CH6:");
  Serial.print(CH6);
  Serial.println();
}//END VOID LOOP

void forward(){
  analogWrite(ENA, MotorPWM); //OFFKAN CONTROLLER
  digitalWrite(IN1, LOW); //OFFKAN CONTROLLER
  digitalWrite(IN2, HIGH); //OFFKAN CONTROLLER

}//END FORWARD

void reverse(){
  analogWrite(ENA, MotorPWM); //OFFKAN CONTROLLER
  digitalWrite(IN1, HIGH); //OFFKAN CONTROLLER
  digitalWrite(IN2, LOW); //OFFKAN CONTROLLER

}//END FORWARD

void brake(){
  digitalWrite(ENA, LOW); //OFFKAN CONTROLLER
  digitalWrite(IN1, LOW); //OFFKAN CONTROLLER
  digitalWrite(IN2, LOW); //OFFKAN CONTROLLER

}//END BRAKE

Dalam keadaan Joystick Transmitter di posisi tengah, Motor akan terhenti.

Jika anda mempunyai sebarang PERTANYAAN berkenaan artikel ini, anda boleh maklumkan dalam bahagian COMMENT.

Selamat Bermain RC Radio Control!


Jika anda menyukai artikel-artikel keluaran MatGyver.my, kami mohon jasa baik tuan/cikpuan untuk sumbangkan like pada page FaceBook kami,
dan juga Subscribe ke YouTube Channel kami !

Dapatkan Tips-tips DIY dan Arduino dari FB Page Kami.
Konten Video Tips DIY Hobby MatGyver Official Channel.


GPS module menggunakan TinyGPSPlus.h

GPS module merupakan komponen yang digunakan untuk merekod lokasi sesuatu objek. Dalam tutorial kali ini kita akan belajar bagaimana GPS module ini berfungsi pada Arduino dengan menggunakan library TinyGPSPlus.h

Bagaimana GPS Module berfungsi?

GPS module memproses maklumat yang dihantar daripada satelit ke antena yang ada pada GPS module. Maklumat ini di hantar melalui Radio Frequency yang tertentu. Maklumat yang diproses adalah latitude, longitude dan masa.

Ketepatan maklumat ini bergantung pada jumlah satelit yang dikesan oleh GPS module dan kelajuan receiver bergerak. Semakin bnyak satelit dan semakin kurang kelajuan, semakin tepat maklumat yang diterima.

Terdapat beberapa jenis GPS module yang ada di pasaran cuma pada tutorial ini kita akan menggunakan NEO-6M GPS Module.

NEO-6M GPS Module

U-blox NEO-6M GPS Module with EPROM at Rs 599/piece | Satellite Road |  Ahmedabad| ID: 20970781962

Specification :

  • Size: 23mm x 30mm
  • Update Rate: 1 Hz, 5Hz maximum
  • Power Requirements: Power Supply Voltage: 3V – 5V
  • Baud Rate: 9600
  • Sensitivity: -161dBm
  • Number of Channels: 50
  • Antennas: Includes external patch antenna

GPS module ini mempunyai 4 pin dan disediakan dengan external antena yang perlu dipasang pada module

Lokasi antena dipasang

TinyGPSPlus.h library

TinyGPSPlus.h ini adalah library yang digunakan untuk susun dan asingkan data – data yang diterima oleh GPS module seperti latitude dan longitude.

Panduan Install Library

  1. Klik sini untuk download library ini.
  2. Dalam Software Arduino pergi ke Sketch > Include Library > Add .ZIP Libray.
  1. Pilih .ZIP file yang anda download tadi dan tekan ‘Open’.

Cara menggunakan TinyGPSPlus.h library

Rajah di bawah adalah sebagai panduan sebelum kita memulakan langkah seterusnya

DEFINING AREA

Include Library TinyGPSPlus dan SoftwareSerial(SoftwareSerial adalah library sedia ada yang digunakan untuk connection module GPS dan Arduino)

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

Cipta objek GPS dan declare pin Software Serial

TinyGPSPlus gps; // Object GPS

SoftwareSerial ss(4, 3);//pin 4 dan 3 digunakan untuk Software Serial 

Cipta Variables untuk simpan data GPS

//GPS Information variables
float Latitude;
float Longitude;

VOID SETUP

Mulakan Serial dan Software Serial

  Serial.begin(9600);
  ss.begin(9600);

VOID LOOP

Masukkan coding berikut

  if (ss.available() > 0){ // apabila Software Serial menerima data
    while(ss.available() > 0){ // Ketika Software Serial menerima data
      if (gps.encode(ss.read())){ // apabila data telah diterjemahkan
        GPSinfo(); // Subroutine untuk menyimpan data GPS
        
      }// END IF
    }  //END WHILE
  }// END IF

Coding di atas adalah command di mana data akan ditarik hanya apabila Arduino menerima data daripada GPS module melalui Software Serial(connection antara Arduino dan GPS module) dan data tersebut boleh difahami oleh Arduino.

SUB-ROUTINE

Berikut adalah coding sub-routine di mana dcoding ini haruslah diletakkan di luar void loop

void GPSinfo(){
  if (gps.location.isValid()){
    Latitude = gps.location.lat();
    Longitude = gps.location.lng();
  }
  Serial.print("Location: ");
  Serial.print(Latitude,6);
  Serial.print(",");
  Serial.print(Longitude,6);
  Serial.print(" ");

}

Coding dia atas menunjukkan kita hanya akan mengambil data location apabila data tersebut adalah valid dan printkan data tersebut ke Serial monitor dengan 6 titik perpuluhan.

Syntax gps.location.lat() adalah dimana data latitude disimpan dan syntax gps.location.lng() adalah dimana data longitude disimpan

Untuk mengambil maklumat tarikh masukkan coding seperti di bawah

  if (gps.date.isValid()){
    dayDate = gps.date.day();
    monthDate = gps.date.month();
    yearDate = gps.date.year();
  }

Untuk maklumat masa pula GPS secara default akan memberi data UTC timezone oleh itu ubah suai timezone anda pada data jam sahaja seperti coding di bawah

  if (gps.time.isValid()){
    hourTime = gps.time.hour() + 8; // Timezone Malaysia adalah UTC+8
    minuteTime = gps.time.minute();
  }

Sambungan Litar

Komponen yang diperlukan

  • Arduino Uno
  • NEO-6M GPS Module

Sambungan Diagram

  • Pin RX sambungkan ke pin 3 Arduino
  • Pin TX sambungkan ke pin 4 Arduino
  • VCC sambungkan ke 5v
  • GND sambungkan ke GND

Coding Penuh GPS Module

Berikut adalah coding yang disediakan merangkumi kesemua syntax yang dipelajari dalam tutorial ini

//Library
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps; // Object GPS

SoftwareSerial ss(4, 3);//pin 4 dan 3 digunakan untuk Software Serial 

//GPS Information variables
float Latitude;
float Longitude;
int dayDate = 0;
int monthDate = 0;
int yearDate = 0;
int hourTime = 0;
int minuteTime = 0;

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  ss.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (ss.available() > 0){ // apabila Software Serial menerima data
    while(ss.available() > 0){ // Ketika Software Serial menerima data
      if (gps.encode(ss.read())){ // apabila data telah diterjemahkan
        GPSinfo(); // Subroutine untuk menyimpan data GPS
        
      }// END IF
    }  //END WHILE
  }// END IF

}

void GPSinfo(){
  if (gps.location.isValid()){
    Latitude = gps.location.lat();
    Longitude = gps.location.lng();
  }

  if (gps.date.isValid()){
    dayDate = gps.date.day();
    monthDate = gps.date.month();
    yearDate = gps.date.year();
  }

  if (gps.time.isValid()){
    hourTime = gps.time.hour() + 8; // Timezone Malaysia adalah UTC+8
    minuteTime = gps.time.minute();
  }

  Serial.print("Location: ");
  Serial.print(Latitude,6);
  Serial.print(",");
  Serial.print(Longitude,6);
  Serial.print(" ");
  Serial.print("Date: ");
  Serial.print(dayDate);
  Serial.print("/");
  Serial.print(monthDate);
  Serial.print("/");
  Serial.print(yearDate);
  Serial.print(" ");
  Serial.print("Time: ");
  Serial.print(hourTime);
  Serial.print(":");
  Serial.print(minuteTime);
  Serial.println();
  delay (1000);
}

Anda boleh lihat hasilnya dalam Serial Monitor.

Setelah upload coding, GPS module mengambil masa lebih kurang 30 saat sebelum ia berfungsi sepenuhnya.

Bonus: GPS module dan Nodemcu

Seterusnya anda akan belajar bagaimana GPS module ini digunakan pada Nodemcu

Komponen yang diperlukan

  • Nodemcu
  • NEO-6M GPS Module

Sambungan Litar

  • Pin Tx sambungkan ke pin D2 pada Nodemcu
  • Pin Rx sambungkan ke pin D1 pada Nodemcu
  • Vcc sambungkan ke 3.3v pada Nodemcu
  • GND sambungkan ke GND pada Nodemcu

Coding

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

SoftwareSerial ss(4, 5);

//GPS Information variables
float Latitude;
float Longitude;


void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  ss.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (ss.available() > 0){
    while(ss.available() > 0){
      if (gps.encode(ss.read())){
        GPSinfo();
      }
    }  
  }

}

void GPSinfo(){
  if (gps.location.isValid())
  {
    Latitude = gps.location.lat();
    Longitude = gps.location.lng();
  }

  Serial.print("Location: ");
  Serial.print(Latitude,6);
  Serial.print(",");
  Serial.print(Longitude,6);
  Serial.println();
  delay (1000);
}

Penggunaan GPS module pada Nodemcu

Jika anda perasan, coding untuk Nodemcu adalah lebih kurang sama dengan coding untuk Arduino UNO.

Cuma apa yang apa yang berbeza antara Nodemcu dan Arduino UNO adalah penggunaan Sofware Serial iaitu pin dimana GPS module ini dipasang.

SoftwareSerial ss(4, 5);

Di atas adalah syntax pin Nodemcu yang digunakan untuk Software Serial dan pin ini adalah pin GPIO. Anda boleh rujuk gambar di bawah

Semoga tutorial ini dapat membantu anda untuk memahami cara – cara dan penggunaan GPS module ini.

SELAMAT MENCUBA

Joystick PS2 Controller dengan Arduino

Dalam tutorial ini, MatGyver akan tunjukkan Step-by-Step bagaimana membuat DIY PS2 Controller dengan menggunakan Arduino UNO.

Sebelum kita mulakan Tutorial, kami akan terangkan Perkara-perkara Penting yang perlu kita tahu berkenaan PS2 Controller.

PS2 Controller adalah kegunaan utama untuk PlayStation.Tetapi boleh digunakan untuk pelbagai lagi projek-projek seperti mengawal pergerakan kenderaan beroda atau kenderaan yang dijejaki. Mengawal lengan robot. Berinteraksi dengan komputer. Mengawal gunung dan kamera kecondongan. Sistem kawalan radio DIY dengan menggunakan modul bluetooth, atau modul radio untuk menghantar arahan dari pengawal Playstation 2 kepada Arduino lain yang mengawal kenderaan.

Hasil carian imej untuk ps2 controller arduino png

Fungsi PS2 Controller

Bagi mengaktifkan Fungsi PS2 Controller pada Arduino UNO, anda akan perlukan Library PS2X_lib.h yang akan GENERATE-kan signal Sebuah PS2 dan di hantar ke PC melalui USB.

Langkah #1: Sambungan Litar

Komponen-komponen yang diperlukan :

  • Arduino UNO
  • Sony PS2 wireless controller

Sambungkan litar anda seperti rajah di bawah:

INSTALL LIBRARY PS2X_lib.h

Library yang akan digunakan dalam tutorial ini, adalah library oleh Tuan Bill Porter’s dari GitHub.

Library ini mempunyai pelbagai folder, dan kami telah permudahkan dalam link berikut untuk di Download:

Library PS2 By Bill Porter’s

atau, anda boleh terus ke link GitHub-nya adalah dibawah:

https://github.com/madsci1016/Arduino-PS2X


Setelah Download Library Joystick.h dalam bentuk .ZIP file,
NAVIGASI KE:

Sketch > Include Library > Add.ZIP Library

untuk install Library tersebut.

MENGGUNAKAN LIBRARY PS2X_lib.h

Rujuk rajah berikut sebagai panduan untuk langkah-langkah seterusnya.

DEFINING AREA

Includekan PS2X_lib.h dan juga cipta objek PS2.

PENTING 1# Pin SPI pada setiap board adalah berbeza

Tetapkan pin SPI yang akan digunakan disini

//Includekan Library PS2X_lib.h
#include <PS2X_lib.h>  //for v1.6
//namakan pin yang digunakan
//Pin SPI pada setiap Arduino adalah berbeza
//Pin di bawah ada untuk Arduino Uno
#define PS2_DAT        12 //MISO     
#define PS2_CMD        11 //MOSI 
#define PS2_SEL        10 //SS 
#define PS2_CLK        13 //SCK 
#define pressures   false
#define rumble      false
//Cipta Objek PS2 untuk digunakan dalam coding
PS2X ps2x; 
//variable yang digunakan
byte vibrate = 0;


 


 

VOID SETUP

void setup(){
 
   Serial.begin(9600);
   delay(300);
   //tambah sedikit delay untuk memberikan mod ps2 wireless untuk start beberapa masa untuk memulakan, sebelum mengkonfigurasinya
   //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) semak kesalahan
   ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
  
   }//end void setup



VOID LOOP

Rujuk Syntax-syntax di bawah untuk digunakan dalam Void Loop.

MENU PS2 GAMEPAD

void loop() {
  
/***PENTING****/
  //Ini adalah syntax untuk membaca value PS2 button
  ps2x.read_gamepad(false, vibrate);
  
   if(ps2x.Button(PSB_START)== 1){
    //jika button ditekan value pada button akan menjadi 1
    //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"
      Serial.println("START");
      }
      
   if(ps2x.Button(PSB_SELECT)== 1){
    //jika button ditekan value pada button akan menjadi 1
    //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"
      Serial.println("SELECT");
      }
  }

STICK_AXIS PS2 GAMEPAD

void loop() {
  
/***PENTING****/
  //Ini adalah syntax untuk membaca value PS2 button
  ps2x.read_gamepad(false, vibrate);
  
/***STICK KANAN****/
     if(ps2x.Analog(PSS_RY) > 130){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE BAWAH");

     }
     
     if(ps2x.Analog(PSS_RY) < 125 ){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE ATAS");
  
     }
     if(ps2x.Analog(PSS_RX) > 130){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127
     Serial.println("KE KANAN");
  
  
     }
     if(ps2x.Analog(PSS_RX) < 125 ){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE KIRI");
  
     }

     //Button Stick Kanan
     if(ps2x.Button(PSB_R3) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"
      Serial.println("Button Stick kanan");
        
        }

/***STICK KIRI****/
     if(ps2x.Analog(PSS_LY) > 130){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE BAWAH");

     }
     
     if(ps2x.Analog(PSS_LY) < 125 ){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE ATAS");
  
     }
     if(ps2x.Analog(PSS_LX) > 130 ){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE KANAN");
  
  
     }
     if(ps2x.Analog(PSS_LX) < 125){
      //Range value pada stick adalah 0~255
      //Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu
     Serial.println("KE KIRI");
  
     }

     //Button Stick Kiri
     if(ps2x.Button(PSB_L3) == 1 ){
        //jika button ditekan value pada button akan menjadi 1
        //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"
        Serial.println("Button Stick kiri");
        
        }
      
  }//END VOID LOOP

Range value pada stick adalah 0~255 Kedudukan stick pada value 127,anda boleh tukarkan value yang anda mahu

Stick_axis mewakili Stick dan arah yang hendak dibaca, seperti berikut:

PSS_LY = y-kedudukan stick ke kiri
PSS_LX = x-kedudukan stick ke kanan
PSS_RY = y-kedudukan stick ke kiri
PSS_RX = x-kedudukan stick ke kanan

TRIGGER PS2 GAMEPAD

void loop() {
  
/***PENTING****/
  //Ini adalah syntax untuk membaca value PS2 button
  ps2x.read_gamepad(false, vibrate);
 

   if(ps2x.Button(PSB_TRIANGLE) == 1){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"
      Serial.println("Button Tiga Segi"); 
             
      }

    if(ps2x.Button(PSB_CIRCLE) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Button Bulat");
      
      }
      
    if(ps2x.Button(PSB_CROSS) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Button Pangkah");
      
      }
      
    if(ps2x.Button(PSB_SQUARE) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Button Petak");
      
      }    
      
  }//END VOID LOOP


 

BUTTON ARAH PS2 GAMEPAD

void loop() {
  
/***PENTING****/
  //Ini adalah syntax untuk membaca value PS2 button
  ps2x.read_gamepad(false, vibrate);
 
    if(ps2x.Button(PSB_PAD_UP) == 1 ) {
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Ke Atas");
      
    }
    if(ps2x.Button(PSB_PAD_RIGHT) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Ke Kanan ");
      
    }
    if(ps2x.Button(PSB_PAD_LEFT) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Ke Kiri");
     
    }
    if(ps2x.Button(PSB_PAD_DOWN) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"      
      Serial.println("Ke Bawah");
    
    }   
    
  }//END VOID LOOP

BUTTON PEMICU PS2 GAMEPAD

void loop() {
  
      /***PENTING****/
      //Ini adalah syntax untuk membaca value PS2 button
      ps2x.read_gamepad(false, vibrate);
 

      if(ps2x.Button(PSB_L1) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"         
      Serial.println("Button Kiri 1");
      }
      
      if(ps2x.Button(PSB_R1) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"         
      Serial.println("Button Kanan 1");
      }
      
      if(ps2x.Button(PSB_L2) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"             
      Serial.println("Button Kiri 2");
      }
      
      if(ps2x.Button(PSB_R2) == 1 ){
      //jika button ditekan value pada button akan menjadi 1
      //boleh masukkan apa-apa yang ingin ada ingin gerakkan disini contohnya "Servo"         
      Serial.println("Button Kanan 2");
      }
      
  }//END VOID LOOP