#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int encoderPinA = 3;
const int encoderPinB = 4;
const int encoderButtonPin = 5;
int lastEncoded = 0;
int menuIndex = 0;
float lastTemperature = 0.0;
float lastHumidity = 0.0;
bool menuNeedsRedraw = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
bool isMenuSelected = false;
void setup() {
lcd.init();
lcd.backlight();
dht.begin();
rtc.begin();
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(encoderButtonPin, INPUT_PULLUP);
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error reading DHT22");
delay(2000);
return;
}
if (!menuNeedsRedraw) {
displayMainScreen(temperature, humidity);
handleMenuButton();
} else {
if (!isMenuSelected) {
displayMenuScreen();
handleMenuNavigation();
} else {
handleSelectedMenuItem();
}
}
}
void displayMainScreen(float temperature, float humidity) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1); // Display temperature with 1 decimal place
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(humidity, 1); // Display humidity with 1 decimal place
lcd.print("%");
}
void displayMenuScreen() {
lcd.clear();
lcd.setCursor(0, 0);
switch (menuIndex) {
case 0:
lcd.print("Humidity Set");
break;
case 1:
lcd.print("Time");
break;
case 2:
lcd.print("Home");
break;
}
}
void handleMenuButton() {
int buttonState = digitalRead(encoderButtonPin);
if (buttonState == LOW && (millis() - lastDebounceTime) > debounceDelay) {
menuNeedsRedraw = true;
isMenuSelected = false;
lastDebounceTime = millis();
delay(200); // Debounce delay
}
}
void handleMenuNavigation() {
int change = readEncoder();
if (change != 0) {
menuIndex += change;
if (menuIndex < 0) menuIndex = 2;
if (menuIndex > 2) menuIndex = 0;
lcd.clear();
menuNeedsRedraw = true;
delay(200); // Slow down the scroll speed
}
}
void handleSelectedMenuItem() {
if (menuIndex == 0) {
// Handle Humidity Set
// Display "Number Set" screen
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity Set");
lcd.setCursor(0, 1);
lcd.print(">number set");
delay(200); // Delay to stabilize display
} else if (menuIndex == 1) {
// Handle Time
// Display current time
DateTime now = rtc.now();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time:");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
delay(200); // Delay to stabilize display
} else if (menuIndex == 2) {
// Handle Home
menuNeedsRedraw = false;
isMenuSelected = false;
lcd.clear();
delay(200); // Delay to stabilize display
}
}
int readEncoder() {
int MSB = digitalRead(encoderPinA);
int LSB = digitalRead(encoderPinB);
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
lastEncoded = encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
return 1;
}
else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
return -1;
}
return 0;
}