кнопки шилда"плюс" и "минус" одинаково минусуют значение, не могу понять в чем дело
- Войдите на сайт для отправки комментариев
Пнд, 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-я строка никакого дребезга не устраняет)
Огромное спасибо Вам!
все работает как надо))) тема закрыта..