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:
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:
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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?
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:
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:
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 andavoidsetup(){// Setup Code di sini hanya akan berjalan sekali sahajapinMode(2,OUTPUT);// Declare pin 2 sebagai digital output// LED disambungkan pada pin 2}voidloop(){// Di sini biasanya adalah code utama projek// Code dalam void loop() akan di-loop secara infinitidigitalWrite(2,HIGH);//digital output HIGH = 5V pada LED (ON)delay(1000);//loop tunggu 1000 millisaat = 1s//bermaksud signal LED ON selama 1sdigitalWrite(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.
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 tersebutdan 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:
Membaca Input
Memproses Data/Maklumat
Arahan Output
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.
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:
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
}
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 SerialSerial.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:
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:
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:
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:
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.
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 denganLibray 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+ .
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 radiodata.but1=255;}if(digitalRead(4)==HIGH){//jika butang dilepas, send nilai 0 pada radiodata.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 RF24Lconstuint64_tpipeOut=0xA8A8F6F6E1LL;//address/alamat unik ditentukan oleh penggunaRF24radio(9,10);//pin CE(9) & CSN(10)//MOSI(11) , SCK(13) , MISO(12)//Struktur Data-Array yang akan di transmit setiap cycle//data dinamakan MyDatastructMyData{bytebut1;//1 byte data digunakan untuk menghantar status butang};// boleh hantar sehingga 32 byte data dalam satu cycle penghnataran dataMyDatadata;//prefix "data" diletakkan kepada setiap individu-array dalam MyDatavoidsetup(){//PERMULAAN VOID SETUPpinMode(4,INPUT_PULLUP);//butang disambung pada digital pin 4delay(100);Serial.begin(9600);//Serial untuk debug/check coding outputradio.begin();//memulakan radio nRFradio.setAutoAck(false);radio.setDataRate(RF24_250KBPS);//kelajuan penghantaran data nRFradio.openWritingPipe(pipeOut);//set module nRF sebagai transmitter(pipeOut)data.but1=0;//nilai permulaan variable untuk butang bersamaan 0delay(300);}//PENUTUP VOID SETUP//PROGRAM UTAMAvoidloop(){//permulaan void loop if(digitalRead(4)==LOW){//jika butang ditekan, send nilai 255 pada radiodata.but1=255;}if(digitalRead(4)==HIGH){//jika butang dilepas, send nilai 0 pada radiodata.but1=0;}radio.write(&data,sizeof(MyData));//send semua data set array MyData kepada penerimacheckserial();//check data pada serial monitor adakah butang berfungsi}//voidcheckserial(){//seria print untuk debugSerial.print("Butang 1: ");//serial print nilai butangSerial.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:
Output nilai ‘0’ ketika butang Off
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)
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>constuint64_tpipeIn=0xA8A8F6F6E1LL;//address/alamat unik ditentukan oleh pengguna//alamat ini perlu sama dengan unit TransmitterRF24radio(9,10);//pin CE(9) & CSN(10)//MOSI(11) , SCK(13) , MISO(12)//Struktur Data-Array yang akan di transmit setiap cycle//data dinamakan MyDatastructMyData{byteinbut1;//namakan data array};// Jumlah size data adalah 1 byte, masih ada 31 lagi kekosonganMyDatadata;//prefix "data" diletakkan kepada setiap individu-array dalam MyDatavoidsetup(){//PERMULAAN VOID SETUPSerial.begin(9600);radio.begin();//memulakan radio nRFradio.setAutoAck(false);radio.setDataRate(RF24_250KBPS);//kelajuan penghantaran data nRFradio.openReadingPipe(1,pipeIn);//set module nRF sebagai Receiver(pipeIn)//pilih pipe nombor 1. boleh terima sehingga 6 piperadio.startListening();//bersedia untuk menerima sebarang data/signaldelay(100);data.inbut1=0;//default value pada input variabledelay(500);}/************************************************/unsignedlonglastRecvTime=0;//declare variable untuk check cycle timevoidloop(){while(radio.available()){//check jika ada sebarang input dari Transmitter radio.read(&data,sizeof(MyData));//read data dan susun dalam array MyDatalastRecvTime=millis();//declare permulaan masa data di-check}unsignedlongnow=millis();//masa selepas input diterimaif(now-lastRecvTime>1000){//FAIL-SAFE jika masa melebihi 1 saatdata.inbut1=0;//FAIL-SAFE data jika RF module tidak terima data}//data akan beri default value 0byteBut1=data.inbut1;//simpan data dalam algo baru But1Serial.print("Butang Input: ");//check input dengan serialSerial.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:
Bacaan apabila butang TIDAK ditekan.
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.
(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:
Sambungan Komponen Electroniks
Aktiviti Programming dan Coding
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
Anda hanya perlu ada 3 komponen seperti di atas untuk menghidupkan Arduino buat pertama kali:
Laptop/Komputer Peribadi
Arduino Board (UNO, NANO, MEGA 2560, atau yang lain2)
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.
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.
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 sahaja terus seperti mana-mana USB device yang lain.
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” 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” 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.
PENTING! :Pastikan anda memilih Board yang betul dalam pilihan “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
voidsetup(){// bahagian untuk setup codeSerial.begin(9600);//Line #1Serial.print(" Hello World ");//Line #2}voidloop(){// 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)
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
voidsetup(){// bahagian untuk setup codeSerial.begin(9600);//Line #1}voidloop(){// main code yang akan berulang-ulangSerial.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)
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.
Window Save As
Kemudian, upload Sketch tadi ke dalam Arduino anda dengan semudah menekan butang “Upload” seperti dalam gambar di bawah:
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.
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 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.
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 RF24Lconstuint64_tpipeOut=0xA8A8F6F6E1LL;//address/alamat unik ditentukan oleh penggunaRF24radio(9,10);//pin CE(9) & CSN(10)//MOSI(11) , SCK(13) , MISO(12)//Struktur Data-Array yang akan di transmit setiap cycle//data dinamakan MyDatastructMyData{bytebut1;//1 byte data digunakan untuk menghantar status butang};// boleh hantar sehingga 32 byte data dalam satu cycle penghnataran dataMyDatadata;//prefix "data" diletakkan kepada setiap individu-array dalam MyDatavoidsetup(){//PERMULAAN VOID SETUPpinMode(4,INPUT_PULLUP);//butang disambung pada digital pin 4delay(100);Serial.begin(9600);//Serial untuk debug/check coding outputradio.begin();//memulakan radio nRFradio.setAutoAck(false);radio.setDataRate(RF24_250KBPS);//kelajuan penghantaran data nRFradio.openWritingPipe(pipeOut);//set module nRF sebagai transmitter(pipeOut)data.but1=0;//nilai permulaan variable untuk butang bersamaan 0delay(300);}//PENUTUP VOID SETUP//PROGRAM UTAMAvoidloop(){//permulaan void loop if(digitalRead(4)==LOW){//jika butang ditekan, send nilai 255 pada radiodata.but1=255;}if(digitalRead(4)==HIGH){//jika butang dilepas, send nilai 0 pada radiodata.but1=0;}radio.write(&data,sizeof(MyData));//send semua data set array MyData kepada penerimacheckserial();//check data pada serial monitor adakah butang berfungsi}//voidcheckserial(){//seria print untuk debugSerial.print("Butang 1: ");//serial print nilai butangSerial.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:
Output nilai ‘0’ ketika butang Off
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:
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.
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.
LCD Widget (tengah atas)
LED Widget (kiri bawah)
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.
STEP 7: Untuk setting Widget LED , letakkan input V1 (Virtual V1).
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)
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/blynkapphttp://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 *************************************************************/#defineBLYNK_PRINTSerial#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 emailcharauth[]="4fb6252baaa447af9b6aeb674982d5e0";//masukkan code auth token anda di sini// Maklumat WiFi// Set password pada "" untuk network tanpa password.charssid[]="********";//letakkan nama WiFi Network di sinicharpass[]="*******";//letakkan PASSWORD WiFi Network di sini//Setting untuk Software Serial Uno atau Nano...#include<SoftwareSerial.h>SoftwareSerialEspSerial(2,3);// RX, TX//SETTING ESP8266// Kelajuan Baud Rate Module ESP8266:#defineESP8266_BAUD9600ESP8266wifi(&EspSerial);//SETTING/DECLARE WIDGET LEDWidgetLEDled3(V1);//Virtul LED dalam blynk pada pin V1//SETTING/DECLARE WIDGET LCDWidgetLCDlcd(V2);//pin Virtual V2 sebagai input pada Blynk LCD//SETTING MODULE NRF24structMyData{//data-array untuk input dari nRF24byteinbut1;};MyDatadata;//data-array untuk input dari nRF24constuint64_tpipeIn=0xA8A8F6F6E1LL;RF24radio(9,10);//pin CE & CN (pin data)//VARIABLE UNTUK MEMBACA DATA INPUT BUTANG RESETintstatbut1=0;//initial value of Virtual RESET PIN in Blynk//CODING/SETTING WAJIB UNTUK MENGGUNAKAN BUTANG VIRTUAL DALAM BLYNK APPbooleanbtnState=false;BLYNK_WRITE(3)//virtual pin V3 declare sebagai input{intpinValue=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}}voidsetup(){///**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/DEBUGSerial.begin(9600);//MULAKAN DAN SET MODULE WiFi ESP8266EspSerial.begin(ESP8266_BAUD);delay(10);//MULAKAN BLYNK LIBRARYBlynk.begin(auth,wifi,ssid,pass);//PERMULAAN DISPLAY LCDlcd.clear();lcd.print(4,0,"SISTEM");//DATA PADA BARIS PERTAMAlcd.print(4,1,"START...");//DATA PADA BARIS KEDUA delay(2000);lcd.clear();//CLEARKAN LCD}unsignedlonglastRecvTime=0;voidloop(){while(radio.available()){//CHECK DATA INPUT DARI NRF24radio.read(&data,sizeof(MyData));lastRecvTime=millis();}unsignedlongnow=millis();//FAIL-SAFE VALUE JIKA TIADA DATA RECEPTIONif(now-lastRecvTime>1000){data.inbut1=0;}byteBut1=data.inbut1;//SIMPAN DATA INPUT DARI NRF24 DALAM But1//KONDISI APABILA BUTANG TIDAK DITEKANif(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 DEBUGBlynk.run();//PASTIKAN BLYNK SENTIASA ACTIVATE}//CODING UNTUK FUNGSI NORMALvoidNormalCondition(){lcd.print(0,0,"Rumah Anda");lcd.print(0,1,"Selamat");}//CODING UNTUK FUNGSI ALARMvoidAlarmCondition(){lcd.clear();//CODING/CYCLE UNTUK ALARM CONDITIONwhile(statbut1==0){lcd.print(0,0,"!!!PERHATIAN!!!");lcd.print(0,1,"PINTU TERBUKA!!!");led3.on();delay(300);//DELAY MENYALAlcd.clear();led3.off();delay(200);//DELAY OFFBlynk.run();//PASTIKAN BLYNK SENTIASA ACTIVATEBlynk.syncVirtual(V3);//CODING UNTUK MEMASTIKAN BUTANG RESET DAPAT DI BACAcheckserial();}//CODING UNTUK KONDISI RESETlcd.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 INPUTvoidcheckserial(){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.
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 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:
Menggunakan RTC Module sebagai Module yang menyimpan maklumat masa. Kemudian hantarkan masa tersebut dari NodeMCU.
Menggunakan Library Time NTP Server, di mana masa diambil dari Server NTP tanpa menggunakan RTC module, dan dihantar dari NodeMCU.
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(newDate(), "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.
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 TABLEDATA 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 ESP32PERLU 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 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.
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.
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
ESP32
Arduino UNO
Bilangan Core CPU
2 (Dual-Core)
1 (Single-Core)
Built-In WiFi
2.4GHz
TIADA
Built-In Bluetooth
BLE dan Legacy Bluetooth
TIADA
CPU Clock Frequency
sehingga 240MHz
16MHz
CPU Architecture
32-bit
8-bit
RAM
512 KB
2 KB
EEPROM
4 KB
1 KB
Flash Memory
4 MB
32 KB
Digital/Analog Pins
30~36pin
19 pin
Analog-In Pins
14 (rujuk carta Pantang-Larang)
6 pin
Hardware Serial
2
1
I2C Port
1
1
SPI Port
2
1
Capacitive Touch Pin
10
TIADA
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:
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.
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.
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)
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.
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
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.
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.
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.
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.
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:
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:
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:
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 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.
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)
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-Variablenow , 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.
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 FS–iA6B 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)
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 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 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
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.
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
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.
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.
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:
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