1

Тема: Терморегулятор MAX6675 (Arduino)

Основная статья - https://rcl-radio.ru/?p=45845

http://forum.rcl-radio.ru/uploads/images/2020/12/9971804a0211a369a663153a85497f7b.png


#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <max6675.h> // https://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
Encoder myEnc(8, 9);//CLK, DT

int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

unsigned long time,oldPosition  = -999,newPosition;
double t_c,t_sum,t_iz; 
int menu,w,reg,gis,reg_h,reg_l,i;

void setup() {
   Wire.begin();lcd.init();lcd.backlight();Serial.begin(9600);
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   pinMode(10,INPUT); /// кнопка энкодера
   pinMode(13,OUTPUT); // реле
   reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2);
   reg = reg_h*100+reg_l;

}

void loop() {
//// измерение температуры 
  i++;
  t_c=thermocouple.readCelsius();t_sum=t_sum+t_c;
  if(i>4){i=0;t_iz=t_sum/5;t_sum=0;}
/////////////////////////////////////////////
  if(digitalRead(10)==LOW){menu++;if(menu>2){menu=0;}delay(200);lcd.clear();}
  
///////// регулирование
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     reg=reg+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(reg>1000){reg=1000;}if(reg<0){reg=0;}}
     lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C   ");
     lcd.setCursor(0,1);lcd.print("Reg > ");lcd.print(reg);lcd.print(" ");
     lcd.setCursor(10,1);lcd.print("G = ");lcd.print(gis);lcd.print(" ");
     Serial.println(reg);
     }
///////// гистерезис
   if(menu==2){
  if (newPosition != oldPosition){oldPosition = newPosition;
     gis=gis+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(gis>10){gis=10;}if(gis<0){gis=0;}}
     lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C ");
     lcd.setCursor(0,1);lcd.print("Reg = ");lcd.print(reg);lcd.print(" ");
     lcd.setCursor(10,1);lcd.print("G > ");lcd.print(gis);lcd.print(" ");
     Serial.println(gis);
     }
////////////////////////////////////////////////////////        
  if(menu==0){  myEnc.write(0);
  lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C ");
  lcd.setCursor(0,1);lcd.print("Reg = ");lcd.print(reg);lcd.print(" ");
  lcd.setCursor(10,1);lcd.print("G = ");lcd.print(gis);lcd.print(" ");
  }
////////////////////////////////////////////////////////      
   if(millis()-time>5000 && w==1){
     reg_h = reg/100;reg_l = reg-reg_h*100;
     EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis);
     menu=0;w=0;}

  if(reg >= t_iz + gis){digitalWrite(13,HIGH);}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);}
  
  delay(50);
  Serial.println(menu);
}// loop

void to_Timer(){newPosition = myEnc.read()/4;}

2

Re: Терморегулятор MAX6675 (Arduino)

TM1637+энкодер. Как происходит задание и отображение температура и гистерезиса

3

Re: Терморегулятор MAX6675 (Arduino)

Для установки температуры регулирования необходимо вращать ручку энкодера, а для сохранения температуры регулирования в энергонезависимой памяти необходимо нажать кнопку энкодера.
Гистерезис изменить нельзя, он задается в скетче:
const byte gis=1;// гистерезис

4

Re: Терморегулятор MAX6675 (Arduino)

Светодиод прилепить, было бы нормально. Светится - нагрев, потух - нагрева нет.

5

Re: Терморегулятор MAX6675 (Arduino)

D12 - led

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <max6675.h> // https://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
Encoder myEnc(8, 9);//CLK, DT

int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

unsigned long time,oldPosition  = -999,newPosition;
double t_c,t_sum,t_iz; 
int menu,w,reg,gis,reg_h,reg_l,i;

void setup() {
   Wire.begin();lcd.init();lcd.backlight();Serial.begin(9600);
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   pinMode(10,INPUT); /// кнопка энкодера
   pinMode(13,OUTPUT); // реле
   pinMode(12,OUTPUT); // индикатор нагрева
   reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2);
   reg = reg_h*100+reg_l;

}

void loop() {
//// измерение температуры 
  i++;
  t_c=thermocouple.readCelsius();t_sum=t_sum+t_c;
  if(i>4){i=0;t_iz=t_sum/5;t_sum=0;}
/////////////////////////////////////////////
  if(digitalRead(10)==LOW){menu++;if(menu>2){menu=0;}delay(200);lcd.clear();}
  
///////// регулирование
  if(menu==1){
  if (newPosition != oldPosition){oldPosition = newPosition;
     reg=reg+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(reg>1000){reg=1000;}if(reg<0){reg=0;}}
     lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C   ");
     lcd.setCursor(0,1);lcd.print("Reg > ");lcd.print(reg);lcd.print(" ");
     lcd.setCursor(10,1);lcd.print("G = ");lcd.print(gis);lcd.print(" ");
     Serial.println(reg);
     }
///////// гистерезис
   if(menu==2){
  if (newPosition != oldPosition){oldPosition = newPosition;
     gis=gis+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;if(gis>10){gis=10;}if(gis<0){gis=0;}}
     lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C ");
     lcd.setCursor(0,1);lcd.print("Reg = ");lcd.print(reg);lcd.print(" ");
     lcd.setCursor(10,1);lcd.print("G > ");lcd.print(gis);lcd.print(" ");
     Serial.println(gis);
     }
////////////////////////////////////////////////////////        
  if(menu==0){  myEnc.write(0);
  lcd.setCursor(0,0);lcd.print("Temp = ");lcd.print(t_iz,1);lcd.print(" C ");
  lcd.setCursor(0,1);lcd.print("Reg = ");lcd.print(reg);lcd.print(" ");
  lcd.setCursor(10,1);lcd.print("G = ");lcd.print(gis);lcd.print(" ");
  }
////////////////////////////////////////////////////////      
   if(millis()-time>5000 && w==1){
     reg_h = reg/100;reg_l = reg-reg_h*100;
     EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis);
     menu=0;w=0;}

  if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,LOW);}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,HIGH);}
  
  delay(50);
  Serial.println(menu);
}// loop

void to_Timer(){newPosition = myEnc.read()/4;}

6

Re: Терморегулятор MAX6675 (Arduino)

добавьте светодиод в скеч с индикатором TM1637, я хочу протестить обе схемы

7 (2020-12-31 08:30:46 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

Немного отвлекусь от темы.

Очень популярными  стают схемы с адресными лентами типа WS28xx,
Бегло прочитал это: https://rcl-radio.ru/?p=91626

Сейчас автомобилисты, ставят адресные лента типа WS28xx на стоп и поворот и разные штучки.
У вас есть такие схемы ? Тема была бы интересная!

Чисто для информации:
Вот интересный сайт: https://alexgyver.ru/ws2812_guide/

8 (2021-01-06 01:05:45 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

TM1637 - дайте ссылку на библиотеку <TM1637Display.h>
несколько скачал, ошибки...

9

Re: Терморегулятор MAX6675 (Arduino)

Данный контент доступен только зарегистрированным пользователям.

10 (2021-01-06 02:31:48 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

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

http://forum.rcl-radio.ru/uploads/images/2021/01/549894810b0af491ffc86352ba535b63.jpg

http://forum.rcl-radio.ru/uploads/images/2021/01/656a6a9e5df38d78ef493b1220a2c2fa.jpg

11

Re: Терморегулятор MAX6675 (Arduino)

подключил термопару от мультиметра, показания комнатной температуры не отличаются,
позже прогоню температуру на образцовых приборах и выложу
http://forum.rcl-radio.ru/uploads/images/2021/01/9e24ed3f21c9ec41734cf5719a2a8cf8.jpg

12 (2021-01-06 20:57:59 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

Скеч - TM1637-энкодер

- подключил реле. Меняю температуру включения - выключения,
   модуль реле не реагирует, реле сработано, на 13 низкий уровень.
- если что-то будете менять, сразу вставьте светодиод. Скеч - TM1637-энкодер.
   куда подтягивать светодиод  + или -

13

Re: Терморегулятор MAX6675 (Arduino)

D8 - индикатор включения реле

#include <max6675.h> 
#include <TM1637Display.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1008&download=1
#include <Encoder.h>
#include <EEPROM.h>//#include <EEPROMex.h>
int thermoDO = 12; // SO
int thermoCS = 11; // CS
int thermoCLK = 10;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
TM1637Display display(4, 5);// CLK,DIO
Encoder myEnc(2, 3);// CLK, DT
 
double t_c,t_sum,t_iz; 
unsigned long time,time0;
int oldPosition  = -999,newPosition,rom,k;
byte reg,r0,r1;
const byte gis=1;// гистерезис
uint8_t data1[]{0x6d,0x08,0x50,0x3d};
 
void setup(){
pinMode(9,INPUT); // SW энкодера
pinMode(13,OUTPUT);// выход для управления нагрузкой
pinMode(8,OUTPUT); // индикатор нагрева
display.setBrightness(3);// яркость TM1637 0-7
delay(500);
r0=EEPROM.read(0);r1=EEPROM.read(1);rom=r0*100+r1;//чтение EEPROM
}
 
void loop(){
  newPosition = myEnc.read()/4+rom;// чтение состояния энкодера
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    time=millis();
    reg=1;time0=3000;
    r0=newPosition/100;r1=newPosition-r0*100;
  }
else if(millis()-time>time0){
reg=0;time0=0;
for(int i=0;i<5;i++){
t_c=thermocouple.readCelsius();// чтение температуры с max6675
t_sum=t_sum+t_c;
delay(200);
}
 time=millis();t_iz=t_sum/5;t_sum=0;
 }
 
  if(digitalRead(9)==LOW){// запись в EEPROM
    EEPROM.update(0,r0);EEPROM.update(1,r1);
    display.setSegments(data1); 
    delay(1000);
  }
 
if(newPosition<0){newPosition=0;}
if(newPosition>1000){newPosition=1000;}
 
 if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(8,LOW);}
 if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(8,HIGH);}
 
if(reg==1){k=newPosition;}
  else{k = t_iz;}
  Serial.println(reg);
display.showNumberDecEx(k,0x00,false);// вывод информации на индикатор
 
}

14

Re: Терморегулятор MAX6675 (Arduino)

ничего не поменялось

15

Re: Терморегулятор MAX6675 (Arduino)

модуль реле не реагирует, реле сработано, на 13 низкий уровень. ???

Я не понял вопроса

16 (2021-01-06 21:20:22 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

задаю 40гр. - записываю,  10гр. - записываю, относительно комнатной температуры
не работает регулеровка, не отрабатывает блок реле вкл. выкл. нагрева.

17

Re: Терморегулятор MAX6675 (Arduino)

Светодиод на плате ардуино подключен к D13, посмотрите по нему, срабатывает ли включение нагрева.

18 (2021-01-06 21:25:31 отредактировано sanj76a)

Re: Терморегулятор MAX6675 (Arduino)

pinMode(13,OUTPUT);// выход для управления нагрузкой
pinMode(8,OUTPUT); // индикатор нагрева

8  и 13 реагируют одинаково

19

Re: Терморегулятор MAX6675 (Arduino)

D13 переключается, при изменении температуры регулирования?

20

Re: Терморегулятор MAX6675 (Arduino)

http://forum.rcl-radio.ru/uploads/images/2021/01/66fffe8cac37146d5dc76caac924a687.jpg

21

Re: Терморегулятор MAX6675 (Arduino)

нет

22

Re: Терморегулятор MAX6675 (Arduino)

По коду я не вижу ошибок, все должно работать:

if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(8,LOW);}
if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(8,HIGH);}

Сейчас проверить не могу, нет в наличии датчика max

23

Re: Терморегулятор MAX6675 (Arduino)

буду разбираться,
На ардуино   VIN  запитан от  +5в, может это влияет?

24

Re: Терморегулятор MAX6675 (Arduino)

На ардуино   VIN  запитан от  +5в, может это влияет?

Так нельзя запитывать.

25

Re: Терморегулятор MAX6675 (Arduino)

I2C