На ИМС 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);// вывод информации на индикатор }
А можно, в этот проект добавить таймер? Когда температура подымается, до выставленный, включается реле и продолжается поддержание температуры, до истечения времени выставленному на таймер.
http://rcl-radio.ru/wp-content/uploads/2019/04/temp_reg_time_v03.zip
Скетч использует индикатор 1602, поменял номера кнопок и подключения LCD.(можете вернуть как было).
В основном меню кнопками плюс и минус выставляете время, но только минуты, часы выставляются перебором минут. Как только температура регулирования становится равной темп. измеренной начинается обратный отсчет, при 00:00:00 выход D13 отключается.
Не тестировал в железе, скетч может не правильно работать. Если что пишите если возникнут проблеммы с кодом.
Буду пробовать.
Сделал температура не корректно отображается плавает 1000 +-200, в комнате.
Замкните вход, на индикаторе должна отображаться темп. окружающей среды.
Уважаемый , если бы добавили ещё управление симистором к этому делу , вашей статье не было бы цены) Скоро собираюсь делать паяльную станцию на ардуино, жду дисплей и оптопары , можно с вами консультироваться ,если будут вопросы?
Да, можете обращаться.
Все делают с переходом через 0, то есть добавляют вторую оптопару. На сколько кретично?)
Если имеется большая индукционная нагрузка тогда есть смысл использовать такую схему.
Не отображает температуру вообще, всегда нули.
Термопару подключили? Если нет, то замкните вход, должна отображаться температура окружающей среды.
Вход термопары замыкаю ничего не происходит
Проверьте все соединения, я не совсем понял какой именно скетч, но обратите внимание на энкодер, на платке энкодера должно быть 3 резистора.
Я использовал первый скетч,для 1602,сейчас попробовал перезагрузить скетч ничего не изменилось,использую arduino pro mini
Обновите прошивку, скетч я поправил. На схеме и в скетче было разное подключение.
Я как то не подума́л про шумы , все делают без фильтра по выходу , просто насколько я понял , переход через ноль это тот же ШИМ только на переменке
Добрый день! в первом скетче с использованием 1602, гистерезис после перезагрузки равен 255. Т.е значение гистерезиса не записывается в память. Подскажите решение?
У Вас новая ардуино, все ячейки памяти равны 255, установите гистерезис и перезагрузите ардуино, новое значение должно записаться в память.
В этом- то и есть проблема! после установки температуры регулирования и гистерезиса я произвожу перезагрузку ардуинки. температура регулирования остается той которую я задал ранее, а гистерезис снова равен 255
Не вижу ошибок в скетче, исправьте строку:
#include «EEPROMex.h» //#include «EEPROMex.h»
на
#include «EEPROM.h»
Заменил, теперь скомпилировать не могу (куча ошибок). Может у меня с ардуинкой что-то не так?
Я поправил скетч. Запись в память происходит при переходе в основное меню.
не может скомпилировать
exit status 1
‘class EEPROMClass’ has no member named ‘update’
44 строка
У Вас какая версия Arduino IDE?
1.8.10
Скопируйте скетч по новой, у меня компиляция проходит без ошибок.
странно, но у меня по-прежнему ошибки. может библиотека не правильная какая-нибудь у меня?
У меня версия ардуино иде 1,8,9. Опубликуйте текст ошибок.
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’
Плата:»WEMOS X
Не верно выбрана плата. Надо Aruino UNO или NANO
У меня китайский «аналог» ардуинки. в программе сменил плату, компиляция прошла,но при загрузке выдает ошибку. видимо дело в ней, в плате. буду думать. Спасибо Вам большое
библиотека Wire должна запускаться на архитектурах avr и может быть несовместима с вашей платой на архитектуре XI.
Архитектура микроконтроллера не совместима с контролером AVR под который написан скетч. Ни чего не выйдет, нужна ардуино с микроконтроллером ATMEGA 168 или 328.