Используя контроллер Arduino, можно собрать обучаемую систему полива растений.
Например, когда датчик уровня показывает, что резервуар для воды пуст — система может «настроиться» на новый уровень поддержания влажности.
Скетч
#include <EEPROM.h> #define BLED 9 // BLUE LED D13 #define GLED 10 // GREEN LED D12 #define RLED 11 // RED LED D11 #define SVCC 4 // Soil moisture sensor power supply #define SOIL A0 // Analog signal from soil moisture sensor A0 #define WATER 2 // Digital signal from water tank #define PUMP 13 // water pump #define ALRM 3 // Buzzer uint8_t setValue; // value remembered by our neuron uint8_t prevValue; void setup() { pinMode(GLED, OUTPUT); pinMode(RLED, OUTPUT); pinMode(BLED, OUTPUT); pinMode(ALRM, OUTPUT); pinMode(PUMP, OUTPUT); digitalWrite(PUMP, LOW); makeTone(300, 180); makeTone(800, 600); delay(500); setValue = EEPROM.read(0); } void makeTone(int ntone, int duration) { tone(ALRM, ntone); delay(duration); noTone(ALRM); } void showLed(int value) { value = constrain(value, 40, setValue); for (int i = 0; i < 510; i++) { int k = i; uint8_t bluled = map(value, 40, setValue, 255, 0); uint8_t greled = map(value, 40, setValue, 150, 0); uint8_t redled = map(value, 40, setValue, 0, 255); if (i > 255) { k = 510 - i; } analogWrite(RLED, redled * k / 255); analogWrite(GLED, greled * k / 255); analogWrite(BLED, bluled * k / 255); delay(25); } } void noWaterAlarm() { for (int d = 1000; d > 100; d--) { tone(ALRM, d); delay(3); } noTone(ALRM); makeTone(100, 500); delay(50); makeTone(120, 500); } void playPump (int duration) { unsigned long pstart = millis(); while (millis() - pstart < duration * 1000) { makeTone(630, 120); makeTone(1200, 120); makeTone(9000, 120); makeTone(8000, 120); } } void startPump(int pump) { digitalWrite(PUMP, HIGH); playPump(pump); // pumping for seconds digitalWrite(PUMP, LOW); // waiting for even water distribution for (int d = 1; d < 20; d++) { for (int i = 1; i < 100; i = i + 10) { analogWrite(BLED, i); delay(50); } } } void loop() { // supply power to moisture sensor digitalWrite(SVCC, HIGH); delay(20); // settle the power // read sensor value - this is our synapse signal int soilValue = analogRead(SOIL); // remove power to prevent galvanic corrosion of the sensor probes digitalWrite(SVCC, LOW); // this is our neuron making a decision if (digitalRead(WATER)) // read water level sensor value // decision 1: is it learing (tank is empty) or is it normal operation (water in the tank) { // if water is present, compare the moisture value with eeprom one if (soilValue > setValue) // current < eeprom, run the pump { startPump(12); } else // indicate the moisture with certain LED color for 30 sec { showLed(soilValue); } } else { // if no water, compare the moisture value with previous one // if moisture increased by at least 5 (manual watering) write the previous value to memory, // and ignore further changes for 1 hour. if (prevValue != 0 && soilValue < prevValue - 5) { EEPROM.write(0, prevValue); // that's the moment of teaching setValue = prevValue; delay(200); } else { showLed(soilValue); delay(1000); } } // store the moisture value to compare it in the next cycle prevValue = soilValue; delay(100); }
Ссылки
AI on Arduino (learning irrigation station)
По теме
3 датчика Arduino-садовника
Farmbot - открытый проект робота-садовника на базе Raspberry Pi и Arduino
Запрограммировать робота-садовника
Ардуино что это и зачем?
Arduino, термины, начало работы
Разновидности плат Arduino, а также про клоны, оригиналы и совместимость
КМБ для начинающих ардуинщиков