#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definiciones de pines para LEDs e interruptores
#define INT1_PIN 2
#define INT2_PIN 3
#define INT3_PIN 4
#define L1_PIN 5
#define L2_PIN 6
#define L3_PIN 7
// Configuración de la LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Arreglos para almacenar los datos de temperatura
float temperaturas[60]; // Almacena las últimas 60 lecturas de temperatura
float temperaturasD[24];
float minimaHora = 100; // Inicializar con un valor alto
float maximaHora = -100; // Inicializar con un valor bajo
float minimaHoraH = 100; // Inicializar con un valor alto
float maximaHoraH = -100; // Inicializar con un valor bajo
float sumaHora = 0;
int conteoHora = 0;
float minimaDia = 100;
float maximaDia = -100;
float sumaDia = 0;
int conteoDia = 0;
int tiempoMinimaHoram;
int tiempoMaximaHoram;
int tiempoMinimaHoraH;
int tiempoMaximaHoraH;
float promedioHora;
// Seguimiento del tiempo
unsigned long tiempoInicio;
unsigned long ultimaActualizacionHora = 0;
unsigned long ultimaActualizacionDia = 0;
// Pin del sensor de temperatura (A1)
const int sensorTempPin = A1;
void setup() {
// Inicializar componentes
pinMode(INT1_PIN, INPUT);
pinMode(INT2_PIN, INPUT);
pinMode(INT3_PIN, INPUT);
pinMode(L1_PIN, OUTPUT);
pinMode(L2_PIN, OUTPUT);
pinMode(L3_PIN, OUTPUT);
lcd.init();
lcd.backlight();
// Inicializar temporizador
tiempoInicio = millis();
Serial.begin(9600);
}
void loop() {
// Leer la temperatura cada minuto
unsigned long tiempoActual = millis();
if (tiempoActual - ultimaActualizacionHora >= 1000) {
leerTemperatura();
ultimaActualizacionHora = tiempoActual;
}
// Calcular estadísticas por hora
if (tiempoActual - ultimaActualizacionDia >= 60000) {
calcularEstadisticasHora();
ultimaActualizacionDia = tiempoActual;
}
// Calcular estadísticas diarias
if (tiempoActual - tiempoInicio >= 1440000) {
calcularEstadisticasDia();
}
// Controlar LEDs y LCD según interruptores
controlarInterruptoresYLeds();
// Actualizar la pantalla LCD
//actualizarLCD();
}
void leerTemperatura() {
// Leer la temperatura desde el sensor (en grados Celsius)
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
float lecturaTemp = analogRead(sensorTempPin);
float celsius = 1 / (log(1 / (1023. / lecturaTemp - 1)) / BETA + 1.0 / 298.15) - 273.15;
// Almacenar la lectura actual en el arreglo
for (int i = 59; i > 0; i--) {
temperaturas[i] = temperaturas[i - 1];
}
temperaturas[0] = celsius;
// Calcular estadísticas por hora
sumaHora += celsius;
conteoHora++;
if (celsius < minimaHora) {
minimaHora = celsius;
tiempoMinimaHoram = (millis() - tiempoInicio) / 1000; // Registrar el tiempo en el que se tomó la temperatura máxima
}
if (celsius > maximaHora) {
maximaHora = celsius;
tiempoMaximaHoram = (millis() - tiempoInicio) / 1000; // Registrar el tiempo en el que se tomó la temperatura máxima
}
}
void calcularEstadisticasHora() {
if (conteoHora > 0) {
// Calcular la temperatura promedio de la última hora
promedioHora = sumaHora / conteoHora;
for (int i = 23; i > 0; i--) {
temperaturasD[i] = temperaturasD[i - 1];
}
temperaturasD[0] = promedioHora;
// Almacenar o actualizar las estadísticas por hora
if (promedioHora < minimaHora) {
minimaHoraH = promedioHora;
tiempoMinimaHoraH = (millis() - tiempoInicio) / 60000;
}
if (promedioHora > maximaHora) {
maximaHoraH = promedioHora;
tiempoMaximaHoraH = (millis() - tiempoInicio) / 60000;
}
// Reiniciar contadores por hora
sumaHora = 0;
conteoHora = 0;
}
sumaDia += promedioHora;
conteoDia++;
}
void calcularEstadisticasDia() {
if (conteoDia > 0) {
// Calcular la temperatura promedio del día
float promedioDia = sumaDia / conteoDia;
// Almacenar o actualizar las estadísticas diarias
if (promedioDia < minimaDia) {
minimaDia = promedioDia;
}
if (promedioDia > maximaDia) {
maximaDia = promedioDia;
}
// Reiniciar contadores diarios
sumaDia = 0;
conteoDia = 0;
}
}
void controlarInterruptoresYLeds() {
bool estadoINT1 = digitalRead(INT1_PIN);
bool estadoINT2 = digitalRead(INT2_PIN);
bool estadoINT3 = digitalRead(INT3_PIN);
if (estadoINT1 && !estadoINT2 && !estadoINT3) {
// INT1 ON, otros OFF
digitalWrite(L1_PIN, HIGH);
digitalWrite(L2_PIN, LOW);
digitalWrite(L3_PIN, LOW);
if (tiempoMinimaHoraH>=1){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Minima: ");
lcd.print(minimaHoraH, 1);
lcd.setCursor(0, 1);
lcd.print("T.MIN: ");
lcd.print(tiempoMinimaHoraH); // Mostrar tiempo en minutos
lcd.print(" min.");
}else{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Minima: ");
lcd.print(minimaHora, 1);
lcd.setCursor(0, 1);
lcd.print("T.MIN: ");
lcd.print(tiempoMinimaHoram); // Mostrar tiempo en minutos
lcd.print(" min.");
}
} else if (!estadoINT1 && estadoINT2 && !estadoINT3) {
// INT2 ON, otros OFF
digitalWrite(L1_PIN, LOW);
digitalWrite(L2_PIN, HIGH);
digitalWrite(L3_PIN, LOW);
if (tiempoMaximaHoraH>=1){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Maxima: ");
lcd.print(maximaHoraH, 1);
lcd.setCursor(0, 1);
lcd.print("T.MAX: ");
lcd.print(tiempoMaximaHoraH); // Mostrar tiempo en minutos
lcd.print(" min.");
}else{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Maxima: ");
lcd.print(maximaHora, 1);
lcd.setCursor(0, 1);
lcd.print("T.MAX: ");
lcd.print(tiempoMaximaHoram); // Mostrar tiempo en minutos
lcd.print(" min.");
}
} else if (!estadoINT1 && !estadoINT2 && estadoINT3) {
// INT3 ON, otros OFF
digitalWrite(L1_PIN, LOW);
digitalWrite(L2_PIN, LOW);
digitalWrite(L3_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Promedio: ");
lcd.print(promedioHora, 1);
} else if (!estadoINT1 && !estadoINT2 && !estadoINT3) {
// INT3 ON, otros OFF
digitalWrite(L1_PIN, LOW);
digitalWrite(L2_PIN, LOW);
digitalWrite(L3_PIN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T.Actual: ");
lcd.print(temperaturas[0], 1); // Mostrar un decimal de la temperatura
// Mostrar el tiempo transcurrido
lcd.setCursor(0, 1);
lcd.print("T.ON: ");
lcd.print((millis() - tiempoInicio) / 1000);
lcd.print(" min.");
} else {
// Otras combinaciones
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONF. ERRONEA");
// Hacer parpadear L1, L2, L3
digitalWrite(L1_PIN,LOW);
digitalWrite(L2_PIN,LOW);
digitalWrite(L3_PIN,LOW);
delay(500);
digitalWrite(L1_PIN,HIGH);
digitalWrite(L2_PIN,HIGH);
digitalWrite(L3_PIN,HIGH);
delay(500);
digitalWrite(L1_PIN,LOW);
digitalWrite(L2_PIN,LOW);
digitalWrite(L3_PIN,LOW);
delay(500);
digitalWrite(L1_PIN,HIGH);
digitalWrite(L2_PIN,HIGH);
digitalWrite(L3_PIN,HIGH);
}
}