#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
DHT dht(4, DHT22);
bool Switch_AC;
bool Switch_Heat;
bool Switch_Fan;
bool Switch_Auto;
bool Mode_Cool;
bool Mode_Heat;
float Switch_Point;
float Temp_Tol;
float Delay_Fan_Off;
float Delay_AC_ON;
float Delay_Heat_On;
float Temp;
float Temp_Setpoint;
float Humid;
int Mode;
int A_Mode;
int Pin_Cool = 0;
int Pin_Heat = 1;
int Pin_Fan = 2;
int Pin_Auto = 3;
int Pin_Dial = 31;
int Pin_Butt = 7;
int Pin_SWC = 14;
int Pin_SWH = 15;
int Pin_SWF = 16;
int Pin_SWA = 17;
int Screen_Num;
int Screen_Old;
void setup() {
//Pins
pinMode(Pin_SWC, INPUT);
pinMode(Pin_SWH, INPUT);
pinMode(Pin_SWF, INPUT);
pinMode(Pin_SWA, INPUT);
pinMode(Pin_Butt, INPUT);
pinMode(Pin_Cool, OUTPUT);
pinMode(Pin_Heat, OUTPUT);
pinMode(Pin_Fan, OUTPUT);
pinMode(Pin_Auto, OUTPUT);
// Init
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(3, 0);
lcd.print("Hello, world!");
lcd.setCursor(2, 1);
lcd.print("Wokwi Online IoT");
//Vars Initial Values
Switch_AC = 0;
Switch_Heat = 0;
Switch_Fan = 0;
Switch_Auto = 0;
Mode_Cool = 0;
Mode_Heat = 0;
Switch_Point = 0;
Temp_Tol = 0;
Delay_Fan_Off = 0;
Delay_AC_ON = 0;
Delay_Heat_On = 0;
Temp = 0.0;
Temp_Setpoint = 0.0;
Humid = 0.0;
Switch_Point = 10.0;
Temp_Tol = 10.0;
Mode = 0;
A_Mode = 0;
Screen_Num = 0;
Screen_Old = 0;
digitalWrite(Pin_Cool, HIGH);
digitalWrite(Pin_Heat, HIGH);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
delay(10000); // Wait for 10000 millisecond(s)
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, LOW);
digitalWrite(Pin_Auto, LOW);
delay(100); // Wait for 100 millisecond(s)
}
void loop()
{
if ((Switch_AC != digitalRead(Pin_SWC) || Switch_Heat != digitalRead(Pin_SWH)) || (Switch_Fan != digitalRead(Pin_SWF) || Switch_Auto != digitalRead(Pin_SWA))) {
Switch_AC = digitalRead(Pin_SWC);
Switch_Heat = digitalRead(Pin_SWH);
Switch_Fan = digitalRead(Pin_SWF);
Switch_Auto = digitalRead(Pin_SWA);
}
Temp = dht.readTemperature(true);
Humid = dht.readHumidity();
// Mode 0 = OFF
if (Switch_Auto == 0 && (Switch_Fan == 0 && (Switch_AC != 1 && Switch_Heat != 1 || Switch_AC == 1 && Switch_Heat == 1))) {
Mode = 0;
}
// Mode1 = Fan Only
if (Switch_Auto == 0 && (Switch_Fan == 1 && (Switch_AC != 1 && Switch_Heat != 1 || Switch_AC == 1 && Switch_Heat == 1))) {
Mode = 1;
}
// Mode 2 = AC On / Fan On
if (Switch_Auto == 0 && (Switch_Fan == 1 && (Switch_AC == 1 && Switch_Heat == 0))) {
Mode = 2;
}
// Mode 3 = AC On / Fan Auto
if (Switch_Auto == 0 && (Switch_Fan == 0 && (Switch_AC == 1 && Switch_Heat == 0))) {
Mode = 3;
}
// Mode 4 = Heat On / Fan On
if (Switch_Auto == 0 && (Switch_Fan == 1 && (Switch_Heat == 1 && Switch_AC == 0))) {
Mode = 4;
}
// Mode 5 = Heat On / Fan Auto
if (Switch_Auto == 0 && (Switch_Fan == 0 && (Switch_Heat == 1 && Switch_AC == 0))) {
Mode = 5;
}
// Mode 6 = Auto / Fan On
if (Switch_Auto == 1 && Switch_Fan == 1) {
Mode = 6;
}
// Mode 7 = Auto / Fan Auto
if (Switch_Auto == 1 && Switch_Fan == 0) {
Mode = 7;
}
/*
//
//
// OFF - Mode 0
if (Mode == 0) {
// OFF
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_Fan_Off); // Wait for 1000 * Delay_Fan_Off millisecond(s)
digitalWrite(Pin_Fan, LOW);
}
if (Mode == 1) {
// Fan Only
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
}
if (Mode == 2) {
// AC / Fan On
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_AC_ON); // Wait for 1000 * Delay_AC_ON millisecond(s)
digitalWrite(Pin_Cool, HIGH);
}
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
}
}
if (Mode == 3) {
// AC / Fan Auto
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_AC_ON); // Wait for 1000 * Delay_AC_ON millisecond(s)
digitalWrite(Pin_Cool, HIGH);
}
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_Fan_Off); // Wait for 1000 * Delay_Fan_Off millisecond(s)
digitalWrite(Pin_Fan, LOW);
}
}
if (Mode == 4) {
// Heat / Fan On
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_Heat_On); // Wait for 1000 * Delay_Heat_On millisecond(s)
digitalWrite(Pin_Heat, HIGH);
}
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
}
}
if (Mode == 5) {
// Heat / Fan Auto
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_Heat_On); // Wait for 1000 * Delay_Heat_On millisecond(s)
digitalWrite(Pin_Heat, HIGH);
}
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Auto, LOW);
delay(1000 * Delay_Fan_Off); // Wait for 1000 * Delay_Fan_Off millisecond(s)
digitalWrite(Pin_Fan, LOW);
}
}
if (Mode == 6) {
// Auto / Fan On
// A_Mode 0=Cool 1=Heat
if (A_Mode == 0 && Temp < Temp_Setpoint - Switch_Point) {
A_Mode = 1;
}
if (A_Mode == 1 && Temp > Temp_Setpoint + Switch_Point) {
A_Mode = 0;
}
if (A_Mode == 0) {
// AC / Fan On
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_AC_ON); // Wait for 1000 * Delay_AC_ON millisecond(s)
digitalWrite(Pin_Cool, HIGH);
}
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
}
}
if (A_Mode == 1) {
// Heat / Fan On
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_Heat_On); // Wait for 1000 * Delay_Heat_On millisecond(s)
digitalWrite(Pin_Heat, HIGH);
}
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
}
}
}
if (Mode == 7) {
// Auto / Fan Auto
// A_Mode 0=Cool 1=Heat
if (A_Mode == 0 && Temp < Temp_Setpoint - Switch_Point) {
A_Mode = 1;
}
if (A_Mode == 1 && Temp > Temp_Setpoint + Switch_Point) {
A_Mode = 0;
}
if (A_Mode == 0) {
// AC / Fan Auto
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_AC_ON); // Wait for 1000 * Delay_AC_ON millisecond(s)
digitalWrite(Pin_Cool, HIGH);
}
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_Fan_Off); // Wait for 1000 * Delay_Fan_Off millisecond(s)
digitalWrite(Pin_Fan, HIGH);
}
}
if (A_Mode == 1) {
// Heat / Fan Auto
if (Temp < Temp_Setpoint - Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Fan, HIGH);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_Heat_On); // Wait for 1000 * Delay_Heat_On millisecond(s)
digitalWrite(Pin_Heat, HIGH);
}
if (Temp > Temp_Setpoint + Temp_Tol) {
digitalWrite(Pin_Cool, LOW);
digitalWrite(Pin_Heat, LOW);
digitalWrite(Pin_Auto, HIGH);
delay(1000 * Delay_Fan_Off); // Wait for 1000 * Delay_Fan_Off millisecond(s)
digitalWrite(Pin_Fan, LOW);
}
}
}
// SCREENS
if (digitalRead(10) == 1) {
Screen_Num += 1;
if (Screen_Num < 0 || Screen_Num > 10) {
Screen_Num = 0;
}
}
if (Screen_Num != Screen_Old) {
lcd.clear();
}
if (Screen_Num == 0) {
Temp_Setpoint = map(analogRead(Pin_Dial), 0, 1023, 40, 110);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TEMP");
lcd.setCursor(5, 0);
lcd.print(Temp);
lcd.setCursor(9, 0);
lcd.print("/");
lcd.setCursor(10, 0);
lcd.print(Temp_Setpoint);
lcd.setCursor(15, 0);
lcd.print("F");
lcd.setCursor(0, 1);
lcd.print("Humidity");
lcd.setCursor(12, 1);
lcd.print(Humid);
lcd.setCursor(15, 1);
lcd.print("%");
}
if (Screen_Num == 1) {
Temp_Tol = map(analogRead(Pin_Dial), 0, 1023, 0, 20);
lcd.setCursor(0, 0);
lcd.print("Temp Gap");
lcd.setCursor(12, 0);
lcd.print(Temp_Tol);
lcd.setCursor(15, 0);
lcd.print("F");
}
if (Screen_Num == 2) {
Switch_Point = map(analogRead(Pin_Dial), 0, 1023, Temp_Tol, ((Temp_Tol + 5) + 25));
lcd.setCursor(0, 0);
lcd.print("Auto Gap");
lcd.setCursor(12, 0);
lcd.print(Switch_Point);
lcd.setCursor(15, 0);
lcd.print("F");
}
// Housekeeping
Screen_Old = Screen_Num;
*/
//Debug
Serial.println();
Serial.println(Switch_AC);
Serial.println(Switch_Heat);
Serial.println(Switch_Fan);
Serial.println(Switch_Auto);
Serial.println(Mode_Cool);
Serial.println(Mode_Heat);
Serial.println(Switch_Point);
Serial.println(Temp_Tol);
Serial.println(Delay_Fan_Off);
Serial.println(Delay_AC_ON );
Serial.println(Delay_Heat_On);
Serial.println(Temp);
Serial.println(Temp_Setpoint);
Serial.println(Humid);
Serial.println(Switch_Point);
Serial.println(Temp_Tol);
Serial.println(Mode);
Serial.println(A_Mode);
delay(100000);
}