Komunikator Tanaman Cerdas: Arduino MKR IoT Bundle untuk Pertanian Otomatis
Komponen dan Perlengkapan
Arduino MKR IoT Bundle
1
Aplikasi dan Layanan Online
Zapier
ThingSpeak API
Tentang Proyek
Catatan: Tutorial ini mungkin sudah ketinggalan zaman, silakan pergi disini untuk versi yang lebih terkini.
Pengantar
Seperti yang pernah dikatakan oleh penyair Inggris William Wordsworth:
"Pikiranmu adalah taman, pikiranmu adalah benih, panen dapat berupa bunga atau gulma."
Menjaga tanaman agar tetap hidup bisa menjadi tantangan karena mereka sangat buruk dalam berkomunikasi.
Salah satu cara untuk membuatnya bahagia adalah membawa tanaman Anda bersama Anda, namun mungkin Anda tidak ingin membawanya dengan kaktus besar atau pakis yang menempel di saku jaket dingin Anda. Selain itu, sebagian besar tanaman tidak suka dingin.
Setelah menghabiskan berbulan-bulan mencoba berkomunikasi dengan Spider Plant kami, kami menyerah dan menggunakan komponen MKR IoT Bundle untuk membuat perangkat yang memantau kesejahteraan tanaman secara jarak jauh sebagai gantinya.
Secara singkat:
Dalam eksperimen ini Anda akan mempelajari cara melindungi tanaman Anda dan memastikan mereka bertahan serta menggunakan sihir Arduino.
Dengan memantau kelembaban, suhu dan cahaya, Anda dapat memastikan tanaman Anda bahagia. Ini dapat mengirim email dan grafik setiap hari serta memberi tahu Anda akan kebutuhannya.
Komponen
Sensor suhu TMP36
Phototransistor
Sensor kelembaban tanah DIY
Tujuan Pembelajaran
Memperkenalkan layanan internet Zapier
Mengirim permintaan HTTP
Mengelola Real Time Clock dan alarm
Membuat sensor kelembaban tanah DIY
Memplot nilai dengan ThingSpeak #ProTips
Stail email Anda dengan HTML dan CSS #ProTips
Menguji API dengan PostMan #ProTips
Ingin Mengetahui Lebih Banyak?
Tutorial ini adalah bagian dari serangkaian eksperimen yang memperkenalkan Anda dengan MKR1000 dan IoT. Semua eksperimen dapat dibuat menggunakan komponen yang terkandung dalam MKR IoT Bundle.
Love You Pillow
Puzzle Box
Pavlov's Cat
The Nerd
Plant Communicator
Siapkan Zapier
Zapier adalah alat otomatisasi online yang dapat dengan mudah mengelola API aplikasi lain untuk kita. Ini adalah alat yang hebat untuk menggabungkan beberapa tugas atau jika aplikasi yang ingin kita gunakan memiliki API yang kompleks yang tidak dapat dikelola oleh Arduino.
Dalam kasus kita kita akan menggunakannya untuk mengirim email dengan data yang diambil dari Arduino.
Ikuti langkah-langkah sederhana ini untuk membuat zap Anda sendiri!
Untuk melanjutkan kita perlu menguji hook pertama dengan menyalin URL yang diberikan, lalu memilih tombol Test and Review yang muncul ketika Anda menekan Continue. Tambahkan parameter ini ke URL:
Sekarang cukup salin dan tempelkan URL ini di halaman browser baru.
Anda seharusnya melihat respons seperti ini:
Selamat! Anda baru saja mengirim permintaan http!
Ini persis apa yang akan kita lakukan dengan papan Arduino kita. Namun alih-alih menempelkan URL tersebut ke halaman browser kita akan mengirimnya langsung ke server Zapier. Juga kita akan mengubah nilai parameter yang sekarang diatur ke nol dengan nilai sensor kita.
Untuk cara yang lebih canggih untuk menguji dan bekerja dengan API lihat #ProTip di bagian bawah halaman.
Setelah Anda menguji permintaan Anda Anda dapat melanjutkan membuat Zap.
Lanjutkan di Edit dengan Do This...
Periksa kotak masuk Anda untuk melihat email yang dihasilkan dari Zapier. Ini akan dari akun yang Anda gunakan di langkah pertama konfigurasi gmail.
Siapkan Papan
Untuk mengimplementasikan semua fungsionalitas kami akan menggunakan pustaka berikut:
WiFi101 // untuk terhubung ke internet dan memindai jaringan
RTCZero // untuk mengelola event yang dipicu waktu
Anda dapat mengunduhnya dari manajer pustaka seperti yang dijelaskan dalam panduan ini.
Untuk menggunakan API Zapier kita pertama perlu mengunggah sertifikat pada MKR1000. Ini berlaku untuk sebagian besar layanan dan API online!
Unggah contoh Firmware Updater dari pustaka WiFi101 dan tambahkan hooks.zapier.com ke domain.
> examples > WiFi101 > FirmwareUpdater
Jika Anda menggunakan Arduino Web Editor fitur ini belum diimplementasikan dan Anda perlu melakukan ini melalui Arduino Desktop Application.
Mengirim Permintaan HTTP
Kami sekarang siap untuk mengirim permintaan HTTP dari papan Arduino.
Untuk saat ini kita akan menetapkan nilai acak ke parameter kita yang nantinya akan diganti dengan nilai sensor nyata.
float temperature = 22; int moisture = 150; int light = 40; String warning = "This is a warning message"; warning.replace(" ", "%20");
Perhatikan bahwa string harus dienkode, karena spasi tidak dapat dikirim dalam permintaan HTTP. Semua spasi diganti dengan setara kode %20
Setelah menyiapkan parameter kita kita akan memanggil fungsi send_email(), yang akan mengonversi semuanya menjadi String dan akan membangun ulang URL yang sama yang kita gunakan sebelumnya untuk kemudian mempostingnya ke server Zapier.
Isi sketsa ini dengan kredensial WiFi Anda dan potongan URL yang Anda terima dari Zapier dan unggah.
#include <WiFi101.h> #include<WiFiSSLClient.h> const char* ssid = SECRET_SSID; // your network SSID (name) const char* password = SECRET_PSWD; // your network password String httpsRequest = SECRET_REQUEST; // your Zapier URL const char* host = "hooks.zapier.com"; WiFiSSLClient client; void setup() { Serial.begin(9600); while (!Serial); delay(2000); Serial.print("Connecting Wifi: "); Serial.println(ssid); while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); } void loop() { float temperature = 22; int moisture = 150; int light = 40; String warning = "This is a warning message"; warning.replace(" ", "%20"); send_email(temperature, moistue, light, warning ); delay(20000) } void send_email(float temperature, int moisture, int light, String warning) { // convert values to String String _temperature = String(temperature); String _moisture = String(moisture); String _light = String(light); String _warning = warning; if (client.connect(host, 443)) { client.println("POST " + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + " HTTP/1.1"); client.println("Host: " + String(host)); client.println("Connection: close"); client.println(); delay(1000); while (client.available()) { // Print on the console the answer of the server char c = client.read(); Serial.write(c); } client.stop(); // Disconnect from the server } else { Serial.println("Failed to connect to client"); } }
Ini akan mengirim email ke alamat yang Anda pilih setiap 20 detik.
Hati-hati dengan permintaan, Zapier hanya mengizinkan 100 permintaan gratis per bulan.
RTC dan Alarm
Kami dapat menggunakan Real Time clock MKR1000 untuk mengirim email setiap hari pada jam tertentu.
Sketsa ini akan mengatur waktu dan tanggal pada 16:00 pada 4 Desember 2017 dan kemudian memicu alarm setiap hari pada 16:01.
Perhatikan bahwa karena alarm terpasang pada fungsi interruptkami tidak dapat menyertakan jeda apa pun, namun kita dapat menggunakan variabel boolean untuk memicu tindakan dalam loop()
#include <RTCZero.h> RTCZero rtc; // create RTC object /* Change these values to set the current initial time */ const byte seconds = 0; const byte minutes = 0; const byte hours = 16; /* Change these values to set the current initial date */ const byte day = 4; const byte month = 12; const byte year = 17; bool email_already_sent = false; void setup() { Serial.begin(9600); while (!Serial); delay(2000); rtc.begin(); // initialize RTC 24H format rtc.setTime(hours, minutes, seconds); rtc.setDate(day, month, year); rtc.setAlarmTime(16, 1, 0); // Set the time for the Arduino to send the email rtc.enableAlarm(rtc.MATCH_HHMMSS); rtc.attachInterrupt(alarmMatch); } void loop() { if (!email_already_sent) { // send_email(); email_already_sent = true; } } void alarmMatch() { // triggered when the alarm goes on Serial.println("Alarm Match!"); email_already_sent = false; }
Sensor Kelembaban Tanaman DIY
Dua kabel yang ditempatkan dalam pot tanah membentuk variabel resistor, yang resistensinya bervariasi tergantung pada kelembaban tanah.
Variabel resistor ini dihubungkan dalam konfigurasi pembagi tegangan, dan Arduino mengumpulkan tegangan yang proporsional terhadap resistensi antara 2 kabel.
Artinya semakin lembab tanahnya, semakin sedikit tegangan yang diukur dari Arduino.
Menggunakan resistor 1 Mega Ohm dan dua kabel, kita dapat membuat sensor kelembaban tanah DIY kita!
Mengunggah sketsa berikut Anda dapat mulai membaca nilai sensor, kami menyarankan Anda mulai mengujinya terlebih dahulu di tanah kering dan catat nilai yang Anda baca.
Nilai itu akan digunakan untuk mengatur ambang batas sehingga Arduino akan tahu kapan tanaman Anda butuh air dan akan mengirim Anda email darurat.
int moisturePin = A2; // Set this threeshold accordingly to the resistance you used // The easiest way to calibrate this value is to test the sensor in both dry and wet soil int threeshold = 800; void setup() { Serial.begin(9600); while (!Serial); delay(2000); } void loop() { Serial.println(get_average_moisture()); delay(5000); } int get_average_moisture() { // make an average of 10 values to be more accurate int tempValue = 0; // variable to temporarly store moisture value for (int a = 0; a < 10; a++) { tempValue += analogRead(moisturePin); delay(100); } return tempValue / 10; }
Tambahkan Sensor Suhu dan Cahaya
Lihat skematik di bawah untuk merangkaikan dua sensor. Kami akan menggunakan dua fungsi ini untuk membaca nilai dari sensor:
float get_temperature(){ int reading = analogRead(A1); float voltage = reading * 3.3; voltage /= 1024.0; // Print tempeature in Celsius float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset // Convert to Fahrenheit float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; return temperatureC; } int get_light(){ int light_value=analogRead(A0); return light_value; }
Perhatikan bahwa Anda dapat menggunakan satuan Fahrenheit dengan mengembalikan temperatureF alih-alih temperatureC
#ProTip: Memplot Nilai Menggunakan ThingSpeak
Untuk semua pengontrol freak di sini ini adalah instruksi untuk memplot semua data yang dikumpulkan dalam grafik yang indah seperti ini:
Kami akan menggunakan platform ThingSpeak untuk memplot grafik, ikuti langkah-langkah ini untuk memulai.
Unduh pustaka ThingSpeak dan mari kita mulai. Sketsa di bawah ini akan mengunggah nilai sensor ke cloud setiap menit, cukup isi kredensial WiFi Anda dan kunci API channel Anda dan unggah.
#include <WiFi101.h> #include<WiFiSSLClient.h> #include "ThingSpeak.h" const char* ssid = SECRET_SSID; // your network SSID (name) const char* password = SECRET_PSWD; // your network password WiFiClient ThingSpeakClient; unsigned long myChannelNumber = 356392; const char * myWriteAPIKey = SECRET_WRITE_API; int lightPin = A0; //the analog pin the light sensor is connected to int tempPin = A1; //the analog pin the TMP36's Vout (sense) pin is connected to int moisturePin = A2; void setup() { Serial.begin(9600); while (!Serial); delay(2000); Serial.print("Connecting Wifi: "); Serial.println(ssid); while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); ThingSpeak.begin(ThingSpeakClient); } void loop() { ThingSpeak.setField(1, get_light()); ThingSpeak.setField(2, get_temperature()); ThingSpeak.setField(3, get_average_moisture()); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); Serial.println("message sent to cloud"); delay(60000); // send values every 1 minute } float get_temperature() { int reading = analogRead(tempPin); float voltage = reading * 3.3; voltage /= 1024.0; // Print tempeature in Celsius float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset // Convert to Fahrenheit float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; return temperatureC; } int get_average_moisture() { // make an average of 10 values to be more accurate int tempValue = 0; // variable to temporarly store moisture value for (int a = 0; a < 10; a++) { tempValue += analogRead(moisturePin); delay(10); } return tempValue / 10; } int get_light() { int light_value = analogRead(A0); return light_value; }
Dalam sketsa Pro lengkap di bawah ini Anda dapat melihat cara melampirkan pengunggahan ini ke alarm RTC yang dipicu setiap menit.
Sayangnya Gmail tidak membiarkan kami menyematkan grafik dan iframes dalam tubuh email, namun kita dapat mengirim tautan melalui email dalam tombol yang indah, lihat tips di bawah.
Kami memilih ThingSpeak, namun ada banyak alternatif lain di luar sana! Lihat Dweet.io dan freeboard.io misalnya.
#ProTip: Stail Email Anda
Zapier memungkinkan kami untuk menyematkan beberapa kode html dan css dalam tubuh email. Kita dapat menggunakannya untuk mengirim email yang dipahat indah seperti ini:
Untuk mencapai hasil ini cukup ubah jenis tubuh menjadi html di antarmuka Zapier dan tambahkan HTML dan CSS kustom Anda.