Не тестировал, но должно работать
Кнопки
D7 - menu
D8 - up
D9 - down
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
unsigned long time;
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);
pinMode(13,OUTPUT); // реле
pinMode(12,OUTPUT); // индикатор нагрева
pinMode(7,INPUT_PULLUP); // menu (нажатие кнопки - замыкание на gnd)
pinMode(8,INPUT_PULLUP); // up (нажатие кнопки - замыкание на gnd)
pinMode(9,INPUT_PULLUP); // down (нажатие кнопки - замыкание на gnd)
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(7)==LOW){menu++;if(menu>2){menu=0;}delay(200);lcd.clear();}
///////// регулирование
if(menu==1){
if(digitalRead(8)==LOW){reg++;time=millis();w=1;if(reg>1000){reg=1000;}delay(100);}
if(digitalRead(9)==LOW){reg--;time=millis();w=1;if(reg<0){reg=0;}delay(100);}
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(digitalRead(8)==LOW){gis++;time=millis();w=1;if(gis>10){gis=10;}delay(100);}
if(digitalRead(9)==LOW){gis--;time=millis();w=1;if(gis<0){gis=0;}delay(100);}
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){
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