Membangun Proyek IoT Sederhana dengan Arduino UNO, ESP-01, ThingSpeak & MIT App Inventor
Komponen dan Perlengkapan
Arduino UNO
×
1
Espressif ESP8266 ESP-01
×
1
Sensor Suhu DHT22
×
1
Sensor Suhu Digital 1-Wire DS18B20 untuk tanah
×
1
LDR - Resistor Bergantung Cahaya
×
1
Modul Relay DC 5V 2 Saluran
×
1
Aplikasi dan Layanan Online
Arduino IDE
ThingSpeak API
MIT App Inventor
Tentang Proyek Ini
Tujuan kami pada dasarnya adalah mengumpulkan informasi dari unit lokal dan mengirimkannya ke internet. Pengguna di mana saja di planet ini yang melihat informasi ini akan membuat keputusan dengan mengirim perintah jarak jauh ke aktuator, yang juga akan ada dalam unit lokal ini. Sensor atau aktuator apa pun dapat digunakan.
Sebagian besar pekerjaan saya di bidang IoT menggunakan NodeMCU dan lebih baru lagi, ESP32. Namun, menurut saya penting untuk tidak melupakan langkah awal saya, beberapa tahun yang lalu ketika saya mulai mempelajari IoT menggunakan Arduino UNO dan ESP8266-01 yang lama dan baik.
Jadi, saya memutuskan di sini untuk kembali ke waktu itu (dengan sedikit lebih banyak pengalaman sekarang) dan menjelajahi lagi perangkat hebat ini, menghubungkannya ke cloud, menggunakan layanan web ThingSpeak.com. Kami juga akan menjelajahi cara mengontrol hal-hal secara jarak jauh menggunakan aplikasi Android yang dikembangkan dengan MIT App Inventor.
"Pusat proyek IoT kami" akan menjadi ThingSpeak.com. Unit lokal (UNO/ESP-01) akan menangkap data dari sensor dan status aktuator, mengirim data tersebut ke Internet, "menulis" ke Saluran Status ThingSpeak.com tertentu. Unit lokal juga akanmenerima data dari internet, "membaca" dari Saluran Aktuator ThingSpeak tertentu.
Aplikasi Android juga akanmembaca data tersebut dari Saluran Status ThingSpeak.com dan menampilkannya bagi pengguna. Dengan cara yang sama, pengguna, berdasarkan informasi status tersebut, dapat mengirim perintah ke aktuator, menulis data tersebut ke Saluran Aktuator ThingSpeak (Lihat diagram blok di atas untuk memahami alur data dengan lebih baik).
Jadi, apa yang akan kita lakukan? Diagram blok yang ditampilkan di langkah berikutnya akan memberikan gambaran umum tentang proyek akhir:
Langkah 1: Pengantar
Menggunakan sensor umum, proyek kami akan menangkap beberapa data, mengirimkannya ke cloud, di mana semua orang dapat melihatnya melalui internet. Untuk memproses data tersebut, kami akan menggunakan layanan yang disediakan oleh ThingSpeak.com, platform IoT terbuka yang akan memungkinkan kami untuk mengumpulkan, menganalisis, dan bertindak terhadap data tersebut.
Data yang akan dikumpulkan oleh sensor adalah:
Suhu Udara dan kelembaban relatif
Suhu Tanah dan kelembaban
Kecerahan
Proyek akan memiliki 2 aktuator:
Pompa Listrik
Lampu Listrik
Status aktuator tersebut ("ON/OFF") juga harus dikirim ke cloud.
Jadi, idenya adalah menangkap data tersebut dari sensor, misalnya, sebuah perkebunan dan mengirimkannya ke cloud. Berdasarkan data tersebut, pengguna harus mengambil keputusan berdasarkan pernyataan berikut:
Nyalakan Pompa jika kelembaban tanah terlalu rendah
Nyalakan Lampu jika suhu tanah terlalu rendah
Untuk mengontrol aktuator kita secara jarak jauh, kami akan menggunakan aplikasi Android.
Langkah 2: Daftar Bahan (BoM)
Beberapa komponen terpenting yang tercantum di sini memiliki tautan dan harga perkiraan dalam USD yang terkait. Tautan tersebut hanya untuk informasi.
Arduino UNO (Mikrokontroler) - $10.00
ESP8266-01 (Modul Komunikasi) - $3.50
DHT22 (Sensor Suhu dan Kelembaban Udara) - $9.00
DS18B20 (Sensor Suhu Digital 1-Wire untuk tanah) - $6.00
YL-69 + LM393 (Sensor Kelembaban Tanah) - $2.00
LDR (Sensor Kecerahan) - $0.20
2 x LED (Merah dan Hijau)
1 x Modul Relay DC 5V 2 Saluran dengan Optokopler Low Level Trigger - $7.00
Pompa DC 5V - $3.00
Lampu 220V
2 x Resistor 330 ohm (untuk digunakan dengan LED)
2 x Resistor 10K ohm (untuk digunakan dengan DHT22 dan LDR)
1 x Resistor 4K7 ohm (untuk digunakan dengan DS18B20
Protoboard
Kabel Jumper
Daya Eksternal DC 5V untuk Relai
Langkah 3: Perangkat Keras
Mari kita rangkai perangkat keras proyek. Idealnya adalah memasang dan menguji proyek kami secara bertahap. Sebagai saran, kita dapat mengikuti langkah-langkah berikut:
Pasang dan uji semua sensor secara lokal
Pasang dan konfigurasikan ESP-01 (BareMinimum)
Ubah pemasangan ESP-01 ke konfigurasi akhir dan uji coba
Konfigurasikan Saluran Status ThingSpeak
Pasang kode ThingSpeak di Arduino Anda dan periksa status Sensor di Cloud
Kembangkan versi pertama aplikasi Android untuk menampilkan Status dan pesan
Pasang aktuator (LED dan Relai)
Konfigurasikan saluran Aktuator ThingSpeak
Pasang dan uji Kode Arduino dengan Aktuator
Kembangkan versi akhir Aplikasi Android
Langkah 4: Menghubungkan Sensor
Kami harus memiliki beberapa library yang terinstal di IDE kami untuk membaca sensor dengan benar. Periksa apakah Anda telah menginstal semua library. Konfigurasi awalnya harusnya adalah:
// DS18B20 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 // DS18B20 on pin D5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); int soilTemp = 0; //DHT #include "DHT.h" #include <stdlib.h> int pinoDHT = 11; int tipoDHT = DHT22; DHT dht(pinoDHT, tipoDHT); int airTemp = 0; int airHum = 0; // LDR (Light) #define ldrPIN 1 int light = 0; // Soil humidity #define soilHumPIN 0 int soilHum = 0;
Gambar Serial Monitor di bawah ini menunjukkan nilai sensor.
Kode dapat diunduh dari GITHUB saya: Sensors_Test.ino
Langkah 5: Konfigurasi Awal ESP8266-01
ESP-01 akan digunakan sebagai Jembatan Serial, yang berarti kita akan memprogramnya menggunakan "perintah AT". Hal pertama adalah memastikan bahwa ESP-01 Anda pada kecepatan komunikasi Baud Rate yang benar. Dalam kasus kami, 9.600 baud. Biasanya, ESP-01 datang diprogram dari pabrik dengan 115.200 baud dan kita harus mengubahnya menjadi 9.600 baud.
Pertama, Anda harus menghubungkan ESP-01 seperti yang ditunjukkan di atas.
Lalu hubungkan Arduino ke komputer Anda, buka IDE dan muat contoh yang ada di File> Contoh> 01.Basics> BareMinimum. Ini adalah kode kosong, untuk memastikan tidak akan ada bentrokan komunikasi antara Arduino dan ESP.
Kami telah mentransfer kode ini ke Arduino sebelum menghubungkannya ke ESP-01S untuk memastikan Arduino tidak akan menggunakan komunikasi serial (TX dan RX). Ini penting agar ESP dapat berkomunikasi dengan benar.
Buka Serial Monitor IDE Anda dan ubah kecepatan menjadi 115.200 baud. Mulai mengirim perintah "AT" di Serial Monitor IDE Anda. ESP-01 seharusnya mengembalikan "OK"
Selanjutnya, mari kita ubah kecepatan. Untuk itu, Anda dapat menggunakan perintah:
AT + CIOBAUD = 9600
Perhatikan bahwa ESP-01 mungkin kembali ke pemrograman pabrik (Saya tidak tahu apakah ini karena versi FW). Setidaknya dalam kasus saya, saya harus menggunakan perintah yang berbeda untuk mengubah BaudRate secara permanen:
Contoh: 9600 baud / 8 bit data / 1 bit stop dan tidak ada parity serta flow control:
AT + UART_DEF = 9600,8,1,0,0
Dalam kotak pilihan di bagian bawah Serial Monitor Anda, ubah kecepatan menjadi "9600 baud". Uji komunikasi: di bagian atas jendela ketik AT dan lihat jawaban OK. Sekarang Anda harus mengonfigurasi modul dalam Station Mode untuk bertindak sebagai Klien jaringan Wi-Fi Anda. Gunakan perintah:
AT + CWMODE = 1
Sekarang kita harus menghubungkan modul ke jaringan Wi-Fi Anda.
Untuk melakukan ini, gunakan perintah di bawah ini, ganti "network_name" dengan nama jaringan Wi-Fi Anda dan "network_name" dengan kata sandi Anda. Tetap tanda kutip.
AT + CWJAP = "network_name", "network_name"
Jika Anda melihat jawaban di bawah ini, koneksi Anda telah terbentuk dengan benar:
WIFI CONNECTED WIFI GOT IP
Untuk menemukan IP, jalankan perintah:
AT + CIFSR
Dan catat alamat IP yang akan muncul di Serial Monitor Anda. Anda mungkin membutuhkannya di masa depan.
Langkah 6: Menguji ESP-01
Setelah kita mengonfigurasi ESP-01, kita harus memasangnya di rangkaian akhir. Untuk itu kita harus MENGUBAH pemasangan yang dilakukan sebelumnya dan menghubungkan ESP-01 ke UNO kami seperti di bawah ini:
ESP-01 RX (Kuning) ke UNO Pin D7
ESP-01 TX (Oranye) ke UNO Pin D6
ESP-01 Ch-Pd (Cokelat) ke Vcc (3.3V)
ESP-01 Reset (Biru) ke UNO Pin D8
ESP-01 Vcc (Merah) ke 3.3V
ESP-01 Gnd (Hitam) ke UNO GND
Mari kita lakukan tes sederhana untuk memeriksa apakah ESP-01 kami terpasang dan diuji dengan benar. Masukkan kode di bawah ini:
Sekarang, coba beberapa perintah AT dan lihat hasilnya di Serial monitor Anda:
* AT =====> ESP8266 returns OK * AT+RST =====> ESP8266 restart and returns OK * AT+GMR =====> ESP8266 returns AT Version; SDK version; id; OK * AT+CWMODE? => ESP8266 returns mode type * AT+CWLAP ===> ESP8266 returs close access points * AT+CIFSR ===> ESP8266 returs designided IP
Kode dapat diunduh dari GITHUB saya: ESP_AT_Config.ino
Jika Anda ingin terhubung ke jaringan WiFi setiap kali reset terjadi (atau Arduino Anda dimatikan / dinyalakan) dan memasukkan kredensial Anda, tambahkan panggilan ke fungsi connectWiFi () di akhir fungsi setup ():
setup() { ... connectWiFi(); }
Fungsi connectWiFi () harus berada di akhir kode .ino utama Anda:
Perhatikan bahwa fungsi di atas memanggil fungsi sendData (data) lainnya, yang juga harus terletak di kode Anda:
String sendData(String command, const int timeout, boolean debug) { String response = ""; EspSerial.print(command); long int time = millis(); while ( (time + timeout) > millis()) { while (EspSerial.available()) { // The esp has data so display its output to the serial window char c = EspSerial.read(); // read the next character. response += c; } } if (debug) { Serial.print(response); } return response; }
Langkah 7: Menghubungkan Sensor dan ESP-01
Setelah semua sensor kami terpasang dan diuji serta ESP-01 kami berfungsi dengan baik, mari kita lihat semuanya bersama-sama dan siap untuk mengirim data ke internet.
Langkah 8: ThingSpeak
Salah satu bagian terpenting dari proyek kami adalah ThingSpeak, platform IoT terbuka yang akan memungkinkan kami untuk mengumpulkan, menganalisis, dan bertindak terhadap data yang dikumpulkan. Jika Anda belum memilikinya, silakan kunjungi ThingSpeak untuk mendaftar dan membuat akun Anda.
Selanjutnya, buat Channel baru tempat kita akan memiliki 2 aktuator, 5 sensor, dan satu bidang cadangan status:
Field 1: Aktuator 1
Field 2: Aktuator 2
Field 3: Suhu Udara dalam oC
Filed 4: Kelembaban Udara Relatif dalam %
Field 5: Suhu Tanah dalam oC
Field 6: Kelembaban Tanah dalam %
Field 7: Kecerahan dalam %
Field 8: Cadangan
Field 8 akan dibiarkan sebagai cadangan untuk digunakan untuk ekspansi di masa depan atau untuk tujuan debug. Misalnya, saya akan menggunakannya sebagai "penghitung" untuk setiap kesalahan komunikasi yang terjadi selama jabat tangan Arduino/ESP-01 dengan ThingSpeak.com.
Setelah Anda membuat channel Anda (dalam hal ini akan menjadi Saluran Status kami), akan penting untuk mencatat kunci Anda, seperti yang ditunjukkan di bawah ini.
Langkah 9: Mengirim Status ke Cloud
Pada titik ini, kami telah memiliki Layanan Cloud yang tersedia dan sensor kami menangkap data secara lokal. Mari kita ambil nilai-nilai tersebut dan kirimkan ke ThingSpeak.com. Kami akan MENULIS ke channel ThingSpeak dan untuk itu, kita perlu mengirim string GET. Kami akan melakukannya dalam 3 bagian:
Kami akan mengirim "Start cmd":
AT+CIPSTART="TCP","184.106.153.149",80
Diikuti oleh "panjang" perintah:
AT+CIPSEND=116
Dan string GET itu sendiri, yang akan menulis ke bidang yang sesuai pada Saluran Status:
GET /update?api_key=YOUR_WRITE_KEY_HERE&field1=pump&fieldlamp=0&field3=airTemp&field4=airHum&field5=soilTemp&field6=soilHum&field7=light&field8=spare<br>
Kode di bawah ini akan melakukan pekerjaan untuk kita dan PrintScreen di atas menunjukkan hasilnya di Serial Monitor:
// Thingspeak String statusChWriteKey = "6SRPQQKIE6AJVQE6"; // Status Channel id: 385184 #include <SoftwareSerial.h> SoftwareSerial EspSerial(6, 7); // Rx, Tx #define HARDWARE_RESET 8 // DS18B20 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 // DS18B20 on pin D5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); int soilTemp = 0; //DHT #include "DHT.h" #include <stdlib.h> int pinoDHT = 11; int tipoDHT = DHT22; DHT dht(pinoDHT, tipoDHT); int airTemp = 0; int airHum = 0; // LDR (Light) #define ldrPIN 1 int light = 0; // Soil humidity #define soilHumPIN 0 int soilHum = 0; // Variables to be used with timers long writeTimingSeconds = 17; // ==> Define Sample time in seconds to send data long startWriteTiming = 0; long elapsedWriteTime = 0; // Variables to be used with Actuators boolean pump = 0; boolean lamp = 0; int spare = 0; boolean error; void setup() { Serial.begin(9600); pinMode(HARDWARE_RESET,OUTPUT); digitalWrite(HARDWARE_RESET, HIGH); DS18B20.begin(); dht.begin(); EspSerial.begin(9600); // Comunicacao com Modulo WiFi EspHardwareReset(); //Reset do Modulo WiFi startWriteTiming = millis(); // starting the "program clock" } void loop() { start: //label error=0; elapsedWriteTime = millis()-startWriteTiming; if (elapsedWriteTime > (writeTimingSeconds*1000)) { readSensors(); writeThingSpeak(); startWriteTiming = millis(); } if (error==1) //Resend if transmission is not completed { Serial.println(" <<<< ERROR >>>>"); delay (2000); goto start; //go to label "start" } } /********* Read Sensors value *************/ void readSensors(void) { airTemp = dht.readTemperature(); airHum = dht.readHumidity(); DS18B20.requestTemperatures(); soilTemp = DS18B20.getTempCByIndex(0); // Sensor 0 will capture Soil Temp in Celcius light = map(analogRead(ldrPIN), 1023, 0, 0, 100); //LDRDark:0 ==> light 100% soilHum = map(analogRead(soilHumPIN), 1023, 0, 0, 100); } /********* Conexao com TCP com Thingspeak *******/ void writeThingSpeak(void) { startThingSpeakCmd(); // preparacao da string GET String getStr = "GET /update?api_key="; getStr += statusChWriteKey; getStr +="&field1="; getStr += String(pump); getStr +="&field2="; getStr += String(lamp); getStr +="&field3="; getStr += String(airTemp); getStr +="&field4="; getStr += String(airHum); getStr +="&field5="; getStr += String(soilTemp); getStr +="&field6="; getStr += String(soilHum); getStr +="&field7="; getStr += String(light); getStr +="&field8="; getStr += String(spare); getStr += "\r\n\r\n"; sendThingSpeakGetCmd(getStr); } /********* Reset ESP *************/ void EspHardwareReset(void) { Serial.println("Reseting......."); digitalWrite(HARDWARE_RESET, LOW); delay(500); digitalWrite(HARDWARE_RESET, HIGH); delay(8000);//Tempo necessário para começar a ler Serial.println("RESET"); } /********* Start communication with ThingSpeak*************/ void startThingSpeakCmd(void) { EspSerial.flush();//limpa o buffer antes de começar a gravar String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += "184.106.153.149"; // Endereco IP de api.thingspeak.com cmd += "\",80"; EspSerial.println(cmd); Serial.print("enviado ==> Start cmd: "); Serial.println(cmd); if(EspSerial.find("Error")) { Serial.println("AT+CIPSTART error"); return; } } /********* send a GET cmd to ThingSpeak *************/ String sendThingSpeakGetCmd(String getStr) { String cmd = "AT+CIPSEND="; cmd += String(getStr.length()); EspSerial.println(cmd); Serial.print("enviado ==> lenght cmd: "); Serial.println(cmd); if(EspSerial.find((char *)">")) { EspSerial.print(getStr); Serial.print("enviado ==> getStr: "); Serial.println(getStr); delay(500);//tempo para processar o GET, sem este delay apresenta busy no próximo comando String messageBody = ""; while (EspSerial.available()) { String line = EspSerial.readStringUntil('\n'); if (line.length() == 1) { //actual content starts after empty line (that has length 1) messageBody = EspSerial.readStringUntil('\n'); } } Serial.print("MessageBody received: "); Serial.println(messageBody); return messageBody; } else { EspSerial.println("AT+CIPCLOSE"); // alert user Serial.println("ESP8266 CIPSEND ERROR: RESENDING"); //Resend... spare = spare + 1; error=1; return "error"; } }
Kode dapat diunduh dari GITHUB saya: SendingStatusTS_EXT.ino
Langkah 10: Aplikasi Android Bagian Pertama - Pemantauan Status
Mari kita buat bagian pertama aplikasi Android kami.
Pertama, kita merancang antarmuka pengguna. Print Screen di atas menunjukkan elemen-elemen utama yang terlihat dan tidak terlihat. Setelah itu, kita harus merancang blok-blok (angka di bawah ini sesuai dengan gambar di atas):
Setiap 2 detik (ditentukan oleh Clock1), kita akan memanggil prosedur bernama: "readArduino".
Hasil pengembalian prosedur tersebut akan menjadi nilai untuk setiap variabel Status yang harus ditampilkan di layar.
Perhatikan bahwa kita akan "mengonversi" nilai "0" dan "1" dari status aktuator menjadi "OFF" dan "ON" untuk pemahaman yang lebih baik.
Nilai-nilai tersebut ("Status") akan ditampilkan di "label" yang sesuai
Variabel status harus dideklarasikan sebagai Global.
Prosedur "readArduino" akan, sebenarnya, membaca Saluran Status di ThingSpeak. Jadi, kita harus menentukan URL yang akan dikirim ke Thingspeak. Untuk itu 3 variabel Global harus dideklarasikan dan digabungkan untuk membuat URL yang akan dikirim ke TS. Seharusnya dikirim GET ke Komponen Web bernama "ArduFarmBotStatusCh"
Teks yang diperoleh dari perintah sebelumnya, akan tiba dalam format JSON. Teks ini harus diproses dengan setiap bidang yang akan dibaca dan disimpan di variabel global yang sesuai.
Hal terakhir yang harus dilakukan adalah memanggil prosedur "Alarm", yang akan menganalisis status dari dua sensor tanah. Jika suhu terlalu rendah (dalam kasus kami 10oC), pesan harus ditampilkan. Begitu pula dengan kelembaban, jika lebih rendah dari 60%. Perhatikan bahwa kami telah menentukan timer lain (Clock2), yang diprogram untuk diaktifkan setiap 1 detik. Ini hanya untuk "mengganti" warna teks pesan (dari putih ke merah). Ini akan membuat pesan "berkedip".
Foto terakhir di atas menunjukkan aplikasi akhir yang berfungsi.
Kode aplikasi dapat diunduh dari GITHUB saya: ArduFarmBot_Status_App_EXT.aia
Langkah 11: Memasang Aktuator (LED dan Relai)
Mari kita selesaikan perangkat keras kami.
Untuk itu, kita harus memasang Aktuator kami. Seperti yang Anda ingat, kami akan menerima perintah jarak jauh untuk Nyalakan dan Matikan Pompa dan Lampu. Output Arduino akan mengaktifkan Relai (dan LED) untuk melakukan tindakan tersebut.
Kami akan menggunakan modul Relai yang memiliki Optokopler Low-Level Trigger. Juga, kami akan menyuplai 5V padanya melalui pin terpisah, jadi kita tidak perlu menyediakan arus yang diperlukan pada pin input. Modul melakukan hal itu untuk kami.
Gambar di atas menunjukkan bagaimana aktuator harus dihubungkan. Perhatikan bahwa GND Realai TIDAK DIHUBUNGKAN ke GND Arduino. Ini akan membantu untuk tidak memperkenalkan kebisingan saat relai bekerja.
Untuk kesederhanaan, saya menghapus dari diagram, sensor. Namun, Anda dapat menambahkan rangkaian aktuator ke proyek Anda tanpa menghapus sensor yang telah Anda pasang dan uji.
Langkah 12: Mengonfigurasi Saluran Aktuator ThingSpeak
Sama seperti yang kita lakukan untuk Status, kami akan membuat 2 channel baru, satu untuk setiap aktuator. Dari masing-masing, catat Channel ID, kunci Baca dan Tulis. Kami akan menulis hanya pada Field 1 dari masing-masing channel tersebut. Jadi, dalam kasus saya misalnya:
Channel ID 375598 ==> LED Merah (Pompa)
Field1 = 0 ==> Pompa OFF
Field1 = 1 ==> Pompa ON
Channel ID 375599 ==> LED Hijau (Lampu)
Field1 = 0 ==> Lampu OFF
Field1 = 1 ==> Lampu ON
Langkah 13: Memasang dan Menguji Kode Arduino dengan Aktuator
Saat kita mengirim data ke web, yang kita lakukan adalah MENULIS ke channel ThingSpeak (Channel status) untuk "mengirim" (mengunggah) data. Sekarang kita harus MEMBACA dari channel ThingSpeak (Channel Aktuator) untuk "menerima" (mengunduh) data.
Kami akan MEMBACA dari channel ThingSpeak dan untuk itu, kita perlu mengirim string GET. Kami akan melakukannya dalam 3 bagian:
Kami akan mengirim "Start cmd":
AT+CIPSTART="TCP","184.106.153.149",80
Diikuti oleh "panjang" perintah:
AT+CIPSEND=36
Dan string GET itu sendiri, yang akan membaca dari field 1 pada masing-masing Channel Aktuator:
GET /channels/375598/fields/1/last
Kami akan membaca dari channel ThingSpeak pada interval 10 detik. Setelah kita mengirim perintah GET di atas, yang memanggil "NILAI TERAKHIR YANG DISIMPAN PADA FIELD 1 kita akan menerima jawaban dari ThingSpeak yang harusnya "1" atau "0" pada posisi tertentu dalam jawaban. Jika sesuatu yang berbeda dari itu tiba, kita harus mengabaikannya.
Perbedaan utama antara bagian kode ini dan bagian sebelumnya (untuk Mengirim data Status), adalah fungsi:
readThingSpeak(String channelID)
Kode di bawah ini akan melakukan pekerjaan untuk kita dan PrintScreen di atas menunjukkan hasilnya di Serial Monitor:
// Thingspeak String canalID1 = "375598"; //Actuator1 String canalID2 = "375599"; //Actuator2 #include <SoftwareSerial.h> SoftwareSerial EspSerial(6, 7); // Rx, Tx #define HARDWARE_RESET 8 // Variables to be used with timers long readTimingSeconds = 10; // ==> Define Sample time in seconds to receive data long startReadTiming = 0; long elapsedReadTime = 0; //Relays #define ACTUATOR1 10 // RED LED ==> Pump #define ACTUATOR2 12 // GREEN LED ==> Lamp boolean pump = 0; boolean lamp = 0; int spare = 0; boolean error; void setup() { Serial.begin(9600); pinMode(ACTUATOR1,OUTPUT); pinMode(ACTUATOR2,OUTPUT); pinMode(HARDWARE_RESET,OUTPUT); digitalWrite(ACTUATOR1, HIGH); //o módulo relé é ativo em LOW digitalWrite(ACTUATOR2, HIGH); //o módulo relé é ativo em LOW digitalWrite(HARDWARE_RESET, HIGH); EspSerial.begin(9600); // Comunicacao com Modulo WiFi EspHardwareReset(); //Reset do Modulo WiFi startReadTiming = millis(); // starting the "program clock" } void loop() { start: //label error=0; elapsedReadTime = millis()-startReadTiming; if (elapsedReadTime > (readTimingSeconds*1000)) { int command = readThingSpeak(canalID1); if (command != 9) pump = command; delay (5000); command = readThingSpeak(canalID2); if (command != 9) lamp = command; takeActions(); startReadTiming = millis(); } if (error==1) //Resend if transmission is not completed { Serial.println(" <<<< ERROR >>>>"); delay (2000); goto start; //go to label "start" } } /********* Take actions based on ThingSpeak Commands *************/ void takeActions(void) { Serial.print("Pump: "); Serial.println(pump); Serial.print("Lamp: "); Serial.println(lamp); if (pump == 1) digitalWrite(ACTUATOR1, LOW); else digitalWrite(ACTUATOR1, HIGH); if (lamp == 1) digitalWrite(ACTUATOR2, LOW); else digitalWrite(ACTUATOR2, HIGH); } /********* Read Actuators command from ThingSpeak *************/ int readThingSpeak(String channelID) { startThingSpeakCmd(); int command; // preparacao da string GET String getStr = "GET /channels/"; getStr += channelID; getStr +="/fields/1/last"; getStr += "\r\n"; String messageDown = sendThingSpeakGetCmd(getStr); if (messageDown[5] == 49) { command = messageDown[7]-48; Serial.print("Command received: "); Serial.println(command); } else command = 9; return command; } /********* Reset ESP *************/ void EspHardwareReset(void) { Serial.println("Reseting......."); digitalWrite(HARDWARE_RESET, LOW); delay(500); digitalWrite(HARDWARE_RESET, HIGH); delay(8000);//Tempo necessário para começar a ler Serial.println("RESET"); } /********* Start communication with ThingSpeak*************/ void startThingSpeakCmd(void) { EspSerial.flush();//limpa o buffer antes de começar a gravar String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += "184.106.153.149"; // Endereco IP de api.thingspeak.com cmd += "\",80"; EspSerial.println(cmd); Serial.print("enviado ==> Start cmd: "); Serial.println(cmd); if(EspSerial.find("Error")) { Serial.println("AT+CIPSTART error"); return; } } /********* send a GET cmd to ThingSpeak *************/ String sendThingSpeakGetCmd(String getStr) { String cmd = "AT+CIPSEND="; cmd += String(getStr.length()); EspSerial.println(cmd); Serial.print("enviado ==> lenght cmd: "); Serial.println(cmd); if(EspSerial.find((char *)">")) { EspSerial.print(getStr); Serial.print("enviado ==> getStr: "); Serial.println(getStr); delay(500);//tempo para processar o GET, sem este delay apresenta busy no próximo comando String messageBody = ""; while (EspSerial.available()) { String line = EspSerial.readStringUntil('\n'); if (line.length() == 1) { //actual content starts after empty line (that has length 1) messageBody = EspSerial.readStringUntil('\n'); } } Serial.print("MessageBody received: "); Serial.println(messageBody); return messageBody; } else { EspSerial.println("AT+CIPCLOSE"); // alert user Serial.println("ESP8266 CIPSEND ERROR: RESENDING"); //Resend... spare = spare + 1; error=1; return "error"; } }
Kode dapat diunduh dari GITHUB saya: ReadingCommandTS_EXT.ino
Langkah 14: Mengirim Perintah ke Aktuator
Pada titik ini, kami telah mengonfigurasi channel aktuator di ThingSpeak dan dengan mengubah nilai Field 1 pada masing-masing channel, kita harus melihat aktuator berubah sesuai. Pada proyek akhir kami kita akan melakukan tugas ini menggunakan aplikasi Android, tetapi untuk tujuan pengujian kita juga dapat melakukannya menggunakan browser biasa. Mari kita lakukan.
Di atas Anda dapat melihat layar tangkapan dari perintah untuk Menyalakan Pompa yang dikirim dari browser dan bagaimana itu akan muncul di Serial Monitor. Tentu saja, LED Merah dan relai juga akan menyala.
Langkah 15: Melengkapi Aplikasi Android
Mari kita selesaikan aplikasi. Sebelumnya kami telah mengembangkan aplikasi sederhana yang mengambil status dari ThingSpeak (BACA dari Saluran Status). Sekarang kita harus MENULIS ke channel Aktuator, sehingga perintah tersebut dapat dibaca oleh Arduino dan bertindak pada Pompa dan Lampu sesuai.
Untuk pengguna untuk melewatkan perintah ke aplikasi, kami akan menggunakan "tombol". Pasangan tombol (ON dan OFF) untuk masing-masing Aktuator.
Ketika tombol ditekan, warna teksnya berubah.
Jika ON ==> Biru
Jika OFF ==> Merah
Di atas Anda dapat melihat seperangkat blok untuk masing-masing pasangan tombol.
Uji aplikasi, mengirim perintah untuk menyala dan mematikan aktuator. Periksa di Serial Monitor, pesan yang ditukar antara ESP-01 dan ThingSpeak.
Kode aplikasi lengkap dapat diunduh dari GITHUB saya: ArduFarmBot_V1_EXT.aia
Langkah 16: Menggabungkan Semua
Sempurna! Pada titik ini, Anda memiliki aplikasi Android lengkap, perangkat keras lengkap tetapi Anda masih belum memiliki kode yang akan secara berkelanjutan membaca dan menulis ke ThingSpeak. Mari kita gabungkan semua yang telah kami kembangkan sebelumnya.
Pada kode akhir, Anda akan menemukan bagian tambahan untuk memverifikasi misalnya apakah ESP-01 tidak meleset. Kami akan melakukannya, mengirim perintah AT padanya sebelum setiap baca atau tulis. Seperti yang kita lihat di awal tutorial ini, mengirim perintah AT harus mengembalikan OK dari ESP-01. Jika ini tidak terjadi, kami akan melanjutkan dengan reset perangkat keras, yang dikendalikan oleh perangkat lunak (seperti yang kami lakukan sekali selama fase setup).
Kode lengkap untuk proyek kami dapat diunduh dari GITHUB saya: ArduFarmBot_Light_EXT.ino
Langkah 17: Kesimpulan
Ada banyak yang dapat dieksplorasi di bidang IoT dengan perangkat kecil hebat ini, Arduino Uno, dan ESP8266-01. Kami akan segera kembali dengan tutorial baru! Tetap ikuti tutorial MJRoBot!
Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka di dunia elektronika, robotika, dan IoT yang menarik!
Silakan kunjungi GitHub saya untuk file terbaru: ArduFarmBot_Light
Untuk lebih banyak proyek, silakan kunjungi blog saya: MJRoBot.org
Salam dari selatan dunia!
Sampai jumpa di tutorial selanjutnya!
Terima kasih,
Marcelo
Kode
Code snippet #1
Code snippet #2
Code snippet #3
Code snippet #11
Code snippet #12
Code snippet #16
Code snippet #20
Code snippet #1Plain text
// DS18B20 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 // DS18B20 on pin D5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); int soilTemp = 0; //DHT #include "DHT.h" #include <stdlib.h> int pinoDHT = 11; int tipoDHT = DHT22; DHT dht(pinoDHT, tipoDHT); int airTemp = 0; int airHum = 0; // LDR (Light) #define ldrPIN 1 int light = 0; // Soil humidity #define soilHumPIN 0 int soilHum = 0;