#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
const float BETA = 3950;
boolean protectionMode = false;
const int maxTemp = 25;
const float minVoltage = 12;
int prevBedTemp = -1;
int prevTargetTemp = -1;
void overheatProtection () {
protectionMode = true;
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("ERROR");
lcd.setCursor(2, 1);
lcd.print("BED OVERHEAT");
digitalWrite(8, LOW);
}
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Bed Temp: ---");
lcd.setCursor(2, 1);
lcd.print("Target: ---");
}
void loop() {
if (!protectionMode) {
int analogBedTemp = analogRead(A1);
// Serial.println(analogBedTemp);
// float celsius = 1 / (log(1 / (1023. / analogBedTemp - 1)) / BETA + 1.0 / 298.15) - 273.15;
// int bedTemp = round(celsius);
int bedTemp = analogBedTemp;
// Serial.println(bedTemp);
if (bedTemp != prevBedTemp) {
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(bedTemp);
lcd.print((char)223);
lcd.print("C");
prevBedTemp = bedTemp;
}
int targetValue = analogRead(A0);
float targetTemp = (targetValue / 1023.0) * 120.0;
int roundedTargetTemp = round(targetTemp);
if (bedTemp < (roundedTargetTemp - 1)) {
digitalWrite(A2, HIGH);
} else if (bedTemp > (roundedTargetTemp + 1)) {
digitalWrite(A2, LOW);
}
if (roundedTargetTemp != prevTargetTemp) {
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(roundedTargetTemp);
lcd.print((char)223);
lcd.print("C");
prevTargetTemp = roundedTargetTemp;
}
if (bedTemp > maxTemp) {
overheatProtection();
};
}
delay(1000);
}