Тема: Терморегулятор MAX6675 (Arduino)
Основная статья - http://rcl-radio.ru/?p=45845
 
 
#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://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> // http://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;}


