#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "RTClib.h"
// DEFINICIÓN DE CONSTANTES
#define DHTPIN 2
#define DHTTYPE DHT11
#define rele 8
#define PULSADOR_IZQUIERDA A0
#define PULSADOR_OK A1
#define PULSADOR_DERECHA A2
#define RETARDO_ANTIREBOTE 200
typedef enum { ESTADO_INFO,
ESTADO_CONFIGURAR,
ESTADO_MENU_HUMEDAD,
ESTADO_MENU_HORARIO } estadoMEF;
enum { OPCION_UMBRAL_HUMEDAD,
OPCION_UMBRAL_HORARIO };
enum { HUM1, HUM2, HUM3};
// DECLARACIÓN DE FUNCIONES
void inicializarMEF(estadoMEF *punteroEstadoActual);
void actualizarMEF(estadoMEF *punteroEstadoActual);
estadoMEF estadoActual;
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// DECLARACIÓN DE VARIABLES GLOBALES
uint16_t miliSegundos;
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
bool banderaRegando = false;
float humedad;
float temperatura;
float f;
int umbralHumedad = 40 ;
int opcionMenu;
void setup() {
inicializarMEF(&estadoActual);
Serial.begin(9600);
delay(2000);
lcd.init(); // especifico caracteres y cantidad de lineas
lcd.backlight();
dht.begin();
#ifndef ESP8266
while (!Serial)
;
#endif
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(2023, 9, 4, 16, 12, 0));
}
byte circulo[] = {
B01110,
B01010,
B01110,
B00000,
B00000,
B00000,
B00000,
B00000
};
lcd.createChar(0, circulo);
pinMode(rele, OUTPUT);
pinMode(PULSADOR_IZQUIERDA, INPUT_PULLUP);
pinMode(PULSADOR_OK, INPUT_PULLUP);
pinMode(PULSADOR_DERECHA, INPUT_PULLUP);
opcionMenu = OPCION_UMBRAL_HUMEDAD;
}
void loop() {
actualizarMEF(&estadoActual);
delay(1);
miliSegundos++;
}
void inicializarMEF(estadoMEF *punteroEstadoActual) {
*punteroEstadoActual = ESTADO_INFO;
}
void actualizarMEF(estadoMEF *punteroEstadoActual) {
switch (*punteroEstadoActual) {
case ESTADO_INFO:
/*CADA 3 SEG MUESTRO EN LCD INFO*/
if (miliSegundos >= 3000) {
miliSegundos = 0;
humedad = dht.readHumidity();
temperatura = dht.readTemperature();
f = dht.readTemperature(true);
if (isnan(humedad) || isnan(temperatura) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
lcd.setCursor(0, 0);
lcd.print("H: ");
lcd.print(int(humedad));
lcd.print("% ");
lcd.setCursor(8, 0);
lcd.print("T: ");
lcd.print(int(temperatura));
lcd.write(byte(0));
lcd.print("C");
DateTime now = rtc.now();
lcd.setCursor(0, 1);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(" ");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
}
if (humedad < umbralHumedad && banderaRegando == false) {
digitalWrite(rele, HIGH);
banderaRegando = true;
}
if (humedad > umbralHumedad && banderaRegando == true) {
digitalWrite(rele, LOW);
banderaRegando = false;
}
if (digitalRead(PULSADOR_IZQUIERDA) == LOW && digitalRead(PULSADOR_DERECHA) == LOW) {
lcd.clear();
lcd.print("Configurar... ");
delay(2000);
lcd.clear();
*punteroEstadoActual = ESTADO_CONFIGURAR;
}
break;
case ESTADO_CONFIGURAR:
lcd.setCursor(0, 0);
lcd.print("Configurar: ");
if (digitalRead(PULSADOR_DERECHA) == LOW) {
delay(RETARDO_ANTIREBOTE);
opcionMenu++;
if (opcionMenu == 2)
opcionMenu = 0;
}
if (digitalRead(PULSADOR_IZQUIERDA) == LOW) {
delay(RETARDO_ANTIREBOTE);
opcionMenu--;
if (opcionMenu == -1)
opcionMenu = 1;
}
switch (opcionMenu) {
case OPCION_UMBRAL_HUMEDAD:
lcd.setCursor(0, 1);
lcd.print("<UMBRAL HUMEDAD>");
if (digitalRead(PULSADOR_OK) == LOW) {
lcd.clear();
lcd.print("MENU_HUMEDAD... ");
delay(2000);
lcd.clear();
miliSegundos = 3000;
*punteroEstadoActual = ESTADO_MENU_HUMEDAD;
}
break;
case OPCION_UMBRAL_HORARIO:
lcd.setCursor(0, 1);
lcd.print("<UMBRAL HORARIO>");
if (digitalRead(PULSADOR_OK) == LOW) {
lcd.clear();
lcd.print("MENU_HORARIO... ");
delay(2000);
lcd.clear();
miliSegundos = 3000;
*punteroEstadoActual = ESTADO_MENU_HORARIO;
}
break;
}
break;
case ESTADO_MENU_HUMEDAD:
lcd.setCursor(0, 0);
lcd.print("Configurar HUM:");
if (digitalRead(PULSADOR_DERECHA) == LOW) {
delay(RETARDO_ANTIREBOTE);
opcionMenu++;
if (opcionMenu == 3)
opcionMenu = 0;
}
if (digitalRead(PULSADOR_IZQUIERDA) == LOW) {
delay(RETARDO_ANTIREBOTE);
opcionMenu--;
if (opcionMenu == -1)
opcionMenu = 2;
}
switch (opcionMenu) {
case HUM1:
lcd.setCursor(0, 1);
lcd.print("<HUMEDAD1>");
if (digitalRead(PULSADOR_OK) == LOW) {
umbralHumedad = 30;
lcd.clear();
lcd.print("Cambio 30% OK ");
delay(2000);
lcd.clear();
miliSegundos = 3000;
*punteroEstadoActual = ESTADO_INFO;
}
break;
case HUM2:
lcd.setCursor(0, 1);
lcd.print("<HUMEDAD2>");
if (digitalRead(PULSADOR_OK) == LOW) {
umbralHumedad = 40;
lcd.clear();
lcd.print("Cambio 40% OK ");
delay(2000);
lcd.clear();
miliSegundos = 3000;
*punteroEstadoActual = ESTADO_INFO;
}
break;
case HUM3:
lcd.setCursor(0, 1);
lcd.print("<HUMEDAD3>");
if (digitalRead(PULSADOR_OK) == LOW) {
umbralHumedad = 60;
lcd.clear();
lcd.print("Cambio 60% OK ");
delay(2000);
lcd.clear();
miliSegundos = 3000;
*punteroEstadoActual = ESTADO_INFO;
}
break;
}
}
}