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

На ИМС MAX6675 довольно простой, но вполне точный терморегулятор. Микросхема MAX6675 предназначена для работы с термопарами типа К(ХА) в диапазоне температур от 0 до 1000ºС, регулировка температуры осуществляется в этом же диапазоне, дополнительно добавлена возможность регулировки гистерезиса. Значения регулировки температуры и гистерезиса хранятся в энергонезависимой памяти.При нажатии кнопки «К»  происходит переход в режим регулировки, далее в режим регулировки гистерезиса, при третьем нажатии кнопки происходит переход на основной экран, на котором отображена измеренная температура, температура регулировки и гистерезиса.

#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip
#include <LiquidCrystal.h>
#include <Wire.h>
#include <EEPROM.h> //#include <EEPROM.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
 
double t_c,t_sum,t_iz; 
byte erom2,erom3,erom4;
int kn1,kn2,t_reg,sh,sh1,gis;
long w;
 
void setup(){Serial.begin(9600);lcd.begin(16, 2);delay(500);
  pinMode(A0,INPUT);pinMode(3,INPUT);pinMode(2,INPUT); // кнопки
  pinMode(13,OUTPUT);
  erom2=EEPROM.read(2);if(erom2>99){EEPROM.update(2,0);}
  erom3=EEPROM.read(3);if(erom3>10){EEPROM.update(3,0);}
  erom4=EEPROM.read(4);if(erom4>10){EEPROM.update(4,0);}
  t_reg=erom2*100+erom3;gis=erom4;
}
 
void loop(){
  if(analogRead(A0)>600){kn1++;delay(300);}if(kn1>2){kn1=0;}// кнопка
  if(kn1==1){// регулирование
  if(digitalRead(3) == HIGH){sh++;if(sh<=10){t_reg++;}if(sh>10&&sh<=100){t_reg=t_reg+10;}}else{sh=0;}
  if(digitalRead(2) == HIGH){sh1++;if(sh1<=10){t_reg--;}if(sh1>10&&sh1<=100){t_reg=t_reg-10;}}else{sh1=0;}
  lcd.setCursor(0,0);lcd.print("reg = ");lcd.print(t_reg);lcd.print((char)223);lcd.print("C");delay(200);
  if(t_reg<=0){t_reg=0;}if(t_reg>=1000){t_reg=1000;}
  erom2=t_reg/100;
  erom3=t_reg-((t_reg)/100)*100;w=0;
}
 
if(kn1==2){// гистерезис
  if(digitalRead(3) == HIGH){gis=gis+1;}
  if(digitalRead(2) == HIGH){gis=gis-1;}
  if(gis>=10 || gis<0){gis=0;}
  lcd.setCursor(0,0);lcd.print("gis = ");lcd.print(gis);lcd.print((char)223);lcd.print("C");delay(300);
  erom4=gis;w=0;
}
 
if(kn1==0){w++;if(w==1){EEPROM.update(2,erom2);EEPROM.update(3,erom3);EEPROM.update(4,erom4);}  
  lcd.setCursor(0,0);lcd.print("T = ");lcd.print(t_iz,1);lcd.print((char)223);lcd.print("C ");
  lcd.setCursor(0,1);lcd.print("reg=");lcd.print(t_reg);lcd.print(" gis=");lcd.print(gis);
  Serial.print("C = "); 
  Serial.println(thermocouple.readCelsius());
 
  for(int i=0;i<5;i++){
    t_c=thermocouple.readCelsius();
    t_sum=t_sum+t_c;
    delay(200);
  }
  t_iz=t_sum/5;t_sum=0;
}
 
  if(t_reg >= t_iz + gis){digitalWrite(13,HIGH);}
  if(t_reg <= t_iz - gis){digitalWrite(13,LOW);}
 
  lcd.clear();
}

http://forum.rcl-radio.ru/viewtopic.php?pid=2750#p2750 — обновленный скетч (LCD1602_I2C + энкодер)


Второй вариант температурного регулятора аналогичен первому, только вместо LCD индикатора применен четырех разрядный семисегментный индикатор на базе драйвера TM1637 (модуль TM1637), а вместо кнопок управления используется энкодер ky-040.

Для установки температуры регулирования необходимо вращать ручку энкодера, а для сохранения температуры регулирования в энергонезависимой памяти необходимо нажать кнопку энкодера.

#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);// выход для управления нагрузкой
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(newPosition >= t_iz + gis){digitalWrite(13,HIGH);}
if(newPosition <= t_iz - gis){digitalWrite(13,LOW);}
 
if(reg==1){k=newPosition;}
  else{k = t_iz;}
  Serial.println(reg);
display.showNumberDecEx(k,0x00,false);// вывод информации на индикатор
 
}

Comments

    1. http://rcl-radio.ru/wp-content/uploads/2019/04/temp_reg_time_v03.zip
      Скетч использует индикатор 1602, поменял номера кнопок и подключения LCD.(можете вернуть как было).
      В основном меню кнопками плюс и минус выставляете время, но только минуты, часы выставляются перебором минут. Как только температура регулирования становится равной темп. измеренной начинается обратный отсчет, при 00:00:00 выход D13 отключается.
      Не тестировал в железе, скетч может не правильно работать. Если что пишите если возникнут проблеммы с кодом.

  1. Уважаемый , если бы добавили ещё управление симистором к этому делу , вашей статье не было бы цены) Скоро собираюсь делать паяльную станцию на ардуино, жду дисплей и оптопары , можно с вами консультироваться ,если будут вопросы?

                1. Проверьте все соединения, я не совсем понял какой именно скетч, но обратите внимание на энкодер, на платке энкодера должно быть 3 резистора.

                    1. Обновите прошивку, скетч я поправил. На схеме и в скетче было разное подключение.

  2. У Вас новая ардуино, все ячейки памяти равны 255, установите гистерезис и перезагрузите ардуино, новое значение должно записаться в память.

    1. В этом- то и есть проблема! после установки температуры регулирования и гистерезиса я произвожу перезагрузку ардуинки. температура регулирования остается той которую я задал ранее, а гистерезис снова равен 255

  3. Arduino: 1.8.10 (Windows 10), Плата:»WEMOS XI (Retired)»

    ПРЕДУПРЕЖДЕНИЕ: библиотека Wire должна запускаться на архитектурах avr и может быть несовместима с вашей платой на архитектуре XI.
    C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_927708\sketch_oct17a.ino: In function ‘void setup()’:

    sketch_oct17a:19:44: error: ‘class EEPROMClass’ has no member named ‘update’

    erom2=EEPROM.read(2);if(erom2>99){EEPROM.update(2,0);}

    ^~~~~~

    sketch_oct17a:20:44: error: ‘class EEPROMClass’ has no member named ‘update’

    erom3=EEPROM.read(3);if(erom3>10){EEPROM.update(3,0);}

    ^~~~~~

    sketch_oct17a:21:44: error: ‘class EEPROMClass’ has no member named ‘update’

    erom4=EEPROM.read(4);if(erom4>10){EEPROM.update(4,0);}

    ^~~~~~

    C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_927708\sketch_oct17a.ino: In function ‘void loop()’:

    sketch_oct17a:44:32: error: ‘class EEPROMClass’ has no member named ‘update’

    if(kn1==0){w++;if(w==1){EEPROM.update(2,erom2);EEPROM.update(3,erom3);EEPROM.update(4,erom4);}

    ^~~~~~

    sketch_oct17a:44:55: error: ‘class EEPROMClass’ has no member named ‘update’

    if(kn1==0){w++;if(w==1){EEPROM.update(2,erom2);EEPROM.update(3,erom3);EEPROM.update(4,erom4);}

    ^~~~~~

    sketch_oct17a:44:78: error: ‘class EEPROMClass’ has no member named ‘update’

    if(kn1==0){w++;if(w==1){EEPROM.update(2,erom2);EEPROM.update(3,erom3);EEPROM.update(4,erom4);}

    ^~~~~~

    Несколько библиотек найдено для «Wire.h»
    Используется: C:\Program
    Несколько библиотек найдено для «EEPROM.h»
    Используется: C:\Program
    Несколько библиотек найдено для «max6675.h»
    Используется: C:\Program
    Несколько библиотек найдено для «LiquidCrystal.h»
    Используется: C:\Program
    exit status 1
    ‘class EEPROMClass’ has no member named ‘update’

    1. библиотека Wire должна запускаться на архитектурах avr и может быть несовместима с вашей платой на архитектуре XI.

      Архитектура микроконтроллера не совместима с контролером AVR под который написан скетч. Ни чего не выйдет, нужна ардуино с микроконтроллером ATMEGA 168 или 328.

Добавить комментарий

Войти с помощью: