#include <LiquidCrystal.h>
const int rs = 8; // Pin 7 on Arduino to pin 4 (RS) on LCD
const int en = 7; // Pin 6 on Arduino to pin 6 (E) on LCD
const int d4 = 6; // Pin 12 on Arduino to pin 11 (D4) on LCD
const int d5 = 5; // Pin 10 on Arduino to pin 12 (D5) on LCD
const int d6 = 4; // Pin 9 on Arduino to pin 13 (D6) on LCD
const int d7 = 3; // Pin 8 on Arduino to pin 14 (D7) on LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Temp Sensor reference: https://docs.wokwi.com/parts/wokwi-ntc-temperature-sensor
const float BETA = 3950;
const int tempMin = 1; // Celcius
const int tempMax = 20; // Celcius
const int timeTecPause = 10; // Seconds
int timerMs = 0;
int timer = 0;
int lcdMode = 0; // 0 = Off, 1 = Boot, 2 = Run, 3 = Shutdown
int lcdTimerMs = 0;
char *lcdStringMode[] = {"Off", "Cool", "Heat"};
int pinButtonRed = 11;
int pinButtonGreen = 10;
int pinButtonBlue = 9;
int pinSensorTemp = A0;
int pinRelayCool = A2;
int pinRelayHeat = A1;
int pinBuzzer = 12;
int pinLcdBacklight = 2;
int buttonRed = 0;
int buttonGreen = 0;
int buttonBlue = 0;
int state = 0; // 0 = Off, 1 = Run
int mode = 0; // 0 = Off, 1 = Cooling, 2 = Heating(NOT WORKING)
int tecState = 0; // 0 = Off, -1 = Cooling, 1 = Heating
int sensorVal = 0;
int sensorTemp = 0;
int setTemp = 0;
int setTempCoolMin = 1;
int setTempCoolMax = 25;
int setTempHeatMin = 25;
int setTempHeatMax = 50;
// LCD CUSTOM CHARACTER
byte testChar[8] = {
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
byte celciusChar[8] = {
0b11000,
0b11000,
0b00111,
0b01000,
0b01000,
0b01000,
0b01000,
0b00111
};
byte thermometerChar[8] = {
0b00100,
0b01010,
0b01010,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110
};
byte fanChar[8] = {
0b00000,
0b01000,
0b00101,
0b01110,
0b10100,
0b00010,
0b00000,
0b00000
};
// END
void lcdTest() {
// LCD
digitalWrite(pinLcdBacklight, HIGH);
lcd.display();
lcd.clear();
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.write(byte(0));
//delay(25);
}
}
delay(500);
digitalWrite(pinLcdBacklight, LOW);
lcd.clear();
lcd.noDisplay();
//lcd.write(byte(1));
//delay(1000);
}
void lcdDisplay(int currentMode, int setTemp, int sensorTemp) {
// LCD
if (lcdMode == 0) {
lcd.noDisplay();
if (currentMode > 0) {
digitalWrite(pinLcdBacklight, HIGH);
lcd.display();
lcdMode++;
}
} else if (lcdMode == 1) {
if (lcdTimerMs == 0) {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("");
lcd.setCursor(0, 1);
lcd.print("Power on...");
lcdTimerMs++;
} else if (lcdTimerMs < 10) {
lcdTimerMs++;
} else if (lcdTimerMs == 10) {
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.write(byte(0));
delay(16);
}
}
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.print(" ");
delay(16);
}
}
lcd.clear();
lcdTimerMs = 0;
lcdMode++;
}
} else if (lcdMode == 2) {
if (currentMode < 1) {
lcdMode++;
} else {
lcd.setCursor(0, 0);
lcd.print(lcdStringMode[mode]);
lcd.setCursor(9, 0);
lcd.print("Set:");
lcd.setCursor(13, 0);
if (setTemp >= 10) {
lcd.print(setTemp);
lcd.write(1);
} else {
lcd.print(" ");
lcd.print(setTemp);
lcd.write(byte(1));
}
//lcd.print(setTemp);
//lcd.write(byte(1));
lcd.setCursor(0, 1);
lcd.write(2);
//lcd.print("Temp:");
lcd.setCursor(1, 1);
//lcd.setCursor(5, 1);
if (sensorTemp >= 10) {
lcd.print(" ");
lcd.print(sensorTemp);
lcd.write(byte(1));
} else if (sensorTemp >= 0) {
lcd.print(" ");
lcd.print(sensorTemp);
lcd.write(byte(1));
} else if (sensorTemp > -10) {
lcd.print(" ");
lcd.print(sensorTemp);
lcd.write(byte(1));
} else {
lcd.print(sensorTemp);
lcd.write(byte(1));
}
if (tecState == 0) {
lcd.setCursor(15, 1);
lcd.print(" ");
} else {
lcd.setCursor(15, 1);
lcd.write(3);
}
}
} else if (lcdMode == 3) {
if (lcdTimerMs == 0) {
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.write(byte(0));
delay(16);
}
}
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.print(" ");
delay(16);
}
}
//lcd.clear();
lcd.setCursor(3, 0);
lcd.print("");
lcd.setCursor(0, 1);
lcd.print("Power off...");
lcdTimerMs++;
} else if (lcdTimerMs < 10) {
lcdTimerMs++;
} else if (lcdTimerMs == 10) {
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.write(byte(0));
delay(16);
}
}
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 16; j++) {
lcd.setCursor(j, i);
lcd.print(" ");
delay(16);
}
}
lcd.clear();
lcd.noDisplay();
digitalWrite(pinLcdBacklight, LOW);
lcdTimerMs = 0;
lcdMode = 0;
}
}
}
int toggleMode(int currentMode) {
if (currentMode == 0) {
return currentMode;
} else if (currentMode == 1) {
if (mode == 0) {
return currentMode;
} else {
return ++currentMode;
}
} else {
return --currentMode;
}
}
void buzzerBeep(int beepType) {
if (beepType == 1) {
// Short beep
tone(pinBuzzer, 1000, 10);
} else if (beepType == 2) {
// Power up beep
tone(pinBuzzer, 1000, 50);
delay(75);
tone(pinBuzzer, 1200, 50);
delay(75);
tone(pinBuzzer, 1600, 50);
delay(75);
tone(pinBuzzer, 2000, 100);
} else if (beepType == 3) {
// Power off beep...
tone(pinBuzzer, 2000, 100);
delay(75);
tone(pinBuzzer, 1600, 50);
delay(75);
tone(pinBuzzer, 1200, 50);
delay(75);
tone(pinBuzzer, 1000, 50);
} else if (beepType == 4) {
// Mode beep
tone(pinBuzzer, 1000, 100);
//tone(pinBuzzer, 1000, 50);
//delay(150);
//tone(pinBuzzer, 1000, 50);
}
}
void setup() {
// put your setup code here, to run once:
pinMode(pinButtonRed, INPUT_PULLUP);
pinMode(pinButtonGreen, INPUT_PULLUP);
pinMode(pinButtonBlue, INPUT_PULLUP);
buttonRed = digitalRead(pinButtonRed);
buttonGreen = digitalRead(pinButtonGreen);
buttonBlue = digitalRead(pinButtonBlue);
pinMode(pinRelayCool, OUTPUT);
digitalWrite(pinRelayCool, LOW);
pinMode(pinRelayHeat, OUTPUT);
digitalWrite(pinRelayHeat, LOW);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLcdBacklight, OUTPUT);
lcd.begin(16, 2);
lcd.createChar(0, testChar);
lcd.createChar(1, celciusChar);
lcd.createChar(2, thermometerChar);
lcd.createChar(3, fanChar);
state = 0;
mode = 0;
tecState = 0;
lcdMode = 0;
lcdTimerMs = 0;
timerMs = 0;
timer = 0;
setTemp = 15;
lcdTest();
buzzerBeep(1);
}
void loop() {
// put your main code here, to run repeatedly:
delay(100);
buttonRed = digitalRead(pinButtonRed);
buttonGreen = digitalRead(pinButtonGreen);
buttonBlue = digitalRead(pinButtonBlue);
sensorVal = analogRead(A0);
sensorTemp = 1 / (log(1 / (1023. / sensorVal - 1)) / BETA + 1.0 / 298.15) - 273.15;
//int sensorTempInt = static_cast<int>(sensorTemp);
// Buttons
if (buttonRed == 0) {
if (state != 0) {
if (mode == 1) {
if (setTemp < setTempCoolMax) {
setTemp++;
buzzerBeep(1);
}
} else if (mode == 2) {
if (setTemp < setTempHeatMax) {
setTemp++;
buzzerBeep(1);
}
}
}
} else {
if (state != 0) {
if (mode == 1) {
if (setTemp > setTempCoolMax) {
setTemp--;
}
} else if (mode == 2) {
if (setTemp > setTempHeatMax) {
setTemp--;
}
}
}
}
if (buttonGreen == 0 && timerMs < 10) {
if (timerMs < 10) {
timerMs++;
} else {
timerMs = 0;
}
} else {
if (state == 1) {
if (timerMs == 10) {
// Power off
state = 0;
mode = toggleMode(state);
timerMs = 0;
buzzerBeep(3);
} else if (timerMs > 1) {
// Change modes
mode = toggleMode(mode);
timerMs = 0;
buzzerBeep(4);
}
} else {
if (timerMs == 10) {
// Power on
state = 1;
mode = toggleMode(state);
timerMs = 0;
buzzerBeep(2);
} else {
timerMs = 0;
}
}
//timerMs = 0;
//timer = 0;
}
if (buttonBlue == 0) {
if (state != 0) {
if (mode == 1) {
if (setTemp > setTempCoolMin) {
setTemp--;
buzzerBeep(1);
}
} else if (mode == 2) {
if (setTemp > setTempHeatMin) {
setTemp--;
buzzerBeep(1);
}
}
}
} else {
if (state != 0) {
if (mode == 1) {
if (setTemp < setTempCoolMin) {
setTemp++;
}
} else if (mode == 2) {
if (setTemp < setTempHeatMin) {
setTemp++;
}
}
}}
// TEC relay decision
if (mode == 1) {
if (sensorTemp > setTemp + 1) {
tecState = -1;
} else if (sensorTemp <= setTemp) {
tecState = 0;
}
} else if (mode == 2) {
if (sensorTemp < setTemp - 1) {
tecState = 1;
} else if (sensorTemp >= setTemp) {
tecState = 0;
}
} else {
tecState = 0;
}
// Set relay
if (tecState == 1) {
digitalWrite(pinRelayCool, LOW);
digitalWrite(pinRelayHeat, HIGH);
} else if (tecState == -1) {
digitalWrite(pinRelayCool, HIGH);
digitalWrite(pinRelayHeat, LOW);
} else {
digitalWrite(pinRelayCool, LOW);
digitalWrite(pinRelayHeat, LOW);
}
//lcdDisplay(lcdStringMode[mode], setTemp, sensorTemp);
lcdDisplay(mode, setTemp, sensorTemp);
}