#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 tiempominimo[24];
float tiempomaximo[24];
float tempminimo[24];
float tempmaximo[24];
float minimaHora = 100; // Inicializar con un valor alto
float maximaHora = -100; // Inicializar con un valor bajo
float minimaHoraD = 100; // Inicializar con un valor alto
float maximaHoraD = -100; // Inicializar con un valor bajo
float sumaHora = 0;
int conteoHora = 0;
float minimaDia = 100;
float maximaDia = -100;
float sumaDia = 0;
int conteoDia = 0;
float celsius=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() {
delay(1000);
// 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);
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] = celsius;
}
// Calcular estadísticas por hora
for (int d = 59; d > 0; d--){
sumaHora += temperaturas[d];
conteoHora++;
if (temperaturas[d] < minimaHora) {
minimaHora = temperaturas[d];
tiempoMinimaHoram = (millis() - tiempoInicio) / 1000; // Registrar el tiempo en el que se tomó la temperatura máxima
}
if (temperaturas[d] > maximaHora) {
maximaHora = temperaturas[d];
tiempoMaximaHoram = (millis() - tiempoInicio) / 1000; // Registrar el tiempo en el que se tomó la temperatura máxima
}
}
promedioHora = sumaHora / conteoHora;
}
void calcularEstadisticasHora() {
if (conteoHora > 0) {
// Calcular la temperatura promedio de la última hora
for (int i = 23; i > 0; i--) {
temperaturasD[i] = promedioHora;
}
for (int i = 23; i > 0; i--) {
tempminimo[i] = minimaHora;
}
for (int i = 23; i > 0; i--) {
tempmaximo[i] = maximaHora;
}
for (int i = 23; i > 0; i--) {
tiempomaximo[i] = tiempoMaximaHoram;
}
for (int i = 23; i > 0; i--) {
tiempominimo[i] = tiempoMinimaHoram;
}
// Reiniciar contadores por hora
sumaHora = 0;
conteoHora = 0;
minimaHora=100;
maximaHora=-100;
}
sumaDia += promedioHora;
conteoDia++;
}
void calcularEstadisticasDia() {
if (conteoDia > 0) {
// Calcular la temperatura promedio del día
float promedioDia = sumaDia / conteoDia;
float Tiempomax;
float Tiempomin;
// Almacenar o actualizar las estadísticas diarias
for (int d = 23; d > 0; d--){
if (tempminimo[d] < minimaHoraD) {
minimaHoraD = tempminimo[d];
Tiempomin=tiempominimo[d];
}
if (tempmaximo[d] > maximaHoraD) {
maximaHoraD = tempmaximo[d];
Tiempomax=tiempomaximo[d];
}
}
// 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);
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);
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);
lcd.setCursor(0, 1);
lcd.print("T.ON: ");
lcd.print((millis() - tiempoInicio) / 60000);
lcd.print(" hrs.");
} 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(celsius,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);
}
}