#include <MAX6675.h>
#include <LiquidCrystal_I2C.h>
// MAX6675 Pins
int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
// Control Pins
int triacPin = 9;
int potPin = A0; // Potentiometer
// 10 Temperature Levels (0-200°C)
int tempLevels[11] = {0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200};
int currentLevel = 0;
float currentTemp = 0;
int powerLevel = 0;
unsigned long previousBlinkTime = 0;
bool blinkState = false;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(triacPin, OUTPUT);
pinMode(potPin, INPUT);
lcd.init();
lcd.backlight();
lcd.print("Temp Controller");
lcd.setCursor(0, 1);
lcd.print("0-200C 10 Levels");
delay(2000);
Serial.begin(9600);
}
void loop() {
// Read temperature
currentTemp = thermocouple.readCelsius();
// Read potentiometer and select level 0-10
int potValue = analogRead(potPin);
currentLevel = map(potValue, 0, 1023, 0, 10);
int setpoint = tempLevels[currentLevel];
// Calculate power based on temperature difference
powerLevel = calculateStepPower(currentTemp, setpoint);
// Safety cutoff at 200°C
if (currentTemp >= 200) {
powerLevel = 0;
digitalWrite(triacPin, LOW);
}
// Apply power to triac
analogWrite(triacPin, powerLevel);
// Display information with blinking ON
displayStatus(currentTemp, powerLevel, currentLevel);
delay(500);
}
int calculateStepPower(float current, int target) {
int power = 0;
float diff = target - current;
if (current >= 200) return 0;
if (target == 0) {
power = 0;
}
else if (diff > 20) {
power = 255;
}
else if (diff > 10) {
power = 200;
}
else if (diff > 5) {
power = 150;
}
else if (diff > 2) {
power = 100;
}
else if (diff > 0) {
power = 50;
}
else {
power = 0;
}
return power;
}
void displayStatus(float current, int power, int level) {
// Blink logic for ON text (500ms interval)
if (millis() - previousBlinkTime > 500) {
blinkState = !blinkState;
previousBlinkTime = millis();
}
lcd.clear();
// Row 1: Power:ON/OFF Temp:(current temperature)*C
lcd.setCursor(0, 0);
lcd.print("Power:");
if (power > 0) {
// Blinking ON
if (blinkState) {
lcd.print("ON ");
} else {
lcd.print(" "); // Blank when off
}
} else {
// Steady OFF
lcd.print("OFF");
}
lcd.setCursor(10, 0);
lcd.print("T:");
lcd.print(current, 1);
lcd.print("*C");
// Row 2: Level=0-10
lcd.setCursor(0, 1);
lcd.print("Level=");
lcd.print(level);
// Serial Monitor output
Serial.print("Pot Value: ");
Serial.print(analogRead(potPin));
Serial.print(" | Level: ");
Serial.print(level);
Serial.print(" | Set: ");
Serial.print(tempLevels[level]);
Serial.print("C | Temp: ");
Serial.print(current, 1);
Serial.print("C | Power: ");
Serial.println(power > 0 ? "ON" : "OFF");
}