Управление тремя тенами и насосом для электрокотла.нужна помощь
- Войдите на сайт для отправки комментариев
Ср, 30/01/2019 - 15:05
Помогите найти схему и код для управления электрокотлом.необходимо с помощью датчиков температуры управлять тэнами котла и насосом.
Находил подобный скейтч,но не нашел схемы подключения устройств к пинам Ардуино.
Искать помогает гугол. Тут помогают понять.
А если нет желания понимать самому - можно нанять того, кто понимает. С такими проектами обращаются в раздел "Ищу исполнителя"
Дружище! С такими вопросами в котел лучше не лезть. Совсем. Поверь, здоровее будешь.
// Подключаем библиотеку для работы с шиной OneWire
// Термометр будет подключен на Pin2
#include
OneWire oneWire(2);//котел
OneWire oneWireOut(3);//Комната
//OneWire oneWireOut2(12);//Веранда - не контролируемые
//OneWire oneWireOut3(13);//Улица - не контролируемые
//Подключаем библиотеку для работы с термометром
#include
//Создаем объект 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 lcd(8, 9, 4, 5, 6, 7);//Только Английская раскладка
#include
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
//Реле подключено к пину 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 (KeyValue2ButtonUp_LOW) {KeyNum=1;}//Up
if (KeyValue2ButtonDown_LOW) {KeyNum=2;}//Down
if (KeyValue2ButtonLeft_LOW) {KeyNum=3;}//Left
if (KeyValue2<=ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
if (KeyValue2ButtonSelect_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 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 // 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); //Отключение подсветки
}
}
Ну теперь буду знать )))
жесть...
Это ты про код?
Особенно скил ВСТАВКА КОДА .