
Используя контроллер 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, а также про клоны, оригиналы и совместимость
КМБ для начинающих ардуинщиков
