#include <Wire.h>
#include <LiquidCrystal.h>
#include <RTClib.h>
#include "DHT.h"
#include <EEPROM.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7, 6);
RTC_DS1307 rtc;
const int LED_GREEN = 4;
const int LED_RED = 5;
const int BUZZER_PIN = 3;
const int JOY_BTN_PIN = 13;
const int LDR_PIN = A0;
float temperatura, umidade;
int ldrValor;
int ldrPercent;
unsigned long lastSensorRead = 0;
unsigned long lastDisplayUpdate = 0;
unsigned long lastSecond = 0;
const unsigned long SENSOR_INTERVAL = 5000;
const unsigned long DISPLAY_INTERVAL = 1000;
float TEMP_MIN = 20.0;
float TEMP_MAX = 28.0;
float LUX_MIN = 30.0;
float LUX_MAX = 80.0;
#define EEPROM_TEMP_ADDR 0
#define EEPROM_LDR_ADDR 10
bool hourlyAlarmActive = false;
int lastAlarmHour = -1;
byte termVazia_b[8] = {B00100,B01010,B01010,B01010,B10001,B10001,B10001,B01110};
byte termMeio_b[8] = {B00100,B01010,B01010,B01010,B11111,B11111,B11111,B01110};
byte termCheia_b[8] = {B00100,B01110,B01110,B01110,B11111,B11111,B11111,B01110};
byte lampVazia_b[8] = {B01110,B10001,B10001,B10001,B01010,B01110,B00000,B01110};
byte lampMeio_b[8] = {B01110,B10001,B10001,B11111,B01110,B01110,B00000,B01110};
byte lampCheia_b[8] = {B01110,B11111,B11111,B11111,B01110,B01110,B00000,B01110};
void image00(); void image01(); void image02(); void image03();
void image04(); void image05(); void image06(); void image07();
void showTeachMeAnimation() {
lcd.begin(16, 2);
lcd.setCursor(4,0); lcd.print("Wellness");
lcd.setCursor(4,1); lcd.print("Reminder");
delay(2000);
lcd.clear();
image00(); delay(500);
image01(); delay(500);
image02(); delay(500);
image03(); delay(800);
image04(); delay(600);
image05(); delay(600);
image06(); delay(800);
image07(); delay(1500);
lcd.clear();
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(JOY_BTN_PIN, INPUT_PULLUP);
dht.begin();
if (!rtc.begin()) {
lcd.print("Erro no RTC!");
while (1);
}
showTeachMeAnimation();
// Cria ícones
lcd.createChar(0, termVazia_b);
lcd.createChar(1, termMeio_b);
lcd.createChar(2, termCheia_b);
lcd.createChar(3, lampVazia_b);
lcd.createChar(4, lampMeio_b);
lcd.createChar(5, lampCheia_b);
lcd.clear();
}
void loop() {
DateTime now = rtc.now();
if (millis() - lastSensorRead >= SENSOR_INTERVAL) {
lastSensorRead = millis();
temperatura = dht.readTemperature();
umidade = dht.readHumidity();
int ldrVal = analogRead(LDR_PIN);
ldrPercent = map(ldrVal, 0, 1023, 100, 0);
if (isnan(temperatura) || isnan(umidade)) {
lcd.clear();
lcd.print("Erro no DHT!");
delay(1000);
return;
}
EEPROM.put(EEPROM_TEMP_ADDR, temperatura);
EEPROM.put(EEPROM_LDR_ADDR, ldrPercent);
}
if (millis() - lastDisplayUpdate >= DISPLAY_INTERVAL) {
lastDisplayUpdate = millis();
bool tempOk = (temperatura >= TEMP_MIN && temperatura <= TEMP_MAX);
bool luxOk = (ldrPercent >= LUX_MIN && ldrPercent <= LUX_MAX);
if (tempOk && luxOk) {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
noTone(BUZZER_PIN);
} else {
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
tone(BUZZER_PIN, 1000);
delay(1000);
noTone(BUZZER_PIN);
}
// Próxima pausa
int currentHour = now.hour();
int currentMin = now.minute();
int currentSec = now.second();
int segundosDesdeHora = currentMin * 60 + currentSec;
int segundosRestantes = 3600 - segundosDesdeHora;
int minutosRestantes = segundosRestantes / 60;
int segRest = segundosRestantes % 60;
lcd.clear();
lcd.setCursor(0,0);
if (temperatura < TEMP_MIN) lcd.write(byte(0));
else if (temperatura > TEMP_MAX) lcd.write(byte(2));
else lcd.write(byte(1));
lcd.print(temperatura,1);
lcd.print((char)223);
lcd.print("C ");
if (ldrPercent < LUX_MIN) lcd.write(byte(3));
else if (ldrPercent > LUX_MAX) lcd.write(byte(5));
else lcd.write(byte(4));
lcd.print(ldrPercent);
lcd.print("%");
// Linha 2: Tempo até a próxima pausa
lcd.setCursor(0,1);
lcd.print("Prox pausa:");
if (minutosRestantes < 10) lcd.print("0");
lcd.print(minutosRestantes);
lcd.print(":");
if (segRest < 10) lcd.print("0");
lcd.print(segRest);
}
if (now.minute() == 0 && now.second() == 0 && now.hour() != lastAlarmHour) {
lastAlarmHour = now.hour();
tone(BUZZER_PIN, 1000, 1000);
lcd.clear();
lcd.print("Hora da pausa!");
lcd.setCursor(0,1);
lcd.print("Press. joystick");
while (digitalRead(JOY_BTN_PIN) == HIGH);
noTone(BUZZER_PIN);
lcd.clear();
}
}
void image00()
{
lcd.clear();
byte image22[8] = {B00110, B01101, B11011, B10011, B00111, B01111, B01111, B11111};
byte image23[8] = {B01111, B11110, B11100, B11000, B11000, B10000, B10000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00001, B00111};
byte image08[8] = {B00000, B01000, B10000, B10000, B10000, B11111, B11111, B11000};
byte image09[8] = {B00000, B00000, B00000, B00000, B00000, B11000, B11000, B00100};
lcd.createChar(0, image22);
lcd.createChar(1, image23);
lcd.createChar(2, image07);
lcd.createChar(3, image08);
lcd.createChar(4, image09);
lcd.setCursor(5, 1);
lcd.write(byte(0));
lcd.setCursor(6, 1);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(7, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(4));
}
void image01()
{
lcd.clear();
byte image22[8] = {B00110, B00101, B00011, B00011, B00111, B01111, B01111, B11111};
byte image23[8] = {B01111, B11110, B11100, B11000, B11000, B10000, B10000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B11001, B10111};
byte image08[8] = {B00000, B01000, B10000, B10000, B10000, B11111, B11111, B11000};
byte image09[8] = {B00000, B00000, B00000, B00000, B00000, B11000, B11000, B00100};
byte image06[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00011};
lcd.createChar(0, image22);
lcd.createChar(1, image23);
lcd.createChar(2, image07);
lcd.createChar(3, image08);
lcd.createChar(4, image09);
lcd.createChar(5, image06);
lcd.setCursor(5, 1);
lcd.write(byte(0));
lcd.setCursor(6, 1);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(7, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(4));
lcd.setCursor(5, 0);
lcd.write(byte(5));
}
void image02()
{
lcd.clear();
byte image22[8] = {B00000, B00001, B00011, B00011, B00111, B01111, B01111, B11111};
byte image23[8] = {B01111, B11110, B11100, B11000, B11000, B10000, B10000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00001, B00111, B00100, B11001, B10111};
byte image08[8] = {B00000, B01000, B10000, B10000, B10000, B11111, B11111, B11000};
byte image09[8] = {B00000, B00000, B00000, B00000, B00000, B11000, B11000, B00100};
lcd.createChar(0, image22);
lcd.createChar(1, image23);
lcd.createChar(2, image07);
lcd.createChar(3, image08);
lcd.createChar(4, image09);
lcd.setCursor(5, 1);
lcd.write(byte(0));
lcd.setCursor(6, 1);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(7, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(4));
}
void image03()
{
lcd.clear();
byte image22[8] = {B00000, B00001, B00011, B00011, B00111, B01111, B01111, B11111};
byte image23[8] = {B01111, B11110, B11100, B11000, B11000, B10000, B10000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00001, B00111};
byte image08[8] = {B00000, B01000, B10000, B10000, B10000, B11111, B11111, B11010};
byte image09[8] = {B00000, B00000, B00000, B00000, B00000, B11000, B11000, B00100};
byte image24[8] = {B00010, B00111, B00111, B00111, B00111, B00111, B00010, B00000};
lcd.createChar(0, image22);
lcd.createChar(1, image23);
lcd.createChar(2, image07);
lcd.createChar(3, image08);
lcd.createChar(4, image09);
lcd.createChar(5, image24);
lcd.setCursor(5, 1);
lcd.write(byte(0));
lcd.setCursor(6, 1);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(7, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(4));
lcd.setCursor(7, 1);
lcd.write(byte(5));
}
void image04()
{
lcd.clear();
byte image22[8] = {B00000, B00001, B00011, B00011, B00111, B01111, B01111, B11111};
byte image23[8] = {B01111, B11110, B11100, B11000, B11000, B10001, B10000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00001, B00111};
byte image08[8] = {B00000, B01000, B10000, B10000, B10000, B11111, B11111, B11010};
byte image09[8] = {B00000, B00000, B00000, B00000, B00000, B11000, B11000, B00100};
byte image24[8] = {B00010, B00100, B01011, B10101, B11010, B10101, B11010, B01110};
byte image25[8] = {B00000, B00000, B00000, B10000, B10000, B00000, B00000, B00000};
lcd.createChar(0, image22);
lcd.createChar(1, image23);
lcd.createChar(2, image07);
lcd.createChar(3, image08);
lcd.createChar(4, image09);
lcd.createChar(5, image24);
lcd.createChar(6, image25);
lcd.setCursor(5, 1);
lcd.write(byte(0));
lcd.setCursor(6, 1);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(7, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(4));
lcd.setCursor(7, 1);
lcd.write(byte(5));
lcd.setCursor(8, 1);
lcd.write(byte(6));
}
void image05()
{
lcd.clear();
byte image24[8] = {B01010, B10100, B01011, B10101, B11010, B10101, B11010, B01110};
byte image25[8] = {B00000, B00000, B00000, B10000, B10000, B00000, B00000, B00000};
byte image23[8] = {B01101, B01010, B01101, B00111, B00000, B00000, B00000, B00000};
byte image07[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00001, B00011};
byte image08[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B10000};
lcd.createChar(0, image24);
lcd.createChar(1, image25);
lcd.createChar(2, image23);
lcd.createChar(3, image07);
lcd.createChar(4, image08);
lcd.setCursor(7, 1);
lcd.write(byte(0));
lcd.setCursor(8, 1);
lcd.write(byte(1));
lcd.setCursor(6, 1);
lcd.write(byte(2));
lcd.setCursor(6, 0);
lcd.write(byte(3));
lcd.setCursor(7, 0);
lcd.write(byte(4));
}
void image06()
{
lcd.clear();
byte image08[8] = {B00000, B00100, B01010, B01010, B10001, B00011, B00110, B01100};
byte image07[8] = {B00000, B00000, B00000, B00000, B00001, B00010, B00010, B00001};
byte image09[8] = {B00000, B00000, B10000, B11000, B00000, B00000, B11000, B00100};
byte image24[8] = {B00100, B00100, B00011, B00000, B00000, B00000, B00000, B00000};
byte image25[8] = {B10000, B00000, B00000, B00000, B00000, B00000, B00000, B00000};
lcd.createChar(0, image08);
lcd.createChar(1, image07);
lcd.createChar(2, image09);
lcd.createChar(3, image24);
lcd.createChar(4, image25);
lcd.setCursor(7, 0);
lcd.write(byte(0));
lcd.setCursor(6, 0);
lcd.write(byte(1));
lcd.setCursor(8, 0);
lcd.write(byte(2));
lcd.setCursor(7, 1);
lcd.write(byte(3));
lcd.setCursor(8, 1);
lcd.write(byte(4));
}
void image07()
{
lcd.clear();
byte image24[8] = {B10101, B01110, B01110, B00100, B10101, B01110, B00100, B11111};
byte image08[8] = {B00000, B00100, B01010, B01010, B10001, B00011, B00110, B01100};
byte image07[8] = {B00000, B00000, B00000, B00000, B00001, B00010, B00010, B00001};
byte image09[8] = {B00000, B00000, B10000, B11000, B00000, B00000, B00000, B00000};
lcd.createChar(0, image24);
lcd.createChar(1, image08);
lcd.createChar(2, image07);
lcd.createChar(3, image09);
lcd.setCursor(7, 1);
lcd.write(byte(0));
lcd.setCursor(7, 0);
lcd.write(byte(1));
lcd.setCursor(6, 0);
lcd.write(byte(2));
lcd.setCursor(8, 0);
lcd.write(byte(3));
}