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