Автополив теплицы
- Войдите на сайт для отправки комментариев
Представляю на Ваш суд свое твоерение.
автополив для теплицы.
Работает в нескольких режимах:
Полив - по датчику, влажности, по недельному таймеру, по кнопке (принудительных);
Проветривание - по датчику температуры, принудительно.
Состав:
1.Arduino Uno
Блок реле на 4 каналов - управляют нагрузкам (пока использованы 3)
Датчики Температур DHT и DS1820
LCD I2C 2004А (не русифицированный) :-(((
Часы реального времени DS3231
мосфет IRFZ44n для управления питанием датчика влажности.
Кнопки нормально разомкнутые для ручного управления ардуиной
Датчик влажности почвы (переделанный из заводского, сделал щупы из шампура). такой http://www.aliexpress.com/snapshot/6613616082.html?orderId=66828459605327
Электро магнитные клапана 12в для автополива такой http://www.aliexpress.com/snapshot/6613616072.html?orderId=66828459635327
Актуаторы для спутниковых антенн - ими открываются и закрываться форточки для проветривания и поддержания температуры внутри теплицы.
2000 л еврокубы дляводы.
/* Автополив v2.1 Рус Sergey Samokish Sergey_nevinka@mail.ru Полив: - по таймеру недельному - вручную с кнопки - по датчику влажности земли Проветривание: - по датчику температуры в теплице - вручную с кнопки Адреса в EEPROM EEPROM 0 Минимальное значение температуры актуатора EEPROM 1 Максимальное значение темп актуатора 1 линия полива EEPROM 2 Минимальное значение влажности земли EEPROM 3 Максимальное значение влажности земли EEPROM 4 1/0 включение отключение полива (0=off / 1=on) EEPROM 5 стоп час полива EEPROM 6 стоп мин полива EEPROM 7 старт час полива EEPROM 8 старт минута полива ///дни недели для таймера вкл и или выкл в конкретный день EEPROM 10 Пн EEPROM 11 Вт EEPROM 12 Ср EEPROM 13 Чт EEPROM 14 Пт EEPROM 15 Сб EEPROM 16 Вс EEPROM 20 Сстояние полива вкл/выкл для востонавления после сбоя питания EEPROM 21 Сстояние Актуатора вкл/выкл для востонавления после сбоя питания !!!!ЕСЛИ не работает датчик температуры!!! если работает то он и так откроет вентиляцию */ #define HumTerraPower 9 //пин для питания датчика влажности (2) в скобках контакты разьема реле MP701 от Dessy :-) #define open_actuator 10 //пин открытия актуатора (1) #define close_actuator 13 //пин закрытия актуатора (4) #define irrigator_relay 12 //пин включения полива (3) #include <EEPROM2.h> //Создаем переменные для работы с термометром int TINMin=0; //переменная Min температуры актуатора int TINMax=0; // переменная Max температуры актуатора int TIn=0; //переменная температуры воздуха в теплице //Создаем переменные для работы с Гигрометром int HumTerraINMin=0; //переменная Min влажность земли int HumTerraINMax=0; // переменная Max влажность земли int HumTerraTmp=0; // переменная промежуточной влажности земли int HumTerra=0; // переменная текущей влажности земли int HumIn=0; //переменная влажности воздуха в теплице //Объявим переменную для хранения состояния реле boolean relayStatusIrr=LOW; //реле полива boolean relayStatusActuator=LOW; //реле актуатора //============================ подключение датчиков DHT11 #include <DHT.h> #define DHTIN 8 //определяем пин #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTIN, DHTTYPE); //==================== ========LCD 200x4 I2C #include <LiquidCrystal_I2C.h> //используем LCD i2c // Глифы русских букв byte yu[8] = { //Ю B10010, B10101, B10101, B11101, B10101, B10101, B10010, B00000 }; byte ii[8] = { //Ы B10001, B10001, B10001, B11101, B10101, B10101, B11101, B00000 }; byte che[8] = { //Ч B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000 }; byte pe[8] = { //П 0b11111, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b00000 }; byte ll[8] = { //Л 0b00111, 0b01001, 0b01001, 0b01001, 0b01001, 0b01001, 0b10001, 0b00000 }; byte u[8] = { //У B10001, B10001, B10001, B01010, B00100, B01000, B10000, B00000 }; byte i[8] = { //И B10001, B10011, B10101, B11001, B10001, B10001, B10001, B00000 }; /* byte ce[8] = { //Ц 0b10010, 0b10010, 0b10010, 0b10010, 0b10010, 0b10010, 0b11111, 0b00001 }; */ byte be[8] = { //Б 0b11111, 0b10000, 0b10000, 0b11110, 0b10001, 0b10001, 0b11110, 0b00000 }; LiquidCrystal_I2C lcd(0x27,20,4); // Задаем адрес и размерность дисплея. //=============================задаем работу клавиатуры - цифровая // задаем константы кнопок и присваиваем им пины const int button_MENU = 3; const int button_UP = 4; const int button_DOWN = 5; const int button_LEFT = 6; const int button_RIGHT = 7; // переменные для отработки реакции на кнопки int MENUBtn = 1; int UPBtn = 1; int DOWNBtn = 1; int LEFTBtn = 1; int RIGHTBtn = 1; int Tday=0; //день недели int regim=0; //для меню int posic=0; int flag=0; //флаг былали нажата кнопка int tHumTerra=0; //флаг интервала включения измерения влажности почвы int flagActManual=0;//флаг ручного управления Актуатором int flagIrrManual=0;//флаг ручного управления поливом int Timer=0; //переменная таймера byte TstartHour=0; //часы таймера byte TstartMinute=0; //минуты таймера byte TstopHour=0; //часы интервала таймера byte TstopMinute=0; //минуты интервала таймера //ds3231 модуль часов реального времени #include <Wire.h> #include "DS3231.h" //модифицированная отсюда: http://arduino.ru/forum/programmirovanie/chasy-i-arduino#comment-112470 DS3231 rtc(SDA, SCL); // Init a Time-data structure Time t; void setup() { lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(1, yu); lcd.createChar(2, ii); lcd.createChar(3, che); lcd.createChar(4, pe); lcd.createChar(5, ll); lcd.createChar(6, u); lcd.createChar(7, i); lcd.createChar(0, be); lcd.clear(); lcd.print(" ABTO\4O\5\7B v.2.1 P\6"); //почемуто выводятся левые знаки в начале строки (( Wire.begin(); // Shield I2C pins connect to alt I2C bus on Arduino rtc.begin();//новое //задаем часам первоначальное время /* The following lines can be uncommented to set the date and time rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY rtc.setTime(22,59, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(18, 6, 2015); // Set the date to January 1st, 2014 */ lcd.setCursor(0, 2); t = rtc.getTime(); // Send date if (t.date<10) lcd.print("0"); lcd.print(t.date); lcd.print(" "); lcd.print(rtc.getMonthStr()); lcd.print(" "); lcd.print(t.year); lcd.setCursor(0,3); if (t.dow==1) lcd.print("\4H"); if (t.dow==2) lcd.print("BT"); if (t.dow==3) lcd.print("CP"); if (t.dow==4) lcd.print("\3T"); if (t.dow==5) lcd.print("\4T"); if (t.dow==6) {lcd.print("C");lcd.write(0);} if (t.dow==7) lcd.print("BC"); lcd.print(" "); // Send time lcd.println(rtc.getTimeStr()); lcd.print(" "); lcd.setCursor(0,1); delay(5000); lcd.clear(); dht.begin(); //инициализация датчика влажности и температуры //Настроим пин для управления реле pinMode(open_actuator,OUTPUT); digitalWrite(open_actuator,LOW); pinMode(close_actuator,OUTPUT); digitalWrite(close_actuator,LOW); pinMode(irrigator_relay,OUTPUT); digitalWrite(irrigator_relay,LOW); pinMode (HumTerraPower,OUTPUT); digitalWrite (HumTerraPower,LOW); //Инициализируем клавиатуру pinMode(button_MENU, INPUT); digitalWrite(button_MENU, HIGH); pinMode(button_UP, INPUT); digitalWrite(button_UP, HIGH); pinMode(button_DOWN, INPUT); digitalWrite(button_DOWN, HIGH); pinMode(button_LEFT,INPUT); digitalWrite(button_LEFT, HIGH); pinMode(button_RIGHT, INPUT); digitalWrite(button_RIGHT, HIGH); } void timeDS3231() //=========== Обработка часов { //читаем время из часов DS3231 t = rtc.getTime(); } //========== Обработка нажатия кнопки void Button_read() { MENUBtn = int (1-digitalRead(button_MENU)); //запоминаем значение кнопки UPBtn = int (1-digitalRead(button_UP)); //запоминаем значение кнопки DOWNBtn = int (1-digitalRead(button_DOWN)); //запоминаем значение кнопки LEFTBtn = int (1-digitalRead(button_LEFT)); //запоминаем значение кнопки RIGHTBtn = int (1-digitalRead(button_RIGHT)); //запоминаем значение кнопки if ((MENUBtn==LOW or UPBtn==LOW or DOWNBtn==LOW or LEFTBtn==LOW or RIGHTBtn==LOW) && flag==0) flag=1; //Устанавливаем флаг нажатия кнопки, для 100% антидребезга if ((MENUBtn==HIGH && UPBtn==HIGH && DOWNBtn==HIGH && LEFTBtn==HIGH && RIGHTBtn==HIGH) && flag==1) flag=0;// Сбрасываем флаг, если кнопки не нажимались } //========== считываем температуру воздуха в теплице void TInGet() { TIn = int(dht.readTemperature()); } //========== считываем Влажность воздуха в теплице void HumInGet() { HumIn = int (dht.readHumidity()); } //========== Считывание Влажности почвы void HumTerraGet() { if (EEPROM_read_byte(4)==0) //Если не установен флаг таймера в меню то измеряем влажность) { if ((t.sec==0) or (t.sec==10) or (t.sec==20) or (t.sec==30)or (t.sec==40) or (t.sec==50)) { digitalWrite(HumTerraPower,HIGH); delay(1000); //задержка а то датчик не успевает отработать - кидает показания на 100 % сразу (( HumTerraTmp=analogRead(1); //Считываем показатели влажности почвы HumTerra=map(HumTerraTmp,0,1023,99.9,0); //Преобразуя в процентное соотношение :) // HumTerra=int((1023-analogRead(1))*0.1); } else if ((t.sec==2) or (t.sec==12) or (t.sec==22) or (t.sec==32) or (t.sec==42) or (t.sec==52)){ digitalWrite(HumTerraPower,LOW);} } } //=========== Отработка актуатора void Actuator() { //EEPROM_write_byte(21,0); //заносим первоначальное значение 1 раз при первой загрузке скетча TINMin=EEPROM_read_byte(0);//Считаем из постоянной памяти МИН температуру TINMax=EEPROM_read_byte(1);//Считаем из постоянной памяти МАКС температуру if (TIn==0) {lcd.setCursor(9,0);lcd.print("[?]");} //если датчик не работает то выводим информацию о неисправности if (EEPROM_read_byte(21)==1&&relayStatusActuator==LOW) {open_windows();lcd.setCursor(9, 3);lcd.print("BK ");relayStatusActuator=HIGH;}//если до сбоя был открыт то открываем if (EEPROM_read_byte(21)==0&&relayStatusActuator==HIGH) {close_windows();lcd.setCursor(9, 3);lcd.print("B\2K ");relayStatusActuator=LOW;}//если до сбоя был закрыт то закрываем if (flagActManual==1); //проверка на ручной режим управления else if (flagActManual==0) { if ((TIn>TINMax)&&relayStatusActuator==LOW&&flagActManual==0) {open_windows();lcd.setCursor(9, 3);lcd.print("BK ");relayStatusActuator=HIGH;EEPROM_write_byte(21,1);} else if ((TIn<TINMin)&&relayStatusActuator==HIGH&&flagActManual==0) {close_windows(); lcd.setCursor(9, 3);lcd.print("B\2K");relayStatusActuator=LOW;EEPROM_write_byte(21,0);} else if ((TIn==0) or (TIn<TINMin) or (TIn==TINMin)) flagActManual=1; //Если значения не заданном диапазоне для открытия позволяем вручную управлять } } //=========== Отработка автополива void Irrigation() { HumTerraINMin=EEPROM_read_byte(2); //Считаем из постоянной памяти МИН влажность HumTerraINMax=EEPROM_read_byte(3); //Считаем из постоянной памяти МАКС влажность //Считаем из постоянной памяти режим таймера Timer=EEPROM_read_byte(4); //включен или нет TstopHour=EEPROM_read_byte(5); TstopMinute=EEPROM_read_byte(6); TstartHour=EEPROM_read_byte(7); TstartMinute=EEPROM_read_byte(8); //EEPROM_write_byte(20,0); //заносим первоначальное значение 1 раз при первой загрузке скетча if (Timer==0&&flagIrrManual==0) { if (HumTerra<5) {lcd.setCursor(17,0);lcd.print("[?]");digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K ");relayStatusIrr=LOW;flagIrrManual=1;} if (HumTerra>HumTerraINMin&&HumTerra<HumTerraINMax) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");relayStatusIrr=HIGH;lcd.setCursor(17,0);lcd.print(" ");flagIrrManual=0;} if (HumTerra>HumTerraINMax) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("OFF ");relayStatusIrr=LOW;lcd.setCursor(17,0);lcd.print(" ");flagIrrManual=0;} } if (Timer==1) { if (EEPROM_read_byte(20)==1) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");relayStatusIrr=HIGH;lcd.setCursor(17,0);lcd.print(" ");flagIrrManual=0;} if (EEPROM_read_byte(20)==0) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K ");relayStatusIrr=LOW;lcd.setCursor(17,0);lcd.print(" ");flagIrrManual=1;} if (t.dow==1&&EEPROM_read_byte(10)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1); lcd.print("\4H"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==2&&EEPROM_read_byte(11)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("BT"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==3&&EEPROM_read_byte(12)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("CP"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==4&&EEPROM_read_byte(13)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("\3T"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==5&&EEPROM_read_byte(14)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("\4T"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==6&&EEPROM_read_byte(15)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("C");lcd.write(0); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else if (t.dow==7&&EEPROM_read_byte(16)==1) { lcd.setCursor(4, 1); lcd.print("["); if (TstartHour<10) lcd.print('0');lcd.print(TstartHour);lcd.print(":");if (TstartMinute<10) lcd.print('0');lcd.print(TstartMinute);lcd.print("]");lcd.print("--[");if (TstopHour<10) lcd.print('0');lcd.print(TstopHour);lcd.print(":");if (TstopMinute<10) lcd.print('0');lcd.print(TstopMinute);lcd.print("]");flagIrrManual=1; lcd.setCursor(11,1);lcd.print("BC"); if (t.hour==TstartHour&&t.min==TstartMinute) {digitalWrite(irrigator_relay,HIGH);lcd.setCursor(17,3);lcd.print("BK ");EEPROM_write_byte(20,1);} else if (t.hour==TstopHour&&t.min==TstopMinute) {digitalWrite(irrigator_relay,LOW);lcd.setCursor(17,3);lcd.print("B\2K");EEPROM_write_byte(20,0);} } else {lcd.setCursor(4,1);lcd.print("[TA\7MEP + P\6\3] ");} } if (((Timer==0) or (Timer==1))&&flagIrrManual==1) { if (HumTerra>1) {flagIrrManual=0;} } } //отработка ручного управления орошением и вентиляцией КОМУ какой вариант ниже нравится :-) void StaticButton() { Button_read(); //включаем/отключаем принудительно полив при ошибке (НЕИСПРАВНОСТИ) // if ((RIGHTBtn)&&relayStatusIrr==LOW&&flag==1&&flagIrrManual==1) {digitalWrite(irrigator_relay,HIGH); lcd.setCursor(17, 3);lcd.print("BK ");relayStatusIrr=HIGH;flag=0;flagIrrManual=1;} // if ((RIGHTBtn)&&relayStatusIrr==HIGH&&flag==1&&flagIrrManual==1) {digitalWrite(irrigator_relay,LOW); lcd.setCursor(17, 3);lcd.print("B\2K");relayStatusIrr=LOW;flagIrrManual=0;} //включаем/отключаем полив ПРИНУДИТЕЛЬНО if ((RIGHTBtn)&&relayStatusIrr==LOW&&flag==1) {digitalWrite(irrigator_relay,HIGH); lcd.setCursor(17, 3);lcd.print("BK ");relayStatusIrr=HIGH;flag=0;flagIrrManual=1;EEPROM_write_byte(20,1);} if ((RIGHTBtn)&&relayStatusIrr==HIGH&&flag==1) {digitalWrite(irrigator_relay,LOW); lcd.setCursor(17, 3);lcd.print("B\2K");relayStatusIrr=LOW;flagIrrManual=0;EEPROM_write_byte(20,0);} //открываем/закрываем форточку при ошибке (НЕИСПРАВНОСТИ) // if ((LEFTBtn)&&relayStatusActuator==LOW&&flag==1&&flagActManual==1) {open_windows(); lcd.setCursor(9, 3);lcd.print("BK ");relayStatusActuator=HIGH;flag=0;} //if ((LEFTBtn)&&relayStatusActuator==HIGH&&flag==1&&flagActManual==1) {close_windows(); lcd.setCursor(9, 3);lcd.print("B\2K");relayStatusActuator=LOW;flagActManual=0;} //открываем/закрываем форточку ПРИНУДИТЕЛЬЛНО if ((LEFTBtn)&&relayStatusActuator==LOW&&flag==1) {open_windows(); lcd.setCursor(9, 3);lcd.print("BK ");relayStatusActuator=HIGH;flag=0;EEPROM_write_byte(21,1);} if ((LEFTBtn)&&relayStatusActuator==HIGH&&flag==1) {close_windows(); lcd.setCursor(9, 3);lcd.print("B\2K");relayStatusActuator=LOW;flagActManual=0;EEPROM_write_byte(21,0);} if ((MENUBtn)&&flag==1){MenuSET();} } //============Вход в Меню настроек и установок void MenuSET() { do { Button_read(); delay(500); if (MENUBtn && flag==1) {regim++;flag=0;} if (regim==1)// реж Установка TINMin и TINMax { TINMin=EEPROM_read_byte(0); TINMax=EEPROM_read_byte(1); lcd.setCursor(0, 0); lcd.print("[1]\6CT TEM\4 BH\6TP\7 "); lcd.setCursor(0, 1); lcd.print("t"); lcd.print(char(223)); lcd.print("[min]="); if (TINMin < 10) {lcd.print("0");} lcd.print(TINMin); lcd.print(" "); lcd.setCursor(0, 2); lcd.print("t"); lcd.print(char(223)); lcd.print("[max]="); if (TINMax < 10) lcd.print("0"); lcd.print(TINMax); lcd.print(" + "); lcd.setCursor(0,3); lcd.print("MEH\1 <->"); lcd.blink(); if (RIGHTBtn && flag==1) posic++; if (LEFTBtn && flag==1) posic--; if (posic==0) {lcd.setCursor(9,1); if (UPBtn && flag==1) { if (TINMin < 99) TINMin++; else TINMin = 0; EEPROM_write_byte(0,TINMin);} if (DOWNBtn && flag==1) { if (TINMin > 0) TINMin--; else TstartHour = 99; EEPROM_write_byte(0,TINMin);} } if (posic==1) {lcd.setCursor(9,2); if (UPBtn && flag==1) { if (TINMax <99) TINMax++; else TINMax = 0; EEPROM_write_byte(1,TINMax);} if (DOWNBtn && flag==1) { if (TINMax > 0) TINMax--; else TINMax = 99; EEPROM_write_byte(1,TINMax);} } if (posic==2) posic=0; } if(regim==2)//режим Установка HumeTerraMin и HumeTerraMax { HumTerraINMin=EEPROM_read_byte(2); HumTerraINMax=EEPROM_read_byte(3); lcd.setCursor(0, 0); lcd.print("[2]\6CT B\5A]i[H 3EM\5\7"); lcd.setCursor(0, 1); lcd.print("HT%"); lcd.print("[min]="); if (HumTerraINMin < 10) lcd.print("0"); lcd.print(HumTerraINMin); lcd.print(" "); lcd.setCursor(0, 2); lcd.print("HT%"); lcd.print("[max]="); if (HumTerraINMax < 10) lcd.print("0"); lcd.print(HumTerraINMax); lcd.print(" + "); lcd.setCursor(0,3); lcd.print("MEH\1 <->"); lcd.blink(); if (RIGHTBtn && flag==1) posic++; if (LEFTBtn && flag==1) posic--; if (posic==0) {lcd.setCursor(9,1); if (UPBtn && flag==1) { if (HumTerraINMin < 99) HumTerraINMin++; else HumTerraINMin = 0; EEPROM_write_byte(2,HumTerraINMin);} if (DOWNBtn && flag==1) { if (HumTerraINMin > 0) HumTerraINMin--; else HumTerraINMin = 99; EEPROM_write_byte(2,HumTerraINMin);} } if (posic==1) {lcd.setCursor(9,2); if (UPBtn && flag==1) { if (HumTerraINMax <99) HumTerraINMax++; else HumTerraINMax = 0; EEPROM_write_byte(3,HumTerraINMax);} if (DOWNBtn && flag==1) { if (HumTerraINMax > 0) HumTerraINMax--; else HumTerraINMax = 99; EEPROM_write_byte(3,HumTerraINMax);} } if (posic==2) posic=0; } if(regim==3)// режим Установка Вроемени Таймера полива { Timer=EEPROM_read_byte(4); lcd.setCursor(0, 0); lcd.print("[3]\6CT TA\7MEPA - "); if (Timer==0) lcd.print("B\2K"); if (Timer==1) lcd.print("BK "); TstopHour=EEPROM_read_byte(5); TstopMinute=EEPROM_read_byte(6); TstartHour=EEPROM_read_byte(7); TstartMinute=EEPROM_read_byte(8); // Button_read(); //читаем кнопки // проверяем нажата ли кнопка lcd.setCursor(0, 1); lcd.print("BK\5="); //lcd.setCursor(4,1); if (TstartHour<10){lcd.print("0");} lcd.print(TstartHour); lcd.print(":"); if (TstartMinute<10){lcd.print("0");} lcd.print(TstartMinute); lcd.print(" "); lcd.setCursor(10,1); lcd.print("B\2K\5="); lcd.setCursor(15,1); if (TstopHour<10){lcd.print("0");} lcd.print(TstopHour); lcd.print(":"); if (TstopMinute<10){lcd.print("0");} lcd.print(TstopMinute); lcd.setCursor(0,2); lcd.print("\4 B C \3 \4 C B Bce +"); //задаем первоначальные значения для будильника по дням недели /* EEPROM_write_byte(10,1); EEPROM_write_byte(11,1); EEPROM_write_byte(12,1); EEPROM_write_byte(13,1); EEPROM_write_byte(14,1); EEPROM_write_byte(15,1); EEPROM_write_byte(16,1); */ if (EEPROM_read_byte(10)==1) {lcd.setCursor(0,3);lcd.print(char(94));} if (EEPROM_read_byte(11)==1) {lcd.setCursor(2,3);lcd.print(char(94));} if (EEPROM_read_byte(12)==1) {lcd.setCursor(4,3);lcd.print(char(94));} if (EEPROM_read_byte(13)==1) {lcd.setCursor(6,3);lcd.print(char(94));} if (EEPROM_read_byte(14)==1) {lcd.setCursor(8,3);lcd.print(char(94));} if (EEPROM_read_byte(15)==1) {lcd.setCursor(10,3);lcd.print(char(94));} if (EEPROM_read_byte(16)==1) {lcd.setCursor(12,3);lcd.print(char(94));} if (EEPROM_read_byte(10)==0) {lcd.setCursor(0,3);lcd.print(" ");} if (EEPROM_read_byte(11)==0) {lcd.setCursor(2,3);lcd.print(" ");} if (EEPROM_read_byte(12)==0) {lcd.setCursor(4,3);lcd.print(" ");} if (EEPROM_read_byte(13)==0) {lcd.setCursor(6,3);lcd.print(" ");} if (EEPROM_read_byte(14)==0) {lcd.setCursor(8,3);lcd.print(" ");} if (EEPROM_read_byte(15)==0) {lcd.setCursor(10,3);lcd.print(" ");} if (EEPROM_read_byte(16)==0) {lcd.setCursor(12,3);lcd.print(" ");} {lcd.setCursor(1,3);lcd.print(" ");} {lcd.setCursor(3,3);lcd.print(" ");} if (EEPROM_read_byte(10)==0 or EEPROM_read_byte(11)==0 or EEPROM_read_byte(12)==0 or EEPROM_read_byte(13)==0 or EEPROM_read_byte(14)==0 or EEPROM_read_byte(15)==0 or EEPROM_read_byte(16)==0) {lcd.setCursor(15,3);lcd.print(" ");} if (EEPROM_read_byte(10)==1&&EEPROM_read_byte(11)==1&&EEPROM_read_byte(12)==1&&EEPROM_read_byte(13)==1&&EEPROM_read_byte(14)==1&&EEPROM_read_byte(15)==1&&EEPROM_read_byte(16)==1) {lcd.setCursor(15,3);lcd.print(char(94));} lcd.setCursor(17,3); lcd.print("<->"); lcd.blink(); if (RIGHTBtn && flag==1) posic++; if (LEFTBtn && flag==1) posic--; if (posic==0) { lcd.setCursor(19,0); if (UPBtn && flag==1) { if (Timer < 1) Timer++; else TstartHour = 0; EEPROM_write_byte(4,Timer);} if (DOWNBtn && flag==1) { if (Timer > 0) Timer--; else Timer = 1; EEPROM_write_byte(4,Timer);} } if (posic==1) { lcd.setCursor(5,1); if (UPBtn && flag==1) { if (TstartHour < 23) TstartHour++; else TstartHour = 0; EEPROM_write_byte(7,TstartHour);} if (DOWNBtn && flag==1) { if (TstartHour > 0) TstartHour--; else TstartHour = 23; EEPROM_write_byte(7,TstartHour);} } if (posic==2) { lcd.setCursor(8,1); if (UPBtn && flag==1) { if (TstartMinute < 59) TstartMinute++; else TstartMinute = 0; EEPROM_write_byte(8,TstartMinute);} if (DOWNBtn && flag==1) { if (TstartMinute > 0) TstartMinute--; else TstartMinute = 59; EEPROM_write_byte(8,TstartMinute);} } if (posic==3) { lcd.setCursor(16,1); if (UPBtn && flag==1) { if (TstopHour < 23) TstopHour++; else TstopHour = 0; EEPROM_write_byte(5,TstopHour);} if (DOWNBtn && flag==1) { if (TstopHour > 0) TstopHour--; else TstopHour = 23; EEPROM_write_byte(5,TstopHour);} } if (posic==4) { lcd.setCursor(19,1); if (UPBtn && flag==1) { if (TstopMinute < 59) TstopMinute++; else TstopMinute = 0; EEPROM_write_byte(6,TstopMinute);} if (DOWNBtn && flag==1) { if (TstopMinute > 0) TstopMinute--; else TstopMinute = 59; EEPROM_write_byte(6,TstopMinute);} } if (posic==5) //устанавливаем дни недели для будильника "Все сразу" { lcd.setCursor(15,2); if (UPBtn && flag==1) { if (Tday < 1) Tday++; else Tday=0; EEPROM_write_byte(10,Tday); EEPROM_write_byte(11,Tday); EEPROM_write_byte(12,Tday); EEPROM_write_byte(13,Tday); EEPROM_write_byte(14,Tday); EEPROM_write_byte(15,Tday); EEPROM_write_byte(16,Tday); } if (DOWNBtn && flag==1) { if (Tday > 0) Tday--; else Tday=1; EEPROM_write_byte(10,Tday); EEPROM_write_byte(11,Tday); EEPROM_write_byte(12,Tday); EEPROM_write_byte(13,Tday); EEPROM_write_byte(14,Tday); EEPROM_write_byte(15,Tday); EEPROM_write_byte(16,Tday); } } if (posic==6) //устанавливаем будильника ПH { lcd.setCursor(0,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(10) < 1) Tday++; else Tday=0; EEPROM_write_byte(10,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(10) > 0) Tday--; else Tday=1; EEPROM_write_byte(10,Tday); } } if (posic==7) //устанавливаем для будильника BT { lcd.setCursor(2,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(11) < 1) Tday++; else Tday=0; EEPROM_write_byte(11,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(11) > 0) Tday--; else Tday=1; EEPROM_write_byte(11,Tday); } } if (posic==8) //устанавливаем для будильника СР { lcd.setCursor(4,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(12) < 1) Tday++; else Tday=0; EEPROM_write_byte(12,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(12) > 0) Tday--; else Tday=1; EEPROM_write_byte(12,Tday); } } if (posic==9) //устанавливаем для будильника ЧТ { lcd.setCursor(6,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(13) < 1) Tday++; else Tday=0; EEPROM_write_byte(13,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(13) > 0) Tday--; else Tday=1; EEPROM_write_byte(13,Tday); } } if (posic==10) //устанавливаем для будильника ПТ { lcd.setCursor(8,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(14) < 1) Tday++; else Tday=0; EEPROM_write_byte(14,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(14) > 0) Tday--; else Tday=1; EEPROM_write_byte(14,Tday); } } if (posic==11) //устанавливаем для будильника СБ { lcd.setCursor(10,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(15) < 1) Tday++; else Tday=0; EEPROM_write_byte(15,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(15) > 0) Tday--; else Tday=1; EEPROM_write_byte(15,Tday); } } if (posic==12) //устанавливаем для будильника ВС { lcd.setCursor(12,2); if (UPBtn && flag==1) { if (EEPROM_read_byte(16) < 1) Tday++; else Tday=0; EEPROM_write_byte(16,Tday); } if (DOWNBtn && flag==1) { if (EEPROM_read_byte(16) > 0) Tday--; else Tday=1; EEPROM_write_byte(16,Tday); } } if (posic==13) posic=0;//возврат в начало } if (regim==4) //Режим установки часов { lcd.setCursor(0, 0); lcd.print("[4]\6CT \3ACOB "); // Button_read(); //читаем кнопки // проверяем нажата ли кнопка lcd.setCursor(0, 1); if (t.date<10){lcd.print("0");} lcd.print(t.date); lcd.print("/"); //lcd.setCursor(3,1); if (t.mon<10){lcd.print("0");} lcd.print(t.mon); lcd.print("/"); lcd.print(t.year); lcd.print(" "); if (t.dow==1) lcd.print("\4H "); if (t.dow==2) lcd.print("BT "); if (t.dow==3) lcd.print("CP "); if (t.dow==4) lcd.print("\3T "); if (t.dow==5) lcd.print("\4T "); if (t.dow==6) {lcd.print("C");lcd.write(0);lcd.print(" ");} if (t.dow==7) lcd.print("BC "); lcd.setCursor(0,2); if (t.hour<10){lcd.print("0");} lcd.print(t.hour); lcd.print(":"); if (t.min<10){lcd.print("0");} lcd.print(t.min); lcd.print(":"); if (t.sec<10){lcd.print("0");} lcd.print(t.sec); lcd.setCursor(8,2); lcd.print(" + "); lcd.setCursor(0,3); lcd.print("MEH\1 <->"); lcd.blink(); if (RIGHTBtn && flag==1) posic++; if (LEFTBtn && flag==1) posic--; if (posic==0) { lcd.setCursor(1,1); if (UPBtn && flag==1) { if (t.date < 31) t.date++; else t.date = 0; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} if (DOWNBtn && flag==1) { if (t.date > 1) t.date--; else t.date = 31; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} timeDS3231(); } if (posic==1) { lcd.setCursor(4,1); if (UPBtn && flag==1) { if (t.mon < 12) t.mon++; else t.mon = 1; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} if (DOWNBtn && flag==1) { if (t.mon > 1) t.mon--; else t.mon = 12; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} timeDS3231(); } if (posic==2) { lcd.setCursor(9,1); if (UPBtn && flag==1) { if (t.year < 2100) t.year++; else t.year = 2000; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} if (DOWNBtn && flag==1) { if (t.year > 2000) t.year--; else t.year = 2100; rtc.setDate(t.date,t.mon,t.year); timeDS3231();} timeDS3231(); } if (posic==3) { lcd.setCursor(13,1); if (UPBtn && flag==1) { if (t.dow < 7) t.dow++; else t.dow = 1; rtc.setDOW(t.dow); timeDS3231();} if (DOWNBtn && flag==1) { if (t.dow > 1) t.dow--; else t.dow = 7; rtc.setDOW(t.dow); timeDS3231();} timeDS3231(); } if (posic==4) { lcd.setCursor(1,2); if (UPBtn && flag==1) { if (t.hour < 23) t.hour++; else t.hour = 0; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} if (DOWNBtn && flag==1) { if (t.hour > 0) t.hour--; else t.hour = 23; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} timeDS3231(); } if (posic==5) { lcd.setCursor(4,2); if (UPBtn && flag==1) { if (t.min < 59) t.min++; else t.min = 0; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} if (DOWNBtn && flag==1) { if (t.min > 0) t.min--; else t.min = 59; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} timeDS3231(); } if (posic==6) { lcd.setCursor(7,2); if (UPBtn && flag==1) { if (t.sec < 59) t.sec++; else t.sec = 0; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} if (DOWNBtn && flag==1) { if (t.sec > 0) t.sec--; else t.sec = 23; rtc.setTime(t.hour,t.min,t.sec); timeDS3231();} } if (posic==7) posic=0; } } while (regim<5); lcd.clear(); lcd.noBlink(); regim=0; posic=0; } void TimePrint() { lcd.setCursor(11, 2); if (t.dow==1) lcd.print("\4H "); if (t.dow==2) lcd.print("BT "); if (t.dow==3) lcd.print("CP "); if (t.dow==4) lcd.print("\3T "); if (t.dow==5) lcd.print("\4T "); if (t.dow==6) {lcd.print("C");lcd.write(0);lcd.print(" ");} if (t.dow==7) lcd.print("BC "); if (t.hour<10) lcd.print('0'); lcd.print(t.hour,DEC); lcd.print(':'); if (t.min<10) lcd.print('0'); lcd.print(t.min,DEC); lcd.print(" "); } //=========== Обработки печати и вывода на дисплейчик (Влажности воздуха, температуры воздуха , влажности земли) void printDin() { lcd.setCursor(0, 0); lcd.print("H%="); if (HumIn<10) lcd.print('0'); lcd.print(int(HumIn)); lcd.setCursor(6, 0); lcd.print("t"); lcd.print((char)223); lcd.print("="); if (TIn<10) lcd.print('0'); lcd.print(int(TIn)); lcd.setCursor(12,0); lcd.print("HT="); lcd.print(HumTerra); lcd.print("%"); } //=========== Обработки печати и вывода на дисплейчик СТАТИКИ void printStat () { lcd.setCursor(0,3); lcd.print("MEH BEHT>"); lcd.setCursor(13,3); lcd.print("\4O\5>"); lcd.setCursor(0,1); lcd.print("\4O\5"); if (flagIrrManual==0&&Timer==0) {lcd.setCursor(4,1);lcd.print("[ABTO] ");} if (flagIrrManual==1&&Timer==0) {lcd.setCursor(4,1);lcd.print("[P\6\3H] " );} lcd.setCursor(0,2); lcd.print("BEHT"); if (flagActManual==0) {lcd.setCursor(4,2);lcd.print("[ABTO] ");} if (flagActManual==1) {lcd.setCursor(4,2);lcd.print("[P\6\3H] ");} } void open_windows() //открываем форточку { digitalWrite(open_actuator, HIGH); delay(1000); digitalWrite(open_actuator, LOW); } void close_windows() //зарываем форточку { digitalWrite(close_actuator, HIGH); delay(1000); digitalWrite(close_actuator, LOW); } void loop() { timeDS3231(); TInGet(); HumInGet(); HumTerraGet(); Actuator(); Irrigation(); StaticButton(); TimePrint(); printDin(); printStat(); }
перед публикацией неплохо бы код фрагментировать в IDE - нажимаем Ctrl + T и код становится читабельным...
Не плохой труд. Респект. Желательно выложить фото рабочего изделия с пояснениями.
Давно работает?
Еще бы фотки реализации выложил, было бы вообще хорошо.
Ссылка на клапан ведет на датчик влажности. Поправьте.
Респект за труд.
Отлично! Если можно схему бы и библиотеки на us154@yandeх.ru Я работаю то же, но знаний катастрофически не хватате, читаю и у всех учусь. Спасибо за ответ.
фото приложи. интересно посмотреть
В таких проектах самое интересное - система полива, при которой не будет образовываться водорослей в трубах.
Автора на сцену.
фото приложи. интересно посмотреть
А еще лучше - видео. Интересно увидеть меню с русско-английскими символами.
схема стандартная, полно внете, подключение по умолчанию, как в примерах.
датчик влажности подключен чере полевич, актуатор и клапан через реле 4-х канальное 5 вольтовое.
библиотеки стандарт, тока та что в коде записана дополнительная на I2C.
ссылка на клапан правильная.
система работала 3 месяца, полет нормальный, только косяк в кнопках, кривая оказалась коротит (((
фото сделаю, как будет возможность.
система полива капельная, 4 нитки полива, клапан конечно маловат, но тут спешить некогда, поливает в 2раза дольше чем краном ДУ20.
Да, вчера библиотечки доскачивал чего не было и скомпилировал,залил в UNO все вроде заработало. Из оборудования: UNO,DHT11,DS3231, LCD204 I2C, Реле ,на подходе DS1820, ну а дальше все в кучу будем собирать. Спасибо огромное за работу.
Но если будет возможность, конечно, на принципиалку хотелось бы взглянуть, а так по сктчу прдется восстанавливать, если не затруднит, буду крайне благодарен. Поклон еще раз низкий за работу.
P.S. А Вы, как я понял, из Невинномысска????
P.S. А DS1820 не вижу куда подключен вроде там 11 пин свободен, пока я так вижу. хотя и ошибатьс могу, да и библиотеку DallasTemperature не вижу или OneWire
по примеру и подобию
http://arduino.ru/forum/programmirovanie/lcd-i-datchik-temperatury-ds1820
Да я из Невинномысска.
датчик влажности и температуры DHT21 а не DS1820/
по пинам вроде все вначале кода расписал.
А я из Ставрополя, , ну да там я вижу DHT11. Если не затруднит , я почту свою написал в одном из постов. Ответьте пож-ста, что бы не засорять тему.
Добрался до фотоаппарата и выкладываю свое творение, лето отработал, полет нормальный!!
кнопочек много, мне удалось обойтись одним энкодером с кликом.
Как перенесли повышенную влажность?
кнопок как раз, удобно работать )) энкодера нет ((
Влажность прекрасно, индикатор залит с пистолета, а крпус закрывается на прокладку резиновую, так, что
полная герметизация, только одна кнопка замкнула, вот и весь косяк, в кнопке))
вряд ли кнопки вставлены герметично. Думаю, стоит нарыть в коробках из-под обуви пакетик силикагеля и закинуть внутрь. Хуже не будет.
Все герметично, кнопки круглые и захродят в притык, затягиваются гайкой.
В иных случаях и селикагель не поможет ))
Народ, помогите переделать под дисплей 1602 и под часы ds1302
С дисплеем разобрался, а вот с чисами всё-же помощ нужна...
Ты библиотеку поменяй на DS1307RTC, она со всеми модулями робит, и будет тебе счастье )))
И всё так просто? Спасибо!!!
Народ !!! Помогите . Нахожусь на стадии подключения библиотек, скетч не компилируется а почему не знаю. Выглядит это так. Заранее спасибо.
C:\Documents and Settings\Admin\Рабочий стол\sketch_mar05a\sketch_mar05a.ino: In function 'void Actuator()':
Добавь либу EEPROM2 или #include <EEPROM2.h> в скетч )))
Спасибо за ответ, но стоит эта библиотека. Может еще какие варианты есть.
sketch_mar05a:824: error: 'EEPROM_write_byte' was not declared in this scope
ты вначале приведи фрагмент скетча, а потом спрашивай, по ошибкам не все можно определит )))
Это же Ваш скетч!
Arduino: 1.6.3
Выделил шрифтом 296,315,323,325 строки.
(Windows XP), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)
попробуй вот эту библу EEPROM2.h - EEPROM library v2 Copyright (c) A.Nesterovsky, http://freeduino.ru. All right reserved.
у тебя просто заморочки с библой. EEPROM_read_byte - это внутренняя команда.
Большое спасибо. А ведь заработало. Я думал, если название одинаковое, то и содержимое тоже. Буду знать, еще раз спасибо!
Ничего с чисами не выходит... Я так понимаю, просто заменой библиотеки хрен отделаешься.
Понять бы куда лезть. Может кто как дураку пальцем ткнет?
С часами разбирайся, так же как и пост выше, смотри методы работы библы и все, все в описании библы )))
С часами разбирайся, так же как и пост выше, смотри методы работы библы и все, все в описании библы )))
Хай с этими часами. Заказал с китаю чтоб не париться. Как быть с кнопками? На кнопки 0 реакции!!! Вы не могли бы схемку кинуть на почту bigtg@bk.ru . А то мне кажется что я делаю что-то не так.
отправил картинку!
Спасибо большое!!! Я думал, что кнопки с плюсом замыкаются.
первоначально и были на плюс, но там много помех было, пришлось на минус идти.
шас вообще все переделываю, вернулся к аналоговой клавиатуре ))
Подключил все кнопки как указоно на схеме, но всёровно на них никакой риакции. На дисплее только надпись начальная (Автополив) и всё. Может такое быть из-за дисплея 1602?
И ещё такой вопрос. Датчик влажности почвы к А0 подключается?
не должно, если вы все переписали под 1602
HumTerraTmp=analogRead(1); //Считываем показатели влажности почвы - это для кого подписано?????
Добрый день, Сергей! Как навояете новое поделитесь????
Вот новое творение!
Сделал 4 канала полива, 2 блокируется при дожде. Недельный таймеры по 1-му на канал.
а видео?
mrGoReC, а последний скетч под МEGA, в UNO не ложится ругается.
Вот последний вариант влезает в uno
Спасибо Сергей , вечером дома попробую.
Нашел на работе UNO,залил скетч выдала :
Убрал все лишнее в UNO влазеет. Управление актуатором с использованием делителя на резисторах для +12 в, он отлавливает просадку и отрубает двигатель, это вместо концевиков )))
если кто знает как еще код оптимизировать пишите исправляйте, буду очень рад )))
80% int можно заменить на byte - освободится прилично памяти.
Зачем для пинов, номера дня недели, флагов, режимов и пр. резервировать число размерностью 65535?
Понял, спасибо. исправлю.
Сергей не компилируется что-то