кнопки шилда"плюс" и "минус" одинаково минусуют значение, не могу понять в чем дело
- Войдите на сайт для отправки комментариев
Пнд, 09/04/2018 - 12:54
Здравствуйте, форумчане)))
Сваял контроллер для теплицы без часов реального времени, с открыванием - закрыванием форточек.
#include <LiquidCrystal_I2C.h> #include <Wire.h> #include <DHT.h> #include <DHT_U.h> #include <EEPROM.h> #define DHTTYPE DHT11 #define DHTPIN A2//пин ДНТ-11 #define light A1//фоторезистор #define casepin A0//пин клавиатуры #define D1 4//влево движок открытия 1 форточки #define D2 7//вправо движок открытия 1 форточки #define C1 8//влево движок открытия 2 форточки #define C2 9//вправо движок открытия 2 форточки #define relay 10//реле полива теплицы //A4-SDA LCD 1602,A5-SCL LCD 1602 int door1 = digitalRead(5); int door2 = digitalRead(6); unsigned long loopTime = 0; unsigned long LimitTime = 0; //время прошло unsigned long starttime;// переменная для хранения значения точки отсчета. unsigned long starttime2;// переменная для хранения значения точки отсчета. unsigned long starttime3;// переменная для хранения значения точки отсчета. byte timeSTART = 1;// Флаг задатчика значения точки отсчета. byte timeEND = 0;// Флаг окончания работы таймера. byte timeSTART2 = 1;// Флаг задатчика значения точки отсчета. byte timeEND2 = 0;// Флаг окончания работы таймера. byte Hum; byte Light; byte Temp; byte setTempmin; byte setTempmax; byte setlight; byte setWork; byte Work; byte regim=0; //для меню DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(0x3F, 16, 2); //клавиатуры - аналоговая int button; const int NONE = 0; const int RIGHT = 5; const int DOWN = 4; const int UP = 3; const int LEFT = 2; const int SELECT = 1; byte flag=0; //флаг былали нажата кнопка //функция считывания клавиатуры НАДО калибровать под контретную сборку резисторов!!!!!!! byte getPressedButton() { int buttonValue = analogRead(casepin); delay(50); //задержка для устранения дребезга if (buttonValue < 70) { return RIGHT; } else if (buttonValue < 350){ return DOWN; } else if (buttonValue < 200) { return UP; } else if (buttonValue < 600){ return LEFT; } else if (buttonValue < 800){ return SELECT; } return NONE; } void Button_read() { button = getPressedButton(); if (button > 0) flag = 1; } void(* resetFunc) (void) = 0; // Reset MC function void menu() { do { Setting(); if (timeEND == 1) { resetFunc(); } Button_read(); delay(50); if (button==1 && flag==1) {regim++;flag=0;} if (regim ==1){ lcd.clear(); lcd.setCursor(3, 0); lcd.print("temp open");// выделяем значение максимальной температуры lcd.setCursor(7, 1); lcd.print(setTempmax);// выделяем значение максимальной температуры lcd.setCursor(9, 1); lcd.print(" C"); if (button==3 && flag ==1){ setTempmax++; if (setTempmax > 60) { setTempmax = 0; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } if (button==4 && flag ==1){ setTempmax--; if (setTempmax < 0) { setTempmax = 60; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } } if (regim == 2) { lcd.clear(); lcd.setCursor(3, 0); lcd.print("temp close"); lcd.setCursor(7, 1); lcd.print(setTempmin); lcd.setCursor(9, 1); lcd.print(" C"); if (button==3 && flag ==1) { setTempmin++; if (setTempmin > 60) { setTempmin = 0; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } if (button==4 && flag ==1) { setTempmin--; if (setTempmin < 0) { setTempmin = 60; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } } if (regim == 3) { lcd.clear(); lcd.setCursor(2, 0); lcd.print("irrigation"); lcd.setCursor(7, 1); lcd.print(setWork); lcd.setCursor(10, 1); lcd.print(" min"); // выделяем значение задержки if (button==3 && flag ==1) { setWork++;//увеличиваем задержку на 1 минуту if (setWork > 60) { setWork = 0; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } if (button==4 && flag ==1) { setWork--;//уменьшаем задержку на 1 минуту if (setWork < 0) { setWork = 60; } starttime = millis();// Присваиваем значение точки отсчета. delay(50); } } if (regim == 4)//экран установки включения света { lcd.clear(); lcd.setCursor(4, 0); lcd.print("Light ON");// lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(7, 1); Light = analogRead(light)/4; lcd.print(Light); delay(50); setlight = Light; } if (regim == 5){ lcd.clear(); lcd.setCursor(5,0); lcd.print("save?"); lcd.setCursor(1,1); lcd.print("yes 'R' no 'L'"); if(button==5 && flag ==1) { starttime = millis();// Присваиваем значение точки отсчета if (EEPROM.read(1) != setTempmax) { EEPROM.write(1, setTempmax);//Записываем новые значения в память } if (EEPROM.read(2) != setTempmin) { EEPROM.write(2, setTempmin);//Записываем новые значения в память } if (EEPROM.read(4) != setlight) { EEPROM.write(4, setlight);//Записываем новые значения в память } if (EEPROM.read(3) != setWork) { EEPROM.write(3, setWork);//Записываем новые значения в память } lcd.clear(); lcd.setCursor(6, 0); lcd.print("save"); delay(2000); resetFunc(); } if(button==2 && flag ==1)// Не сохраняем { starttime = millis();// Присваиваем значение точки отсчета. lcd.clear(); lcd.print("no save"); delay(2000); lcd.clear(); } } } while(regim < 6); lcd.clear(); regim = 0; } void Setting() { if (timeSTART == 1)// Проверка условия разрешения работы задатчика точки отсчета. { starttime = millis();// Присваиваем значение точки отсчета. timeSTART = 0;// перевод флага задатчика значения точки отсчета в положение ВЫКЛ. timeEND = 0; // Флаг окончания работы таймера ВЫКЛ. } if ((millis() - starttime) >= 20000)// Проверка условия окончания работы таймера. { timeSTART = 1;// Перевод флага задатчика значения точки отсчета в положение ВКЛ. timeEND = 1; // Флаг окончания работы таймера ВКЛ. } } void DHTsensor() { TimeDHT(); if (timeEND2 == 1) { Hum = dht.readHumidity(); Temp = dht.readTemperature(); } } void TimeDHT() { if (timeSTART2 == 1)// Проверка условия разрешения работы задатчика точки отсчета. { starttime2 = millis();// Присваиваем значение точки отсчета. timeSTART2 = 0;// перевод флага задатчика значения точки отсчета в положение ВЫКЛ. timeEND2 = 0; // Флаг окончания работы таймера ВЫКЛ. } if ((millis() - starttime2) >= 2000)// Проверка условия окончания работы таймера 2 c. { timeSTART2 = 1;// Перевод флага задатчика значения точки отсчета в положение ВКЛ. timeEND2 = 1; // Флаг окончания работы таймера ВКЛ. } } void work(){ starttime3 = millis();// Присваиваем значение точки отсчета. lcd.clear(); lcd.setCursor(3,1); lcd.print("irrigation"); setWork = EEPROM.read(3);//Читаем из памяти значение времени полива LimitTime = setWork * 60000; digitalWrite(relay,LOW); while (loopTime < LimitTime) { loopTime = millis() - starttime3; } loopTime = 0; lcd.clear(); digitalWrite(relay,HIGH); EEPROM.write(5,1); delay (1000); } void op(){ if (door1 == HIGH && door2 == HIGH){ digitalWrite(D1,HIGH); digitalWrite(D2,LOW); digitalWrite(C1,HIGH); digitalWrite(C2,LOW); lcd.clear(); lcd.setCursor(6, 0); lcd.print("open"); delay(3000); EEPROM.write(6,0); lcd.clear(); digitalWrite(D1,LOW); digitalWrite(D2,LOW); digitalWrite(C1,LOW); digitalWrite(C2,LOW); } } void cl(){ if ( door1 == LOW && door2 == LOW){ digitalWrite(D1,LOW); digitalWrite(D2,HIGH); digitalWrite(C1,LOW); digitalWrite(C2,HIGH); lcd.clear(); lcd.setCursor(6, 0); lcd.print("close"); delay(3000); digitalWrite(D1,LOW); digitalWrite(D2,LOW); digitalWrite(C1,LOW); digitalWrite(C2,LOW); lcd.clear(); EEPROM.write(6,1); } } void res(){ lcd.clear(); lcd.setCursor(6,1); lcd.print("reset"); EEPROM.write(5,0); delay(1000); lcd.clear(); } void setup() { pinMode(light,INPUT); pinMode(casepin,INPUT); pinMode(relay,OUTPUT); pinMode(D1,OUTPUT); pinMode(D2,OUTPUT); pinMode(C1,OUTPUT); pinMode(C2,OUTPUT); pinMode(5,INPUT); pinMode(6,INPUT); digitalWrite(D1,LOW); digitalWrite(D2,LOW); digitalWrite(C1,LOW); digitalWrite(C2,LOW); digitalWrite(relay,HIGH); setTempmax = EEPROM.read(1);//Читаем из памяти значение температуры setTempmin = EEPROM.read(2);//Читаем из памяти значение влажности setlight = EEPROM.read(4);//Читаем из памяти значение зосвещенности //EEPROM.write(1,30);//открытие //EEPROM.write(2,29);//закрытие // EEPROM.write(3,1);//полив setlight = setlight + 10; Serial.begin(9600); dht.begin(); lcd.init(); lcd.setCursor(4, 0); lcd.print("teplitza"); lcd.setCursor(2, 1); lcd.print("very clever"); delay(3000); lcd.clear(); } void loop() { Button_read(); DHTsensor(); setlight = EEPROM.read(4);//Читаем из памяти значение зосвещенности setWork = EEPROM.read(3);//Читаем из памяти значение времени полива setTempmax = EEPROM.read(1);//Читаем из памяти значение температуры setTempmin = EEPROM.read(2);//Читаем из памяти значение влажности Light = analogRead(light)/4; lcd.setCursor(0, 0); lcd.print("temp"); lcd.setCursor(5, 0); lcd.print(Temp); lcd.print("C"); lcd.setCursor(9, 0); lcd.print("hum"); lcd.setCursor(13,0); lcd.print(Hum); lcd.print("%"); lcd.setCursor(0,1); lcd.print("irig"); lcd.setCursor(5,1); lcd.print(setWork); lcd.setCursor(8,1); lcd.print("min"); if (Light > setlight && EEPROM.read(5) == 0){ delay(3000); if (Light > setlight && EEPROM.read(5) == 0){ work(); delay(500); } } if(Light < setlight && EEPROM.read(5) == 1){ delay(3000); if (Light < setlight && EEPROM.read(5) == 1){ res(); delay(500); } } if (Temp > setTempmax && EEPROM.read(6) == 1){ delay(3000); if(Temp > setTempmax && EEPROM.read(6) == 1){ op(); delay(500); } } if (Temp < setTempmin && EEPROM.read(6) == 0){ delay(3000); if(Temp < setTempmin && EEPROM.read(6) == 0){ cl(); delay(500); } } if (EEPROM.read(6) == 0){ lcd.setCursor(12,1); lcd.print("w=op"); } if (EEPROM.read(6) == 1){ lcd.setCursor(12,1); lcd.print("w=cl"); } if (button ==1 && flag ==1){ lcd.clear(); lcd.setCursor(4, 0); lcd.print("setting"); delay (1000); menu(); } }
Все работает, однако...Прошу Вашей помощи по вопросу ЛСД-шилда. Подключен к А0, вход в меню обрабатывает без ошибок (из loop), но вот в меню при попытке увеличить значение, происходит его уменьшение, причем любой кнопкой, как +, так и -(((. Буду благодарен за любую помощь, заранее спасибо.
В функции getPressedButton() значения должны по порядку анализироваться, а у Вас сначала идёт 350, потом 200. Вот Вы Up никогда и не получаете. (И 52-я строка никакого дребезга не устраняет)
Огромное спасибо Вам!
все работает как надо))) тема закрыта..