Радиотехника | Электротехника | Строительство | Растениеводство | Учёба | Книги | Фильмы | Игры | Вопросы-ответы | Визитка

Главы страницы

  1. Работа автомата полива
  2. Использованные материалы и детали
  3. Использованные библиотеки
  4. Текст программы на С
  5. Эпилог

Как самому сделать автомат полива комнатных цветов на базе набора "Arduino"

Плата Arduino-Uno

Пример автомата полива комнатных цветов

Работа автомата полива

Полив производится в течении 3 секунд (агумент функции poliw) только в дневное время. Причины для это две:

  1. не нарушать тишину ночью работой насоса;
  2. корням растений ночью нужен кислород для дыхания, который вода при поливе вытесняет.

Сигнальный светодиод led при номальной работе всех систем подает следующие сигналы:

  1. первый:
    1. длинный (день) : полив разрешен,
    2. короткий (ночь): полив запрещен;
  2. второй:
    1. длинный (влажно): полив запрещен,
    2. короткий (сухо): полив разрешен.

При аварийной ситуации (нет воды в баке, обрыв шлангов и пр.) светодиод led подает сигнал Морзе SOS: три коротких, три длинных, три коротких.

Использованные материалы и детали

  1. Плата Arduino-Uno;
  2. Датчиком освещенности служит светодиод АЛ307;
  3. Датчик влажности выполнен из провода ПЭВ длиной 2х100мм с залуженными рабочими поверхностями. Для исключения гальванического эффекта напряжение на датчик подается только на время измерения.
  4. Любой автомобильный бачок омывателя ветрового стекла с насосиком

Использованные библиотеки

С целью экономии энергии в алгоритм работы включена библиотека Narcoleptic. Если экономия не нужна библиотеку Narcoleptic можно не использовать.

Текст программы на C

/*************

**************/

#include "Narcoleptic.h"
//#define debug true
// pins
#define d_swet A2
#define d_wlagn A3
const int u_pitanie_d_wlagn=7; // вкл.питания датчика влажн.
const int nasos=8;
const int led=13;

// consts
const int wlagn_porog=512;
const int swet_porog=150;

// bools
bool day=false;
bool suho=false;
bool err=false;
int test(int land=1000){
    Serial.println(F("Start test programm:"));
    digitalWrite(led,HIGH);
    Serial.print(F("swet = "));
    Serial.println(analogRead(d_swet));
    digitalWrite(u_pitanie_d_wlagn,HIGH);
    Serial.print(F("wlagn = "));
    delay(100);
    Serial.println(analogRead(d_wlagn));
    Serial.println(F("Start nasos "));
    digitalWrite(nasos,LOW);
    Serial.print(F("Delay, ms = "));
    Serial.println(land);
    delay(land);
    Serial.println(F("Reset"));
    digitalWrite(u_pitanie_d_wlagn,LOW);
    digitalWrite(nasos,HIGH);
    digitalWrite(led,LOW);
    return 1;
}
bool is_day(){
    if (analogRead(d_swet)>swet_porog){
        day=true;
    }else{
        day=false;
        err=false;
    }
    return day;
}
bool is_suho(){
    digitalWrite(u_pitanie_d_wlagn,HIGH);
    if (analogRead(d_wlagn)>wlagn_porog){
        suho=true;
    }else{
        suho=false;
        err=false;
    }
    digitalWrite(u_pitanie_d_wlagn,LOW);
    return suho;
}
int poliw(int land=3000){
    digitalWrite(nasos,LOW);
    #if debug
        Serial.print(F("Poliw start"));
    #endif
    delay(land);
    #if debug 
        Serial.println(F(" -- end"));
    #endif
    digitalWrite(nasos,HIGH);
    err=is_suho();
    return 1;
}
int beep(int land=200){
    delay(200);
    digitalWrite(led,HIGH);
    delay(land);
    digitalWrite(led,LOW);
    delay(200);
    return 1;
}
int s(int land=100){
    for (int i =0;i<3;i++){
        delay(150);
        digitalWrite(led,HIGH);
        delay(land);
        digitalWrite(led,LOW);
    }
    delay(150);
    return 1;
}
int o(int land=300){
    for (int i =0;i<3;i++){
        delay(150);
        digitalWrite(led,HIGH);
        delay(land);
        digitalWrite(led,LOW);
    }
    delay(150);
    return 1;
}
int sos(){
    s();o();s();
    return 1;
}
int signal(){
    if (day){
        beep();
    }else{
        beep(800);
    }

    if (suho){
        beep();
    }else{
        beep(800);
    }
    return 1;

}
void setup() {
    Serial.begin(9600);
    pinMode(u_pitanie_d_wlagn,OUTPUT);
    pinMode(led,OUTPUT);
    pinMode(nasos,OUTPUT);
    digitalWrite(u_pitanie_d_wlagn,LOW);
    digitalWrite(led,LOW);
    digitalWrite(nasos,HIGH);// насос отключить
    test();

}
void loop() {
    is_day();
    is_suho();
    if (err){
        sos();
    }else{
        signal();
    }

    if (suho && day && !err){
        poliw();
    }
 
    #if debug
        Serial.print(F("day = "));Serial.println(day);
        Serial.print(F("suho = "));Serial.println(suho);
        Serial.print(F("err = "));Serial.println(err);
    #endif

    Narcoleptic.delay(5000);

}

Эпилог

Функции программы документированы, переменные имеют доступные имена.

Но если понадобится помощь -- обращайтесь