Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

IoT Menjadi Mudah dengan UNO, ESP-01, ThingSpeak &MIT App Inventor

Komponen dan persediaan

Arduino UNO
× 1
Espressif ESP8266 ESP-01
× 1
Sensor Suhu DHT22
× 1
DS18B20 1-Wire Digital Sensor Suhu untuk digunakan di tanah
× 1
LDR - Resistor Bergantung Cahaya
× 1
Modul Relai DC 5V 2 Saluran
× 1

Aplikasi dan layanan online

Arduino IDE
ThingSpeak API
Penemu Aplikasi MIT

Tentang proyek ini

Tujuan kami pada dasarnya adalah mengumpulkan informasi dari unit lokal dan mengirimkannya ke internet. Pengguna di mana pun di planet ini yang melihat informasi ini akan membuat keputusan dengan mengirimkan perintah jarak jauh ke aktuator, yang juga akan berada di unit lokal ini. Sensor atau aktuator apa pun dapat digunakan.

Sebagian besar pekerjaan saya di arena IoT menggunakan NodeMCU dan baru-baru ini, ESP32. Tapi, saya pikir penting untuk tidak melupakan langkah awal saya, beberapa tahun yang lalu di mana saya mulai belajar IoT menggunakan Arduino UNO dan ESP8266-01 yang lama dan bagus.

Jadi, saya memutuskan di sini untuk kembali ke waktu itu (dengan sedikit lebih banyak pengalaman sekarang) dan menjelajahi lagi perangkat hebat itu, menghubungkannya ke cloud, menggunakan layanan web ThingSpeak.com. Kami juga akan mengeksplorasi untuk mengontrol berbagai hal dari jarak jauh, menggunakan Aplikasi Android yang dikembangkan menggunakan MIT AppInventor.

"Pusat proyek IoT kami" akan menjadi ThingSpeak.com. Unit lokal (UNO/ESP-01) akan menangkap data dari sensor dan status aktuator, kirim mereka ke Internet, "menulis" di ThingSpeak.com tertentu Saluran Status . Unit lokal juga akan menerima data dari internet, "membacanya" dari Saluran Aktuator ThingSpeak specific tertentu .

Aplikasi Android juga akan membaca data tersebut dari Saluran Status ThingSpeak.com dan menampilkannya untuk pengguna. Dengan cara yang sama, pengguna, berdasarkan info status itu, dapat mengirim perintah ke aktuator, menulis mereka di Saluran Aktuator ThingSpeak (Lihat diagram Blok di atas untuk lebih memahami aliran data).

Jadi, apa yang akan kita lakukan? Diagram blok yang ditunjukkan pada langkah berikutnya akan memberi kita gambaran tentang tugas akhir:

Langkah 1:Pendahuluan

Menggunakan sensor umum, proyek kami akan menangkap beberapa data, mengirimkannya ke cloud, di mana semua orang dapat melihatnya melalui internet. Untuk mengolah data tersebut, kami akan menggunakan layanan yang disediakan oleh ThingSpeak.com, platform IoT terbuka yang memungkinkan kami mengumpulkan, menganalisis, dan bertindak berdasarkan data tersebut.

Data yang akan dikumpulkan oleh sensor akan menjadi:

  • Suhu udara dan kelembaban relatif
  • Suhu dan kelembaban tanah
  • Luminositas

Proyek ini akan memiliki 2 aktuator :

  • Pompa Listrik
  • Lampu Listrik

Status aktuator tersebut ("ON/OFF"), juga harus dikirim ke cloud.

Jadi, idenya adalah untuk menangkap data tersebut dari sensor, misalnya, perkebunan dan mengirimkannya ke cloud. Berdasarkan data tersebut, pengguna harus mengambil keputusan berdasarkan pernyataan tersebut:

  • Nyalakan Pompa jika kelembaban tanah terlalu rendah
  • Nyalakan Lampu jika suhu tanah terlalu rendah

Untuk memerintahkan aktuator kami dari jarak jauh, kami akan menggunakan Aplikasi Android.

Langkah 2:BoM - Bill of Material

Beberapa komponen terpenting yang tercantum di sini, memiliki tautan dan harga indikatif dalam USD yang terkait. Tautan tersebut hanya untuk informasi.

  • Arduino UNO (Mikrokontroler) - $10.00
  • ESP8266-01 (Modul Komunikasi) - $3,50
  • DHT22 (Sensor Kelembaban Udara dan Relatif) - $9,00
  • DS18B20 (Sensor Suhu Digital 1-Kabel untuk digunakan di tanah) - $6,00
  • YL-69 + LM393 (Sensor Kelembaban Tanah) - $2,00
  • LDR (Sensor Luminositas) - $0,20
  • 2 x LED (Merah dan Hijau)
  • Modul Relai DC 5V 1 x 2 Saluran dengan Pemicu Tingkat Rendah Optocoupler - $7.00
  • Pompa DC 5V - $3,00
  • Lampu 220V
  • Resistor 2 x 330 ohm (untuk digunakan dengan LED)
  • Resistor 2 x 10K ohm (untuk digunakan dengan DHT22 dan LDR)
  • Resistor 1 x 4K7 ohm (untuk digunakan dengan DS18B20
  • Protoboard
  • Jumper
  • Daya DC 5V eksternal untuk Relai

Langkah 3:Perangkat Keras

Mari kita merakit Proyek HW. Yang ideal adalah menginstal dan menguji proyek kami per bagian. Sebagai saran, kita bisa mengikuti langkah-langkah berikut:

  • Pasang dan uji semua sensor secara lokal
  • Instal dan konfigurasikan ESP-01 (BareMinimum)
  • Ubah instalasi ESP-01 untuk konfigurasi terakhirnya dan ujilah
  • Konfigurasikan Saluran Status ThingsPeak
  • Instal 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 Relay)
  • Mengonfigurasi saluran ThingSpeak Actuators
  • Instal dan uji Kode Arduino dengan Aktuator
  • Mengembangkan Versi Aplikasi Android terakhir

Langkah 4:Menghubungkan Sensor

Kita harus memiliki beberapa perpustakaan yang diinstal pada IDE kita untuk membaca sensor dengan benar. Periksa apakah Anda telah menginstal semua perpustakaan. Konfigurasi awal mereka harus:

// DS18B20#include #include #define ONE_WIRE_BUS 5 // DS18B20 pada pin D5 OneWire oneWire(ONE_WIRE_BUS);DallasTemperature DS18B20(&oneWire);int soilTemp =0; //DHT#include "DHT.h"#include int pinoDHT =11;int tipoDHT =DHT22;DHT dht(pinoDHT, tipoDHT); int airTemp =0;int airHum =0;// LDR (Light)#define ldrPIN 1int light =0;// Kelembaban tanah#define soilHumPIN 0int soilHum =0; 

Pada Setup dan loop, mari kita tulis:

pengaturan batal(){ Serial.begin(9600); DS18B20.begin(); dht.begin();}void loop(){ readSensors(); tampilanSensor(); penundaan (10000);} 

Dan terakhir, mari kita tulis dua fungsi spesifik, satu untuk membaca sensor kita dan satu lagi untuk menampilkan nilainya di Serial Monitor:

/********* Nilai Sensor Baca *************/void readSensors(void){ airTemp =dht.readTemperature(); airHum =dht.readHumidity(); DS18B20.requestTemperatures(); soilTemp =DS18B20.getTempCByIndex(0); // Sensor 0 akan menangkap Soil Temp dalam Celcius soilHum =map(analogRead(soilHumPIN), 1023, 0, 0, 100); cahaya =peta(analogRead(ldrPIN), 1023, 0, 0, 100); //LDRDark:0 ==> light 100% }/********* Nilai Sensor Tampilan *************/void displaySensors(void){ Serial.print (" suhu udara (oC):"); Serial.println (airTemp); Serial.print("airHum (%):"); Serial.println (airHum); Serial.print("suhu tanah (oC):"); Serial.println (soilTemp); Serial.print("soilHum (%):"); Serial.println (soilHum); Serial.print("cahaya (%):"); Serial.println (ringan); Serial.println ("");} 

Gambar Serial Monitor di bawah ini menunjukkan kepada kita nilai-nilai sensor.

Kode dapat diunduh dari GITHUB saya:Sens ors_Test.ino

Langkah 5:​ESP8266-01 Konfigurasi Awal

ESP-01 akan digunakan sebagai Serial Bridge, artinya kita akan memprogramnya menggunakan " AT command". Hal pertama adalah memastikan bahwa ESP-01 Anda berada pada kecepatan komunikasi Baud Rate yang benar. Dalam kasus kami, 9.600 baud. Biasanya ESP-01 diprogram dari pabrik dengan 115.200 baud dan kami harus mengubahnya menjadi 9.600 baud.

Pertama, Anda harus menghubungkan ESP-01 seperti gambar di atas.

Kemudian sambungkan Arduino ke komputer Anda, buka IDE dan muat contoh yang ada di File> Contoh> 01.Basics> BareMinimum. Ini adalah kode kosong, untuk memastikan bahwa tidak akan ada konflik komunikasi antara Arduino dan ESP.

Kami telah mentransfer kode ini ke Arduino sebelum menghubungkannya ke ESP-01S untuk memastikan bahwa Arduino tidak akan menggunakan komunikasi serial (TX dan RX). Hal ini penting agar ESP dapat berkomunikasi dengan baik.

Buka IDE Serial Monitor Anda dan ubah kecepatannya menjadi 115.200 baud Mulai kirim perintah "AT" di IDE Serial Monitor Anda. ESP-01 seharusnya mengembalikan "OK"

Selanjutnya, mari kita ubah kecepatannya. Untuk itu, Anda dapat menggunakan perintah:

AT + CIOBAUD =9600 

Perhatikan bahwa ESP-01 dapat 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 definitif:

AT+ UART_DEF=,,,, 

Misalnya:9600 baud / 8 bit data / 1 stop bit dan tidak ada paritas dan kontrol aliran:

AT + UART_DEF =9600,8,1,0,0 

Di kotak pilihan di bagian bawah Serial Monitor Anda, ubah kecepatannya menjadi "9600 baud". Uji komunikasi:di sisi atas jendela ketik AT dan lihat jawabannya OK. Sekarang Anda harus mengonfigurasi modul dalam Mode Stasiun untuk bertindak sebagai Klien dari jaringan Wi-Fi Anda. Gunakan perintah:

 AT + CWMODE =1 

Sekarang kita harus menghubungkan modul ke jaringan Wi-Fi Anda.

Untuk melakukannya, gunakan perintah di bawah ini, ganti "network_name" dengan nama jaringan Wi-Fi Anda dan "network_name" dengan kata sandi Anda. Pertahankan tanda kutip.

AT + CWJAP ="nama_jaringan", "nama_jaringan"  

Jika Anda melihat jawaban di bawah ini, koneksi Anda telah dibuat dengan benar:

WIFI TERHUBUNG WIFI MENDAPATKAN IP 

Untuk menemukan IP, jalankan perintah:

AT + CIFSR  

Dan perhatikan alamat IP yang akan muncul di Serial Monitor Anda. Anda mungkin membutuhkannya di masa depan.

Langkah 6:Menguji ESP-01

Setelah kita mengkonfigurasi ESP-01, kita harus menginstalnya di sirkuit terakhirnya. Untuk itu kita harus MENGUBAH pengkabelan yang dilakukan sebelumnya dan menghubungkan ESP-01 ke UNO kita seperti di bawah ini:

  • ESP-01 RX (Kuning) ke UNO Pin D7
  • ESP-01 TX (Oranye) ke UNO Pin D6
  • ESP-01 Ch-Pd (Coklat) ke Vcc (3.3V)
  • ESP-01 Reset (Biru) ke UNO Pin D8
  • ESP-01 Vcc (Merah) hingga 3.3V
  • ESP-01 Gnd (Hitam) ke UNO GND

Mari kita lakukan tes sederhana untuk memeriksa apakah ESP-01 kita sudah terkoreksi diinstal dan diuji. Masukkan kode di bawah ini:

#include  SoftwareSerial esp8266(6,7); //Rx ==> Pin 6; TX ==> Pin7 #define speed8266 9600 void setup() { esp8266.begin (speed8266); Serial.begin(kecepatan8266); Serial.println("ESP8266 Setup test - gunakan perintah AT");}void loop() { while(esp8266.available()) { Serial.write(esp8266.read()); } while(Serial.available()) { esp8266.write(Serial.read()); }} 

Sekarang, coba beberapa perintah AT dan lihat hasilnya di monitor Serial Anda:

* AT =====> ESP8266 mengembalikan OK* AT+RST =====> ESP8266 restart dan mengembalikan OK* AT+GMR =====> ESP8266 mengembalikan AT Version; versi SDK; Indo; OK* AT+CWMODE? => ESP8266 mengembalikan jenis mode* AT+CWLAP ===> ESP8266 mengembalikan titik akses dekat* AT+CIFSR ===> ESP8266 mengembalikan IP yang dirancang 

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 / dihidupkan) dan memasukkan kredensial Anda, tambahkan panggilan ke connectWiFi () fungsi di akhir pengaturan () fungsi:

setup(){ ... connectWiFi(); } 

menghubungkanWiFi () fungsi harus di akhir kode utama Anda .ino:

void connectWiFi(void){ sendData("AT+RST\r\n", 2000, 0); // reset sendData("AT+CWJAP=\"NAMA PENGGUNA ANDA\",\"PASSWORD ANDA\"\r\n", 2000, 0); //Hubungkan penundaan jaringan(3000); sendData("AT+CWMODE=1\r\n", 1000, 0); sendData("AT+CIFSR\r\n", 1000, 0); // Tampilkan Alamat IP Serial.println("8266 Connected");} 

Perhatikan bahwa fungsi di atas memanggil sendData (data) lainnya fungsi, yang juga harus ditempatkan di kode Anda:

String sendData(String command, const int timeout, boolean debug){ String response =""; EspSerial.print(perintah); waktu int panjang =milis(); while ( (waktu + batas waktu)> milis()) { while (EspSerial.available()) { // esp memiliki data jadi tampilkan outputnya ke jendela serial char c =EspSerial.read(); // membaca karakter berikutnya. tanggapan +=c; } } if (debug) { Serial.print(respon); } kembalikan tanggapan;}  

Langkah 7:Menghubungkan Sensor dan ESP-01

Setelah semua sensor terpasang dan diuji dan juga ESP-01 kita berfungsi dengan baik, mari kita lihat bersama-sama dan bersiap untuk mengirim data ke internet.

Langkah 8:The ThingSpeak

Salah satu bagian terpenting dari proyek kami adalah ThingSpeak, platform IoT terbuka yang memungkinkan kami mengumpulkan, menganalisis, dan bertindak berdasarkan data yang dikumpulkan. Jika Anda belum memilikinya, silakan masuk ke ThingSpeak, daftar dan buat akun Anda.

Selanjutnya, buat Saluran baru di mana kita akan memiliki 2 aktuator, 5 sensor, dan status medan cadangan:

  • Bidang 1:Aktuator 1
  • Bidang 2:Aktuator 2
  • Bidang 3:Suhu Udara dalam oC
  • Diajukan 4:Kelembaban Relatif Udara dalam %
  • Field 5:Suhu Tanah dalam oC
  • Field 6:Kelembaban Tanah dalam %
  • Bidang 7:Luminositas dalam %
  • Bidang 8:Cadangan

Bidang 8 akan dibiarkan sebagai cadangan untuk digunakan untuk ekspansi di masa mendatang atau untuk tujuan debug. Sebagai contoh, saya akan menggunakannya sebagai "penghitung" untuk setiap kesalahan komunikasi yang terjadi selama jabat tangan Arduino/ESP-01 dengan ThingSpeak.com.

Setelah Anda membuat saluran Anda (dalam hal ini akan menjadi Saluran Status kami), penting untuk mencatat kunci Anda, seperti yang ditunjukkan di bawah ini.

Langkah 9:Mengirim Status ke Cloud

Pada titik ini, Layanan Cloud kami tersedia dan sensor kami menangkap data secara lokal. Mari kita ambil nilai-nilai itu dan kirimkan ke ThingSpeak.com. Kami akan MENULIS di saluran ThingSpeak dan untuk itu, kami perlu mengirim string GET. Kami akan melakukan dalam 3 bagian:

Kami akan mengirimkan "Mulai cmd":

AT+CIPSTART="TCP","184.106.153.149",80 

Mengikuti "panjang" dari perintah:

AT+CIPSEND=116 

Dan string GET itu sendiri, yang akan menulis di bidang yang sesuai di Saluran Status:

DAPATKAN /update?api_key=YOUR_WRITE_KEY_HERE&field1=pump&fieldlamp=0&field3=airTemp&field4=airHum&field5=soilTemp&field6=soilHum&field7=light&field8=spare

Kode di bawah ini akan bekerja untuk kita dan PrintScreen di atas menunjukkan hasilnya pada Serial Monitor:

// Thingspeak String statusChWriteKey ="6SRPQQKIE6AJVQE6"; // Status Saluran id:385184#include SoftwareSerial EspSerial(6, 7); // Rx, Tx#define HARDWARE_RESET 8// DS18B20#include #include #define ONE_WIRE_BUS 5 // DS18B20 pada pin D5 OneWire oneWire(ONE_WIRE_BUS);DallasSuhu tanah(&TemponeWire DS18B); =0;//DHT#include "DHT.h"#include int pinoDHT =11;int tipoDHT =DHT22;DHT dht(pinoDHT, tipoDHT); int airTemp =0;int airHum =0;// LDR (Light)#define ldrPIN 1int light =0;// Kelembaban tanah#define soilHumPIN 0int soilHum =0;// Variabel yang akan digunakan dengan timer tulis panjangWaktuSeconds =17; // ==> Tentukan waktu sampel dalam detik untuk mengirim datalong startWriteTiming =0;long elapsedWriteTime =0;// Variabel yang akan digunakan dengan Actuatorsboolean pump =0; lampu boolean =0; int cadangan =0;kesalahan boolean;pengaturan batal(){ Serial.begin(9600); pinMode(HARDWARE_RESET,OUTPUT); digitalWrite(HARDWARE_RESET, TINGGI); DS18B20.begin(); dht.mulai(); EspSerial.begin(9600); // Komunikasi dan Modulo WiFi EspHardwareReset(); //Reset lakukan Modulo WiFi startWriteTiming =milis(); // memulai "jam program"}void loop(){ start://label error=0; elapsedWriteTime =milis()-startWriteTiming; if (elapsedWriteTime> (writeTimingSeconds*1000)) { readSensors(); writeThingSpeak(); startWriteTiming =milis(); } if (error==1) //Kirim ulang jika transmisi tidak selesai { Serial.println(" <<<>>>"); penundaan (2000); harus mulai; //masuk ke label "mulai" }}/********* Nilai Sensor Baca *************/void readSensors(void){ airTemp =dht.readTemperature(); airHum =dht.readHumidity(); DS18B20.requestTemperatures(); soilTemp =DS18B20.getTempCByIndex(0); // Sensor 0 akan menangkap Suhu Tanah dalam 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(); // persiapan da string GET String getStr ="GET /update?api_key="; getStr +=statusChWriteKey; getStr +="&field1="; getStr +=String(pompa); getStr +="&field2="; getStr +=String(lampu); getStr +="&field3="; getStr +=String(airTemp); getStr +="&field4="; getStr +=String(airHum); getStr +="&field5="; getStr +=String(soilTemp); getStr +="&field6="; getStr +=String(soilHum); getStr +="&field7="; getStr +=String(ringan); getStr +="&field8="; getStr +=String(cadangan); getStr +="\r\n\r\n"; sendThingSpeakGetCmd(getStr); }/********* Reset ESP *************/void EspHardwareReset(void){ Serial.println("Reseting......."); digitalWrite(HARDWARE_RESET, RENDAH); penundaan (500); digitalWrite(HARDWARE_RESET, TINGGI); delay(8000);//Tempo perlu untuk datang lebih awal Serial.println("RESET"); }/********* Mulai komunikasi dengan 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 dari api.thingspeak.com cmd +="\",80"; EspSerial.println(cmd); Serial.print("enviado ==> Mulai cmd:"); Serial.println(cmd); if(EspSerial.find("Error")) { Serial.println("AT+CIPSTART error"); kembali; }}/********* kirim GET cmd ke ThingSpeak *************/String sendThingSpeakGetCmd(String getStr){ String cmd ="AT+CIPSEND="; cmd +=String(getStr.length()); EspSerial.println(cmd); Serial.print("enviado ==> panjang cmd:"); Serial.println(cmd); if(EspSerial.find((char *)">")) { EspSerial.print(getStr); Serial.print("enviado ==> getStr:"); Serial.println(getStr); delay(500);//tempo untuk proses o GET, sem este delay apresenta busy no próximo comando String messageBody =""; while (EspSerial.available()) { String baris =EspSerial.readStringUntil('\n'); if (line.length() ==1) { //konten aktual dimulai setelah baris kosong (yang memiliki panjang 1) messageBody =EspSerial.readStringUntil('\n'); } } Serial.print("Tubuh Pesan diterima:"); Serial.println(messageBody); kembali pesanBody; } else { EspSerial.println("AT+CIPCLOSE"); // mengingatkan pengguna Serial.println("ESP8266 CIPSEND ERROR:RESENDING"); //Kirim ulang... cadangan =cadangan + 1; kesalahan=1; kembalikan "kesalahan"; } }  

Kode dapat diunduh dari GITHUB saya:SendingStatusTS_EXT.ino

Langkah 10:Bagian Pertama Aplikasi Android - Pemantauan Status

Mari buat bagian pertama dari Aplikasi Android.

Pertama, kami merancang antarmuka pengguna. Layar Cetak di atas di atas menunjukkan elemen utama yang terlihat dan tidak terlihat. Setelah itu, kita harus mendesain balok (angka di bawah ini sesuai dengan gambar di atas):

Pada setiap 2 detik (didefinisikan oleh Clock1), kami akan memanggil prosedur bernama:"readArduino".

  • Kembalinya prosedur tersebut akan menjadi nilai untuk masing-masing variabel Status yang harus ditampilkan di layar.
  • Perhatikan bahwa kami akan "mengubah" nilai "0" dan "1" dari status aktuator menjadi "OFF" dan "ON" untuk pemahaman yang lebih baik.
  • Nilai tersebut ("Status") akan ditampilkan pada "label" koresponden
  • Variabel status harus dideklarasikan sebagai Global.
  • Prosedur "readArduino" sebenarnya akan 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. GET harus dikirim ke Komponen Web bernama "ArduFarmBotStatusCh"
  • Teks yang didapat dari perintah sebelumnya, akan muncul dalam format Json. Teks ini harus diproses agar setiap bidang dapat dibaca dan disimpan pada variabel global koresponden.
  • Hal terakhir yang harus dilakukan adalah memanggil prosedur "Alarm", yang akan menganalisis status dua sensor tanah. Jika suhu terlalu rendah (dalam kasus kami 10oC), sebuah pesan harus ditampilkan. Sama untuk kelembaban, jika lebih rendah dari 60%. Perhatikan bahwa kami telah menetapkan pengatur waktu lain (Jam2), yang diprogram untuk diaktifkan setiap 1 detik. Ini hanya untuk "mengalihkan" warna teks pesan (dari putih menjadi merah). Ini akan membuat pesan "berkedip".

Foto terakhir di atas menunjukkan Aplikasi terakhir yang berfungsi.

Kode Aplikasi dapat diunduh dari GITHUB saya:ArduFarmBot_Status_App_EXT.aia

Langkah 11:Memasang Aktuator (LED dan Relay)

Ayo lengkapi HW kita.

Untuk itu, kita harus menginstal Aktuator kita. Seperti yang Anda ingat, kami akan menerima perintah dari jarak jauh untuk MENGHIDUPKAN dan MENONAKTIFKAN Pompa dan Lampu. Output Arduino akan mengaktifkan Relay (dan LED) untuk mendapatkan tindakan tersebut.

Kami akan menggunakan modul Relay yang memiliki Low-Level Trigger Optocoupler. Juga, kami akan mensuplai 5V melalui pin terpisah, jadi kami tidak perlu menyediakan arus yang diperlukan pada pin input. Modul melakukan itu untuk kita.

Gambar di atas menunjukkan bagaimana aktuator harus dihubungkan. Perhatikan bahwa GND Nyata TIDAK TERHUBUNG ke Arduino GND. Ini akan membantu untuk tidak menimbulkan kebisingan saat relai bekerja.

Untuk kesederhanaan, saya mengambil dari diagram, sensor. Tetapi Anda dapat menambahkan sirkuit aktuator ke proyek Anda tanpa mengeluarkan sensor yang telah Anda pasang dan uji.

Langkah 12:Mengonfigurasi Saluran Aktuator ThingSpeak

Cara yang sama yang kami lakukan untuk Status, kami akan membuat 2 saluran baru satu untuk setiap aktuator. Dari masing-masingnya, catat ID Saluran, tombol Baca dan Tulis. Kami akan menulis hanya di Bidang 1 dari masing-masing saluran tersebut. Jadi, dalam kasus saya misalnya:

ID Saluran 375598 ==> LED Merah (Pompa)

  • Field1 =0 ==> Pompa MATI
  • Field1 =1 ==> Pompa AKTIF

ID Saluran 375599 ==> LED Hijau (Lampu)

  • Field1 =0 ==> Lampu MATI
  • Field1 =1 ==> Lampu ON

Langkah 13:Memasang dan Menguji Kode Arduino dengan Aktuator

Ketika kami mengirim data ke web, yang kami lakukan adalah MENULIS di saluran ThingSpeak (Status saluran) untuk "mengirim" (mengunggah) data. Sekarang kita harus MEMBACA dari saluran ThingSpeak (Saluran Aktuator) untuk "menerima" (mengunduh) data.

Kami akan MEMBACA dari saluran ThingSpeak dan untuk itu, kami perlu mengirim string GET. Kami akan melakukan dalam 3 bagian:

Kami akan mengirimkan "Mulai cmd":

AT+CIPSTART="TCP","184.106.153.149",80 

Mengikuti "panjang" dari perintah:

AT+CIPSEND=36 

Dan string GET itu sendiri, yang akan membaca dari field 1 pada masing-masing Saluran Aktuator:

DAPATKAN /channels/375598/fields/1/last 

Kami akan membaca dari saluran ThingSpeak pada interval 10 detik. Setelah kita mengirimkan perintah GET di atas, yaitu memanggil "LAST VALUE STORED ON FIELD 1 kita akan menerima jawaban dari ThingSpeak yang seharusnya "1" atau "0" pada posisi jawaban tertentu. Jika ada yang berbeda dari itu tiba, kita harus mengabaikannya.

Perbedaan utama antara bagian kode ini dan yang sebelumnya (untuk Mengirim data Status), adalah fungsinya:

readThingSpeak(String channelID) 

Kode di bawah ini akan bekerja untuk kita dan PrintScreen di atas menunjukkan hasilnya pada Serial Monitor:

// Thingspeak String canalID1 ="375598"; //Actuator1String canalID2 ="375599"; //Actuator2#include SoftwareSerial EspSerial(6, 7); // Rx, Tx#define HARDWARE_RESET 8// Variabel yang akan digunakan dengan timerlong readTimingSeconds =10; // ==> Tentukan waktu sampel dalam detik untuk menerima datalong startReadTiming =0;long elapsedReadTime =0;//Relay#define ACTUATOR1 10 // LED MERAH ==> Pump#define ACTUATOR2 12 // LED HIJAU ==> Lampboolean pump =0; lampu boolean =0; int cadangan =0;kesalahan boolean;pengaturan batal(){ Serial.begin(9600); pinMode(ACTUATOR1,OUTPUT); pinMode(ACTUATOR2,OUTPUT); pinMode(HARDWARE_RESET,OUTPUT); digitalWrite(ACTUATOR1, TINGGI); //o módulo relé é ativo em LOW digitalWrite(ACTUATOR2, HIGH); //o módulo relé é ativo em LOW digitalWrite(HARDWARE_RESET, HIGH); EspSerial.begin(9600); // Komunikasi dan Modulo WiFi EspHardwareReset(); //Reset lakukan Modulo WiFi startReadTiming =milis(); // memulai "jam program"}void loop(){ start://label error=0; elapsedReadTime =milis()-startReadTiming; if (elapsedReadTime> (readTimingSeconds*1000)) { perintah int =readThingSpeak(canalID1); if (perintah !=9) pump =perintah; penundaan (5000); perintah =readThingSpeak(canalID2); if (perintah !=9) lamp =perintah; ambil tindakan(); startReadTiming =milis(); } if (error==1) //Kirim ulang jika transmisi tidak selesai { Serial.println(" <<<>>>"); penundaan (2000); harus mulai; //pergi ke label "mulai" }}/********* Ambil tindakan berdasarkan Perintah ThingSpeak *************/void takeActions(void){ Serial.print( "Pompa:"); Serial.println(pompa); Serial.print("Lampu :"); Serial.println(lampu); if (pompa ==1) digitalWrite(ACTUATOR1, LOW); lain digitalWrite(ACTUATOR1, TINGGI); if (lampu ==1) digitalWrite(ACTUATOR2, LOW); else digitalWrite(ACTUATOR2, HIGH);}/********* Baca perintah Aktuator dari ThingSpeak *************/int readThingSpeak(String channelID){ startThingSpeakCmd(); perintah int; // persiapan 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("Perintah diterima:"); Serial.println(perintah); } perintah lain =9; return command;}/********* Reset ESP *************/void EspHardwareReset(void){ Serial.println("Reseting......." ); digitalWrite(HARDWARE_RESET, RENDAH); penundaan (500); digitalWrite(HARDWARE_RESET, TINGGI); delay(8000);//Tempo perlu untuk datang lebih awal Serial.println("RESET"); }/********* Mulai komunikasi dengan 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 dari api.thingspeak.com cmd +="\",80"; EspSerial.println(cmd); Serial.print("enviado ==> Mulai cmd:"); Serial.println(cmd); if(EspSerial.find("Error")) { Serial.println("AT+CIPSTART error"); kembali; }}/********* kirim GET cmd ke ThingSpeak *************/String sendThingSpeakGetCmd(String getStr){ String cmd ="AT+CIPSEND="; cmd +=String(getStr.length()); EspSerial.println(cmd); Serial.print("enviado ==> panjang cmd:"); Serial.println(cmd); if(EspSerial.find((char *)">")) { EspSerial.print(getStr); Serial.print("enviado ==> getStr:"); Serial.println(getStr); delay(500);//tempo untuk proses o GET, sem este delay apresenta busy no próximo comando String messageBody =""; while (EspSerial.available()) { String baris =EspSerial.readStringUntil('\n'); if (line.length() ==1) { //konten aktual dimulai setelah baris kosong (yang memiliki panjang 1) messageBody =EspSerial.readStringUntil('\n'); } } Serial.print("Tubuh Pesan diterima:"); Serial.println(messageBody); kembali pesanBody; } else { EspSerial.println("AT+CIPCLOSE"); // mengingatkan pengguna Serial.println("ESP8266 CIPSEND ERROR:RESENDING"); //Kirim ulang... cadangan =cadangan + 1; kesalahan=1; kembalikan "kesalahan"; } } 

Kode dapat diunduh dari GITHUB saya:ReadingCommandTS_EXT.ino

Langkah 14:Mengirim Perintah ke Aktuator

At this point, we have the actuators channels configured on ThingSpeak and changing the value of Field 1 on each channel, we must see the actuators changing accordingly. On our final project we will do this task, using the Android App, but for testing proposes we can also do it using a normal browser. Let's do it.

The commands are:

Turn ON Pump (RED LED):

https://api.thingspeak.com/update?api_key=ACT1_WRITE_KEY&field1=1 

Turn OFF Pump (RED LED):

https://api.thingspeak.com/update?api_key=ACT1_WRITE_KEY&field1=0 

Turn ON Lamp (GREEN LED):

https://api.thingspeak.com/update?api_key=ACT2_WRITE_KEY&field1=1 

Turn OFF Lamp (GREEN LED):

https://api.thingspeak.com/update?api_key=ACT2_WRITE_KEY&field1=0 

Above you can see a print screen of a command to TurnOn the Pump sent from a browser and how it will appear at Serial Monitor. Obviously, the LED Red and relay will be also be turned on.

Step 15:Completing the Android APP

Let's complete the APP. Previously we have developed a simple App that gets the status from ThingSpeak (READ from Staus Channel). Now we must WRITE on Actuator channels, so those commands could be read by Arduino and act on Pump and Lamp accordingly.

For a user to pass the commands to the App, we will use "buttons". A pair of buttons (ON and OFF) for each one of the Actuators.

When a button is pressed, the color of its text changes.

  • If ON ==> Blue
  • if OFF ==> Red

Above you can see the set of blocks for each one of the pairs of buttons.

Test the App, sending commands to turn ON and OFF the actuators. Check on Serial Monitor, the messages exchanged between ESP-01 and ThingSpeak.

The complete App code can be downloaded from my GITHUB:ArduFarmBot_V1_EXT.aia

Step 16:Putting All Together

Perfect! At this point, you have a full Android APP, a complete HW but you still do not have a code that will continuously read and write on ThingSpeak. Let's combine all that we have developed previously.

On the final code, you will find additional portions to verify for example if the ESP-01 is not freezing. We will do it, sending an AT command to it before any read or write. As we saw at the very beginning of this tutorial, sending an AT command should return from ESP-01 an OK. If this does not happen, we will proceed with an HW reset, commanded by SW (as we do once during setup phase).

The complete code for our project can be downloaded from my GITHUB:ArduFarmBot_Light_EXT.ino

Step 17:Conclusion

There is a lot to be explored in IoT arena with those great little devices, the Arduino Uno, and the ESP8266-01. We will return soon with new tutorials! Keep following MJRoBot tutorials!

As always, I hope this project can help others find their way in the exciting world of electronics, robotics, and IoT!

Please visit my GitHub for updated files:ArduFarmBot_Light

Untuk proyek lainnya, silakan kunjungi blog saya:MJRoBot.org

Saludos from the south of the world!

See you at my next tutorial!

Thank you,

Marcelo

Kode

  • Cuplikan kode #1
  • Cuplikan kode #2
  • Cuplikan kode #3
  • Cuplikan kode #11
  • Cuplikan kode #12
  • Code snippet #16
  • Code snippet #20
Cuplikan kode #1Teks biasa
// DS18B20#include #include #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 int pinoDHT =11;int tipoDHT =DHT22;DHT dht(pinoDHT, tipoDHT); int airTemp =0;int airHum =0;// LDR (Light)#define ldrPIN 1int light =0;// Soil humidity#define soilHumPIN 0int soilHum =0;
Cuplikan kode #2Teks biasa
void setup(){ Serial.begin(9600); DS18B20.begin(); dht.begin();}void loop(){ readSensors(); displaySensors(); delay (10000);}
Cuplikan kode #3Teks biasa
/********* 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 soilHum =map(analogRead(soilHumPIN), 1023, 0, 0, 100); light =map(analogRead(ldrPIN), 1023, 0, 0, 100); //LDRDark:0 ==> light 100% }/********* Display Sensors value *************/void displaySensors(void){ Serial.print ("airTemp (oC):"); Serial.println (airTemp); Serial.print ("airHum (%):"); Serial.println (airHum); Serial.print ("soilTemp (oC):"); Serial.println (soilTemp); Serial.print ("soilHum (%):"); Serial.println (soilHum); Serial.print ("light (%):"); Serial.println (light); Serial.println ("");}
Cuplikan kode #11Teks biasa
#include  SoftwareSerial esp8266(6,7); //Rx ==> Pin 6; TX ==> Pin7 #define speed8266 9600 void setup() { esp8266.begin (speed8266); Serial.begin(speed8266); Serial.println("ESP8266 Setup test - use AT coomands");}void loop() { while(esp8266.available()) { Serial.write(esp8266.read()); } while(Serial.available()) { esp8266.write(Serial.read()); }}
Cuplikan kode #12Teks biasa
* 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
Code snippet #16Plain text
// Thingspeak String statusChWriteKey ="6SRPQQKIE6AJVQE6"; // Status Channel id:385184#include SoftwareSerial EspSerial(6, 7); // Rx, Tx#define HARDWARE_RESET 8// DS18B20#include #include #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 int pinoDHT =11;int tipoDHT =DHT22;DHT dht(pinoDHT, tipoDHT); int airTemp =0;int airHum =0;// LDR (Light)#define ldrPIN 1int light =0;// Soil humidity#define soilHumPIN 0int soilHum =0;// Variables to be used with timerslong writeTimingSeconds =17; // ==> Define Sample time in seconds to send datalong startWriteTiming =0;long elapsedWriteTime =0;// Variables to be used with Actuatorsboolean 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.mulai(); 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(" <<<>>>"); 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(); // persiapan 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); penundaan (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"); kembali; }}/********* 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("Tubuh Pesan diterima:"); Serial.println(messageBody); kembali pesanBody; } else { EspSerial.println("AT+CIPCLOSE"); // alert user Serial.println("ESP8266 CIPSEND ERROR:RESENDING"); //Resend... spare =spare + 1; error=1; return "error"; } }
Code snippet #20Plain text
// Thingspeak String canalID1 ="375598"; //Actuator1String canalID2 ="375599"; //Actuator2#include SoftwareSerial EspSerial(6, 7); // Rx, Tx#define HARDWARE_RESET 8// Variables to be used with timerslong readTimingSeconds =10; // ==> Define Sample time in seconds to receive datalong startReadTiming =0;long elapsedReadTime =0;//Relays#define ACTUATOR1 10 // RED LED ==> Pump#define ACTUATOR2 12 // GREEN LED ==> Lampboolean 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(" <<<>>>"); 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); penundaan (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"); kembali; }}/********* 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("Tubuh Pesan diterima:"); Serial.println(messageBody); kembali pesanBody; } else { EspSerial.println("AT+CIPCLOSE"); // alert user Serial.println("ESP8266 CIPSEND ERROR:RESENDING"); //Resend... spare =spare + 1; error=1; return "error"; } }
Github
https://github.com/Mjrovai/ArduFarmBot_Light

Skema

Electrical diagram
https://github.com/Mjrovai/ArduFarmBot_Light/blob/master/ArduFarmBot_Light/ArduFarmBot%20Light.fzz

Proses manufaktur

  1. Komputasi Paralel Pada Papan Raspberry Pi 4B+ IoT Menjadi Mudah
  2. Pemantau Detak Jantung Menggunakan IoT
  3. WebServerBlink Menggunakan Arduino Uno WiFi
  4. Kalkulator UNO sederhana
  5. Kegigihan Visi
  6. Gerbang Pemantauan Suhu Tanpa Kontak
  7. Arduino - Kirim Suhu ke Web melalui Serial
  8. Stasiun Cuaca ArduinoThingSpeak
  9. Seberapa Mudah Menggunakan Termistor?!
  10. Kolam Renang Azure IoT