Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* первый путь - импульсный дождеватель на поле
- * второй путь - улиточная ферма
- * третий клапан мамин огород
- */
- //#include <IRremote.h>
- //#include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- //#include <iarduino_RTC.h> // https://lesson.iarduino.ru/page/podklyuchenie-rtc-chasy-realnogo-vremeni-ds1302-ds1307-ds3231-k-arduino/
- #include <DS1302.h> // time
- #include "DHT.h" // датчик влажности и температуры воздуха
- #define DHTTYPE DHT11 // DHT 11 кстати, зачем этом делается, потом же нигде не используется, но в мануале было так
- int lastlcdusage[2] = {0,0}; // на каком цикле было последнее включение lcd, ну чтобы выключать его если не используется типа для экономии =)
- int liter = 0; // количество сделанных циклов
- int iters[1] = {30}; // для проверок раз в
- int curstate[2] = {0,0}; // глобальное состояние клапанов 0-off;1-?;2-?;3-?
- bool inited = false; // происходит 1 раз на старте
- int wslimits[1] = {500}; //,500,500}; // лимиты значений датчиков влажности при достижении которых начинает работать автополив конкретного датчика
- int wspins[3] = {A0,A1,A2}; // пины на которых стоят датчики влажности почвы
- int rpins[3] = {10,9,8}; //,8,7,6,5,4,3}; // пин реле 10 это реле электричества
- int dht_pin = 13; // пин датчика влажности
- int humi = 65; // если влажность ниже этого значения, то поливаем
- //IRrecv irrecv(ir_pin); // указываем пин, к которому подключен IR приемник
- //decode_results results;
- LiquidCrystal_I2C lcd(0x3F,20,4);
- DS1302 rtc(12, 11, 2);
- DHT dht(dht_pin, DHTTYPE);
- void setup()
- {
- for (int i=0; i<=(sizeof(rpins)/2)-1; i++){ //выключаем все реле
- digitalWrite(rpins[i], HIGH);}
- for (int i=0; i<=(sizeof(rpins)/2)-1; i++){
- pinMode(rpins[i], OUTPUT);}
- lcd.init();
- lcd.backlight(); // Включаем подсветку дисплея
- /*rtc.writeProtect(false); // init time here
- rtc.halt(false);
- Time t(2017, 8, 27, 20, 42, 50, Time::kSunday);
- rtc.time(t);*/
- dht.begin();
- }
- void loop() // MAIN ////////////////////////////////////////////////////////////////////////////////////
- {
- int hum = dht.readHumidity(); // влажность воздуха (вроде показания разнятся с реальными данными). по замерам 70-72 дождь, среднее 50. наверное если больше 65, то ненадо поливать.
- if (!inited)
- {
- lcd.print("watering inited");
- lcd.setCursor(0, 1);
- lcd.print("use controller");
- inited = true;
- }
- if (liter > lastlcdusage[0] + 100){
- lcd.noBacklight(); }
- if (liter > lastlcdusage[1]+iters[0]){ // time event
- lastlcdusage[1] = liter;
- Time t = rtc.time(); // t.yr t.mon t.date t.hr t.min
- if ((hum < humi) && (t.hr == 9 or t.hr == 11 or t.hr == 13 or t.hr == 15) && t.min == 0){ // клапан импульсного дождевателя
- curstate[0] = 3;
- klapan(1,true);
- } else if (curstate[0] == 3 && t.min > 5){
- curstate[0] = 0;
- klapan(1,false);
- }
- /*else if(curstate[1] == 0 and t.min == 0 and t.hr >= 10 and t.hr < 19) // клапан улиток (проект с улитками закрыт)
- {
- klapan(2,true); // включаем на 1 тик
- curstate[1] = 1;
- }
- else if(curstate[1] == 1)
- {
- klapan(2,false);
- curstate[1] = 0;
- }*/
- }
- //wetanalyzer(); // влажность почвы
- if (digitalRead(5) == HIGH) // A
- {
- Serial.println("5");
- if(curstate[0] != 1)
- {
- lcdmsg("turn on",1);
- klapan(1,true);
- curstate[0] = 1;
- }
- else if(curstate[0] == 1)
- {
- lcdmsg("turn off",1);
- klapan(1,false);
- curstate[0] = 0;
- }
- } // нажатия кнопок пульта
- else if (digitalRead(7) == HIGH) // B
- {
- Serial.println("7");
- if(curstate[0] != 2)
- {
- lcdmsg("turn on",1);
- klapan(2,true);
- curstate[0] = 2;
- }
- else if (curstate[0] == 2)
- {
- lcdmsg("turn off",1);
- klapan(2,false);
- curstate[0] = 0;
- }
- }
- else if (digitalRead(4) == HIGH) // C
- {
- lcdmsg("Humidity:"+String(dht.readHumidity()),1);
- }
- else if (digitalRead(6) == HIGH) // D
- {
- Time t = rtc.time();
- lcdmsg("time "+String(t.hr)+":"+String(t.min),1);
- }
- liter++;
- if (liter>=2000000){
- liter = 0;
- lastlcdusage[1] = 0;
- }
- delay(250);
- }
- void wetanalyzer()
- {
- for (int i=0; i<=(sizeof(wslimits)/2)-1; i++)
- {
- msg(String(analogRead(wspins[i])));
- //msg(String(sizeof(wslimits)));
- }
- }
- void turnelec(int way) // управление двумя главными реле
- {
- if (way == 0) // выключаем електричество. на обоих реле минус
- {
- digitalWrite(rpins[0], HIGH); // -
- //digitalWrite(rpins[1], HIGH); // -
- }
- else if (way == 1) // вкл
- {
- digitalWrite(rpins[0], LOW); // +
- //digitalWrite(rpins[1], LOW); // -
- }
- else if (way == 2) // обратный не используется, вначале делал для постоянного тока, но блок питания на выходе переменный
- {
- digitalWrite(rpins[0], HIGH); // -
- digitalWrite(rpins[1], LOW); // +
- }
- }
- void klapan(int id,bool action) // id номер клапана с 1; action - true open, false close
- {
- int way = 0;
- if (action){
- way = 1;
- action = LOW;
- }
- else if (!action){
- way = 0;
- action = HIGH;
- }
- turnelec(way);
- Serial.println("rpins[id]");
- Serial.println(rpins[id]);
- digitalWrite(rpins[id], action);
- }
- void showinfo()
- {
- for (int i=0; i<=(sizeof(wslimits)/2)-1; i++)
- {
- lcdmsg("wet sensor "+String(i+1),0);
- lcdmsg(String(analogRead(wspins[i])),1);
- delay(3000);
- }
- }
- void lcdmsg(String str,int line) // как тут делать параметры по умолчанию?!
- {
- lcd.backlight();
- lcd.setCursor(0, line);
- lcd.print(" "); // clear line
- lcd.setCursor(0, line);
- lcd.print(str);
- lastlcdusage[0] = liter;
- }
- bool isinarr(int what, int arr)
- {
- }
- void msg(String str)
- {
- Serial.println(str);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement