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

Solusi Penyiraman Tanaman Perkotaan

Komponen dan persediaan

Sensor Kelembaban Tanah
Sensor kelembaban tanah apa pun dengan output analog dapat digunakan. Dua elektroda dan pembagi tegangan dapat digunakan juga. INI OPSIONAL.
× 2
Sensor Hujan
× 1
Susu Jug
Setiap wadah yang dapat menampung air, dipotong, dan diikat ke permukaan dapat digunakan. dipasang di permukaan yang ditinggikan.
× 1
Tabung berongga fleksibel plastik lembut
Semua jenis pipa dapat digunakan. Saya menggunakan tali lompat yang ujungnya dipotong, karena sangat fleksibel dan bagian tengahnya berlubang.
× 1
Kabel jumper (generik)
Kurang lebih.
× 37
Kit Penemu SparkFun untuk Arduino 101
Saya menggunakan Arduino 101, servo, papan tempat memotong roti, potensiometer, dan LCD.
× 1
Memodelkan Tanah Liat
× 1
Batang plastik pendek
Atau batang yang tidak fleksibel. Ini digunakan untuk menopang pipa outlet tangki air.
× 1
Resistor 330 ohm
× 1

Alat dan mesin yang diperlukan

Gunting
Oeng Philips
Pita Listrik
dan juga tape biasa.

Aplikasi dan layanan online

Nordic Semiconductor nRF Connect SDK
Arduino IDE

Tentang proyek ini

Perangkat ini meningkatkan irigasi tanaman di lingkungan perkotaan. Didukung oleh Arduino 101, ia menggunakan alat terpasang bersama dengan beberapa sensor eksternal untuk menghitung kondisi optimal untuk menyiram tanaman di lingkungannya sendiri, dan kemudian menyirami tanaman itu sendiri pada waktu yang telah dihitung.

Ini didasarkan pada konsep berikut:

Gravitasi dan Tekanan

Alat ini mengambil sumber air dari reservoir, yang saya buat menggunakan kendi susu, tabung plastik, tanah liat untuk sealant tabung, dan servo. Wadah ini diposisikan sedemikian rupa sehingga selain ditinggikan, wadah ini juga dapat menampung air hujan dari atas perangkat.

Kendi diisi terutama oleh pasokan air rumah tangga (karena hujan tidak selalu tersedia), tetapi dilengkapi dengan air hujan. Ketika air ada di dalam kendi, gaya tarik gravitasi menarik air ke arah Bumi di dalam kendi. Sebuah lubang dipotong di dasar kendi untuk memungkinkan penyisipan pipa keluar. Gaya gravitasi dengan demikian menarik air melalui pipa keluar ini. Servo mengatur kapan air diizinkan keluar sepenuhnya dari pipa. Dalam keadaan normal, lengan servo berada dalam posisi tegak, yang mencegah air mengalir keluar dari pipa. Namun, saat menyiram tanaman, lengan diturunkan 135 derajat, sehingga memungkinkan air mengalir keluar dari pipa dan mengairi tanaman. Lengan terangkat kembali setelah ini selesai.

Tekanan air terhadap kendi tidak hanya membantu stabilitas kendi, tetapi juga membantu keluarnya air, memungkinkan aliran air terus menerus selama irigasi.

Sensor Suhu TMP36 dan Mesin Pencocokan Pola Curie Intel

Kombinasi konsep ini membantu mendorong perhitungan yang menentukan waktu optimal untuk menyiram tanaman. TMP36 adalah sensor suhu yang beroperasi seperti termometer, tetapi dengan output analog elektronik. Output ini dapat dibaca oleh perangkat, seperti mikrokontroler, dan diubah menjadi suhu. Dalam proyek ini, perangkat mencoba menghitung waktu optimal untuk menyiram tanaman, yang paling dekat dengan 25 derajat Celcius. Itu membuat 30 catatan per jam, dengan interval dua menit, dan pada akhir setiap periode menghitung rata-rata 29 ini (tidak termasuk yang pertama, karena biasanya tidak akurat). Di sinilah Mesin Pencocokan Pola berperan.

Intel Curie PME, atau mesin pencocokan pola, adalah jaringan saraf tiruan yang dibangun ke dalam Arduino 101. Pustakanya tersedia di GitHub. Terdiri dari 128 neuron, mampu mempelajari dan mengklasifikasikan data, disimpan dalam vektor, berdasarkan data yang ada, atau vektor yang diklasifikasikan ke dalam kategori. Semakin banyak kategori yang tersedia, semakin banyak pilihan klasifikasi yang dapat dilakukan oleh PME.

Untuk proyek ini, PME merekam data suhu selama satu hari dan mencoba mengklasifikasikan kondisi optimal, 25 derajat Celcius, di antara data ini. Hasilnya menjadi waktu penyiraman tanaman keesokan harinya.

Data direkam setiap jam dari jam 8 pagi sampai jam 9 malam. Pertama kali ini dilakukan, data akan disimpan ke Onboard Serial Flash . Ini akan memungkinkan perangkat untuk melakukan booting ke kumpulan data meskipun telah dimatikan. Setelah mendapatkan dataset, ia mencoba untuk mengklasifikasikan kondisi optimal. Jika mampu, maka kategori yang dipilih menjadi jam yang digunakan untuk putaran selanjutnya. Jika tidak, maka perangkat akan menggunakan konstanta bulanan, atau waktu setiap bulan dengan suhu tertinggi. Perlu dicatat bahwa ini tidak selalu merupakan suhu terbaik untuk menyirami tanaman , itulah sebabnya saya menggunakan PME.

Setelah sesi pembelajaran pertama, data dibersihkan dan dipelajari kembali pada hari berikutnya, dengan tanaman disiram pada jam yang dipilih. Siklus ini berulang tanpa batas, atau hingga perangkat terputus dari daya, saat dihidupkan kembali perangkat menggunakan parameter yang disimpan sebagai jam yang dipilih dan terus berjalan.

Jam Real-Time Intel Curie dan Bluetooth Hemat Energi

Intel Curie RTC, atau jam waktu nyata, adalah komponen penting dari perangkat ini. RTC mengontrol kapan semua yang ada di perangkat terjadi. Untuk proyek ini, RTC sangat penting dalam mencatat jam, yang digunakan untuk menyiram tanaman dan kapan harus merekam data, dan bulan, yang digunakan untuk menentukan konstanta suhu puncak cadangan. Namun, tanggal yang tepat untuk RTC ini perlu diatur secara manual, baik dalam kode atau dengan input pengguna. Ini diselesaikan dengan BLE.

Bluetooth Low Energy adalah versi Bluetooth yang lebih baru yang dirancang untuk perangkat berdaya rendah. Ini beroperasi pada sistem periferal pusat, di mana pusat, atau input, menulis ke periferal, atau output. Ini bertindak lebih seperti sistem papan buletin, di mana pusat menempatkan data pada buletin untuk dibaca oleh semua periferal. Dalam hal ini, saya menggunakan nRF Connect oleh Nordic Semiconductor pada perangkat seluler saya sebagai pusat, dan Arduino 101 sebagai periferal. Perangkat seluler memiliki kemampuan untuk terhubung ke Arduino dan mengirim data ke sana. Dalam hal ini, perangkat seluler perlu mengirim data empat kali, satu kali untuk setiap bidang masukan yang diperlukan.

Input data pada perangkat seluler diketik dalam heksadesimal. Ini cukup mudah untuk mengkonversi dari basis 10, tetapi konverter online dapat digunakan.

Cara Membangun

Membangun solusi irigasi ini membutuhkan sedikit pengetahuan sirkuit, tetapi tidak terlalu banyak. Ini juga membutuhkan beberapa komponen non-listrik untuk menyelesaikannya. Berikut daftar part lengkapnya:

Komponen Listrik

  • Arduino 101
  • 400 ikat papan tempat memotong roti, dengan +- rel
  • Potensiometer putar
  • LCD 16x2
  • resistor 330 Ohm
  • Sensor suhu TMP36
  • Servo 180 derajat, dengan tanduk servo
  • Sensor Hujan dan papan kontrol
  • Sensor Kelembaban Tanah dan papan kontrol (opsional, perangkat keras disertakan sebagai referensi)
  • Jumlah kabel jumper yang cukup besar; lihat diagram Fritzing

Untuk berjalan dengan baterai (mungkin tidak bertahan terlalu lama; pengaturan yang saya gunakan):

  • Kotak baterai 2X 4xAA dengan sakelar hidup/mati dan kabel kabel
  • Baterai isi ulang 8X AA 1.2V NiMH

Untuk berjalan dengan daya USB, baik dari kutil dinding atau laptop:

  • Kabel USB Male A - Male B, yang panjangnya tergantung kebutuhan Anda

Komponen Perangkat Keras Non-Listrik

  • Kendi susu
  • Tabung plastik fleksibel, panjang sekitar 20-30 cm
  • Memodelkan tanah liat, lem panas, atau apa saja yang bisa digunakan sebagai sealant
  • Batang plastik, untuk menopang lengan pipa
  • Keranjang kerajinan, untuk menyimpan perangkat
  • Permukaan yang ditinggikan untuk menampung kendi, yaitu bangku kecil atau meja
  • Tanaman

Alat

  • Pita, baik biasa maupun listrik
  • Gunting
  • Oeng Philips, untuk memasang klakson servo ke servo

Langkah

1. Bangun rangkaian sesuai dengan diagram Fritzing di bawah ini. Harap dicatat bahwa sensor kelembaban tanah adalah opsional, dan sensor hujan dan servo mungkin perlu memiliki kabel yang lebih panjang untuk mencapai lokasi yang diinginkan. Lihat foto kedua di bawah untuk pengaturan akhir sirkuit.

2. (Lewati ke langkah 5 jika menggunakan daya USB). Masukkan baterai ke dalam dua kotak baterai dan ikat kabel positif satu kotak dan kabel negatif kotak lainnya.

3. Rekatkan kotak-kotak tersebut menggunakan selotip listrik. Amankan kotak sehingga penutup keduanya terpasang dan kasing keduanya terpasang, dan penutup dapat dilepas sebagai satu kesatuan. Biarkan slot terbuka untuk sakelar daya.

4. Rekatkan penutup ganda kotak baterai ke bagian bawah Arduino 101 dan papan tempat memotong roti. Ini akan memungkinkan baterai diganti dengan mudah dengan menggesernya keluar dari bawah papan.

5. Masukkan perangkat ke dalam keranjang kerajinan dan potong dua slot di satu sisi perangkat. Slot pertama akan untuk pemrograman (atau daya USB jika Anda memilih untuk melakukannya), dan yang kedua akan menjadi outlet untuk sensor dan aktuator tidak terletak pada perangkat. Jangan ragu untuk menggunakan pita listrik untuk mengamankan kabel yang kendor di stopkontak ini.

6. Ambil kendi susu dan potong bagian atasnya sehingga kendi memiliki bukaan yang cukup besar untuk menampung air dan kapasitas yang cukup besar untuk dapat diandalkan. Saya merekomendasikan potongan berada di suatu tempat dekat dengan dasar pegangan.

7. Buat lubang kecil di dasar kendi tepat di bawah bagian terbesar dari bukaan di bagian atas kendi. Masukkan salah satu ujung pipa plastik ke dalam lubang ini. Pastikan lubangnya cukup kecil sehingga pipa tetap pada posisinya, tetapi cukup besar sehingga tidak menekan pipa.

8. Gunakan tanah liat untuk menyegel area atas dan bawah di sekitar pipa di dalam lubang. Pastikan tanah liat tidak masuk ke dalam pipa itu sendiri.

9. Menggunakan lempung dan pita listrik, kencangkan servo serendah mungkin ke dasar wadah susu. Rekatkan bagian tengah tabung dan batang plastik ke tanduk servo. Pastikan batang plastik juga direkatkan ke ujung atas tabung. Gunakan gambar di bawah ini sebagai referensi untuk langkah 8 sampai 10.

10. Amankan kendi ke permukaan yang ditinggikan. Gunakan selotip jika perlu.

11. Tempatkan tanaman tepat di bawah saluran keluar tabung saat dalam posisi diturunkan. Tempelkan sensor kelembapan ke dalam tanah jika Anda menggunakannya, dan letakkan sensor hujan di dekat tanaman di sepanjang lantai. Colokkan sensor dan servo ke dalam perangkat, dengan perangkat ditempatkan agak jauh dari tabung dan tanaman.

Pemrograman

Program Arduino 101 dengan kode terlampir. Unggah menggunakan Arduino IDE dan Curie Core 2.0.2 atau lebih tinggi (jika tersedia). Banyak komentar bermanfaat disertakan dalam kode.

Operasi Perangkat

Saat perangkat pertama kali dihidupkan, perangkat akan menunggu perangkat seluler terhubung. Setelah perangkat terhubung menggunakan nRF Connect, perangkat akan menunggu input waktu. Untuk melakukannya, ketik kode hex secara berurutan untuk basis 10 jam, menit, hari, dan bulan secara berurutan ke dalam nRF Connect seperti yang ditunjukkan pada diagram di bawah ini.

Masukan ID, atau nomor apapun, harus diketik dan dikirim sebelum memasukkan waktu.

Setelah mengetik waktu, 101 akan menunggu perangkat seluler terputus. Setelah itu, ia akan menunggu jam 8 pagi, baik hari ini atau hari berikutnya.

Setelah mencapai jam 8 pagi, papan akan memeriksa untuk melihat apakah ada sesuatu yang disimpan dalam penyimpanan memori flash. Jika tidak, maka akan melalui proses pengumpulan selama 14 jam seperti yang dijelaskan sebelumnya, kemudian mengklasifikasikan data dan menentukan waktu optimal, pada titik mana ia akan mengulangi siklus pengumpulan. Jika ada sesuatu yang disimpan, maka data tersebut digunakan sebagai konstanta jam dan siklus berlanjut seperti biasa.

Selama papan menyiram tanaman, adanya hujan atau kelembaban tanah yang berlebihan (opsional) akan mencegah tanaman disiram. Kemudian akan melewatkan penyiraman untuk hari itu dan menunggu hari berikutnya.

Solusi ini dirancang untuk membuat irigasi tanaman perkotaan lebih sederhana dan lebih optimal dengan menggunakan pengaturan otomatis untuk menangani hal ini. Ini juga menghemat air hujan bersama dengan persediaan rumah yang ada dengan menggunakan reservoir, yang membuat hujan tidak diarahkan ke tanaman untuk digunakan dengan baik.

Semoga proyek ini akan membuat dunia kita yang terus berubah menjadi tempat yang sedikit lebih baik!

Kode

  • Sistem Irigasi Arduino 101
Sistem Irigasi Arduino 101Arduino
Kode untuk mengoperasikan sistem irigasi Arduino 101. Unggah menggunakan Curie core 2.0.2, dan IDE 1.8.x atau lebih tinggi apa pun. CuriePME dapat ditemukan di GitHub.
/*Ini adalah sketsa untuk solusi irigasi perkotaan. CuriePME menggunakan CuriePME untuk mempelajari data suhu dan mengklasifikasikan kondisi penyiraman tanaman yang optimal. CuriePME kemudian menyirami tanaman pada waktu itu dan mempelajari kembali data, bersepeda tanpa batas. Harap dicatat bahwa sketsa ini HARUS DILAKSANAKAN SEBELUM jam 8 pagi dari hari target untuk memulai perangkat. Sumber data:"WeatherSpark.com." Cuaca rata-rata di Vancouver, Kanada, Sepanjang Tahun - Percikan Cuaca. N.p., n.d. Web. 04 Juli 2017. ."Hanya 4 Petani:Komunitas Taman Global." Hanya Untuk Petani. N.p., n.d. Web. 10 Juli 2017. . */// Pustaka untuk digunakan dengan kode ini. Semuanya kecuali CuriePME dapat ditemukan di ide. CuriePME dapat diunduh dari repositori GitHub.#include "CuriePME.h"#include #include #include #include #include #sertakan // Servo pinout code.Servo waterPipe;// Kode pinout LCD.LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// Konstanta/variabel global.#definisi termometer A3 #menentukan sensor hujan 1#menentukan kelembaban1 A4#menentukan kelembaban2 A1int tm1;int tm2;int tm3;int tm4;int tm5;int tm6;int tm7;int tm8;int tm9;int tm10;int tm11;int tm12; int tm14;int tm15;int tm16;int tm17;int tm18;int tm19;int tm20;int tm21;int tm22;int tm23;int tm24;int tm25;int tm26;int tm27;int tm28;int tm30;int;int rata-rata;int progav;voltase mengambang;suhu mengambangC;int tm;int hourTime =-1;int minuteTime =-1;int dayTime =-1;int monthTime =-1;int confirmTime =-1;// BLE service data.BLEService plantService("19B10000-E8F2-537E-4F6C-D104768A1214");// Karakteristik BLE, dapat dibaca/ditulis oleh pusat.BLEUnsignedCharCharacteristic timeCha racteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLEBaca | BLEWrite);void setup() { // Ini berjalan sekali. waterPipe.attach (9); waterPipe.write(0); pinMode(Sensor hujan, INPUT); lcd.begin(16, 2); // Mulai dan bersihkan LCD. lcd.clear(); if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)); lcd.setCursor(0, 0); lcd.print("Waktu Masukan:BLE"); // Inisialisasi layanan BLE dengan nama, layanan, karakteristik, dan nilai karakteristik. BLE.mulai(); BLE.setLocalName("Arduino 101"); BLE.setAdvertisedService(plantService); plantService.addCharacteristic(Karakteristik waktu); BLE.addService(Layanan tanaman); timeCharacteristic.setValue(0); // 0 sampai ditulis oleh pusat. BLE.iklan(); lcd.setCursor(0, 1); lcd.print("Menunggu"); // Siap terhubung.x:BLEDevice central =BLE.central(); if (pusat) { // Jika perangkat terhubung ke papan. lcd.setCursor(8, 1); lcd.print("Selesai"); penundaan(3000); while (central.connected()) { // Selama perangkat masih terhubung. if (timeCharacteristic.written()) { // Kode yang secara berurutan mengisi semua slot variabel waktu setelah setiap byte dikirim dari perangkat. Data dikirim empat kali, ditambah satu untuk konfirmasi tautan. if (confirmTime ==-1) { confirmTime =timeCharacteristic.value(); } else if (hourTime ==-1) { hourTime =timeCharacteristic.value(); } else if (minuteTime ==-1) { minuteTime =timeCharacteristic.value(); } else if (dayTime ==-1) { dayTime =timeCharacteristic.value(); } else if (monthTime ==-1) { monthTime =timeCharacteristic.value(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Waktu yang ditentukan."); lcd.setCursor(0, 1); lcd.print("Putuskan sambungan perangkat."); } } } } else { goto x; // Ulangi kembali jika perangkat belum terhubung. } // Atur waktu dengan variabel yang dikumpulkan. Detik dan tahun tidak masalah untuk sistem ini. setTime(hourTime, minuteTime, 00, dayTime, monthTime, 2017); // Inisialisasi PME. lcd.clear(); CuriePME.begin(); lcd.setCursor(0, 0); lcd.print("Memeriksa penyimpanan."); penundaan(3000); const char *namafile ="NeurData.dat"; if (check_if_exists(nama file) ==true) { restoreNetworkKnowledge(); lcd.setCursor(0, 1); lcd.print("Ditemukan!"); penundaan(3000); lcd.clear(); harus z; } else { lcd.setCursor(0, 1); lcd.print("Tidak ditemukan!"); penundaan(3000); lcd.clear(); } /* Bagian penyiapan yang tersisa mengumpulkan data suhu sepanjang hari. Itu membuat 30 pemeriksaan per jam, dengan interval 2 menit, dan pada akhir jam dibutuhkan rata-rata data jam dengan menemukan rata-rata aritmatika dari semua data kecuali untuk pemindaian pertama. Rata-rata ini kemudian dimasukkan ke dalam PME dan dipelajari. Ini berulang dari jam 8 pagi sampai jam 9 malam, di mana set data lengkap yang dipelajari oleh PME disimpan ke dalam memori CurieFlash sebagai default jika dan ketika perangkat kehilangan daya atau perlu dihidupkan ulang. */ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); for (int i =8; i <22; i++) // Ulangi ini 14 kali, masing-masing menyimpan di bawah kategori yang berbeda. { // Kumpulkan 30 buah data suhu, disimpan sebagai int yang dipetakan antara 0 dan 255. voltage =analogRead(thermometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm1 =kendala(tm, 0, 255); penundaan (114000); // Mengkompensasi keterlambatan cek di atas. tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm2 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm3 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm4 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm5 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm6 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm7 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm8 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm9 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm10 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm11 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm12 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm13 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm14 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm15 =kendala(tm, 0, 255); // Selama periode pembelajaran pertama, penyiraman tanaman akan dilakukan pada suhu puncak bulan itu. if ((bulan() ==1 || bulan() ==2 || bulan() ==11 || bulan() ==12) &&jam() ==12) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); // Sirami tanaman jika tidak hujan dan kelembaban tanah cukup rendah. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Hujan sekarang."); pergi ke a2; } // Batalkan komentar untuk menggunakan sensor kelembapan. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Sesuaikan ini agar sesuai dengan tanah Anda. //{ //lcd.setKursor(0, 1); //lcd.print("Tanah terlalu lembab."); // masuk ke a2; //}else { waterPipe.write(135); penundaan (7000); // Air selama 7 detik. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Selesai");a2:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); } else if ((bulan() ==3 || bulan() ==4 || bulan() ==10) &&jam() ==14) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); // Sirami tanaman jika tidak hujan dan kelembaban tanah cukup rendah. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Hujan sekarang."); masuk ke a31; } // Batalkan komentar untuk menggunakan sensor kelembapan. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Sesuaikan ini agar sesuai dengan tanah Anda. //{ //lcd.setKursor(0, 1); //lcd.print("Tanah terlalu lembab."); // masuk ke a31; //}else { waterPipe.write(135); penundaan (7000); // Air selama 7 detik. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Selesai");a31:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); } else if ((bulan() ==5 || bulan() ==6 || bulan() ==9) &&jam() ==15) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); // Sirami tanaman jika tidak hujan dan kelembaban tanah cukup rendah. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Hujan sekarang."); pergi ke a3; } // Batalkan komentar untuk menggunakan sensor kelembapan. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Sesuaikan ini agar sesuai dengan tanah Anda. //{ //lcd.setKursor(0, 1); //lcd.print("Tanah terlalu lembab."); // masuk ke a3; //}else { waterPipe.write(135); penundaan (7000); // Air selama 7 detik. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Selesai");a3:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); } else if ((month() ==7 || month() ==8) &&hour() ==16) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Berjalan..."); // Sirami tanaman jika tidak hujan dan kelembaban tanah cukup rendah. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Hujan sekarang."); pergi ke a4; } // Batalkan komentar untuk menggunakan sensor kelembapan. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Sesuaikan ini agar sesuai dengan tanah Anda. //{ //lcd.setKursor(0, 1); //lcd.print("Tanah terlalu lembab."); // masuk ke a4; //}else { waterPipe.write(135); penundaan (7000); // Air selama 7 detik. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Selesai");a4:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Belajar"); } penundaan (110000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm16 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm17 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm18 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm19 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm20 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm21 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm22 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm23 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm24 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; suhuC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm25 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; temperaturC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm26 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; temperaturC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm27 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; temperaturC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm28 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; temperaturC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm29 =kendala(tm, 0, 255); penundaan (120000); tegangan =analogBaca(termometer) * 3.3; tegangan /=1024.0; temperaturC =(tegangan - 0,5) * 100; tm =peta(suhuC, -40, 125, 0, 255); tm30 =kendala(tm, 0, 255); penundaan (120000); // Konversi ulang data ke spesifikasi sensor suhu. tm1 =peta(tm1, 0, 255, -40, 125); tm1 =kendala(tm1, -40, 125); tm2 =peta(tm2, 0, 255, -40, 125); tm2 =kendala(tm2, -40, 125); tm3 =peta(tm3, 0, 255, -40, 125); tm3 =kendala(tm3, -40, 125); tm4 =peta(tm4, 0, 255, -40, 125); tm4 =kendala(tm4, -40, 125); tm5 =peta(tm5, 0, 255, -40, 125); tm5 =kendala(tm5, -40, 125); tm6 =peta(tm6, 0, 255, -40, 125); tm6 =kendala(tm6, -40, 125); tm7 =peta(tm7, 0, 255, -40, 125); tm7 =kendala(tm7, -40, 125); tm8 =peta(tm8, 0, 255, -40, 125); tm8 =kendala(tm8, -40, 125); tm9 =peta(tm9, 0, 255, -40, 125); tm9 =kendala(tm9, -40, 125); tm10 =peta(tm10, 0, 255, -40, 125); tm10 =kendala(tm10, -40, 125); tm11 =peta(tm11, 0, 255, -40, 125); tm11 =kendala(tm11, -40, 125); tm12 =map(tm12, 0, 255, -40, 125); tm12 =constrain(tm12, -40, 125); tm13 =map(tm13, 0, 255, -40, 125); tm13 =constrain(tm13, -40, 125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); // Find the arithmetic mean and commit it to memory. average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; commitSample(i, average); } saveNetworkKnowledge(); // Save this new data to flash memory.z:delay(1);}void commitSample (int category, uint8_t s1){ // Commit to memory a single vector (the average), along with the category, which represents the hour of that data. uint8_t vector[1]; vector[0] =s1; CuriePME.learn(vector, 1, category);}void loop() { // Infinitely repeats. /* This code attempts to classify the optimum temperature for watering plants, 25 Celsius, among the data learned by the PME. If it can classify the data, the returned category becomes the hour at which the plant will be watered. The data is then erased and relearned, which infinitely repeats. IF IT CANNOT CLASSIFY THE DATA, it will take the monthly defaults from earlier in the sketch. */ uint8_t vector[1]; vector[0] =25; int answer =CuriePME.classify(vector, 1 ); if (answer ==CuriePME.noMatch) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("NO MATCHES!"); if (month() ==1 || month() ==2 || month() ==11 || month() ==12) { answer =12; } else if (month() ==3 || month() ==4 || month() ==10) { answer =14; } else if (month() ==5 || month() ==6 || month() ==9) { answer =15; } else if (month() ==7 || month() ==8) { answer =16; } } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Category:"); lcd.setCursor(0, 1); lcd.print(answer); } penundaan(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Optimization Done"); penundaan(3000); CuriePME.forget(); // Erase and relearn. This does not erase the flash memory. lcd.clear(); lcd.setCursor(0, 0); lcd.print("Waiting"); while (hour() !=8); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Learning"); // Learn the data again. for (int i =8; i <22; i++) { voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm1 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm2 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm3 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm4 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm5 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm6 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm7 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm8 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm9 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm10 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm11 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm12 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm13 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm14 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm15 =constrain(tm, 0, 255); // The time in the day at which to water the plant, as determined by the PME. if (hour() ==answer) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Running..."); // Water the plant if it is not raining and soil moisture is low enough. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Raining right now."); goto a5; } // Uncomment to use moisture sensors. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Adjust these to match your soil. //{ // lcd.setCursor(0, 1); // lcd.print("Soil too moist."); // goto a5; //} else { waterPipe.write(135); penundaan (7000); // Water for 7 seconds. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Done");a5:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Learning"); } delay(110000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm16 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm17 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm18 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm19 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm20 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm21 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm22 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm23 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm24 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm25 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm26 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm27 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm28 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm29 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm30 =constrain(tm, 0, 255); delay(120000); tm1 =map(tm1, 0, 255, -40, 125); tm1 =constrain(tm1, -40, 125); tm2 =map(tm2, 0, 255, -40, 125); tm2 =constrain(tm2, -40, 125); tm3 =map(tm3, 0, 255, -40, 125); tm3 =constrain(tm3, -40, 125); tm4 =map(tm4, 0, 255, -40, 125); tm4 =constrain(tm4, -40, 125); tm5 =map(tm5, 0, 255, -40, 125); tm5 =constrain(tm5, -40, 125); tm6 =map(tm6, 0, 255, -40, 125); tm6 =constrain(tm6, -40, 125); tm7 =map(tm7, 0, 255, -40, 125); tm7 =constrain(tm7, -40, 125); tm8 =map(tm8, 0, 255, -40, 125); tm8 =constrain(tm8, -40, 125); tm9 =map(tm9, 0, 255, -40, 125); tm9 =constrain(tm9, -40, 125); tm10 =map(tm10, 0, 255, -40, 125); tm10 =constrain(tm10, -40, 125); tm11 =map(tm11, 0, 255, -40, 125); tm11 =constrain(tm11, -40, 125); tm12 =map(tm12, 0, 255, -40, 125); tm12 =constrain(tm12, -40, 125); tm13 =map(tm13, 0, 255, -40, 125); tm13 =constrain(tm13, -40, 125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; progav =(tm30 - tm2) / 2; commitSample(i, average); }}/* A quick note on the flash memory data:The data will only ever be saved once; that is, it cannot be changed with this code. As a result, if the device loses power, IT WILL DEFAULT TO THE SETTINGS OF THE FIRST TIME IT WAS USED WHEN IT IS REACTIVATED, even if the monthly averages have changed. Keeping the device on an extra day will allow it to software obtain new averages, but the flash memory will stay the same. To erase flash completely, upload "EraseEverything" from "CurieSerialFlash" in the IDE. Then reupload this sketch to save new averages to the flash memory.*/void saveNetworkKnowledge() // Code for saving to flash memory....This file has been truncated, please download it to see its full contents.

Skema

Fritzing diagram for the circuit. Note that batteries would be attached on the left. The soil moisture sensors are optional. rainpoweredsmartirrigationsystem_OHtd4bVfb3.fzz

Proses manufaktur

  1. Titanium
  2. gips
  3. Lem
  4. Utas
  5. Asetilen
  6. Asbes
  7. Dadu
  8. Timah
  9. Penyiraman Tanaman Otomatis Raspberry Pi dengan Situs Web
  10. Siemens, Bentley Meluncurkan Solusi untuk Mempercepat Digitalisasi Pabrik