Обучаемая система полива растений на Arduino

Обучаемая система полива растений на Arduino
Используя контроллер 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, а также про клоны, оригиналы и совместимость
КМБ для начинающих ардуинщиков
  • 0
  • 12 июля 2016, 18:04
  • admin

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.