имеется Arduino uno Lcd shild 1602 с кнопками датчик температуры даллас 18b20 и DHT11 три твердотельные реле и одно обычное для насоса. Имеется твердотопливный котел с тремя тэнами и циркуляционный насос Скетч я нашол моленько не подходит хотелось бы чтобы работало все это следующим образом датчик DHT11 стоял внутри дома и читал температуру в помещении и и относительно этой температуры(нужно чтобы регулировалась в пределах например +10 до +30 градусов) включал тэны а даллас 18b20 стоял на котле и ограничивал максимальную температуру нагрева котла(нужно чтобы регулировалась например от +50 до +80 градусов) и включал циркуляционный насос(нужно чтобы регулировалась например от +30 градусов)и если температура в помещении поднималась до заданной то все тэны отключались ну а насос продолжал работать пока теплоноситель не остывал ниже заданной температуры включения насоса Код (C++): // Подключаем библиотеку для работы с шиной OneWire // Термометр будет подключен на Pin2 #include <OneWire.h> OneWire oneWire(2); //Подключаем библиотеку для работы с термометром #include <DallasTemperature.h> //Создаем объект sensors, подключенный по OneWire DallasTemperature sensors(&oneWire); //Создаем переменные для работы с термометром DeviceAddress temp1DeviceAddress;//переменная для хранения адреса датчика DeviceAddress temp2DeviceAddress; //второй информационный датчик float temp1=0; //переменная для текущего значения температуры 1 float temp2=0; //переменная для текущего значения температуры 2 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 RELAY1 11 #define RELAY2 12 #define RELAY3 13 //Объявим переменную для хранения состояния реле boolean relayStatus1=LOW; boolean relayStatus2=LOW; boolean relayStatus3=LOW; //Объявим переменные для задания задержки long previousMillis1 = 0; long interval1 = 2000; // интервал опроса датчиков температуры //Аналоговая клавиатура подключена к пину A0 #define KEYPAD_PIN A0 //Определим значения на аналоговом входе для клавиатуры #define ButtonUp_LOW 140 #define ButtonUp_HIGH 145 #define ButtonDown_LOW 324 #define ButtonDown_HIGH 330 #define ButtonLeft_LOW 503 #define ButtonLeft_HIGH 509 #define ButtonRight_LOW 0 #define ButtonRight_HIGH 5 #define ButtonSelect_LOW 740 #define ButtonSelect_HIGH 745 void setup() { //Настроим пин для управления реле pinMode(RELAY1,OUTPUT); pinMode(RELAY2,OUTPUT); pinMode(RELAY3,OUTPUT); digitalWrite(RELAY1,LOW); digitalWrite(RELAY2,LOW); digitalWrite(RELAY3,LOW); //Считаем из постоянной памяти заданную температуру setTmp=EEPROM_read_byte(0); //Инициализируем термодатчик и установим разрешающую способность 12 бит //(обычно она установлена по умолчанию, так что последнюю строчку //можно опустить) sensors.begin(); sensors.getAddress(temp1DeviceAddress, 0); temp1=sensors.getTempC(temp1DeviceAddress); sensors.getAddress(temp2DeviceAddress, 1); temp2=sensors.getTempC(temp2DeviceAddress); // 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.1 "); delay(1500); // выведем на дисплей заданное значение температуры на 2 секунды lcd.setCursor(0, 1); lcd.print(" Set temp: "); lcd.setCursor(12,1); lcd.print(setTmp); delay(1500); //Очистим дисплей 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() { lcd.begin(16,2); int keyCode=0; //выводим на дисплей заданное значение температуры 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(150);lcd.setCursor(7, 1);lcd.print(setTmp);} if (keyCode==2){setTmp--;delay(150);lcd.setCursor(7, 1);lcd.print(setTmp);} //lcd.begin(16,2); } while (keyCode!=5 && keyCode!=4); delay(200); //lcd.begin(16, 2); //По клавише 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(250) // задержка для обработки информации внутри термометра, //в данном случае можно не задавать //Считывание значения температуры sensors.getAddress(temp1DeviceAddress, 0); temp1=sensors.getTempC(temp1DeviceAddress); sensors.getAddress(temp2DeviceAddress, 1); temp2=sensors.getTempC(temp2DeviceAddress); // Вывод текущего значения температуры на дисплей lcd.setCursor(0, 0); lcd.print("Current"); lcd.setCursor(0, 1); lcd.print("T="); lcd.print(temp1); lcd.print("C"); lcd.setCursor(9, 1); lcd.print("Ty"); lcd.print(temp2); } //Проверка условия включения/выключения нагревателя if (temp1<setTmp&&relayStatus1==LOW) {relayStatus1=HIGH; digitalWrite(RELAY1,HIGH); lcd.setCursor(10, 0); lcd.print("P= 35%");} if (temp1>setTmp&&relayStatus1==HIGH) {relayStatus1=LOW; digitalWrite(RELAY1,LOW); lcd.setCursor(10, 0); lcd.print("P= 0%"); } delay(500); if (temp1+1<setTmp&&relayStatus2==LOW) {relayStatus2=HIGH; digitalWrite(RELAY2,HIGH); lcd.setCursor(10, 0); lcd.print("P= 70%");} if (temp1>setTmp&&relayStatus2==HIGH) {relayStatus2=LOW; digitalWrite(RELAY2,LOW); //lcd.begin(10, 2); } delay(500); if (temp1+2<setTmp&&relayStatus3==LOW) {relayStatus3=HIGH; digitalWrite(RELAY3,HIGH); lcd.setCursor(10, 0); lcd.print("P=100%");} if (temp1>setTmp&&relayStatus3==HIGH) {relayStatus3=LOW; digitalWrite(RELAY3,LOW); //lcd.begin(16, 2); } delay(200); // Опрос клавиатуры 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(); } } от этого скетча может че поможет
Если ваша задача актуальна, то напишите мне в скайп: rzd-nazarhik1 или Вк: https://vk.com/nazar_diadiun