#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <DHT.h>
#include <RTClib.h>
#define DHTPIN 7 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302) sensor type
DHT dht(DHTPIN, DHTTYPE);
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define BUTTON_PIN 4
Adafruit_SSD1306 lcd(128, 64, &Wire, 4);
RTC_DS3231 rtc;
int lastClkState = HIGH;
int encoderValue = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 150; // Increased debounce delay
unsigned long lastRefreshTime = 0;
unsigned long refreshInterval = 500; // Refresh interval for the home screen
bool menuEntered = false;
// Define menu item names
String menuItems[] = {"- Cure Time", "- Temp Set", "- Humidity Set", "Back"};
void setup() {
Serial.begin(115200);
lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C);
rtc.begin();
dht.begin();
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Display the home screen on startup
displayHomeScreen();
}
void loop() {
int clkState = digitalRead(ENCODER_CLK);
int dtState = digitalRead(ENCODER_DT);
int buttonState = digitalRead(BUTTON_PIN);
if (!menuEntered && buttonState == LOW && encoderValue == 0) {
menuEntered = true;
encoderValue = 0;
displayMenu(encoderValue);
} else if (menuEntered && buttonState == LOW && encoderValue == 3) {
delay(150); // Added delay to prevent re-entering the menu
menuEntered = false;
encoderValue = 0; // Reset encoder value
displayHomeScreen();
}
if (menuEntered && clkState != lastClkState) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (clkState == LOW) {
// Clockwise rotation
if (dtState == HIGH) {
encoderValue++;
}
// Counterclockwise rotation
else {
encoderValue--;
}
// Adjust encoderValue to match the number of menu items
encoderValue = (encoderValue + 4) % 4;
displayMenu(encoderValue);
}
lastDebounceTime = millis();
}
}
lastClkState = clkState;
// Refresh the home screen every refreshInterval milliseconds
if (!menuEntered && (millis() - lastRefreshTime) > refreshInterval) {
displayHomeScreen();
lastRefreshTime = millis();
}
}
void displayHomeScreen() {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
// Display current time at the top center
DateTime now = rtc.now();
int hour = now.hour();
int minute = now.minute();
int second = now.second();
String period = (hour < 12) ? "AM" : "PM";
if (hour > 12) hour -= 12;
lcd.setCursor(50, 0);
if (hour < 10) lcd.print("0");
lcd.print(hour);
lcd.print(':');
if (minute < 10) lcd.print("0");
lcd.print(minute);
lcd.print(':');
if (second < 10) lcd.print("0");
lcd.print(second);
lcd.print(" ");
lcd.print(period);
// Draw temperature circle
lcd.fillCircle(23, 18, 17, WHITE);
lcd.setTextColor(BLACK); // Set text color to black
lcd.setCursor(9, 14);
lcd.print(dht.readTemperature(), 1); // Display temperature with one decimal point
lcd.print("c");
// Draw humidity circle
lcd.fillCircle(106, 18, 17, WHITE);
lcd.setTextColor(BLACK); // Set text color to black
lcd.setCursor(91, 14);
lcd.print(dht.readHumidity(), 1); // Display humidity with one decimal point
lcd.print("%");
// Draw "Cure Time"
lcd.setTextSize(1);
lcd.setCursor(42, 40);
lcd.print("Cure Time");
// Display "MENU" at the bottom in the middle
lcd.setCursor(40, 54);
lcd.print("MENU");
lcd.display();
}
void displayMenu(int currentItem) {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(30, 0);
lcd.print("MENU");
for (int i = 0; i < 4; i++) {
if (i == currentItem) {
lcd.setCursor(5, 10 + i * 10);
lcd.print(">");
}
lcd.setCursor(15, 10 + i * 10);
lcd.print(menuItems[i]);
}
lcd.display();
}
Loading
ssd1306
ssd1306