//LIBRERIAS
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
//PIN SENSOR TEMPERATURA
#define DHTPIN 2
#define DHTTYPE DHT22
// PIN SENSOR MOVIMIENTO;
const int pirPin = 4;
//PIN BOTON RESETEO
const int buttonPin = 5 ;
// INICIALIZAR SENSOR
DHT dht(DHTPIN, DHTTYPE);
// VECTOR PARA HISTORIAL DE TIEMPO
const int TAMANO_VECTOR = 100;
DateTime tiempos[TAMANO_VECTOR];
int indexTiempo = 0;
//ESTADOS COMPOST
enum State {
STATE_VACIO,
STATE_LLENO,
STATE_MESOFILA,
STATE_TERMOFILA,
STATE_FINALIZADO,
};
State state = STATE_VACIO;
// INICIALIZAR LCD (DISPLAY)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize RTC
RTC_DS1307 rtc;
DateTime startTime;
void setup() {
Serial.begin(9600);
// INICIALIZAR SENSOR X2
dht.begin();
// SENSOR MOVIMIENTO COMO ENTRADA
pinMode(pirPin, INPUT);
// BOTON DE RESETEO COMO ENTRADA
pinMode(buttonPin, INPUT);
// INICIALIZANDO EL DISPLAY
lcd.init();
lcd.backlight();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("No se encontró el RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC no está corriendo, se ajustará la hora...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// SET EL TIEMPO DEL RELOJ
startTime = rtc.now();
}
void loop() {
float temperature = dht.readTemperature();
DateTime currentTime = rtc.now();
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature, 1);
switch (state) {
case STATE_VACIO:
lcd.setCursor(0, 0);
lcd.print("VACIO ");
if (digitalRead(pirPin) == HIGH) {
lcd.setCursor(0, 0);
lcd.print("LLENANDO ");
if (indexTiempo < TAMANO_VECTOR) {
tiempos[indexTiempo++] = currentTime;
}
state = STATE_LLENO;
}
break;
case STATE_LLENO:
lcd.setCursor(0, 0);
lcd.print("Llenado ");
if (digitalRead(buttonPin) == HIGH) {
state = STATE_VACIO;
}
if (indexTiempo > 0 && (currentTime - tiempos[indexTiempo - 1]).totalseconds() >= 15 && (temperature > 14)) {
state = STATE_MESOFILA;
}
break;
case STATE_MESOFILA:
lcd.setCursor(0, 0);
lcd.print("MESOFILA ");
if (buttonPin == HIGH) {
state = STATE_VACIO;
}
break;
}
}