Управление обогревом комнаты при помощи Arduino и Dallas18B20

Slaiterx
Offline
Зарегистрирован: 05.05.2016

Про кнопки и как их сканировать описанной в шапке темы

Back
Offline
Зарегистрирован: 22.09.2016

Подскажите пожалуйтса, как сделать чтобы реле срабатывало если температура ниже заданной (а не выше, как в скетче) - после того как сработает реле, было включено 5 минут потом отключалось, через 10 минут запрашивалась температура с датчика и повтор...?

Хочется данный скетч применить для обогрева воздуха в вентиляции (5 минут нужно чтобы трубы и обогрев не раскалялись), там рекупелятор стоит и 5 минут хватит чтобы обогревать постепенно воздух ...

Помогите поправить скетч:

// Подключаем библиотеку для работы с шиной OneWire
// Термометр будет подключен на Pin2
#include <OneWire.h>
OneWire oneWire(2);

//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>

//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);

//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
float temp1=0; //переменная для текущего значения температуры
int setTmp=0; // переменная для заданного значения температуры

//Подключаем LCD-дисплей
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//Подсветка управляется через пин D10
#define BACKLIGHT_PIN 10

//Создаем переменную для хранения состояния подсветки
boolean backlightStatus = 1;

// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>

//Реле подключено к пину D11
#define RELAY_PIN 11

//Объявим переменную для хранения состояния реле
boolean relayStatus1=LOW;

//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры

//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры 
#define ButtonUp_LOW 140
#define ButtonUp_HIGH 170
#define ButtonDown_LOW 320
#define ButtonDown_HIGH 370
#define ButtonLeft_LOW 500
#define ButtonLeft_HIGH 550
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 50
#define ButtonSelect_LOW 730
#define ButtonSelect_HIGH 780

void setup() {

//Настроим пин для управления реле
  pinMode(RELAY_PIN,OUTPUT);
  digitalWrite(RELAY_PIN,LOW);

//Считаем из постоянной памяти заданную температуру
  setTmp=EEPROM_read_byte(0);

//Инициализируем термодатчик и установим разрешающую способность 12 бит (обычно она установлена по умолчанию, так что последнюю строчку можно опустить)
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);
  sensors.setResolution(12);
    
//Настроим подсветку дисплея
  pinMode(BACKLIGHT_PIN, OUTPUT);
  digitalWrite(BACKLIGHT_PIN, backlightStatus);

//Выведем на дисплей стартовое сообщение на 2 секунды
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Temp. Controller");
  lcd.setCursor(0, 1);
  lcd.print("      v1.0      ");
  delay(2000);

// выведем на дисплей заданное значение температуры на 2 секунды
  lcd.setCursor(0, 1);
  lcd.print("  Set temp:     ");
  lcd.setCursor(12,1);
  lcd.print(setTmp);
  delay(2000);

//Очистим дисплей
  lcd.begin(16, 2);
}



//Определим функцию для опроса аналоговой клавиатуры
//Функция опроса клавиатуры, принимает адрес пина, к которому подключена клавиатура, и возвращает код клавиши:
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT

int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;

//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни  одна клавиша.

do {
KeyValue1=analogRead(keyPin);
 KeyValue2=analogRead(keyPin);
 } while (KeyValue1==KeyValue2&&KeyValue2!=1023);

//Интерпретируем полученное значение и определяем код нажатой клавиши
 if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
 if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
 if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
 if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
 if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select

//Возвращаем код нажатой клавиши
return KeyNum;
}

//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down

void setTemperature() {

  int keyCode=0;

//выводим на дисплей заданное значение температуры  
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print("  Setting temp  ");
  lcd.setCursor(7, 1);
  lcd.print(setTmp);

//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){setTmp++;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp);}
  if (keyCode==2){setTmp--;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp);}
} while (keyCode!=5 && keyCode!=4);
  delay(200);

//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode==5) {EEPROM_write_byte(0, setTmp);}
if (keyCode==4) {setTmp = EEPROM_read_byte(0);}
}

void loop() {

//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1) {
    previousMillis1 = currentMillis1;  

//Запуск процедуры измерения температуры
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);

delay(750); // задержка для обработки информации внутри термометра, в данном случае можно не задавать

//Считывание значения температуры
  sensors.getAddress(tempDeviceAddress, 0);
  temp1=sensors.getTempC(tempDeviceAddress);

// Вывод текущего значения температуры на дисплей
  lcd.setCursor(0, 0);
  lcd.print("  Current temp  ");
  lcd.setCursor(5, 1);
  lcd.print(temp1);
//  Serial.println(temp1,4);
}

//Проверка условия включения/выключения нагревателя
if (temp1<setTmp&&relayStatus1==LOW){relayStatus1=HIGH; digitalWrite(RELAY_PIN,HIGH);}
if (temp1>setTmp&&relayStatus1==HIGH){relayStatus1=LOW; digitalWrite(RELAY_PIN,LOW);}

// Опрос клавиатуры 
int Feature = ReadKey(KEYPAD_PIN);
if (Feature==1 ) {backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Включение подсветки
if (Feature==2 ) {backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Отключение подсветки
if (Feature==5 ) {delay(200);setTemperature();} //Переход к редактированию заданной температуры
}

 

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

Почему не настраивается температура ниже 100 градусов, что за это отвечает?

vbsend@mail.ru
Offline
Зарегистрирован: 26.05.2017

Всем здрасти.

Использовал вашу идею для своих нужд. Отлично работает. Пришлось правда скорректировать програмку, но в целом использовал оригинал.

Заменил мозг в конвекторе (родные мозги сгорели) и по накатанной сделал управление отоплением в дачном домике, на основе водяного с котлом. Планирую вписаться под газ. Но это пока только задумка.

Всем огромное спасибо за статью.

Мой код для конвектора:

// Подключаем библиотеку для работы с шиной OneWire
// Термометр будет подключен на Pin2
#include <OneWire.h>
OneWire oneWire(2);
//OneWire oneWireOut(3);

//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>

//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);


//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
DeviceAddress tempDeviceAddressOut;
float temp1=0; //переменная для текущего значения температуры
float temp2=0;
int setTmp=0; // переменная для заданного значения температуры
int setLed=0;

//Подключаем LCD-дисплей
//#include <LiquidCrystal.h>
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//Только Английская раскладка
#include <LiquidCrystal_1602_RUS.h>
LiquidCrystal_1602_RUS lcd(8, 9, 4, 5, 6, 7 );//For LCD Keypad Shield

//Подсветка управляется через пин D10
#define BACKLIGHT_PIN 10

//Создаем переменную для хранения состояния подсветки
boolean backlightStatus = 1;

// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>

//Реле подключено к пину D11
#define RELAY_PIN 11

//Объявим переменную для хранения состояния реле
boolean relayStatus1=LOW;

//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры

//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры 
#define ButtonUp_LOW 110
#define ButtonUp_HIGH 140
#define ButtonDown_LOW 290
#define ButtonDown_HIGH 310
#define ButtonLeft_LOW 460
#define ButtonLeft_HIGH 490
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 10
#define ButtonSelect_LOW 700
#define ButtonSelect_HIGH 730

void setup() {

//Настроим пин для управления реле
  pinMode(RELAY_PIN,OUTPUT);
  digitalWrite(RELAY_PIN,LOW);

//Считаем из постоянной памяти заданную температуру
  setTmp=EEPROM_read_byte(0);

//Инициализируем термодатчик и установим разрешающую способность 12 бит (обычно она установлена по умолчанию, так что последнюю строчку можно опустить)
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);
  sensors.setResolution(12);
 
//Настроим подсветку дисплея
  pinMode(BACKLIGHT_PIN, OUTPUT);
  digitalWrite(BACKLIGHT_PIN, backlightStatus);

//Выведем на дисплей стартовое сообщение на 2 секунды
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(L"Контроллер темп.");
  lcd.setCursor(0, 1);
  lcd.print("-=SVN=-     v1.0");
  delay(2000);

// выведем на дисплей заданное значение температуры на 2 секунды
  lcd.setCursor(0, 1);
  lcd.print(L"Устан.Темп.:     ");
  lcd.setCursor(12,1);
  lcd.print(setTmp);
  delay(2000);

//Очистим дисплей
  lcd.begin(16, 2);
}



//Определим функцию для опроса аналоговой клавиатуры
//Функция опроса клавиатуры, принимает адрес пина, к которому подключена клавиатура, и возвращает код клавиши:
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT

int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;

//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни  одна клавиша.

do {
KeyValue1=analogRead(keyPin);
 KeyValue2=analogRead(keyPin);
 } while (KeyValue1==KeyValue2&&KeyValue2!=1023);

//Интерпретируем полученное значение и определяем код нажатой клавиши
 if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
 if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
 if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
 if (KeyValue2<=ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
 if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select

//Возвращаем код нажатой клавиши
return KeyNum;
}

//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down

void setTemperature() {

  int keyCode=0;

//выводим на дисплей заданное значение температуры  
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print(L"Устан. Темпер.  ");
  lcd.setCursor(7, 1);
  lcd.print(setTmp);
  digitalWrite(RELAY_PIN,LOW);
  setLed=0;
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){
    setTmp++;
    if (setTmp>45){setTmp=45;}//Проверка максимальной температуры
    delay(200);
    lcd.setCursor(7, 1);
    lcd.print(setTmp);}
  if (keyCode==2){
    setTmp--;
    if (setTmp<0) {setTmp=0;}//Проверка минимальной темературы
    if (setTmp<10){
      lcd.setCursor(8, 1);
      lcd.print(" ");}
    delay(200);
    lcd.setCursor(7, 1);
    lcd.print(setTmp);}
} while (keyCode!=3 && keyCode!=4);
  delay(300);

//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode==4) {EEPROM_write_byte(0, setTmp);}
if (keyCode==3) {setTmp = EEPROM_read_byte(0);}
}

void loop() {

//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1) {
    previousMillis1 = currentMillis1;  

//Запуск процедуры измерения температуры
  //sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  //sensors.setWaitForConversion(true);
  

//delay(750); // задержка для обработки информации внутри термометра, в данном случае можно не задавать

//Считывание значения температуры
  sensors.getAddress(tempDeviceAddress, 0);
  temp1=sensors.getTempC(tempDeviceAddress);
  
  
// Вывод текущего значения температуры на дисплей
  lcd.setCursor(0, 0);
  lcd.print(L"Температура   ");
  lcd.setCursor(14, 0);
  lcd.print(setTmp);
  lcd.setCursor(5, 1);
  lcd.print("T=");
  lcd.print(temp1);
  setLed++;
//  Serial.println(temp1,4);
}

//Проверка условия включения/выключения нагревателя
if (temp1+1<setTmp&&relayStatus1==LOW){
  relayStatus1=HIGH; 
  digitalWrite(RELAY_PIN,HIGH);
  lcd.setCursor(15, 1);
  lcd.print("P");}
if (temp1>setTmp&&relayStatus1==HIGH){
  relayStatus1=LOW; 
  digitalWrite(RELAY_PIN,LOW);
  lcd.setCursor(15, 1);
  lcd.print(" ");}


// Опрос клавиатуры 
int Feature = ReadKey(KEYPAD_PIN);
if (Feature==1 ) {backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);;setLed=0;} //Включение подсветки
if (Feature==2 ) {backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Отключение подсветки
if (Feature==5 ) {delay(200);setTemperature();} //Переход к редактированию заданной температуры
if (setLed>60){
    setLed=61;
    backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus); //Отключение подсветки
}
}

Мой код для Отопления с котлом:

// Подключаем библиотеку для работы с шиной OneWire
// Термометр будет подключен на Pin2
#include <OneWire.h>
OneWire oneWire(2);//котел
OneWire oneWireOut(3);//Комната
//OneWire oneWireOut2(12);//Веранда - не контролируемые
//OneWire oneWireOut3(13);//Улица - не контролируемые

//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>

//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);
DallasTemperature sensorsOut(&oneWireOut);
//DallasTemperature sensorsOut2(&oneWireOut2);
//DallasTemperature sensorsOut3(&oneWireOut3);


//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
DeviceAddress tempDeviceAddressOut;
float temp1=0; //переменная для текущего значения температуры
float temp2=0;
int setTmp=0; // переменная для заданного значения температуры
int setLed=0; // Таймер подсветки
int setNas=0; // Таймер работы насоса
int Nas=600; // Задержка работы насоса 10мин

//boolean setTmpD=HIGH;// переменная для заданного основного датика
//Подключаем LCD-дисплей
//#include <LiquidCrystal.h>
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//Только Английская раскладка
#include <LiquidCrystal_1602_RUS.h>
LiquidCrystal_1602_RUS lcd(8, 9, 4, 5, 6, 7 );//For LCD Keypad Shield

//Подсветка управляется через пин D10
#define BACKLIGHT_PIN 10

//Создаем переменную для хранения состояния подсветки
boolean backlightStatus = 1;

// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>

//Реле подключено к пину D11, D12, D13
#define RELAY_PIN1 11// 50% 1кВт
#define RELAY_PIN2 12// 100% 2кВт
#define RELAY_PIN3 13// насос циркуляционный

//Объявим переменную для хранения состояния реле
boolean relayStatus50=LOW;
boolean relayStatus100=LOW;
boolean VklOb=LOW;

//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры

//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры 
#define ButtonUp_LOW 110
#define ButtonUp_HIGH 140
#define ButtonDown_LOW 300
#define ButtonDown_HIGH 310
#define ButtonLeft_LOW 460
#define ButtonLeft_HIGH 490
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 10
#define ButtonSelect_LOW 700
#define ButtonSelect_HIGH 730

void setup() {
  Serial.begin(9600);
//Настроим пин для управления реле
  pinMode(RELAY_PIN1,OUTPUT);
  digitalWrite(RELAY_PIN1,LOW);
  pinMode(RELAY_PIN2,OUTPUT);
  digitalWrite(RELAY_PIN2,LOW);
  pinMode(RELAY_PIN3,OUTPUT);
  digitalWrite(RELAY_PIN3,LOW);
  
//Считаем из постоянной памяти заданную температуру
  setTmp=EEPROM_read_byte(0);//Температура
  //setTmpD=EEPROM_read_byte(1);//Датчик
  
//Инициализируем термодатчик и установим разрешающую способность 12 бит (обычно она установлена по умолчанию, так что последнюю строчку можно опустить)
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);
  sensors.setResolution(12);
  sensorsOut.begin();
  sensorsOut.getAddress(tempDeviceAddressOut, 0);
  sensorsOut.setResolution(12);
    
//Настроим подсветку дисплея
  pinMode(BACKLIGHT_PIN, OUTPUT);
  digitalWrite(BACKLIGHT_PIN, backlightStatus);

//Выведем на дисплей стартовое сообщение на 2 секунды
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(L"Контроллер темп.");
  lcd.setCursor(0, 1);
  lcd.print("  -=SVN=-   v3.0");
  delay(2000);

// выведем на дисплей заданное значение температуры на 2 секунды
  lcd.setCursor(0, 1);
  lcd.print(L"Устан.Темп.:     ");
  lcd.setCursor(12,1);
  lcd.print(setTmp);
  //if (setTmpD){lcd.print("Tk");} else {lcd.print("Ty");}
  delay(2000);

//Очистим дисплей
  lcd.begin(16, 2);
}



//Определим функцию для опроса аналоговой клавиатуры
//Функция опроса клавиатуры, принимает адрес пина, к которому подключена клавиатура, и возвращает код клавиши:
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT

int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;

//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни  одна клавиша.

do {
KeyValue1=analogRead(keyPin);
 KeyValue2=analogRead(keyPin);
 } while (KeyValue1==KeyValue2&&KeyValue2!=1023);

//Интерпретируем полученное значение и определяем код нажатой клавиши
 if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
 if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
 if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
 if (KeyValue2<=ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
 if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select

//Возвращаем код нажатой клавиши
return KeyNum;
}

//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down

void setTemperature() {

  int keyCode=0;
  
//выводим на дисплей заданное значение температуры  
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print(L"Устан. Темп.");
  lcd.setCursor(7, 1);
  lcd.print(setTmp);
  relayStatus100=LOW; 
  relayStatus50=LOW;
  digitalWrite(RELAY_PIN1,LOW);
  digitalWrite(RELAY_PIN2,LOW);
  digitalWrite(RELAY_PIN3,LOW);
  setLed=0;
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){
    setTmp++;
    if (setTmp>45){setTmp=45;}//Проверка максимальной температуры
    delay(100);
    lcd.setCursor(7, 1);
    lcd.print(setTmp);}
  if (keyCode==2){
    setTmp--;
    if (setTmp<10) {setTmp=10;}//Проверка минимальной темературы
    //if (setTmp<10){
    //  lcd.setCursor(8, 1);
    //  lcd.print(" ");}
    delay(100);
    lcd.setCursor(7, 1);
    lcd.print(setTmp);}
} while (keyCode!=3 && keyCode!=4);
  delay(300);

//По клавише Right – созраняем в EEPROM измененное значение

if (keyCode==4) {EEPROM_write_byte(0, setTmp);}

}

void loop() {

//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1) {
    previousMillis1 = currentMillis1;  

//Запуск процедуры измерения температуры
  //sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensorsOut.requestTemperatures();
  //sensors.setWaitForConversion(true);
  

//delay(750); // задержка для обработки информации внутри термометра, в данном случае можно не задавать

//Считывание значения температуры
  sensors.getAddress(tempDeviceAddress, 0);
  temp1=sensors.getTempC(tempDeviceAddress);
  
  sensorsOut.getAddress(tempDeviceAddressOut, 0);
  temp2=sensorsOut.getTempC(tempDeviceAddressOut);

// Вывод текущего значения температуры на дисплей
  lcd.setCursor(0, 0);
  lcd.print(L"Темпер.  ");
  lcd.setCursor(9, 0);
  lcd.print("P=");
  lcd.setCursor(0, 1);
  lcd.print("To=      ");
  lcd.setCursor(3,1);
  if (temp1>-127){lcd.print(temp1);} else {lcd.print("HET");delay(200);}
  //lcd.print("C");
  lcd.setCursor(7,1);
  lcd.print("  Tk=     ");
  lcd.setCursor(12,1);
  if (temp2>-127){lcd.print(temp2);} else {lcd.print("HET");delay(200);}
  setLed++;
  // что твориться... :)
  Serial.print(temp1);
  Serial.print("; ");
  Serial.print(temp2);
  Serial.print("; ");
  Serial.print(setTmp);
  Serial.print("; ");
 // if (setTmpD==HIGH){Serial.print("Tk ");} else {Serial.print("Ty ");}
 // Serial.print(setTmpD);
  Serial.print("; Rel50=");
  Serial.print(relayStatus50);
  Serial.print("; Rel100=");
  Serial.print(relayStatus100);
  Serial.print("; RelNas=");
  Serial.print(setNas);
  Serial.print("; VklOb=");
  Serial.println(VklOb);
}
//Контролируем комнату
//temp1 - котел
//temp2 - Комната
  if (temp1!=-127&&temp2!=-127){
    if (temp2<setTmp-1){VklOb=HIGH;}
    if (temp2>setTmp+1){VklOb=LOW;}
    
    if (VklOb==HIGH){
      
      //Проверка условия включения/выключения нагревателя 100%
      if (temp1<(50)&&relayStatus100==LOW&&relayStatus50==HIGH&&temp1!=-127){
        relayStatus100=HIGH; 
        relayStatus50=HIGH;
 //       digitalWrite(RELAY_PIN1,HIGH);
 //       digitalWrite(RELAY_PIN2,HIGH);
        lcd.setCursor(9, 0);
        lcd.print("P=100%");
      }
      if (temp1>50&&relayStatus100==HIGH&&temp1!=-127){
        relayStatus100=LOW; 
        relayStatus50=LOW;
 //       digitalWrite(RELAY_PIN1,LOW);
 //       digitalWrite(RELAY_PIN2,LOW);
        lcd.setCursor(9, 0);
        lcd.print("P=  0%");
      }
      
      //Проверка условия включения/выключения нагревателя 50%
      if (temp1<60-1&&relayStatus50==LOW&&temp1!=-127){
        relayStatus100=LOW;
        relayStatus50=HIGH; 
//        digitalWrite(RELAY_PIN2,LOW);
//        digitalWrite(RELAY_PIN1,HIGH);
        lcd.setCursor(9, 0);
        lcd.print("P= 50%");
      }
      if (temp1>60+1&&relayStatus50==HIGH&&temp1!=-127){
        relayStatus100=LOW;
        relayStatus50=LOW; 
//        digitalWrite(RELAY_PIN1,LOW);
//        digitalWrite(RELAY_PIN2,LOW);
        lcd.setCursor(9, 0);
        lcd.print("P=  0%");
      }


      if (relayStatus100==LOW&&relayStatus50==LOW){
      lcd.setCursor(9, 0);
      lcd.print("P=  0%");}
    }else{// Достигли температуру в комнате
        relayStatus100=LOW; 
        relayStatus50=LOW;
        lcd.setCursor(9, 0);
        lcd.print("P=  0%");
 //       digitalWrite(RELAY_PIN2,LOW);
 //       digitalWrite(RELAY_PIN1,LOW);
    }
  }else {//Не работают датчики
    relayStatus100=LOW; 
    relayStatus50=LOW;
    digitalWrite(RELAY_PIN1,LOW);
    digitalWrite(RELAY_PIN2,LOW);
    lcd.setCursor(0, 1);
    lcd.print(L"ERROR: Датчики!  ");
    lcd.setCursor(9, 0);
    lcd.print("P=  0%");
    delay(1000);
  }
if (relayStatus50==HIGH){
    digitalWrite(RELAY_PIN1,LOW);
    digitalWrite(RELAY_PIN2,HIGH);
}
if (relayStatus100==HIGH){
    digitalWrite(RELAY_PIN1,HIGH);
    digitalWrite(RELAY_PIN2,HIGH);
}
if (relayStatus100==LOW&&relayStatus50==LOW){
    digitalWrite(RELAY_PIN1,LOW);
    digitalWrite(RELAY_PIN2,LOW);
}
if (relayStatus100==HIGH||relayStatus50==HIGH){// Работа с насосом
  digitalWrite(RELAY_PIN3,HIGH);
  setNas=0;
}else{
  setNas++;
  if (setNas==Nas){
    setNas=Nas+1;
    digitalWrite(RELAY_PIN3,LOW);
  }
}

//if (temp1<setTmp-1&&relayStatus50==LOW&&temp1!=-127){
//  relayStatus50=HIGH; 
//  digitalWrite(RELAY_PIN2,LOW);
//  digitalWrite(RELAY_PIN1,HIGH);
//  lcd.setCursor(9, 0);
//  lcd.print("P= 50%");
//}
//if (temp1>setTmp+1&&relayStatus50==HIGH&&temp1!=-127){
//  relayStatus50=LOW; 
//  digitalWrite(RELAY_PIN1,LOW);
//  lcd.setCursor(9, 0);
//  lcd.print("P=  0%");
//}
  

// Опрос клавиатуры 
int Feature = ReadKey(KEYPAD_PIN);
if (Feature==1 ) {backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);setLed=0;} //Включение подсветки
if (Feature==2 ) {backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Отключение подсветки
if (Feature==5 ) {delay(200);setTemperature();} //Переход к редактированию заданной температуры
if (setLed>60){
    setLed=61;
    backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus); //Отключение подсветки
}
}

Решение с клавишами на управление:

m1tya52
Offline
Зарегистрирован: 29.04.2016

Не компилируется скетч вер.1.2 библиотеки брал с этой темы.

ver_1.2_dht22:30: error: 'DHT22' was not declared in this scope

 
C:\Documents and Settings\Admin\Рабочий стол\ver_1.2_dht22\ver_1.2_dht22.ino:108:17: note: in expansion of macro 'DHTTYPE'
 
C:\Documents and Settings\Admin\Рабочий стол\ver_1.2_dht22\void.ino: In function 'void setup()':
 
void:187: error: 'class DHT' has no member named 'begin'
 
C:\Documents and Settings\Admin\Рабочий стол\ver_1.2_dht22\void.ino: In function 'void loop()':
 
void:226: error: 'class DHT' has no member named 'readTemperature'
evgengrebenyk
Offline
Зарегистрирован: 30.12.2017

Добрый день!

Если не сложно, скиньте схемку.

Заранее благодарен!

Xpom87
Offline
Зарегистрирован: 29.01.2019

Здравствуйте! Очень интересен ваш код под котел отопления. Если вас не затруднит,скиньте, пожалуйста,схему подключения и необходимые материалы.

m1tya52
Offline
Зарегистрирован: 29.04.2016

Читайте комментарии в скетче, там всё расписано куда что подключать.

Xpom87
Offline
Зарегистрирован: 29.01.2019

СПАСИБО,я уже начал разбираться,хотя есть несколько не очень понятных мне моментов