кнопки шилда"плюс" и "минус" одинаково минусуют значение, не могу понять в чем дело

grey72
Offline
Зарегистрирован: 30.01.2017

Здравствуйте, форумчане)))

Сваял контроллер для теплицы без часов реального времени, с открыванием - закрыванием форточек.


#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), но вот в меню при попытке увеличить значение, происходит его уменьшение, причем любой кнопкой, как +, так и -(((. Буду благодарен за любую помощь, заранее спасибо.

kalapanga
Offline
Зарегистрирован: 23.10.2016

В функции getPressedButton() значения должны по порядку анализироваться, а у Вас сначала идёт 350, потом 200. Вот Вы Up никогда и не получаете. (И 52-я строка никакого дребезга не устраняет)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

grey72
Offline
Зарегистрирован: 30.01.2017

Огромное спасибо Вам!

все работает как надо))) тема закрыта..