Re: Терморегулятор с тремя реле
Да, соберу все как планировал и сразу отвечу, думаю в течении недели может меньше управлюсь
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → Терморегулятор с тремя реле
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Да, соберу все как планировал и сразу отвечу, думаю в течении недели может меньше управлюсь
Хорошо, буду ждать ответа.
оживлю тему)
тут отвечают?
собрал, спасибо.
но возникли вопросы - если вращать энкодер к 0 градусов, ниже 10 градусов, температура отображается не 09, 08, 07,...01, а 90, 80, 70, 60. если оставить, к примеру 60, что соответсвует в данном случае 06 градусов, перезагрузить ардуину, то на экране будет 6. вращаем энкодер на увеличение больше 10 градусов, потом обратно - такая же картина. 90, 80, 70, 60...
фото если надо приложу.
как это исправить?
Опубликуйте скетч который Вы используете.
использовал скетч с http://rcl-radio.ru/?p=130777
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <Wire.h>
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <EEPROM.h>
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
LiquidCrystal_I2C lcd(0x27,20,4);
Encoder myEnc(9, 8);// DT, CLK
OneWire ds1(2); // Вход датчика 18b20
OneWire ds2(3); // Вход датчика 18b20
OneWire ds3(4); // Вход датчика 18b20
unsigned long times,times1,oldPosition = -999,newPosition;
bool w,nagrev1,nagrev2,nagrev3;
byte a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
byte mesto2[8]={8,14,8,14,8,14};
byte mesto3[8]={0,0,1,1,2,2};
int menu1,t1_reg_on,t1_reg_of,t2_reg_on,t2_reg_of,t3_reg_on,t3_reg_of,t_reg;
float t_ds1,t_ds2,t_ds3;
bool n1,n2,n3;
void setup(){
Wire.begin();lcd.init();lcd.backlight();Serial.begin(9600);
MsTimer2::set(1, to_Timer);MsTimer2::start();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
pinMode(10,INPUT); // кнопка SW ENCODER
pinMode(5,OUTPUT); // выход реле 1
pinMode(6,OUTPUT); // выход реле 2
pinMode(7,OUTPUT); // выход реле 3
lcd.createChar(3,a4);
t1_reg_on = EEPROM.read(0);t1_reg_of = EEPROM.read(1);
t2_reg_on = EEPROM.read(2);t2_reg_of = EEPROM.read(3);
t3_reg_on = EEPROM.read(4);t3_reg_of = EEPROM.read(5);
digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);
}
void loop(){
///////// BUTTON ////////////////////////
if(digitalRead(10)==LOW){menu1++;if(menu1>5){menu1=0;}times1=millis();w=1;delay(300);}
///////// READ TEMP /////////////////////////////////////////////
if(millis()-times>1000){times=millis();t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);}// Измерять температуру 1 раз в секунду
///////// LCD BIG ///////////////////////////////////////////////
switch(menu1){
case 0: t_reg = t1_reg_on;break;
case 1: t_reg = t1_reg_of;break;
case 2: t_reg = t2_reg_on;break;
case 3: t_reg = t2_reg_of;break;
case 4: t_reg = t3_reg_on;break;
case 5: t_reg = t3_reg_of;break;
}
if(newPosition!=oldPosition){oldPosition=newPosition;t_reg=t_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();w=1;if(t_reg>99){t_reg=99;}if(t_reg<0){t_reg=0;}}
switch(menu1){
case 0: t1_reg_on = t_reg;break;
case 1: t1_reg_of = t_reg;break;
case 2: t2_reg_on = t_reg;break;
case 3: t2_reg_of = t_reg;break;
case 4: t3_reg_on = t_reg;break;
case 5: t3_reg_of = t_reg;break;
}
lcd.setCursor(0,0);lcd.print("T1=");lcd.print(t_ds1,1);
lcd.setCursor(0,1);lcd.print("T2=");lcd.print(t_ds2,1);
lcd.setCursor(0,2);lcd.print("T3=");lcd.print(t_ds3,1);
for(int i=0;i<6;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
lcd.setCursor(9,0);lcd.print("on=");lcd.print(t1_reg_on);lcd.setCursor(15,0);lcd.print("of=");lcd.print(t1_reg_of);
lcd.setCursor(9,1);lcd.print("on=");lcd.print(t2_reg_on);lcd.setCursor(15,1);lcd.print("of=");lcd.print(t2_reg_of);
lcd.setCursor(9,2);lcd.print("on=");lcd.print(t3_reg_on);lcd.setCursor(15,2);lcd.print("of=");lcd.print(t3_reg_of);
if(nagrev1==1){lcd.setCursor(0,3);lcd.print("R1_ON ");}else{lcd.setCursor(0,3);lcd.print("R1_OFF");}
if(nagrev2==1){lcd.setCursor(7,3);lcd.print("R2_ON ");}else{lcd.setCursor(7,3);lcd.print("R2_OFF");}
if(nagrev3==1){lcd.setCursor(14,3);lcd.print("R3_ON ");}else{lcd.setCursor(14,3);lcd.print("R3_OFF");}
///////// EEPROM ////////////////////////////////////////////////
if(millis()-times1>10000 && w==1){
EEPROM.update(0,t1_reg_on);EEPROM.update(1,t1_reg_of);
EEPROM.update(2,t2_reg_on);EEPROM.update(3,t2_reg_of);
EEPROM.update(4,t3_reg_on);EEPROM.update(5,t3_reg_of);
w=0;lcd.clear();}
///////////////////////////////////////////////////////////////////
if(t_ds1 <= t1_reg_on){n1=1;digitalWrite(5,HIGH);nagrev1=1;}
if(t_ds1 > t1_reg_on && t_ds1 < t1_reg_of && n1==1){digitalWrite(5,HIGH);nagrev1=1;}
if(t_ds1 >= t1_reg_of){n1=0;digitalWrite(5,LOW);nagrev1=0;}
if(t_ds2 <= t2_reg_on){n1=1;digitalWrite(6,HIGH);nagrev2=1;}
if(t_ds2 > t2_reg_on && t_ds2 < t2_reg_of && n2==1){digitalWrite(6,HIGH);nagrev2=1;}
if(t_ds2 >= t2_reg_of){n2=0;digitalWrite(6,LOW);nagrev2=0;}
if(t_ds3 <= t3_reg_on){n3=1;digitalWrite(7,HIGH);nagrev3=1;}
if(t_ds3 > t3_reg_on && t_ds3 < t3_reg_of && n3==1){digitalWrite(7,HIGH);nagrev3=1;}
if(t_ds3 >= t3_reg_of){n3=0;digitalWrite(7,LOW);nagrev3=0;}
}// end loop
float dsRead1(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds1.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds1.reset_search(); // Сброс поиска датчика
ds1.reset(); // Инициализация, выполняется сброс шины
ds1.select(addr[x]); // Обращение к датчику по адресу
ds1.write(0x44, 0); // Измерение температуры с переносом данных в память
ds1.reset(); // Инициализация, выполняется сброс шины
ds1.select(addr[x]); // Обращение к датчику по адресу
ds1.write(0xBE); // Обращение памяти
data[0] = ds1.read();// Чтение памяти byte low
data[1] = ds1.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
float dsRead2(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds2.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds2.reset_search(); // Сброс поиска датчика
ds2.reset(); // Инициализация, выполняется сброс шины
ds2.select(addr[x]); // Обращение к датчику по адресу
ds2.write(0x44, 0); // Измерение температуры с переносом данных в память
ds2.reset(); // Инициализация, выполняется сброс шины
ds2.select(addr[x]); // Обращение к датчику по адресу
ds2.write(0xBE); // Обращение памяти
data[0] = ds2.read();// Чтение памяти byte low
data[1] = ds2.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
float dsRead3(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds3.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds3.reset_search(); // Сброс поиска датчика
ds3.reset(); // Инициализация, выполняется сброс шины
ds3.select(addr[x]); // Обращение к датчику по адресу
ds3.write(0x44, 0); // Измерение температуры с переносом данных в память
ds3.reset(); // Инициализация, выполняется сброс шины
ds3.select(addr[x]); // Обращение к датчику по адресу
ds3.write(0xBE); // Обращение памяти
data[0] = ds3.read();// Чтение памяти byte low
data[1] = ds3.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void to_Timer(){newPosition = myEnc.read()/4;}
[видео]
для примера, в строке T2 ....of
lcd.setCursor(0,0);lcd.print("T1=");lcd.print(t_ds1,1);
lcd.setCursor(0,1);lcd.print("T2=");lcd.print(t_ds2,1);
lcd.setCursor(0,2);lcd.print("T3=");lcd.print(t_ds3,1);
>>>
lcd.setCursor(0,0);lcd.print("T1=");if(t_ds1<10){lcd.print(" ");}lcd.print(t_ds1,1);
lcd.setCursor(0,1);lcd.print("T2=");;if(t_ds2<10){lcd.print(" ");}lcd.print(t_ds2,1);
lcd.setCursor(0,2);lcd.print("T3=");;if(t_ds3<10){lcd.print(" ");}lcd.print(t_ds3,1);
Вот пример
было
lcd.print(t1_reg_on);
надо сделать
if(t1_reg_on<10){lcd.print(" ");}lcd.print(t1_reg_on);
аналогично для всех значений
благодарю.
исправлю.
но понимаю, что зря побеспокоил, эта функция лишняя для того, что я хочу). пока изменил состояние выходов 5,6,7 чтобы включалось только при достижении температуры, а не было всегда включено.
потом попытаюсь сделать только включение реле по достижении температуры (оставив только возможность изменения температуры включения гистерезис не нужен)
спасибо за консультацию, настроил работает.
Но, при включении, на секунду по всем датчикам отображается измеряемая температура 85*, потом сбрасывается к актуальным значениям.
где это можно исправить?
Добавьте изменение температуры в setup()
t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);
delay(300);
я добавлял, только без задержки, сейчас delay добавил.
не поменялось ничего
void setup(){
Wire.begin();lcd.init();lcd.backlight();Serial.begin(9600);
t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);
delay(300);
MsTimer2::set(1, to_Timer);MsTimer2::start();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
pinMode(10,INPUT); // кнопка SW ENCODER
pinMode(5,OUTPUT); // выход реле 1
pinMode(6,OUTPUT); // выход реле 2
pinMode(7,OUTPUT); // выход реле 3
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
currentTime = millis();
cloopTime = currentTime;
lcd.createChar(3,a4);
t1_reg_on = EEPROM.read(0);
t2_reg_on = EEPROM.read(1);
t3_reg_on = EEPROM.read(2);
digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);
}
причем, 85* показывает при передергивании питания. при сбросе кнопкой на ардуине, норм - показывает сразу измеряемую температуру
Укажите
delay(500);
перед
t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);
)
заработало
спасибо
upd
достаточно было до 500 увеличить после измерения температуры. тоже перестало 85* отображаться.
и еще вопрос. добавил 4ый ds18b20 (как и в Вашем скетче было, на каждый вход ардуины). на D13 не работает, меняю на другой , работает.
что я упустил?
На D13 висит светодиод, возможно это критично для DS18B20, или просто пин не рабочий
Доброе утро! Могли бы Вы сделать проект трехрелейного терморегулятора на MAX 6675?
Это практически с нуля все делать, очень много тестов с Вашей стороны, у меня нет 3-х модулей, только один. А они работают через шину SPI, нужно из объединять в одну шину. Получить температуру с каждого модуля, а потом уже делать управление.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Тестирование скетчей → Терморегулятор с тремя реле
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|