На ИМС 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);// вывод информации на индикатор }
Заменить МАХ, и сделать управление ЛСД по шине, такое возможно?
А вообще, не надо заморачиваться с МАХ,
(Я куплю), просто переделайте управление ЛСД по шине.
Вы имели виду подключение LCD по I2C шине?
Как купите я переделаю, это просто.
Как буду готов сообщу спасибо
Можно эту тему на форум, будут в процессе фото и коментарии.
Хорошо, я новый скетч опубликую на форуме
Добрый вечер!
С наступающим новым годом!
Не нашел на форуме этой темы.Есть вопросы.
…pinMode(13,OUTPUT); — хочу использовать на этом выходе модуль реле 5в, для регулировки
температуры.
…модуль TM1637+энкодер — как происходит управление (установка гистерезиса) и отображение
на индикаторе? Подробней пожалуйста
Если Вам нужен скетч с LCD1602 + I2C и энкодер, так же гистерезис, то я напишу новый скетч, а Вы протестируете.
pinMode(13,OUTPUT) — какой управляющий уровень (1 или 0)? (какой модуль реле нужно
Low Level или High Level.)
Не имеет значение, какой управляющий уровень надо такой и сделаю.
http://forum.rcl-radio.ru/viewtopic.php?pid=2743#p2743
Здравствуйте. Можете написать скетч для этой схемы??? Сам плохо разбираюсь с написанием.