Тема: Терморегулятор 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;}