#include <DHT.h>
#include <Wire.h>
#include <U8glib.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
const int relayPin = 13;
int upButton = 4;
int selectButton = 8;
int downButton = 12;
struct Option {
String name;
int humidity;
unsigned long time;
};
Option menuItems[] = {
{"Seta 1", 30, 60000},
{"Seta 2", 35, 120000},
{"Seta 3", 40, 180000},
{"Seta 4", 45, 240000},
{"Seta 5", 50, 300000},
};
int menuItem = 0;
int previousMenuItem = -1;
unsigned long selectedTime = 0;
unsigned long endTime = 0;
bool inProgress = false;
String messages[] = {"You are awesome", "You rock", "Keep going", "Excellent!", "Nice job"};
unsigned long lastMessageChange = 0;
int currentMessage = 0;
void setup() {
pinMode(upButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
dht.begin();
u8g.setFont(u8g_font_6x12);
u8g.setColorIndex(1);
}
void loop() {
if (!inProgress) {
handleMenu();
} else {
handleOperation();
}
}
void handleMenu() {
if (digitalRead(upButton) == LOW) {
menuItem--;
delay(200);
} else if (digitalRead(downButton) == LOW) {
menuItem++;
delay(200);
} else if (digitalRead(selectButton) == LOW) {
selectedTime = menuItems[menuItem].time;
inProgress = true;
endTime = millis() + selectedTime;
delay(200);
}
menuItem = constrain(menuItem, 0, sizeof(menuItems) / sizeof(Option) - 1);
displayMenu();
}
void handleOperation() {
unsigned long now = millis();
float h = dht.readHumidity();
if (h < menuItems[menuItem].humidity) {
digitalWrite(relayPin, HIGH);
} else {
digitalWrite(relayPin, LOW);
}
if (now >= endTime) {
inProgress = false;
endTime = 0;
digitalWrite(relayPin, LOW);
return;
}
displayProgressBar(endTime - now);
}
void displayMenu() {
u8g.firstPage();
do {
u8g.setFont(u8g_font_6x12);
u8g.setPrintPos(0, 20);
u8g.print(menuItems[menuItem].name);
u8g.setPrintPos(0, 40);
u8g.print("Humidity: ");
u8g.print(menuItems[menuItem].humidity);
u8g.setPrintPos(0, 60);
u8g.print("Time: ");
u8g.print(menuItems[menuItem].time / 60000);
u8g.print(" minutes");
} while( u8g.nextPage() );
}
void displayProgressBar(unsigned long remaining) {
// Update the current message every 5 seconds
if (millis() - lastMessageChange > 5000) {
lastMessageChange = millis();
currentMessage = (currentMessage + 1) % (sizeof(messages) / sizeof(String));
}
u8g.firstPage();
do {
u8g.setFont(u8g_font_6x12);
u8g.setPrintPos(0, 10);
u8g.print("Selected:");
u8g.setPrintPos(60, 10);
u8g.print(menuItems[menuItem].name);
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
u8g.setPrintPos(0, 20);
u8g.print("Humidity: ");
u8g.print(humidity);
u8g.setPrintPos(0, 30);
u8g.print("Temp: ");
u8g.print(temperature);
u8g.setPrintPos(0, 40);
u8g.print("Time left: ");
if (remaining >= 60000) {
int minutes = remaining / 60000;
int seconds = (remaining % 60000) / 1000;
u8g.print(minutes);
u8g.print(":");
if (seconds < 10) u8g.print("0"); // zero pad on left if necessary
u8g.print(seconds);
} else {
u8g.print(remaining / 1000);
u8g.print(" seconds left");
}
u8g.drawStr(25, 50, messages[currentMessage].c_str()); // Replace "Cargando setas" with current message
u8g.drawFrame(0, 55, 128, 10);
int progress = map(remaining, selectedTime, 0, 0, 128);
u8g.drawBox(0, 60, progress, 5);
} while( u8g.nextPage() );
}