#include <DHT.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define RELAY_PIN 10
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 11};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
float tempSetpoint = 25.0;
float humiditySetpoint = 50.0;
void setup() {
pinMode(RELAY_PIN, OUTPUT);
dht.begin();
delay(2000);
Serial.begin(9600);
Serial.println("DHTxx test!");
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
updateLCD("Initializing...", "Please wait...");
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
if (isnan(h) || isnan(t) ) {
updateLCD("Sensor error", "");
return;
} else {
updateLCD("Temp: " + String(t) + "C", "Humidity: " + String(h) + "%");
delay(200);
}
char key = keypad.getKey();
while (key == NO_KEY) {
updateLCD("Press Keypad", " ");
key = keypad.getKey();
delay(200); // Small delay to prevent overwhelming the CPU
}
if (key) {
switch (key) {
case 'A':
digitalWrite(RELAY_PIN, HIGH);
updateLCD("Fan turned ON", " ");
Serial.print("Fan turned ON");
break;
case 'B':
digitalWrite(RELAY_PIN, LOW);
updateLCD("Fan turned OFF", " ");
Serial.print("Fan turned OFF");
break;
case 'C':
humiditySetpoint = 30.0;
updateLCD("Humidity", "setpoint 30%");
break;
case 'D':
humiditySetpoint = 40.0;
updateLCD("Humidity", "setpoint 40%");
break;
case '*':
humiditySetpoint = 50.0;
updateLCD("Humidity", "setpoint 50%");
break;
case '#':
humiditySetpoint = 60.0;
updateLCD("Humidity", "setpoint 60%");
break;
default:
for (char numKey = '0'; numKey <= '9'; numKey++) {
if (key == numKey) {
tempSetpoint = (key - '0') * 10;
updateLCD("Temp setpoint:", ":" + String(tempSetpoint) + "C");
break;
}
}
}
delay(200);
if (t >= tempSetpoint || h >= humiditySetpoint) {
digitalWrite(RELAY_PIN, HIGH); // Turn on the fan
Serial.print("Fan turned ON");
} else {
digitalWrite(RELAY_PIN, LOW); // Turn off the fan
Serial.print("Fan turned OFF");
}
}
}
void updateLCD(String line1, String line2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
}