Суточный термостат для газового котла

druzik
Offline
Зарегистрирован: 27.01.2016

Добрый день отличный скейтч только вот немогу разобраться как подключить термодатчики? какие вы использываете и где прописаны пины для их подключения? буду благодарен за помощь, кстати часы поставил DS1307 работает хорошо

klbsss
Offline
Зарегистрирован: 16.07.2015

druzik

DS18B20

#define ONE_WIRE_BUS A1
 
Vladis_a
Offline
Зарегистрирован: 13.12.2015

Я выше даже схему выкладывал в картинках. Но имейте ввиду, что резистор на Ds18b20 я не рисовал, а он там нужен.

NoEl
Offline
Зарегистрирован: 28.03.2016

Vladis_a пишет:

Добрый вечер! Перепробовал кучу библиотек, пайку проверил, датчик рабочий. Все равно температуру показывает вот так:

Подскажите, куда копнуть?

Доброго времени суток). Vladis_a, а где вы брали такой корпус и есть ли там еще?

Vladis_a
Offline
Зарегистрирован: 13.12.2015

В любом магазине электротоваров. :) Называется коробка распределительная.

ziuck1
Offline
Зарегистрирован: 11.07.2016

Помогите, повторил схему на макетной плате, залил скетч, всё работает, показывается температура, работает энкодер, но не идут часы, время стоит.Залил скетч для проверки часов, на мониторе порта видно что часы идут.Поменял плату часов, результат тотже.На какие ноги выведена шина i2c?  У меня А4 А5.   Часы на ds1307 и ардуино нано.

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Все правильно.Часы подключаются на А4 и А5. На других скетчах попробуйте часы проверить.

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c  i2c портом (поменьше проводов будет), который подключается  к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.

vlad219i
Offline
Зарегистрирован: 05.03.2014

dwk26111974 пишет:

Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c  i2c портом (поменьше проводов будет), который подключается  к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.

Вместо библиотеки LiquidCrystal.h использовать библиотеку LiquidCrystal_I2C, изменить инициализацию LCD и , возможно, поправить строки с обращениями к LCD. Вообще - откройте в ардуинской оболочке три окна (окно с проектом и два окна с тестовыми примерами для LCD и i2c_LCD) - там всё очевидно будет. Я собирался переделать проект на I2C (хотел ещё радиомодуль в коробочку добавить для связи с остальным умным домом, а свободные пины закончились :), но руки не доходят и вряд ли в ближайшем будущем дойдут...

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Все получилось!Подключил дисплей по i2c.РаботаетЕще раз спасибо за практичный проект.

idtmark
idtmark аватар
Offline
Зарегистрирован: 04.06.2016

dwk26111974 пишет:
Все получилось!Подключил дисплей по i2c.РаботаетЕще раз спасибо за практичный проект.

Выложите свой скетч плиз, тоже хочу собрать этот проект.

2i99i5
Offline
Зарегистрирован: 05.09.2016

У меня как ошалелый мигает LCD и пищит пьезоэлемент. Было у кого-нибудь так же?

Для i2c код со второй страницы от vlad219i, номера выходов под себя менял:

/*
Суточный термостат для котла Baxi Mainfour 240F
 >Encoder control
 >DS18B20 thermal sensor
 >LCD1602 parallel
 >DS1307 RTC
 */
 
//#include <avr\eeprom.h>
#include <Wire.h> // i2c (для RTC)
#include <RealTimeClockDS1307.h> // RTC
#include <EEPROMex.h> // EE
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h> // прерывания по таймеру1
 
#include <OneWire.h> // 1wire для DS18B20
#include <DallasTemperature.h> // DS18B20
 
#define ONE_WIRE_BUS 15
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
DeviceAddress DS18B20Address;
 
#define encoderA    2 // энкодер - поворот вправо (об землю)
#define encoderB    3 // энкодер - поворот влево (об землю)
#define encoderK    4 // энкодер - кнопка (об землю)
#define BeepPin     11 // пищалка
#define BeepToneNo  2000 // тон звука "No", герц
#define BeepToneYes 4000 // тон звука "Yes", герц
#define BeepToneNoDuration 200 // длительность звука "No", мс
#define BeepToneYesDuration 200 // длительность звука "Yes", мс
#define Relay  12 // нога, к которой подключено реле
#define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW)
 
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
byte block1[8] = {
  0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F }; // значок градуса с пламенем снизу
byte block2[8] = {
  0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 }; // значок градуса
 
#define serialenabled // раскомментировать для выдачи в порт отладочной инфы
 
#define TstatTimerMax 180 //минимальная пауза между включениями горелки, сек
unsigned int TstatTimer = 20; //таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса
 
float DS18B20Temperature = 0; //сырая температура от датчика
float Temperature = 0; //вычисленная температура с коррекцией
float DS18B20TempTmp; //времянка
byte DS18B20iteration = 0; //счётчик измерений температуры для усреднения
 
float TstatTemp = 23; //температура термостатирования, может изменяться настройками
float TemperatureCorr = 0; //коррекция температуры, может изменяться настройками
float Hysteresis = 0.1; // гистерезис термостата, может изменяться настройками
float HysteresisOld;
 
int Hours = 0; // времянка часов RTC для отображения и установки
int Minutes = 0; // времянка минут RTC для отображения и установки
int Seconds;
boolean PrintYesNo = false; // показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение)
boolean SetH = false; // выделение часов при отображении
boolean SetM = false; // выделение минут при отображении
boolean SetYesNo = false; // выделение Yes/No при установке часов
 
boolean blink500ms = false; // мигающий бит, инвертируется каждые 500мс
boolean plus1sec = false; // ежесекундно взводится
 
boolean BeepEnabled = true;
 
byte MenuTimeoutTimer;
 
// структура для суточных таймеров (8 байт)
struct buffer_template {
  byte Hours;
  byte Minutes;
  float Temperature;
  boolean Enabled;
  boolean Activated;
};
buffer_template Timer[4] = {
  0, 0, 23.0, false, false}; //объявление 4-х суточных таймеров и их начальные значения
 
float AlarmTemp = 10; // температура для замерзательного орала
 
// encoder vars
static boolean rotating=false;      // debounce management
boolean A_set = false;             
boolean B_set = false;
boolean encoderR = false;
boolean encoderL = false;
 
// EEPROM
EEMEM float TstatTempEE; //EE температура термостатирования
EEMEM float TemperatureCorrEE; // EE коррекция температуры
EEMEM float HysteresisEE; // EE гистерезис
EEMEM boolean BeepEnabledEE; // EE признак разрешения звука
EEMEM float AlarmTempEE; // EE значение недопустимого снижения температуры
EEMEM buffer_template TimerEE[4]; // EE структуры для 4 суточных таймеров
 
// ===== SETUP ========================================================================
void setup() {
 
#ifdef serialenabled
  Serial.begin(9600);
#endif
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, HIGH);
  // initialize the LCD
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.createChar(1, block1);
  lcd.createChar(2, block2);
  pinMode(encoderA, INPUT);
  digitalWrite(encoderA, HIGH);
  pinMode(encoderB, INPUT);
  digitalWrite(encoderB, HIGH);
  pinMode(encoderK, INPUT);
  digitalWrite(encoderK, HIGH);
  attachInterrupt(0, doEncoderA, CHANGE);   // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(1, doEncoderB, CHANGE);  // encoder pin on interrupt 1 (pin 3)
  Timer1.initialize(500000); // Timer0 interrupt - set a timer of length 500000 microseconds
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
  EEPROM.setMaxAllowedWrites(32767);
  if ((digitalRead(encoderK)) == 0)
  { // если первая запись однокристалки (зажата кнопка при включении питания)- записать начальные значения в EE
    lcd.setCursor(0, 0); //инфо на LCD
    lcd.print(F("Cold start..."));
    for (int i=0; i<4; i++)
    {
      //      Timer[i].Hours = Timer[i].Minutes = 0;
      //      Timer[i].Temperature = 23.0;
      //      Timer[i].Enabled = Timer[i].Activated = false;
      EEPROM.updateBlock(int(&TimerEE[i]), Timer[i]);
    }
    EEPROM.updateFloat(int(&TstatTempEE), TstatTemp);
    EEPROM.updateByte(int(&BeepEnabledEE), BeepEnabled);
    EEPROM.updateFloat(int(&TemperatureCorrEE), TemperatureCorr);
    EEPROM.updateFloat(int(&HysteresisEE), Hysteresis);
    EEPROM.updateFloat(int(&AlarmTempEE), AlarmTemp);
    tone(BeepPin,2000,50);
    delay(50);
    tone(BeepPin,3000,50);
    delay(50);
    tone(BeepPin,4000,50);
    delay(1000); 
  }
  lcd.clear();
  lcd.setCursor(0, 0); //инфо на LCD
  lcd.print(F("Read settings..."));
  BeepEnabled = EEPROM.readByte(int(&BeepEnabledEE));
  TstatTemp = EEPROM.readFloat(int(&TstatTempEE));
  TemperatureCorr = EEPROM.readFloat(int(&TemperatureCorrEE));
  Hysteresis = EEPROM.readFloat(int(&HysteresisEE));
  AlarmTemp = EEPROM.readFloat(int(&AlarmTempEE));
  for (int i=0; i<4; i++)
  {
    EEPROM.readBlock(int(&TimerEE[i]), Timer[i]);
  }
 
  DS18B20.begin();
  DS18B20.getAddress(DS18B20Address, 0);
  DS18B20.setResolution(DS18B20Address, 12);
  DS18B20.setWaitForConversion(false);
  DS18B20.requestTemperatures();
 
  tone(BeepPin,4000,50);
  delay(100); 
  tone(BeepPin,4000,50);
  delay(1000); 
  lcd.clear();
  RTC.start();
 
}
 
// ===== MAIN CYCLE ===================================================================
void loop() {
  lcd.setCursor(8, 0); //инфо на LCD
  if ((Temperature < AlarmTemp)&(blink500ms)) {
    lcd.print(F("*"));
  }
  else {
    lcd.print(F(" "));
  }
  lcd.print(F("t="));
  if (Temperature < 10) {
    lcd.print(F(" "));
  }
  lcd.print(Temperature,1);
  lcd.write(0x02); // значок градуса
 
  // если таймер включен - надпись светится, если сработал - мигает, обрабатываем все 4 таймера
  lcd.setCursor(0, 1); //инфо на LCD
  for (int i=0;i<4;i++){
    if ((Timer[i].Enabled)&!((Timer[i].Activated)&(blink500ms))) {
      lcd.print(F("T"));
      lcd.print(i+1);
    }
    else {
      lcd.print(F("  "));
    }
  }
 
  lcd.setCursor(9, 1); //инфо на LCD
  lcd.print(F("s="));
  lcd.print(TstatTemp,1);
  if ( digitalRead(Relay) == RelayOn ) {
    lcd.write(0x01); // значок градуса с пламенем
  }
  else {
    lcd.write(0x02); // значок градуса
  }
 
  // печатаем текущее время
  PrintYesNo = false;
  PrintRTC(0,0);
 
  // термостатирование
  if ( TstatTimer == 0 )
  {
    if ( Temperature > ( TstatTemp + Hysteresis ) ) // гистерезис
    {
      if ( digitalRead(Relay) == RelayOn ) // если горелка включена -
      {
        digitalWrite(Relay, !RelayOn); // выключить горелку
        TstatTimer = TstatTimerMax; // горелку держать выключённой не менее заданного в TstatTimerMax времени
      }
    }
    if (Temperature < TstatTemp)
    {
      if ( digitalRead(Relay) == !RelayOn ) // если горелка выключена -
      {
        digitalWrite(Relay, RelayOn); // включить горелку
        TstatTimer = TstatTimerMax; // горелку держать включённой не менее заданного в TstatTimerMax времени
      }
    }
  }
 
  // если прошла 1 секунда - делаем ежесекундные дела
  if (plus1sec) {
    plus1sec = false; // сбрасываем до следующей секунды
    // обновляем часы
    RTC.readClock();
    Hours=RTC.getHours();
    Minutes=RTC.getMinutes();
    Seconds=RTC.getSeconds();
 
    // измеряем температуру воздуха
    DS18B20TempTmp = DS18B20.getTempCByIndex(0); // получить температуру от датчика
    //Serial.println(DS18B20TempTmp);
    DS18B20.requestTemperatures();  // запустить новое измерение
    if (DS18B20TempTmp != -127)
    {
      DS18B20Temperature += DS18B20TempTmp; // суммируем для усреднения
      DS18B20iteration ++;
      if (DS18B20iteration == 10)
      {
        DS18B20iteration = 0;
        Temperature = (DS18B20Temperature / 10) + TemperatureCorr; //усреднённая + коррекция
        DS18B20Temperature = 0;
      }
    }
 
    // если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту
    //(экономия ресурса EE)
    if ((EEPROM.readFloat(int(&TstatTempEE)) != TstatTemp)&(Seconds == 0)) {
      EEPROM.updateFloat(int(&TstatTempEE), TstatTemp);
    }
 
    // проверка таймеров и изменение уставки термостата при совпадении 
    for (int i=0;i<4;i++)
    {
      if ((Hours == Timer[i].Hours)&(Minutes == Timer[i].Minutes)&(Timer[i].Enabled)&(Seconds == 0)) { // время T совпадает с RTC
      Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated = false;
        Timer[i].Activated = true;
        TstatTemp = Timer[i].Temperature;
        EEPROM.updateFloat(int(&TstatTempEE), TstatTemp);
        if (BeepEnabled) {
          tone(BeepPin,4000,5);
        }
        break; // это чтобы статус Activated остался взведённым
      }
    }
 
    // дебаг-инфо - в терминал
#ifdef serialenabled
    Serial.print(F("Temp="));
    Serial.print(Temperature, 1);
    Serial.print(F("("));
    Serial.print(DS18B20Temperature, 4);
    Serial.print(F(",corr "));
    Serial.print(TemperatureCorr, 1);
    Serial.print(F("),TstatTimer="));
    Serial.println(TstatTimer);
#endif
 
    if (Temperature < AlarmTemp) {
      tone(BeepPin,4000,5);
    }
  }
 
  // обработка поворота энкодера на лету (ручное изменение уставки температуры))
  rotating = true;  // reset the debouncer
  if ((encoderR)|(encoderL)) {
    if (encoderR) {
      TstatTemp += 0.1;
    }
    else
    {
      TstatTemp -= 0.1;
    }
    TstatTemp = constrain(TstatTemp, 10, 35);
    encoderR = false;
    encoderL = false;
    Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated = false;
  }
 
  // ================ по нажатию кнопки энкодера - меню настроек ====================
  if(digitalRead(encoderK) == 0) {
    MenuTimeoutTimer = 10; //таймер таймаута, секунд
    lcd.clear();
    lcd.setCursor(0, 0); //инфо на LCD
    lcd.print(F("< SETUP >")); 
    if (BeepEnabled) {
      tone(BeepPin,4000,50);
    }
    delay(200);
    int menuitem = 0;
 
    do {
      rotating = true;  // reset the debouncer
      if ((encoderR)|(encoderL)) {
        MenuTimeoutTimer = 10; //таймер таймаута, секунд
        if (encoderR) {
          menuitem += 1;
        }
        else  {
          menuitem -= 1;
        }
        if ( menuitem > 9 ) {
          menuitem = 0;
        } // границы пунктов меню
        if ( menuitem < 0 ) {
          menuitem = 9;
        }
        encoderR = false;
        encoderL = false;
      }
 
      // индикация пункта меню (номер пункта - в menuitem)
      lcd.setCursor(0, 1); //инфо на LCD
      switch(menuitem)
      {
      case 0:
        lcd.print(F("0.BACK          ")); 
        break;
      case 1:
        lcd.print(F("1.TIMER1 SET    ")); 
        break;
      case 2:
        lcd.print(F("2.TIMER2 SET    ")); 
        break;
      case 3:
        lcd.print(F("3.TIMER3 SET    ")); 
        break;     
      case 4:
        lcd.print(F("4.TIMER4 SET    ")); 
        break;     
      case 5:
        lcd.print(F("5.CLOCK SET     ")); 
        break;
      case 6:
        lcd.print(F("6.HYSTERESIS SET")); 
        break;
      case 7:
        lcd.print(F("7.T-CORRECT SET ")); 
        break;
      case 8:
        lcd.print(F("8.SOUND SET     ")); 
        break;
      case 9:
        lcd.print(F("9.T-ALARM SET   ")); 
        break;     
      }
      if (MenuTimeoutTimer == 0) {
        menuitem = 0;
      }
 
    }
    while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
    // если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem)
    if (BeepEnabled) {
      tone(BeepPin,4000,50);
    }
    switch(menuitem)
    {
      // ====== пункт 0 - выход
    case 0:
      if (BeepEnabled) {
        tone(BeepPin,BeepToneNo,BeepToneNoDuration);
      } //звук "NO"
      break; // case 0 out
 
      // ====== пункт 1 - установка Timer1
    case 1:
      TimerXSetup(0);
      break; // case 1 out
 
      // ====== пункт 2 - установка Timer2
    case 2:
      TimerXSetup(1);
      break; // case 2 out
 
      // ====== пункт 3 - установка Timer3
    case 3:
      TimerXSetup(2);
      break; // case 3 out
 
      // ====== пункт 4 - установка Timer4
    case 4:
      TimerXSetup(3);
      break; // case 4 out
 
      // ====== пункт 5 - установка RTC
    case 5:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP CLOCK")); 
      delay(200);
      RTC.readClock();
      Hours=RTC.getHours();
      Minutes=RTC.getMinutes();
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo)
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          RTC.setHours(Hours);
          RTC.setMinutes(Minutes);
          RTC.setSeconds(0);
          RTC.setClock();
          RTC.start();
        }
        else
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 5 out
 
      // ====== пункт 6 - установка гистерезиса
    case 6:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      HysteresisOld = Hysteresis;
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP HYSTERESIS")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print("   "); 
        }
        else {
          lcd.print(Hysteresis, 1); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          Hysteresis += 0.1;
          encoderR = false;
        }
        if (encoderL) {
          Hysteresis -= 0.1;
          encoderL = false;
        }
        Hysteresis = constrain(Hysteresis, 0.1, 1); // крайние значения
      }
      while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
      if (MenuTimeoutTimer != 0) {
        EEPROM.updateFloat(int(&HysteresisEE), Hysteresis); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        Hysteresis = HysteresisOld;
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 6 out
 
      // ====== пункт 7 - установка коррекции температуры
    case 7:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP T-CORRECT ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print(F("    ")); 
        }
        else {
          if (TemperatureCorr >= 0) {
            lcd.print(F("+"));
          }
 
          lcd.print(TemperatureCorr, 1); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          TemperatureCorr += 0.1;
          encoderR = false;
        }
        if (encoderL) {
          TemperatureCorr -= 0.1;
          encoderL = false;
        }
        TemperatureCorr = constrain(TemperatureCorr, -8, 8); // крайние значения
      }
      while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        EEPROM.updateFloat(int(&TemperatureCorrEE), TemperatureCorr); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        TemperatureCorr = EEPROM.readFloat(int(&TemperatureCorrEE));
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 7 out     
 
      // ====== пункт 8 - вкл/выкл звука
    case 8:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SOUND SET       ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (BeepEnabled) {
          lcd.print(F("BEEP ON         ")); 
        }     
        else {
          lcd.print(F("BEEP OFF        ")); 
        }
 
        rotating = true;  // reset the debouncer
        if ((encoderR)|(encoderL)) {
          BeepEnabled = !BeepEnabled;
          encoderR = false;
          encoderL = false;
        }
      }
      while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
        EEPROM.updateByte(int(&BeepEnabledEE), BeepEnabled);
      }
      if (MenuTimeoutTimer == 0) {
        BeepEnabled = EEPROM.readByte(int(&BeepEnabledEE));
      }
      break; // case 8 out
 
      // ====== пункт 9 - установка предупреждалки о холоде
    case 9:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("ALARM-TEMP SET  ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print(F("    ")); 
        }
        else {
          if (AlarmTemp >= 0) {
            lcd.print(F("+"));
          }
 
          lcd.print(AlarmTemp, 0); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          AlarmTemp += 1;
          encoderR = false;
        }
        if (encoderL) {
          AlarmTemp -= 1;
          encoderL = false;
        }
        AlarmTemp = constrain(AlarmTemp, 15, 30); // крайние значения
      }
      while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        EEPROM.updateFloat(int(&AlarmTempEE), AlarmTemp); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        AlarmTemp = EEPROM.readFloat(int(&AlarmTempEE));
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 9 out
 
    }
 
    delay(200);
    lcd.clear();
  }
}
 
// ===== SUBROUTINES ==================================================================
 
// ========================================
void SetTime(char x, char y)
{
  // ========= set hours
  SetH = true;
  do {
    PrintRTC(x,y);
    rotating = true;  // reset the debouncer
    if (encoderR) {
      Hours += 1;
      if(Hours > 23) {
        Hours = 0;
      };
      encoderR = false;
    }
    if (encoderL) {
      Hours -= 1;
      if(Hours < 0) {
        Hours = 23;
      };
      encoderL = false;
    }
  }
  while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
  if (BeepEnabled) {
    tone(BeepPin,4000,50); //звук "YES"
  }
  SetH = false;
  delay(200);
  // ========= set minutes
  SetM = true;
  do {
    PrintRTC(0,1);
    rotating = true;  // reset the debouncer
    if (encoderR) {
      Minutes += 1;
      if(Minutes > 59) {
        Minutes = 0;
      };
      encoderR = false;
    }
    if (encoderL) {
      Minutes -= 1;
      if(Minutes < 0) {
        Minutes = 59;
      };
      encoderL = false;
    }
  }
  while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
  if (BeepEnabled) {
    tone(BeepPin,4000,50); //звук "YES"
  }
  if (PrintYesNo) {
    SetM = false;
    delay(200);
    // ========= set yes-no
    SetYesNo = false;
    do {
      PrintRTC(0,1);
      rotating = true;  // reset the debouncer
      if ((encoderR)||(encoderL)) {
        SetYesNo = !SetYesNo;
        encoderR = false;
        encoderL = false;
      }
    }
    while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
    delay(200);
  }
 
}
 
// ========================================
void PrintRTC(char x, char y)
{
  lcd.setCursor(x,y);
  if (SetH&&blink500ms) {
    lcd.print(F("  "));
  }
  else {
    if (Hours < 10) {
      lcd.print(F("0"));
    }   
    lcd.print(Hours);
  }
 
  // мигающее двоеточие, если не в режиме установки времени
  if (!(SetH||SetM||PrintYesNo||blink500ms))
  {
    lcd.print(F(" "));
  }
  else {
    lcd.print(F(":"));
  }
 
  if (SetM&&blink500ms) {
    lcd.print(F("  "));
  }
  else {
    if (Minutes < 10) {
      lcd.print(F("0"));
    }   
    lcd.print(Minutes);
  }
  lcd.print(F(" "));
 
  if (PrintYesNo) {
    lcd.print(F("["));
    if (!(SetH||SetM||blink500ms))
    {
      lcd.print(F("   "));
    }
    else {
      if (SetYesNo)
      {
        lcd.print(F("YES"));
      }
      else {
        lcd.print(F("NO "));
      }
    }
    lcd.print(F("]"));
  }
 
}
 
// ============================ Encoder interrupts =============================
// Interrupt on A changing state
void doEncoderA(){
  if ( rotating ) {
    delay (1) ;  // wait a little until the bouncing is done
  }
  // Test transition, did things really change?
  if( digitalRead(encoderA) != A_set ) {  // debounce once more
    A_set = !A_set;
    // adjust counter + if A leads B
    if ( A_set && !B_set )
    {
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
      encoderR = true;
      rotating = false;  // no more debouncing until loop() hits again
    }
  }
}
// Interrupt on B changing state, same as A above
void doEncoderB(){
  if ( rotating ) {
    delay (1);
  }
  if( digitalRead(encoderB) != B_set ) {
    B_set = !B_set;
    //  adjust counter - 1 if B leads A
    if( B_set && !A_set ) {
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
      encoderL = true;
      rotating = false;
    }
  }
}
// ============================ Timer0 interrupt =============================
// run every 500ms
void timerIsr()
{
  blink500ms = !blink500ms; // инверсия мерцающего бита
  if(blink500ms) {
    plus1sec = true; // ежесекундно взводится
    if (TstatTimer != 0) {
      TstatTimer --; // ежесекундный декремент этого таймера
    }
    if (MenuTimeoutTimer != 0) {
      MenuTimeoutTimer --; // ежесекундный декремент этого таймера
    }
  }
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void TimerXSetup(int X) {
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP TIMER")); 
      lcd.print(X+1);  // выводим номер таймера на LCD
      delay(200);
      Hours=Timer[X].Hours;
      Minutes=Timer[X].Minutes;
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo) // если при установке времени выбрано "Yes"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          Timer[X].Hours = Hours;
          Timer[X].Minutes = Minutes;
          Timer[X].Enabled = true;
          EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]);
 
          MenuTimeoutTimer = 10; //таймер таймаута, секунд
          lcd.clear();
          lcd.setCursor(0, 0); //инфо на LCD
          lcd.print(F("Timer"));
          lcd.print(X+1);
          lcd.print(F(" Temp. Set")); 
          delay(200);
          do {
            lcd.setCursor(0,1);
            if (blink500ms) {
              lcd.print(F("     ")); 
            }
            else {
              lcd.print(Timer[X].Temperature, 1); 
              lcd.write(0x02); // значок градуса
            }
            rotating = true;  // reset the debouncer
            if (encoderR) {
              Timer[X].Temperature += 0.1;
              encoderR = false;
            }
            if (encoderL) {
              Timer[X].Temperature -= 0.1;
              encoderL = false;
            }
            Timer[X].Temperature = constrain(Timer[X].Temperature, 10, 35); // крайние значения
          }
          while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
 
          if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера
          EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }
          else { // если не нажата - используем старую температуру
          EEPROM.readBlock(int(&TimerEE[X]), Timer[X]);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }      
 
        }
        else // если при установке времени выбрано "No"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
          EEPROM.readBlock(int(&TimerEE[X]), Timer[X]);
          Timer[X].Enabled = false;
          EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]);
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````

 

Vitaly-V
Offline
Зарегистрирован: 14.09.2016

Всем привет и хорошего дня.

Я только знакомлюсь с ардуино и радиоэлектроникой прошу не судить строго. 

Есть 3 вопроса. 

1. Где можно найти схему проекта? Боюсь, не поставлю какой-нибудь резистор и все будет работать неправильно. Если схемы нет, то обясните пожалуйста как вы понимаете, что-куда.

2. Хочу сделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Может подскажете где копать и что допилить чтобы связвть ардуинкуи по радио?

3. Как организовать автономное питание для ардуинки-датчика и сколько это штука с такой обвязкой и таким скетчем сможет прожить автономно?

PS: В наличии есть UNO, Nano и Mini Pro 328, котёл baxi rocco neobit )

Заранее всем спасибо.
 

bester
Offline
Зарегистрирован: 25.06.2016

Что изменить я скетче, чтобы использовать часы DS3231? У меня DS3231 почему то не идут. Подключены sda-a4, scl-a5, +, gnd

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Моим скетчем  это назвать нельзя))) Это сектч уважаемого автора, я только добавил ЛСД 1602 с  i2c. Вот что нужно сделать в скетче автора:

//#include <LiquidCrystal.h> // LCD 16*2 старая библиотека
#include <LiquidCrystal_I2C.h> // новая библиотека для 

далее вводим:

//LiquidCrystal lcd(7, 6, 5, 10, 9, 8);// удаляем старый дисплей
LiquidCrystal_I2C lcd(0x27,16,2);// вводим новый с i2c
 
Вот и всё. Очень удобно.
 
Vitaly-V
Offline
Зарегистрирован: 14.09.2016

Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.

Vitaly-V
Offline
Зарегистрирован: 14.09.2016

Вопрос снят. Нужно покупать i2c модуль. Но подключиться ли он к lcd 16*2 мэлт?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V пишет:

Вопрос снят. Нужно покупать i2c модуль. Но подключиться ли он к lcd 16*2 мэлт?

вопрос не понятен...
ардуина и 16х2 по I2C - нужен преобразователь (цена у китайцев = 50р.)

ардуина и 16х2 с I2C - подключится !

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V пишет:

Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом.

контроллер с котлом , может быть ?
а зачем менять два провода на +ардуина и два nrf24 ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V пишет:

Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.

чо за котёл-то ?
делаю свой проект (не себе) , сюда посматриваю , но делаю свой проект....

котёл тупой - уставка T подачи ручная , может работать от радиоТермометра...
у тибя такой ? есть наработки... нано ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V пишет:

Нужно покупать i2c модуль.

мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
   или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)

Vitaly-V
Offline
Зарегистрирован: 14.09.2016

SU-27-16 пишет:

мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
   или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)

Дело в том, что не имею возможности запитать модуль к котлу по проводам. Так как в доме сделан ремонт и не хочеться ничего сверлить и т.п. Для этого решил cделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Cтолкунля с тем, что мне не хватает пинов и для их освобожднеия думаю использовать i2c . Возможно я в чем-то ошибаюсь.

@SU-27-16 для какой цели вы используете 3 датчкика (подача, обратка, улица) ?  На мой взгляд главное иметь комфортную температуру в помещении. Для этого достаточно одного датчика в комнате. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V , сначала тоже хотел радиопульт для котла , заказчик перехотел.
Желает устройство иметь в "кочегарке" около котла.

Датчики - ВСЕ для контроля температур котла и улицы
1 и 2-ой - для управления котлом
2-ой - для компенсации "мороза"
например , в диапазоне -10..-30гр на улице добавляет пропорционально 10гр на подачу
при -20 подача будет на 5 больше чем при -9 , а при -40 - на 15

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vitaly-V , у заказчика уже есть EUROSTER 2006TX = 6300р. , круто !
если котёл с электроникой - то классно !
если котёл тупой как холодильник_СССР - то 
есть проблема... рассказать ?
https://www.teplo-serv.com/ru/prod3861
с точки зрения котла - это выходы реле ( два провода ) : греть / не греть :)
на моей схеме это "RF-приёмник КТВ"

никакой обратной связи !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

тут цена погуманнее , но техОписание :(
https://www.teplo-serv.com/ru/prod3874

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

про "линию Деда Мороза"

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ой-ой-ой !
Ldelta - получилось 20гр.... НЕ ПРАВИЛЬНО нарисовал :(
это значение на графике НЕОТОБРАЖАЕМО... ступил :(
Ldelta - можно прикрутить к нижнему "графику" , но сложнова-то....

Vitaly-V
Offline
Зарегистрирован: 14.09.2016

SU-27-16 спасибо за советы. Котёл у меня - тупой (Baxi Roca Neobit) Делаю термостат ради интереса и для себя. Понимаю, что можно было купить готовый и дешевле, но мне хочеться разобраться и сделать самому. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а на вопрос - ответ
http://anydevices.ru/modules/i2c-serial-interface-adapter-board-module-f...
у "братьев" = 50р. :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а не хочется ли иметь визуальный контроль за работой тупого котла ?
у заказчика - стрелочные-мембранные датчики Т подачи и обратки....
неудобно и нефейшуйно :)
заказчик - брат в другом городе , т.е. делаю как сибе !

AleXis6
Offline
Зарегистрирован: 04.10.2016

а похожий девайс с недельным программированием?

bagotu
Offline
Зарегистрирован: 15.10.2016

[quote=rekrut007]


[code]
/* Программа "Комнатный термостат"
Допоборудование - ds18b20(вывод 2 )- 3 датчика (комнатный, уличный, на котловую воду), ds3231(выводы 5-SCL и 4-SDA) и lcd1602.
Функция - замеряет температуру в помещении и на основании ее сравнения с установленными пользователями включает или выключает нагрузку.

Доброго времени суток

При проверке кода выдает следующее:

(как лечить?)
 
 
C:\Users\Ihor\Documents\Arduino\sketch_oct21_main_code\sketch_oct21_main_code.ino: In function 'void poluchenie_wremeni()':
 
C:\Users\Ihor\Documents\Arduino\sketch_oct21_main_code\sketch_oct21_main_code.ino:298:8: warning: unused variable 'DoW' [-Wunused-variable]
 
   byte DoW = Wire.read();   //??? РЅРµ фига РЅРµ понимаю ???
 
        ^
 
C:\Users\Ihor\Documents\Arduino\sketch_oct21_main_code\sketch_oct21_main_code.ino: In function 'void problem_datch_room()':
 
C:\Users\Ihor\Documents\Arduino\sketch_oct21_main_code\sketch_oct21_main_code.ino:496:38: warning: statement has no effect [-Wunused-value]
 
   time_snach_progi_problem_datch_room;
 
                                      ^
 
 
Скетч использует 17 940 байт (55%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 704 байт (34%) динамической памяти, оставляя 1 344 байт для локальных переменных. Максимум: 2 048 байт.
 
Staryjdub
Offline
Зарегистрирован: 08.04.2016

Доброго времени суток! Очень интересный проект! Только вот при компиляции сразу выдает ошибку :

In file included from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:0:

C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:159:22: error: conflicting declaration 'EEPROMClassEx EEPROM'

 extern EEPROMClassEx EEPROM;

                      ^

In file included from C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:23:0,

                 from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:

C:\Program Files\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:145:20: note: previous declaration as 'EEPROMClass EEPROM'

 static EEPROMClass EEPROM;

                    ^

C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void setup()':

sketch_oct24c:119: error: 'doEncoderA' was not declared in this scope

sketch_oct24c:120: error: 'doEncoderB' was not declared in this scope

sketch_oct24c:122: error: 'timerIsr' was not declared in this scope

sketch_oct24c:123: error: 'struct EEPROMClass' has no member named 'setMaxAllowedWrites'

sketch_oct24c:133: error: 'struct EEPROMClass' has no member named 'updateBlock'

sketch_oct24c:135: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:136: error: 'struct EEPROMClass' has no member named 'updateByte'

sketch_oct24c:137: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:138: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:139: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:150: error: 'struct EEPROMClass' has no member named 'readByte'

sketch_oct24c:151: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:152: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:153: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:154: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:157: error: 'struct EEPROMClass' has no member named 'readBlock'

C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void loop()':

sketch_oct24c:215: error: 'PrintRTC' was not declared in this scope

sketch_oct24c:264: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:265: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:275: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:404: error: 'TimerXSetup' was not declared in this scope

sketch_oct24c:434: error: 'SetTime' was not declared in this scope

sketch_oct24c:491: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:538: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:544: error: 'struct EEPROMClass' has no member named 'readFloat'

sketch_oct24c:580: error: 'struct EEPROMClass' has no member named 'updateByte'

sketch_oct24c:583: error: 'struct EEPROMClass' has no member named 'readByte'

sketch_oct24c:621: error: 'struct EEPROMClass' has no member named 'updateFloat'

sketch_oct24c:627: error: 'struct EEPROMClass' has no member named 'readFloat'

C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void SetTime(char, char)':

sketch_oct24c:649: error: 'PrintRTC' was not declared in this scope

sketch_oct24c:675: error: 'PrintRTC' was not declared in this scope

sketch_oct24c:702: error: 'PrintRTC' was not declared in this scope

C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void TimerXSetup(int)':

sketch_oct24c:847: error: 'struct EEPROMClass' has no member named 'updateBlock'

sketch_oct24c:879: error: 'struct EEPROMClass' has no member named 'updateBlock'

sketch_oct24c:885: error: 'struct EEPROMClass' has no member named 'readBlock'

sketch_oct24c:897: error: 'struct EEPROMClass' has no member named 'readBlock'

sketch_oct24c:899: error: 'struct EEPROMClass' has no member named 'updateBlock'

exit status 1
'doEncoderA' was not declared in this scope

 

bagotu
Offline
Зарегистрирован: 15.10.2016

по I2C часы и LCD работают. 

добавил 4-й таймер. типа: утро, день, вечер, ночь.

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Не затруднит поделиться скетчем? )))) или скиньте плиз на почту: dwk26111974@gmail.com буду признателен.

bagotu
Offline
Зарегистрирован: 15.10.2016
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
#include <RealTimeClockDS1307.h> // RTC
#include <EEPROM.h> // EE
#include <TimerOne.h> // прерывания по таймеру1
#include <OneWire.h> // 1wire для DS18B20
#include <DallasTemperature.h> // DS18B20


hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip

// LCD geometry
const int LCD_ROWS = 2;
const int LCD_COLS = 16;

#define HD44780_LCDOBJECT
 
#define ONE_WIRE_BUS A1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
DeviceAddress DS18B20Address;
 
#define encoderA    2 // энкодер - поворот вправо (об землю)
#define encoderB    3 // энкодер - поворот влево (об землю)
#define encoderK    4 // энкодер - кнопка (об землю)
#define BeepPin     11 // пищалка
#define BeepToneNo  2000 // тон звука "No", герц
#define BeepToneYes 4000 // тон звука "Yes", герц
#define BeepToneNoDuration 200 // длительность звука "No", мс
#define BeepToneYesDuration 200 // длительность звука "Yes", мс
#define  Relay  12 // нога, к которой подключено реле
#define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW)
  
byte block1[8] = {
  0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F }; // значок градуса с пламенем снизу
byte block2[8] = {
  0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 }; // значок градуса
byte block3[8] = {
  0x06,0x0A,0x0A,0x0A,0x0A,0x1F,0x11,0x00 }; // буква Д
byte block4[8] = {
  0x11,0x11,0x11,0x0F,0x01,0x11,0x0E,0x00 }; // буква У


//#define serialenabled // раскомментировать для выдачи в порт отладочной инфы!!!!!
 
#define TstatTimerMax 120 //минимальная пауза между включениями горелки, сек
unsigned int TstatTimer = 20; //таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса
 
float DS18B20Temperature = 0; //сырая температура от датчика
float Temperature = 0; //вычисленная температура с коррекцией
float DS18B20TempTmp; //времянка
byte DS18B20iteration = 0; //счётчик измерений температуры для усреднения
 
float TstatTemp = 23; //температура термостатирования, может изменяться настройками
float TemperatureCorr = 0; //коррекция температуры, может изменяться настройками
float Hysteresis = 0.1; // гистерезис термостата, может изменяться настройками
float HysteresisOld;
 
int Hours = 0; // времянка часов RTC для отображения и установки
int Minutes = 0; // времянка минут RTC для отображения и установки
int Seconds;
boolean PrintYesNo = false; // показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение)
boolean SetH = false; // выделение часов при отображении
boolean SetM = false; // выделение минут при отображении
boolean SetYesNo = false; // выделение Yes/No при установке часов
 
boolean blink500ms = false; // мигающий бит, инвертируется каждые 500мс
boolean plus1sec = false; // ежесекундно взводится
 
boolean BeepEnabled = true;
 
byte MenuTimeoutTimer;
 
byte Timer1Hours = 0;
byte Timer1Minutes = 0;
boolean Timer1Enabled = false;
boolean Timer1Activated = false;
float Timer1Temp = 23; //температура термостатирования по таймеру1, может изменяться настройками
byte Timer2Hours = 0;
byte Timer2Minutes = 0;
boolean Timer2Enabled = false;
boolean Timer2Activated = false;
float Timer2Temp = 23; //температура термостатирования по таймеру2, может изменяться настройками
byte Timer3Hours = 0;
byte Timer3Minutes = 0;
boolean Timer3Enabled = false;
boolean Timer3Activated = false;
float Timer3Temp = 23; //температура термостатирования по таймеру3, может изменяться настройками
byte Timer4Hours = 0;
byte Timer4Minutes = 0;
boolean Timer4Enabled = false;
boolean Timer4Activated = false;
float Timer4Temp = 23; //температура термостатирования по таймеру4, может изменяться настройками
float AlarmTemp = 18; // температура для замерзательного орала
 
// encoder vars
static boolean rotating=false;      // debounce management
boolean A_set = false;             
boolean B_set = false;
boolean encoderR = false;
boolean encoderL = false;
 
// EEPROM addresses
#define TstatTempEEaddr 0 // EE - адрес для сохранения температуры термостатирования, 4 байта(float)!
#define TemperatureCorrEEaddr 4 // EE - адрес для сохранения коррекции температуры, 4 байта(float)!
#define HysteresisEEaddr 8 // EE - адрес для сохранения гистерезиса, 4 байта(float)!
#define Timer1HoursEEaddr 12 // EE - адрес для сохранения часов таймера 1 (byte)
#define Timer1MinutesEEaddr 13 // EE - адрес для сохранения минут таймера 1 (byte)
#define Timer1EnabledEEaddr 14 // EE - адрес для сохранения статуса таймера 1 (boolean)
#define Timer1TempEEaddr 15 // EE - адрес для сохранения температуры таймера 1, 4 байта(float)!
#define Timer2HoursEEaddr 19 // EE - адрес для сохранения часов таймера 2 (byte)
#define Timer2MinutesEEaddr 20 // EE - адрес для сохранения минут таймера 2 (byte)
#define Timer2EnabledEEaddr 21 // EE - адрес для сохранения статуса таймера 2 (boolean)
#define Timer2TempEEaddr 22 // EE - адрес для сохранения температуры таймера 2, 4 байта(float)!
#define Timer3HoursEEaddr 26 // EE - адрес для сохранения часов таймера 3 (byte)
#define Timer3MinutesEEaddr 27 // EE - адрес для сохранения минут таймера 3 (byte)
#define Timer3EnabledEEaddr 28 // EE - адрес для сохранения статуса таймера 3 (boolean)
#define Timer3TempEEaddr 29 // EE - адрес для сохранения температуры таймера 3, 4 байта(float)!
#define Timer4HoursEEaddr 38 // EE - адрес для сохранения часов таймера 4 (byte)
#define Timer4MinutesEEaddr 39 // EE - адрес для сохранения минут таймера 4 (byte)
#define Timer4EnabledEEaddr 40 // EE - адрес для сохранения статуса таймера 4 (boolean)
#define Timer4TempEEaddr 41 // EE - адрес для сохранения температуры таймера 4, 4 байта(float)!
#define BeepEnabledEEaddr 33 // EE - адрес для сохранения признака разрешения звука (boolean)
#define AlarmTempEEaddr 34 // EE - адрес для сохранения значения недопустимого снижения температуры, 4 байта(float)!
 
// ===== SETUP ========================================================================
void setup() 
{
#ifdef serialenabled
  Serial.begin(9600);
#endif
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, HIGH);
  lcd.begin(LCD_COLS, LCD_ROWS);
  lcd.clear();
  lcd.createChar(1, block1);
  lcd.createChar(2, block2);
  lcd.createChar(3, block3);
  lcd.createChar(4, block4);
  pinMode(encoderA, INPUT);
  digitalWrite(encoderA, HIGH);
  pinMode(encoderB, INPUT);
  digitalWrite(encoderB, HIGH);
  pinMode(encoderK, INPUT);
  digitalWrite(encoderK, HIGH);
  attachInterrupt(0, doEncoderA, CHANGE);   // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(1, doEncoderB, CHANGE);  // encoder pin on interrupt 1 (pin 3)
  Timer1.initialize(500000); // Timer0 interrupt - set a timer of length 500000 microseconds
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
  if (EEPROM.read(Timer1HoursEEaddr) > 23) { // если первая запись однокристалки - записать начальные значения в EE
    EEPROM.write(BeepEnabledEEaddr, BeepEnabled);
    EEPROM_float_write(TstatTempEEaddr, TstatTemp);
    EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr);
    EEPROM_float_write(HysteresisEEaddr, Hysteresis);
    EEPROM.write(Timer1HoursEEaddr, Timer1Hours);
    EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes);
    EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
    EEPROM_float_write(Timer1TempEEaddr, Timer1Temp);
    EEPROM.write(Timer2HoursEEaddr, Timer2Hours);
    EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes);
    EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
    EEPROM_float_write(Timer2TempEEaddr, Timer2Temp);
    EEPROM.write(Timer3HoursEEaddr, Timer3Hours);
    EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes);
    EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
    EEPROM_float_write(Timer3TempEEaddr, Timer3Temp);
    EEPROM.write(Timer4HoursEEaddr, Timer4Hours);
    EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes);
    EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
    EEPROM_float_write(Timer4TempEEaddr, Timer4Temp);
    EEPROM_float_write(AlarmTempEEaddr, AlarmTemp);
  }
  BeepEnabled = EEPROM.read(BeepEnabledEEaddr);
  TstatTemp = EEPROM_float_read(TstatTempEEaddr);
  TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr);
  Hysteresis = EEPROM_float_read(HysteresisEEaddr);
  Timer1Hours = EEPROM.read(Timer1HoursEEaddr);
  Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr);
  Timer1Enabled = EEPROM.read(Timer1EnabledEEaddr);
  Timer1Temp = EEPROM_float_read(Timer1TempEEaddr);
  Timer2Hours = EEPROM.read(Timer2HoursEEaddr);
  Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr);
  Timer2Enabled = EEPROM.read(Timer2EnabledEEaddr);
  Timer2Temp = EEPROM_float_read(Timer2TempEEaddr);
  Timer3Hours = EEPROM.read(Timer3HoursEEaddr);
  Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr);
  Timer3Enabled = EEPROM.read(Timer3EnabledEEaddr);
  Timer3Temp = EEPROM_float_read(Timer3TempEEaddr);
  Timer4Hours = EEPROM.read(Timer4HoursEEaddr);
  Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr);
  Timer4Enabled = EEPROM.read(Timer4EnabledEEaddr);
  Timer4Temp = EEPROM_float_read(Timer4TempEEaddr);
  AlarmTemp = EEPROM_float_read(AlarmTempEEaddr);
 
  DS18B20.begin();
  DS18B20.getAddress(DS18B20Address, 0);
  DS18B20.setResolution(DS18B20Address, 12);
  DS18B20.setWaitForConversion(false);
  DS18B20.requestTemperatures();
 
  tone(BeepPin,2000,50);
  delay(50);
  tone(BeepPin,3000,50);
  delay(50);
  tone(BeepPin,4000,50);
  delay(50);
}
 
// ===== MAIN CYCLE ===================================================================
void loop() 
{
 
  lcd.setCursor(8, 0); //инфо на LCD
  if ((Temperature < AlarmTemp)&(blink500ms)) {
  lcd.print(F("*"));
  } else {
  lcd.print(F(" "));
  }
  lcd.print(F("t="));
  if (Temperature < 10) {
    lcd.print(F(" "));
  }
  lcd.print(Temperature,1);
  lcd.write(0x02); // значок градуса
 
  // если таймер 1 включен - надпись светится, если сработал - мигает
  lcd.setCursor(0, 1); //инфо на LCD
  if ((Timer1Enabled)&!((Timer1Activated)&(blink500ms))) {
        lcd.write(0x04);
  }
  else {
    lcd.print(F(" "));
  }
 
  // если таймер 2 включен - надпись светится, если сработал - мигает
  lcd.setCursor(2, 1); //инфо на LCD
  if ((Timer2Enabled)&!((Timer2Activated)&(blink500ms))) {
    lcd.write(0x03);
  }
  else {
    lcd.print(F(" "));
  }
 
  // если таймер 3 включен - надпись светится, если сработал - мигает
  lcd.setCursor(4, 1); //инфо на LCD
  if ((Timer3Enabled)&!((Timer3Activated)&(blink500ms))) {
    lcd.print(F("B"));
  }
  else {
    lcd.print(F(" "));
  }
 
 // если таймер 4 включен - надпись светится, если сработал - мигает
  lcd.setCursor(6, 1); //инфо на LCD
  if ((Timer4Enabled)&!((Timer4Activated)&(blink500ms))) {
    lcd.print(F("H"));
  }
  else {
    lcd.print(F(" "));
  }
  
  lcd.setCursor(9, 1); //инфо на LCD
  lcd.print(F("k="));
  lcd.print(TstatTemp,1);
  if ( digitalRead(Relay) == RelayOn ) {
    lcd.write(0x01); // значок градуса с пламенем
  }
  else {
    lcd.write(0x02); // значок градуса
  }
 
  // печатаем текущее время
  PrintYesNo = false;
  PrintRTC(0,0);
 
  // термостатирование
  if ( TstatTimer == 0 )
  {
    if ( Temperature > ( TstatTemp + Hysteresis ) ) // гистерезис
    {
      if ( digitalRead(Relay) == RelayOn ) // если горелка включена -
      {
        digitalWrite(Relay, !RelayOn); // выключить горелку
        TstatTimer = TstatTimerMax; // горелку держать выключённой не менее заданного в TstatTimerMax времени
      }
    }
    if (Temperature < TstatTemp)
    {
      if ( digitalRead(Relay) == !RelayOn ) // если горелка выключена -
      {
        digitalWrite(Relay, RelayOn); // включить горелку
        TstatTimer = TstatTimerMax; // горелку держать включённой не менее заданного в TstatTimerMax времени
      }
    }
  }
   
  // если прошла 1 секунда - делаем ежесекундные дела
  if (plus1sec) {
    plus1sec = false; // сбрасываем до следующей секунды
    // обновляем часы
    RTC.readClock();
    Hours=RTC.getHours();
    Minutes=RTC.getMinutes();
    Seconds=RTC.getSeconds();
 
    // измеряем температуру воздуха
    DS18B20TempTmp = DS18B20.getTempCByIndex(0); // получить температуру от датчика
    DS18B20.requestTemperatures();  // запустить новое измерение
    if (DS18B20TempTmp != -127)
    {
    DS18B20Temperature += DS18B20TempTmp; // суммируем для усреднения
    DS18B20iteration ++;
    if (DS18B20iteration == 10)
      {
      DS18B20iteration = 0;
      Temperature = (DS18B20Temperature / 10) + TemperatureCorr; //усреднённая + коррекция
      DS18B20Temperature = 0;
      }
    }
     
    // если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту
    //(экономия ресурса EE)
    if ((EEPROM_float_read(TstatTempEEaddr) != TstatTemp)&(Seconds == 0)) {
      EEPROM_float_write(TstatTempEEaddr, TstatTemp);
    }
 
    // проверка Timer1 и изменение уставки термостата при совпадении   
    if ((Hours == Timer1Hours)&(Minutes == Timer1Minutes)&(Timer1Enabled)&(Seconds == 0)) { // время T1 совпадает с RTC
      Timer1Activated = true;
      Timer2Activated = false;
      Timer3Activated = false;
      Timer4Activated = false;
      TstatTemp = Timer1Temp;
      EEPROM_float_write(TstatTempEEaddr, TstatTemp);
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
    }
 
    // проверка Timer2 и изменение уставки термостата при совпадении   
    if ((Hours == Timer2Hours)&(Minutes == Timer2Minutes)&(Timer2Enabled)&(Seconds == 0)) { // время T2 совпадает с RTC
      Timer1Activated = false;
      Timer2Activated = true;
      Timer3Activated = false;
      Timer4Activated = false;
      TstatTemp = Timer2Temp;
      EEPROM_float_write(TstatTempEEaddr, TstatTemp);
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
    }
 
    // проверка Timer3 и изменение уставки термостата при совпадении   
    if ((Hours == Timer3Hours)&(Minutes == Timer3Minutes)&(Timer3Enabled)&(Seconds == 0)) { // время T3 совпадает с RTC
      Timer1Activated = false;
      Timer2Activated = false;
      Timer3Activated = true;
      Timer4Activated = false;
      TstatTemp = Timer3Temp;
      EEPROM_float_write(TstatTempEEaddr, TstatTemp);
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
  }
  
  // проверка Timer4 и изменение уставки термостата при совпадении   
    if ((Hours == Timer4Hours)&(Minutes == Timer4Minutes)&(Timer4Enabled)&(Seconds == 0)) { // время T4 совпадает с RTC
      Timer1Activated = false;
      Timer2Activated = false;
      Timer3Activated = false;
      Timer4Activated = true;
      TstatTemp = Timer4Temp;
      EEPROM_float_write(TstatTempEEaddr, TstatTemp);
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
  }
  
    // дебаг-инфо - в терминал
#ifdef serialenabled
    Serial.print(F("Temp="));
    Serial.print(Temperature, 1);
    Serial.print(F("("));
    Serial.print(DS18B20Temperature, 4);
    Serial.print(F(",corr "));
    Serial.print(TemperatureCorr, 1);
    Serial.print(F("),TstatTimer="));
    Serial.println(TstatTimer);
#endif
     
    if (Temperature < AlarmTemp) {
    tone(BeepPin,4000,5);
    }
  }
 
  // обработка поворота энкодера на лету (ручное изменение уставки температуры))
  rotating = true;  // reset the debouncer
  if ((encoderR)^(encoderL)) {
    if (encoderR) {
      TstatTemp += 0.1;
    }
    else
    {
      TstatTemp -= 0.1;
    }
    TstatTemp = constrain(TstatTemp, 10, 35);
    encoderR = false;
    encoderL = false;
    Timer1Activated = false;
    Timer2Activated = false;
    Timer3Activated = false;
    Timer4Activated = false;
    }
 
  // ================ по нажатию кнопки энкодера - меню настроек ====================
  if(digitalRead(encoderK) == 0) {
    MenuTimeoutTimer = 10; //таймер таймаута, секунд
    lcd.clear();
    lcd.setCursor(0, 0); //инфо на LCD
    lcd.print(F("< SETUP >")); 
    if (BeepEnabled) {
      tone(BeepPin,4000,50);
    }
    delay(200);
    int menuitem = 0;
 
    do {
      rotating = true;  // reset the debouncer
      if ((encoderR)^(encoderL)) {
        MenuTimeoutTimer = 10; //таймер таймаута, секунд
        if (encoderR) { menuitem += 1; }
        else  { menuitem -= 1; }
        if ( menuitem > 8 ) { menuitem = 0; } // границы пунктов меню
        if ( menuitem < 0 ) { menuitem = 8; }
        encoderR = false;
        encoderL = false;
      }
       
      // индикация пункта меню (номер пункта - в menuitem)
      lcd.setCursor(0, 1); //инфо на LCD
      switch(menuitem)
      {
      case 0:
        lcd.print(F("0.BACK          ")); 
        break;
      case 1:
        lcd.print(F("1.TIMER "));
        lcd.write(0x04);
        lcd.print(F(" SET")); 
        break;
      case 2:
       lcd.print(F("2.TIMER "));
        lcd.write(0x03);
        lcd.print(F(" SET")); 
        break;
      case 3:
        lcd.print(F("3.TIMER "));
        lcd.print(F("B SET")); 
        break;     
      case 4:
        lcd.print(F("3.TIMER "));
        lcd.print(F("H SET")); 
        break;     
      case 5:
        lcd.print(F("5.CLOCK SET     ")); 
        break;
      case 6:
        lcd.print(F("6.HYSTERESIS SET")); 
        break;
      case 7:
        lcd.print(F("7.T-CORRECT SET ")); 
        break;
      case 8:
        lcd.print(F("8.SOUND SET     ")); 
        break;
      case 9:
        lcd.print(F("9.T-ALARM SET   ")); 
        break;      }
      if (MenuTimeoutTimer == 0) {
        menuitem = 0;
      }
 
    }
    while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
    // если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem)
    if (BeepEnabled) {
      tone(BeepPin,4000,50);
    }
    switch(menuitem)
    {
    // ====== пункт 0 - выход
    case 0:
      if (BeepEnabled) {
        tone(BeepPin,BeepToneNo,BeepToneNoDuration);
      } //звук "NO"
      break; // case 0 out
 
    // ====== пункт 1 - установка Timer1
    case 1:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP TIMER "));
      lcd.write(0x04); 
      delay(200);
      Hours=Timer1Hours;
      Minutes=Timer1Minutes;
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo) // если при установке времени выбрано "Yes"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          Timer1Hours = Hours;
          Timer1Minutes = Minutes;
          Timer1Enabled = true;
          EEPROM.write(Timer1HoursEEaddr, Timer1Hours);
          EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes);
          EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
 
          MenuTimeoutTimer = 10; //таймер таймаута, секунд
          lcd.clear();
          lcd.setCursor(0, 0); //инфо на LCD
          lcd.print(F("Timer "));
          lcd.write(0x04); 
          lcd.print(F(" Temp.Set"));
          delay(200);
          do {
            lcd.setCursor(0,1);
            if (blink500ms) {
              lcd.print(F("     ")); 
            }
            else {
              lcd.print(Timer1Temp, 1); 
              lcd.write(0x02); // значок градуса
            }
            rotating = true;  // reset the debouncer
            if (encoderR) {
              Timer1Temp += 0.1;
              encoderR = false;
            }
            if (encoderL) {
              Timer1Temp -= 0.1;
              encoderL = false;
            }
            Timer1Temp = constrain(Timer1Temp, 10, 35); // крайние значения
          }
          while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
          if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера
            EEPROM_float_write(Timer1TempEEaddr, Timer1Temp);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }
          else { // если не нажата - используем старую температуру
            Timer1Temp = EEPROM_float_read(Timer1TempEEaddr);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }      
 
        }
        else // если при установке времени выбрано "No"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
          Timer1Enabled = false;
          EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
          Timer1Hours = EEPROM.read(Timer1HoursEEaddr);
          Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr);
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 1 out
 
    // ====== пункт 2 - установка Timer2
    case 2:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP TIMER "));
      lcd.write(0x03); 
      delay(200);
      Hours=Timer2Hours;
      Minutes=Timer2Minutes;
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo) // если при установке времени выбрано "Yes"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          Timer2Hours = Hours;
          Timer2Minutes = Minutes;
          Timer2Enabled = true;
          EEPROM.write(Timer2HoursEEaddr, Timer2Hours);
          EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes);
          EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
 
          MenuTimeoutTimer = 10; //таймер таймаута, секунд
          lcd.clear();
          lcd.setCursor(0, 0); //инфо на LCD
          lcd.print(F("Timer "));
          lcd.write(0x03); 
          lcd.print(F(" Temp.Set"));
          delay(200);
          do {
            lcd.setCursor(0,1);
            if (blink500ms) {
              lcd.print(F("     ")); 
            }
            else {
              lcd.print(Timer2Temp, 1); 
              lcd.write(0x02); // значок градуса
            }
            rotating = true;  // reset the debouncer
            if (encoderR) {
              Timer2Temp += 0.1;
              encoderR = false;
            }
            if (encoderL) {
              Timer2Temp -= 0.1;
              encoderL = false;
            }
            Timer2Temp = constrain(Timer2Temp, 10, 35); // крайние значения
          }
          while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
          if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера
            EEPROM_float_write(Timer2TempEEaddr, Timer2Temp);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }
          else { // если не нажата - используем старую температуру
            Timer2Temp = EEPROM_float_read(Timer2TempEEaddr);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }      
 
        }
        else // если при установке времени выбрано "No"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
          Timer2Enabled = false;
          EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
          Timer2Hours = EEPROM.read(Timer2HoursEEaddr);
          Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr);
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 2 out
 
    // ====== пункт 3 - установка Timer3
    case 3:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP TIMER B")); 
      delay(200);
      Hours=Timer3Hours;
      Minutes=Timer3Minutes;
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo) // если при установке времени выбрано "Yes"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          Timer3Hours = Hours;
          Timer3Minutes = Minutes;
          Timer3Enabled = true;
          EEPROM.write(Timer3HoursEEaddr, Timer3Hours);
          EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes);
          EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
 
          MenuTimeoutTimer = 10; //таймер таймаута, секунд
          lcd.clear();
          lcd.setCursor(0, 0); //инфо на LCD
          lcd.print(F("Timer B Temp.Set")); 
          delay(200);
          do {
            lcd.setCursor(0,1);
            if (blink500ms) {
              lcd.print(F("     ")); 
            }
            else {
              lcd.print(Timer3Temp, 1); 
              lcd.write(0x02); // значок градуса
            }
            rotating = true;  // reset the debouncer
            if (encoderR) {
              Timer3Temp += 0.1;
              encoderR = false;
            }
            if (encoderL) {
              Timer3Temp -= 0.1;
              encoderL = false;
            }
            Timer3Temp = constrain(Timer3Temp, 10, 35); // крайние значения
          }
          while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
          if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера
            EEPROM_float_write(Timer3TempEEaddr, Timer3Temp);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }
          else { // если не нажата - используем старую температуру
            Timer3Temp = EEPROM_float_read(Timer3TempEEaddr);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }      
 
        }
        else // если при установке времени выбрано "No"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
          Timer3Enabled = false;
          EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
          Timer3Hours = EEPROM.read(Timer3HoursEEaddr);
          Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr);
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 3 out

    // ====== пункт 4 - установка Timer4
    case 4:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP TIMER H")); 
      delay(200);
      Hours=Timer4Hours;
      Minutes=Timer4Minutes;
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo) // если при установке времени выбрано "Yes"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          Timer4Hours = Hours;
          Timer4Minutes = Minutes;
          Timer4Enabled = true;
          EEPROM.write(Timer4HoursEEaddr, Timer4Hours);
          EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes);
          EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
 
          MenuTimeoutTimer = 10; //таймер таймаута, секунд
          lcd.clear();
          lcd.setCursor(0, 0); //инфо на LCD
          lcd.print(F("Timer H Temp.Set")); 
          delay(200);
          do {
            lcd.setCursor(0,1);
            if (blink500ms) {
              lcd.print(F("     ")); 
            }
            else {
              lcd.print(Timer4Temp, 1); 
              lcd.write(0x02); // значок градуса
            }
            rotating = true;  // reset the debouncer
            if (encoderR) {
              Timer4Temp += 0.1;
              encoderR = false;
            }
            if (encoderL) {
              Timer4Temp -= 0.1;
              encoderL = false;
            }
            Timer4Temp = constrain(Timer4Temp, 10, 35); // крайние значения
          }
          while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
          if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера
            EEPROM_float_write(Timer4TempEEaddr, Timer4Temp);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }
          else { // если не нажата - используем старую температуру
            Timer4Temp = EEPROM_float_read(Timer4TempEEaddr);
            if (BeepEnabled) {
              tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
            }
          }      
 
        }
        else // если при установке времени выбрано "No"
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
          Timer4Enabled = false;
          EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
          Timer4Hours = EEPROM.read(Timer4HoursEEaddr);
          Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr);
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 4 out
    
    // ====== пункт 5 - установка RTC
    case 5:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP CLOCK")); 
      delay(200);
      RTC.readClock();
      Hours=RTC.getHours();
      Minutes=RTC.getMinutes();
      SetYesNo = false;
      PrintYesNo = true;
      SetTime(0,1); // в позиции 0,1 - запрос ввода времени
      if (MenuTimeoutTimer != 0) {
        if (SetYesNo)
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
          }
          RTC.setHours(Hours);
          RTC.setMinutes(Minutes);
          RTC.setSeconds(0);
          RTC.setClock();
          RTC.start();   //старт часов
        }
        else
        {
          if (BeepEnabled) {
            tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
          }
        }
      }
      else {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 5 out
 
    // ====== пункт 6 - установка гистерезиса
    case 6:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      HysteresisOld = Hysteresis;
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP HYSTERESIS")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print("   "); 
        }
        else {
          lcd.print(Hysteresis, 1); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          Hysteresis += 0.1;
          encoderR = false;
        }
        if (encoderL) {
          Hysteresis -= 0.1;
          encoderL = false;
        }
        Hysteresis = constrain(Hysteresis, 0.1, 1); // крайние значения
      }
      while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
      if (MenuTimeoutTimer != 0) {
        EEPROM_float_write(HysteresisEEaddr, Hysteresis); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        Hysteresis = HysteresisOld;
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 6 out
 
    // ====== пункт 7 - установка коррекции температуры
    case 7:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SETUP T-CORRECT ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print(F("    ")); 
        }
        else {
          if (TemperatureCorr >= 0) {
            lcd.print(F("+"));
          }
 
          lcd.print(TemperatureCorr, 1); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          TemperatureCorr += 0.1;
          encoderR = false;
        }
        if (encoderL) {
          TemperatureCorr -= 0.1;
          encoderL = false;
        }
        TemperatureCorr = constrain(TemperatureCorr, -8, 8); // крайние значения
      }
      while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr);
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 7 out     
 
    // ====== пункт 8 - вкл/выкл звука
    case 8:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("SOUND SET       ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (BeepEnabled) {
          lcd.print(F("BEEP ON         ")); 
        }     
        else {
          lcd.print(F("BEEP OFF        ")); 
        }
 
        rotating = true;  // reset the debouncer
        if ((encoderR)^(encoderL)) {
          BeepEnabled = !BeepEnabled;
          encoderR = false;
          encoderL = false;
        }
      }
      while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
        EEPROM.write(BeepEnabledEEaddr, BeepEnabled);
      }
      if (MenuTimeoutTimer == 0) {
        BeepEnabled = EEPROM.read(BeepEnabledEEaddr);
      }
      break; // case 8 out
 
      // ====== пункт 9 - установка коррекции температуры 
    case 9:
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      lcd.clear();
      lcd.setCursor(0, 0); //инфо на LCD
      lcd.print(F("ALARM-TEMP SET  ")); 
      delay(200);
      do {
        lcd.setCursor(0,1);
        if (blink500ms) {
          lcd.print(F("    ")); 
        }
        else {
          if (AlarmTemp >= 0) {
            lcd.print(F("+"));
          }
 
          lcd.print(AlarmTemp, 0); 
          lcd.write(0x02); // значок градуса
        }
        rotating = true;  // reset the debouncer
        if (encoderR) {
          AlarmTemp += 1;
          encoderR = false;
        }
        if (encoderL) {
          AlarmTemp -= 1;
          encoderL = false;
        }
        AlarmTemp = constrain(AlarmTemp, 15, 30); // крайние значения
      }
      while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
 
      if (MenuTimeoutTimer != 0) {
        EEPROM_float_write(AlarmTempEEaddr, AlarmTemp); // запись в ЕЕПРОМ
        if (BeepEnabled) {
          tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES"
        }
      }
      else {
        AlarmTemp = EEPROM_float_read(AlarmTempEEaddr);
        if (BeepEnabled) {
          tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO"
        }
      }
      break; // case 9 out
       
    }
 
    delay(200);
    lcd.clear();
  }
}
 
// ===== SUBROUTINES ==================================================================
 
// ========================================
void SetTime(char x, char y)
{
  // ========= set hours
  SetH = true;
  do {
    PrintRTC(x,y);
    rotating = true;  // reset the debouncer
    if (encoderR) {
      Hours += 1;
      if(Hours > 23) {
        Hours = 0;
      };
      encoderR = false;
    }
    if (encoderL) {
      Hours -= 1;
      if(Hours < 0) {
        Hours = 23;
      };
      encoderL = false;
    }
  }
  while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
  if (BeepEnabled) {
    tone(BeepPin,4000,50); //звук "YES"
  }
  SetH = false;
  delay(200);
  // ========= set minutes
  SetM = true;
  do {
    PrintRTC(0,1);
    rotating = true;  // reset the debouncer
    if (encoderR) {
      Minutes += 1;
      if(Minutes > 59) {
        Minutes = 0;
      };
      encoderR = false;
    }
    if (encoderL) {
      Minutes -= 1;
      if(Minutes < 0) {
        Minutes = 59;
      };
      encoderL = false;
    }
  }
  while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
  if (BeepEnabled) {
    tone(BeepPin,4000,50); //звук "YES"
  }
  if (PrintYesNo) {
    SetM = false;
    delay(200);
    // ========= set yes-no
    SetYesNo = false;
    do {
      PrintRTC(0,1);
      rotating = true;  // reset the debouncer
      if ((encoderR)||(encoderL)) {
        SetYesNo = !SetYesNo;
        encoderR = false;
        encoderL = false;
      }
    }
    while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
    delay(200);
  }
 
}
 
// ========================================
void PrintRTC(char x, char y)
{
  lcd.setCursor(x,y);
  if (SetH&&blink500ms) {
    lcd.print(F("  "));
  }
  else {
    if (Hours < 10) {
      lcd.print(F("0"));
    }   
    lcd.print(Hours);
  }
 
  // мигающее двоеточие, если не в режиме установки времени
  if (!(SetH||SetM||PrintYesNo||blink500ms))
  {
    lcd.print(F(" "));
  }
  else {
    lcd.print(F(":"));
  }
 
  if (SetM&&blink500ms) {
    lcd.print(F("  "));
  }
  else {
    if (Minutes < 10) {
      lcd.print(F("0"));
    }   
    lcd.print(Minutes);
  }
  lcd.print(F(" "));
 
  if (PrintYesNo) {
    lcd.print(F("["));
    if (!(SetH||SetM||blink500ms))
    {
      lcd.print(F("   "));
    }
    else {
      if (SetYesNo)
      {
        lcd.print(F("YES"));
      }
      else {
        lcd.print(F("NO "));
      }
    }
    lcd.print(F("]"));
  }
 
}
 
// ========= чтение/запись float в EE =====
void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
 
float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{  
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
  return y[0];
}
// ========================================
 
// ============================ Encoder interrupts =============================
// Interrupt on A changing state
void doEncoderA(){
  if ( rotating ) {
    delay (1) ;  // wait a little until the bouncing is done
  }
  // Test transition, did things really change?
  if( digitalRead(encoderA) != A_set ) {  // debounce once more
    A_set = !A_set;
    // adjust counter + if A leads B
    if ( A_set && !B_set )
    {
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
      encoderR = true;
      rotating = false;  // no more debouncing until loop() hits again
    }
  }
}
// Interrupt on B changing state, same as A above
void doEncoderB(){
  if ( rotating ) {
    delay (1);
  }
  if( digitalRead(encoderB) != B_set ) {
    B_set = !B_set;
    //  adjust counter - 1 if B leads A
    if( B_set && !A_set ) {
      MenuTimeoutTimer = 10; //таймер таймаута, секунд
      if (BeepEnabled) {
        tone(BeepPin,4000,5);
      }
      encoderL = true;
      rotating = false;
    }
  }
}
// ============================ Timer0 interrupt =============================
// run every 500ms
void timerIsr()
{
  blink500ms = !blink500ms; // инверсия мерцающего бита
  if(blink500ms) {
    plus1sec = true; // ежесекундно взводится
    if (TstatTimer != 0) {
      TstatTimer --; // ежесекундный декремент этого таймера
    }
    if (MenuTimeoutTimer != 0) {
      MenuTimeoutTimer --; // ежесекундный декремент этого таймера
    }
  }
}

 

R2PM
Offline
Зарегистрирован: 28.12.2015
bagotu
Offline
Зарегистрирован: 15.10.2016

надо воспользоваться этим:

 //#define serialenabled // раскомментировать для выдачи в порт отладочной инфы

и в мониторе порта проверить показания датчика

 

R2PM
Offline
Зарегистрирован: 28.12.2015

bagotu пишет:

надо воспользоваться этим:

 //#define serialenabled // раскомментировать для выдачи в порт отладочной инфы

и в мониторе порта проверить показания датчика

 

Доброе время суток!!!!

Спасибо за ответ! Какую команду подавать  в мониторинге порта?

Что на экране при работающем модуле. Спасибо.

Виктор

bagotu
Offline
Зарегистрирован: 15.10.2016

ни какую. Там либо будут показания датчика температуры либо нули.

R2PM
Offline
Зарегистрирован: 28.12.2015

[quote=bagotu]

ни какую. Там либо будут показания датчика температуры либо нули.

[/quote

ПОДСКАЖИТЕ - ЧТО НА ЭКРАНЕ В ШТАТНОМ РЕЖИМЕ??

dwk26111974
Offline
Зарегистрирован: 11.07.2016

У меня на одним из термостатов была такая же проблема - оказалось энкодер был бракованный...сменил-заработало.

В штатном режиме на ЛСД- показания: часы, температура с датчика 

                                                  Р1Р2Р3Р4 (программы) , заданная температура

dwk26111974
Offline
Зарегистрирован: 11.07.2016
#include <hd44780.h>
0003 #include <hd44780ioClass/hd44780_I2Cexp.h>

Выдает ошибку..а какую библиотеку использовали?

 

dwk26111974
Offline
Зарегистрирован: 11.07.2016

Ошибочка))) не Р1, а Т1Т2Т3Т4

R2PM
Offline
Зарегистрирован: 28.12.2015

dwk26111974 пишет:

#include <hd44780.h>
0003 #include <hd44780ioClass/hd44780_I2Cexp.h>

Выдает ошибку..а какую библиотеку использовали?

 

Доброе время суток!!!!

Спасибо за отвкт!!!! библиотека стандартная из среды 1.6.13, остальные погружал

Так у меня часы то тикают - нет промблем, в нижней строчке правом углу с энкодера идёт изменение величины температуры, а вверху одни нули

Сейчас дома запускаю мониторинг порта.

Виктор

R2PM
Offline
Зарегистрирован: 28.12.2015

Всем привет!!!

Мониторинг порта выдаёт 0.0 - что и вижу на экране.

Вот блин дела - не пойму что не так, с датчика с вывода данных резистор подтягивающий есть, сам вывод подключен к А1, может что ешё надо подключить, да и реле не срабатывает, что с Д12, нет надо с "бубном". Кто знает "пните" в нужном направлении.

С уважением Виктор R2PM

bagotu
Offline
Зарегистрирован: 15.10.2016

по дисплею

ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.

в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,

а затем внести их в скетч.

по датчику.

в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))

вам там по месту виднее

R2PM
Offline
Зарегистрирован: 28.12.2015

bagotu пишет:

по дисплею

ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.

в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,

а затем внести их в скетч.

по датчику.

в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))

вам там по месту виднее

Так весь прикол, что в другой кострукции он работает, он же , фикус да и только, Объясните пожалуста LCD  здесь причём он всё отображает, или я что то "не догоняю"

Виктор

bagotu
Offline
Зарегистрирован: 15.10.2016

это к этому:

dwk26111974 пишет:

 

#include <hd44780.h>
0003 #include <hd44780ioClass/hd44780_I2Cexp.h>

Выдает ошибку..а какую библиотеку использовали?

LCD к градуснику не причем.

надо внимательно просмотреть и прозвонить цепи. бывает.

может отвалилось чего...