26

Re: Терморегулятор с тремя реле

Да, соберу все как планировал и сразу отвечу, думаю в течении недели может меньше управлюсь

27

Re: Терморегулятор с тремя реле

Хорошо, буду ждать ответа.

28

Re: Терморегулятор с тремя реле

оживлю тему)
тут отвечают?

собрал, спасибо.
но возникли вопросы - если вращать энкодер к 0 градусов, ниже 10 градусов, температура отображается не 09, 08, 07,...01, а 90, 80, 70, 60. если оставить, к примеру 60, что соответсвует в данном случае 06 градусов, перезагрузить ардуину, то на экране будет 6. вращаем энкодер на увеличение больше 10 градусов, потом обратно - такая же картина. 90, 80, 70, 60...
фото если надо приложу.
как это исправить?

29

Re: Терморегулятор с тремя реле

Опубликуйте скетч который Вы используете.

30

Re: Терморегулятор с тремя реле

использовал скетч  с 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;}  

31 (2024-04-10 14:07:57 отредактировано marges)

Re: Терморегулятор с тремя реле

[видео]
для примера, в строке  T2 ....of

32

Re: Терморегулятор с тремя реле

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);

33

Re: Терморегулятор с тремя реле

Вот пример

было
lcd.print(t1_reg_on);

надо сделать
if(t1_reg_on<10){lcd.print(" ");}lcd.print(t1_reg_on);

аналогично для всех значений

34

Re: Терморегулятор с тремя реле

благодарю.
исправлю.
но понимаю, что зря побеспокоил, эта функция лишняя для того, что я хочу). пока изменил состояние выходов 5,6,7 чтобы включалось только при достижении температуры, а не было всегда включено.

потом попытаюсь сделать только включение реле по достижении температуры (оставив только возможность изменения температуры включения гистерезис не нужен)

35

Re: Терморегулятор с тремя реле

спасибо за консультацию, настроил работает.

Но, при включении, на секунду по всем датчикам отображается измеряемая температура 85*, потом сбрасывается к актуальным значениям.
где это можно исправить?

36

Re: Терморегулятор с тремя реле

Добавьте изменение температуры в setup()

t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);
delay(300);

37

Re: Терморегулятор с тремя реле

я добавлял, только без задержки, сейчас  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);
  }

38

Re: Терморегулятор с тремя реле

причем, 85* показывает при передергивании питания. при сбросе кнопкой на ардуине, норм - показывает сразу измеряемую температуру

39

Re: Терморегулятор с тремя реле

Укажите
delay(500);
перед
t_ds1 = dsRead1(0);t_ds2 = dsRead2(0);t_ds3 = dsRead3(0);

40 (2024-04-18 19:53:31 отредактировано marges)

Re: Терморегулятор с тремя реле

)
заработало
спасибо

upd
достаточно было до 500 увеличить после измерения температуры. тоже перестало 85* отображаться.

41

Re: Терморегулятор с тремя реле

и еще вопрос. добавил 4ый ds18b20 (как и в Вашем скетче было, на каждый вход ардуины). на D13 не работает, меняю на другой , работает.

что я упустил?

42

Re: Терморегулятор с тремя реле

На D13 висит светодиод, возможно это критично для DS18B20, или просто пин не рабочий

43

Re: Терморегулятор с тремя реле

Доброе утро! Могли бы Вы сделать проект трехрелейного терморегулятора на MAX 6675?

44

Re: Терморегулятор с тремя реле

Это практически с нуля все делать, очень много тестов с Вашей стороны, у меня нет 3-х модулей, только один. А они работают через шину SPI, нужно из объединять в одну шину. Получить температуру с каждого модуля, а потом уже делать управление.