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


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение