Термостат на мега 2560 + DS18B20

stranger80-01
Offline
Зарегистрирован: 16.02.2016

Прошу помощи в небольшой переделке кода по этой теме:

http://arduinolab.pw/index.php/2015/12/02/termostat-na-arduino-do-5-datc...

Там 4 датчика и 4 реле. Надо 1 датчик и 4шт реле. И если возможно - устранить дребезг

контактов реле на выходе. Цель: по одной и той же температуре управлять двумя устройствами:

1е реле - открыть шиберную заслонку по своей t

2е реле - закрыть шиберную заслонку по своей t

3е реле - пуск вентилятора по своей t

4е реле - стоп вентилятора по своей t.

Так я хочу управлять температурой воздуха в компрессорной круглогодично.

Прописал на каждом канале один и тот же адрес датчика, но в итоге показывает

lcd шилд мне только один канал..Код, мною измененный немного:

// Термостат, до пяти датчиков DS18B20.
//  
 
//  v 0.2.1 beta
 
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
 
OneWire  oneWire(63);                     // A9 вход датчиков 18b20
DallasTemperature ds(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);      // пины lcd мега 2560
 
const byte OUT[4] = {3, 11, 12, 13};   // используем эти номера выходов платы мега 2560
 
byte pos;
byte tempOUTon[4];                        // массив с температурой включения выхода
float tempSensor[4];                      // массив куда читается температура
 
byte qty;                                 // количество градусников на шине.
 
// адреса градусников:
DeviceAddress sensor1 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor2 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor3 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor4 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
//один и тот же градусник для управления выходами № 3, 11, 12, 13  - изменил 
//DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};    
//отсутствует 5й градусник
 
byte gradus[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};
byte on[8] = {
  0b00110,
  0b01111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11110,
  0b01100
};
 
void readSet(){
 for (byte i = 0; i < qty; i++) tempOUTon[i] = EEPROM.read(i);
}
 
void outOff(){                      // выключает выходы
  for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);   // было HIGH изменил
}
 
void erorr(){                       // останавливает работу программы и сигнализирует ошибку
  outOff();                          
  lcd.clear();                      
  lcd.print("sensor error");       
   while(1){                        // крутим бесконечный цикл 
      analogWrite(10, 100);
      delay(500);
      analogWrite(10, 255);
      delay(500);
  }
}
////
 
byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 150) return 3;
    else if (val < 350) return 4;
    else if (val < 500) return 2;
    else if (val < 800) return 1;
    else return 0;  
}
////  
 
void setMenu(byte pos){       // установка температуры на индикаторе   
 outOff();                    
 lcd.clear();                
  
  while(1){                   // крутим бесконечный цикл      
    byte KEY = key();        
    
    lcd.setCursor(2, 0);      // выводим на экран
    lcd.print("Out:");
    lcd.print(pos+1);
    lcd.setCursor(9, 0);
    lcd.print("Pin:");
    lcd.print(OUT[pos]);
    lcd.print("    ");
     
    lcd.setCursor(0, 1);   
    lcd.print(" PinON: ");
    lcd.print(tempOUTon[pos]);
    lcd.write(1);
    lcd.print("C <>");
    
    if (KEY == 2) {                                // если нажата кнопка
      tempOUTon[pos]--;                          
        if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
      EEPROM.write(pos, tempOUTon[pos]);         
     }
     else if (KEY == 5){
       tempOUTon[pos]++;
         if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
       EEPROM.write(pos, tempOUTon[pos]);    
     } 
 
   delay(200);
  }/////   
}//
 
void getTemp(){                              // читаем температуру и заполняем массив
   ds.requestTemperatures();    
   
   tempSensor[0] = ds.getTempC(sensor1);     
   tempSensor[1] = ds.getTempC(sensor2); 
   tempSensor[2] = ds.getTempC(sensor3);
   tempSensor[3] = ds.getTempC(sensor4);
  // tempSensor[4] = ds.getTempC(sensor5);
 
void sensorTest(){  // ищем датчики на шине, если количество изменилось, останавливаем работу
   ds.begin();
   if(ds.getDeviceCount() != qty) erorr();
}
 
void setup() {                    
  // Serial.begin(9600); 
  ds.begin();   
  qty = ds.getDeviceCount();      // при включении, сохраняем количество градусников, 
                                  // как можно  количество указать руками?
  
  for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT);  
  for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);   
  
  lcd.createChar(1, gradus);
  lcd.createChar(2, on);
  lcd.begin(16, 2);
  lcd.clear();                    
  
  readSet();                      // читаем настройки из еепром?   
}
 
void loop() {                   
  if (key() == 1) setMenu(pos);   // если нажата селект, уходим в настройки
  
  else if (key() == 4 && pos < qty-1) pos++;    // крутим позицию
  else if (key() == 3 && pos != 0) pos--;
  
  sensorTest();                   // тест наличия градусников на шине
  getTemp();                      
 
  //// сверяем температуру и управляем выходами
  for (int i = 0; i < qty; i++) { 
    if (tempSensor[i] < tempOUTon[i]) digitalWrite(OUT[i], HIGH);  //LOW было, изменил 
    else digitalWrite(OUT[i], LOW);                                //HIGH было, изменил 
  } 
  
  /////// вывод инфы на экран  ////////
  lcd.setCursor(0, 0);            
  lcd.print(pos+1);               
  lcd.print(". ");                
  lcd.print(tempSensor[pos], 1);  // показываем температуру с датчика
  lcd.write(1);                  
  lcd.print("C  ");               
  lcd.setCursor(2, 1);           
  lcd.print(tempOUTon[pos]);      
  lcd.write(1);                   
  lcd.print("C  ");               
  
  lcd.setCursor(11, 0);           // рисуем статус выхода  
    for (int i = 0; i < qty; i++){ 
      if (digitalRead(OUT[i])) lcd.write(2);
      else lcd.print(" ");
    }
  lcd.setCursor(11, 1);           // рисуем номера выходов   
    for (int i = 0; i < qty; i++) lcd.print(i+1); 
 
delay(500); // ввел для попытки устранения дребезга контактов реле 
}

 

stranger80-01
Offline
Зарегистрирован: 16.02.2016

Странно - подключаю все 4 датчика - появляются все 4 канала управления реле..

Чистка EEPROM не помогает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

stranger80-01 пишет:

Прошу помощи в небольшой переделке кода по этой теме:

http://arduinolab.pw/index.php/2015/12/02/termostat-na-arduino-do-5-datc...

А почему просите здесь, а не в той теме?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, вставьте программу по правилам, а то оч трудно ссылаться на строки с Вашими косяками

stranger80-01
Offline
Зарегистрирован: 16.02.2016
// Термостат, до пяти датчиков DS18B20.
//  
 
//  v 0.2.1 beta
 
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
 
OneWire  oneWire(63);                     // A9 вход датчиков 18b20
DallasTemperature ds(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);      // пины lcd мега 2560
 
const byte OUT[4] = {3, 11, 12, 13};   // используем эти номера выходов платы мега 2560
 
byte pos;
byte tempOUTon[4];                        // массив с температурой включения выхода
float tempSensor[4];                      // массив куда читается температура
 
byte qty;                                 // количество градусников на шине.
 
// адреса градусников:
DeviceAddress sensor1 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor2 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor3 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
DeviceAddress sensor4 = {0x28, 0xFF, 0x0B, 0xD2, 0x90, 0x16, 0x04, 0x31};
//один и тот же градусник для управления выходами № 3, 11, 12, 13  - изменил 
//DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};    
//отсутствует 5й градусник
 
byte gradus[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};
byte on[8] = {
  0b00110,
  0b01111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11110,
  0b01100
};
 
void readSet(){
 for (byte i = 0; i < qty; i++) tempOUTon[i] = EEPROM.read(i);
}
 
void outOff(){                      // выключает выходы
  for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);   // было HIGH изменил
}
 
void erorr(){                       // останавливает работу программы и сигнализирует ошибку
  outOff();                          
  lcd.clear();                      
  lcd.print("sensor error");       
   while(1){                        // крутим бесконечный цикл 
      analogWrite(10, 100);
      delay(500);
      analogWrite(10, 255);
      delay(500);
  }
}
////
 
byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 150) return 3;
    else if (val < 350) return 4;
    else if (val < 500) return 2;
    else if (val < 800) return 1;
    else return 0;  
}
////  
 
void setMenu(byte pos){       // установка температуры на индикаторе   
 outOff();                    
 lcd.clear();                
  
  while(1){                   // крутим бесконечный цикл      
    byte KEY = key();        
    
    lcd.setCursor(2, 0);      // выводим на экран
    lcd.print("Out:");
    lcd.print(pos+1);
    lcd.setCursor(9, 0);
    lcd.print("Pin:");
    lcd.print(OUT[pos]);
    lcd.print("    ");
     
    lcd.setCursor(0, 1);   
    lcd.print(" PinON: ");
    lcd.print(tempOUTon[pos]);
    lcd.write(1);
    lcd.print("C <>");
    
    if (KEY == 2) {                                // если нажата кнопка
      tempOUTon[pos]--;                          
        if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
      EEPROM.write(pos, tempOUTon[pos]);         
     }
     else if (KEY == 5){
       tempOUTon[pos]++;
         if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
       EEPROM.write(pos, tempOUTon[pos]);    
     } 
 
   delay(200);
  }/////   
}//
 
void getTemp(){                              // читаем температуру и заполняем массив
   ds.requestTemperatures();    
   
   tempSensor[0] = ds.getTempC(sensor1);     
   tempSensor[1] = ds.getTempC(sensor2); 
   tempSensor[2] = ds.getTempC(sensor3);
   tempSensor[3] = ds.getTempC(sensor4);
  // tempSensor[4] = ds.getTempC(sensor5);
} 
 
void sensorTest(){  // ищем датчики на шине, если количество изменилось, останавливаем работу
   ds.begin();
   if(ds.getDeviceCount() != qty) erorr();
}
 
void setup() {                    
  // Serial.begin(9600); 
  ds.begin();   
  qty = ds.getDeviceCount();      // при включении, сохраняем количество градусников, 
                                  // как можно  количество указать руками?
  
  for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT);  
  for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);   
  
  lcd.createChar(1, gradus);
  lcd.createChar(2, on);
  lcd.begin(16, 2);
  lcd.clear();                    
  
  readSet();                      // читаем настройки из еепром?   
}
 
void loop() {                   
  if (key() == 1) setMenu(pos);   // если нажата селект, уходим в настройки
  
  else if (key() == 4 && pos < qty-1) pos++;    // крутим позицию
  else if (key() == 3 && pos != 0) pos--;
  
  sensorTest();                   // тест наличия градусников на шине
  getTemp();                      
 
  //// сверяем температуру и управляем выходами
  for (int i = 0; i < qty; i++) { 
    if (tempSensor[i] < tempOUTon[i]) digitalWrite(OUT[i], HIGH);  //LOW было, изменил 
    else digitalWrite(OUT[i], LOW);                                //HIGH было, изменил 
  } 
  
  /////// вывод инфы на экран  ////////
  lcd.setCursor(0, 0);            
  lcd.print(pos+1);               
  lcd.print(". ");                
  lcd.print(tempSensor[pos], 1);  // показываем температуру с датчика
  lcd.write(1);                  
  lcd.print("C  ");               
  lcd.setCursor(2, 1);           
  lcd.print(tempOUTon[pos]);      
  lcd.write(1);                   
  lcd.print("C  ");               
  
  lcd.setCursor(11, 0);           // рисуем статус выхода  
    for (int i = 0; i < qty; i++){ 
      if (digitalRead(OUT[i])) lcd.write(2);
      else lcd.print(" ");
    }
  lcd.setCursor(11, 1);           // рисуем номера выходов   
    for (int i = 0; i < qty; i++) lcd.print(i+1); 
 
delay(500); // ввел для попытки устранения дребезга контактов реле 
}

 

stranger80-01
Offline
Зарегистрирован: 16.02.2016

mykaida пишет:

Уважаемый, вставьте программу по правилам, а то оч трудно ссылаться на строки с Вашими косяками

Извиняюсь. Код интересен мне тем, что позволяет посмотреть (пролистать) на LCD шилде уставку по каждому каналу и состояние каналов (вкл - выкл)

stranger80-01
Offline
Зарегистрирован: 16.02.2016

Вот, сегодня сделал из этого кода что мне надо (добавил два канала), но! я не понимаю как сделать прокрутку чтобы глянуть можно было состояние каждого канала (уставку, включено-выключено). На шилде помещаются только два канала.. Вот мой код:

// термостат, один датчик DS18B20, два выхода
// подробнее http://youtu.be/y62Ps_D9B1M
//
//  v 0.1 beta

#include <EEPROM.h>               //   используемые библиотеки
#include <OneWire.h>
#include <LiquidCrystal.h>

#define OUT1 3    // выходы для реле 
#define OUT2 11
#define OUT3 12
#define OUT4 13

// массивы (в ПЗУ?) с температурой управления выходами:
byte tempOUT1, tempOUT2, tempOUT3, tempOUT4;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);    // пины для связи с LCD шилдом
OneWire  ds(63);                        // А9 вход датчика 18b20

byte gradus[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};


void erorr(){ // останавливает работу программы и сигнализирует ошибку
  digitalWrite(OUT1, LOW); // выключаем реле
  digitalWrite(OUT2, LOW);
  digitalWrite(OUT3, LOW);
  digitalWrite(OUT4, LOW);
    while(1){ // крутим бесконечный цикл
      digitalWrite(30, !digitalRead(30));  // пин 30 мигает в случае ошибки
      delay(500);
    }  
}

byte key(){                           // для кнопок ЛСД шилда
  int val = analogRead(0);            // чтение с входа кнопок
    if (val < 50) return 5;           // сопротивление менее 50 - кнопка 5
    else if (val < 150) return 3;     // сопротивление менее 150 - кнопка 3
    else if (val < 350) return 4;     // сопротивление менее 350 - кнопка 4
    else if (val < 500) return 2;     // сопротивление менее 500 - кнопка 2
    else if (val < 800) return 1;     // сопротивление менее 800 - кнопка 1
    else return 0;                    // сопротивление более 800 - кнопка 0
}

void setMenu(){                       // установка температуры 
  byte pos; // для LCD шилда массив перескок строки для индикации следующего выхода???
  digitalWrite(OUT1, LOW);            // выключаем реле
  digitalWrite(OUT2, LOW);
  digitalWrite(OUT3, LOW);
  digitalWrite(OUT4, LOW);
// что нужно отрисовать один раз при нажатии на селект:
  lcd.clear();                    // очистка индакатора от символов
  lcd.setCursor(0, 0);            // позиция для печати - символ 0 строка 0
  lcd.print("1: ");               // отобразить символы 1:
  lcd.setCursor(0, 1);            // позиция для печати - символ 0 строка 1
  lcd.print("2: ");               // отобразить символы 2:
  lcd.setCursor(9, 0);            // позиция для печати - символ 9 строка 0
  lcd.print("3: ");               // отобразить символы 3:
  lcd.setCursor(9, 1);            // позиция для печати - символ 9 строка 1
  lcd.print("4: ");               // отобразить символы 4:
  lcd.blink();                    // команда для отображения мигающего квадратика??
  
  while(1){                       // крутим бесконечный цикл      
    byte KEY = key();             // читаем состояние кнопок
    
    lcd.setCursor(3, 0);          // позиция для печати - символ 3 строка 0
    lcd.print(tempOUT1);          // отобразить уставку канала 1
    lcd.write(1);
    lcd.print("C  ");             // отобразить значок градус цельсия
    lcd.setCursor(3, 1);          // позиция для печати - символ 3 строка 1
    lcd.print(tempOUT2);          // отобразить уставку канала 2
    lcd.write(1);
    lcd.print("C  ");             // отобразить значок градус цельсия
    lcd.setCursor(12, 0);         // позиция для печати - символ 12 строка 0
    lcd.print(tempOUT3);          // отобразить уставку канала 3
    lcd.write(1);
    lcd.print("C  ");             // отобразить значок градус цельсия
    lcd.setCursor(12, 1);         // позиция для печати - символ 12 строка 1
    lcd.print(tempOUT4);          // отобразить уставку канала 4
    lcd.write(1);
    lcd.print("C  ");             // отобразить значок градус цельсия
    
     ////// обработка кнопок 
    if (pos == 0){                // если в первой позиции (канал 1)
      lcd.setCursor(2, 0);        // устанавливаем курсор (мигающий квадратик)
      if (KEY == 2) {             // если нажата кнопка 2
        tempOUT1--;               // уменьшаем температуру
        EEPROM.write(1, tempOUT1);// сохраняем в еепром (ПЗУ)
      }
      else if (KEY == 5){         // если нажата кнопка 5
        tempOUT1++;               // увеличиваем температуру
        EEPROM.write(1, tempOUT1);// сохраняем в еепром (ПЗУ)    
      }    
    }
    if (pos == 1){ 
      lcd.setCursor(2, 1);
      if (KEY == 2) {
        tempOUT2--;
        EEPROM.write(2, tempOUT2);
      }
      else if (KEY == 5){
        tempOUT2++;
        EEPROM.write(2, tempOUT2);     
      }    
    }
        if (pos == 2){ 
      lcd.setCursor(11, 0);
      if (KEY == 2) {
        tempOUT3--;
        EEPROM.write(3, tempOUT3);
      }
      else if (KEY == 5){
        tempOUT3++;
        EEPROM.write(3, tempOUT3);     
      }    
    }
    if (pos == 3){ 
      lcd.setCursor(11, 1);
      if (KEY == 2) {
        tempOUT4--;
        EEPROM.write(4, tempOUT4);
      }
      else if (KEY == 5){
        tempOUT4++;
        EEPROM.write(4, tempOUT4);     
      }    
    }
    ////  крутим позицию курсора (мигающий квадратик  ////
    if (KEY == 3) pos--;        // убавить позицию -1 если нажата кнопка 3)
    else if (KEY == 4) pos++;   // прибавить позицию +1 если нажата кнопка 4 
    if (pos > 3) pos = 0;       // убавить позицию -1 если нажата кнопка 3
 
   delay(200);                  // задержка 0.2с
  }
}

float getTemp(){   // возвращает температуру с датчика
  byte data[12];   // и останавливает программу на секунду
  byte addr[8];  
  
  if (!ds.search(addr)) {
    lcd.clear();
    lcd.print("No sensor!"); 
    erorr(); 
  }
  
  ds.reset_search(); 
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
    lcd.clear();
    lcd.print("Sensor CRC erorr");
    erorr();   
  }
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0];                      // Переводим в температуру   
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  
  return raw / 16.0;
}

void setup() {                // инициализация, выполн. в 1ом цикле при подаче питания
//  Serial.begin(9600); 
  lcd.createChar(1, gradus);
  lcd.begin(16, 2);
  lcd.clear();
  
  pinMode(13, OUTPUT);        // пин 13 - будет выходом
  pinMode(OUT1, OUTPUT);      // пин OUT1 - будет выходом
  pinMode(OUT2, OUTPUT);      // пин OUT2 - будет выходом
  pinMode(OUT3, OUTPUT);      // пин OUT3 - будет выходом
  pinMode(OUT4, OUTPUT);      // пин OUT4 - будет выходом
  
  tempOUT1 = EEPROM.read(1);  // читаем настройки 
  tempOUT2 = EEPROM.read(2);  // из еепром
  tempOUT3 = EEPROM.read(3);  // температуры переключения
  tempOUT4 = EEPROM.read(4);  // всех 4х каналов
}

void loop() {  
  if (key() == 1) setMenu();  // если нажата селект, уходим в меню
  else if (key() == 4) analogWrite(10, 20);     // если вниз, глушим подсветку
  else if (key() == 3) digitalWrite(10, HIGH);  // если вверх подсветка max
  
  float temperature = getTemp();                // читаем температуру
 
  if (temperature < tempOUT1) digitalWrite(OUT1, LOW); // сверяем температуру 
  else digitalWrite(OUT1, HIGH);                         // и управляем выходами
  if (temperature < tempOUT2) digitalWrite(OUT2, LOW);
  else digitalWrite(OUT2, HIGH);
  if (temperature < tempOUT3) digitalWrite(OUT3, LOW);
  else digitalWrite(OUT3, HIGH);
  if (temperature < tempOUT4) digitalWrite(OUT4, LOW);
  else digitalWrite(OUT4, HIGH);
      
  lcd.setCursor(0, 0); /// вывод инфы на экран
  lcd.print("1:");
  lcd.print(tempOUT1);
  lcd.write(1);
//  lcd.print("C");
    if (digitalRead(OUT1)) lcd.print(" OFF"); // показываем состояние выхода
    else lcd.print(" ON ");
  lcd.setCursor(0, 1);
  lcd.print("2:");
  lcd.print(tempOUT2);
  lcd.write(1);
    if (digitalRead(OUT2)) lcd.print(" OFF");
    else lcd.print(" ON ");    
    
  lcd.setCursor(9, 0); // показываем температуру с датчика
  lcd.print("|"); 
  lcd.print(temperature, 1);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(9, 1);     
  lcd.print("|");
  lcd.setCursor(10, 1);    
  lcd.print("sensor"); 
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, замените все Ваши конструкции if - ele if по отношению к кнопкам на switch - case. У Вас может быть только одно значение кнопки и программа станет читаеемей. Далее - я бы посоветовал считывать кнопки по отпусканию - избежите кучу ошибок по дребезгу. А прокрутка - почитайте описание библиотеки LiquidCrystal.h

stranger80-01
Offline
Зарегистрирован: 16.02.2016

mykaida пишет:

Уважаемый, замените все Ваши конструкции if - ele if по отношению к кнопкам на switch - case. У Вас может быть только одно значение кнопки и программа станет читаеемей. Далее - я бы посоветовал считывать кнопки по отпусканию - избежите кучу ошибок по дребезгу. А прокрутка - почитайте описание библиотеки LiquidCrystal.h

Спасибо за подсказки, добрый человек)

sadman41
Offline
Зарегистрирован: 19.10.2016

mykaida пишет:

Далее - я бы посоветовал считывать кнопки по отпусканию - избежите кучу ошибок по дребезгу. 

Правильно ли я понимаю, что attachInterrupt на FALLING лучше борется с дребезгом, чем attachInterrupt на RISING?

ВН
Offline
Зарегистрирован: 25.02.2016

наверно вопрос скорее в том, доверяете вы своему прерыванию или нет.

Доверяете тут в том смысле, насколько вероятен его старт по помехе, не нажатию, а именно внешней помехе.