#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20 11
int contador_min = 0;
int contador=0;
int contador2 =0;
unsigned long t_inicial;
float t_minutos[60];
float t_max_horas[24];
float t_min_horas[24];
float t_promedio_horas[24];
float promedio;
float maxima[2];
float minima[2];
float max_dia;
float tiempo_max_dia;
float min_dia;
float tiempo_min_dia;
float promedio_dia;
int estado;
int estado1;
int estado2;
int estado3;
OneWire oneWire(DS18B20);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2);
// función promedio
float promedio_array(float valores[], int datos){
float suma = 0;
for(int i =0;i<=datos;i++){
suma += valores[i];}
return promedio = suma/datos;}
// función max
void maximo_array(float valores[],int datos,float arr[],int contador2){
float valor = valores[0];
for(int i =0;i<=datos;i++){
if (valor < valores[i]){
valor = valores[i];
arr[0]=valor;
arr[1]=i+60*contador2;}}}
// función min
void minimo_array(float valores[],int datos,float arr[], int contador2){
float resp[2];
float valor = valores[0];
for(int i =0;i<=datos;i++){
if (valor > valores[i]){
valor = valores[i];
arr[0]=valor;
arr[1]=i+60*contador2;}}}
// imprimir temperatura y tiempo
void imprimir_actual(int contador, float t_minutos[],
int contador_min, int pin1, int pin2, int pin3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("t.ON:");
lcd.setCursor(5,0);
lcd.print(contador_min);
lcd.setCursor(8,0);
lcd.print("T:");
lcd.setCursor(10,0);
lcd.print(t_minutos[contador]);
digitalWrite(pin1,0);
digitalWrite(pin2,0);
digitalWrite(pin3,0);}
// imprimir minimo
void imprimir_min(float temp, float tiempo,
int pin1, int pin2, int pin3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("tmin:");
lcd.setCursor(6,0);
lcd.print(temp);
lcd.setCursor(11,0);
lcd.print("t:");
lcd.setCursor(13,0);
lcd.print(tiempo);
digitalWrite(pin1,1);
digitalWrite(pin2,0);
digitalWrite(pin3,0);}
// imprimir máximo
void imprimir_max(float temp, float tiempo,
int pin1, int pin2, int pin3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("tmax:");
lcd.setCursor(7,0);
lcd.print(temp);
lcd.setCursor(11,0);
lcd.print("t:");
lcd.setCursor(13,0);
lcd.print(tiempo);
digitalWrite(pin1,0);
digitalWrite(pin2,1);
digitalWrite(pin3,0);}
// imprimir promedio
void imprimir_promedio(float promedio,
int pin1, int pin2, int pin3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("tpromedio:");
lcd.setCursor(12,0);
lcd.print(promedio);
digitalWrite(pin1,0);
digitalWrite(pin2,0);
digitalWrite(pin3,1);}
// imprimir error
void imprimir_error(int pin1, int pin2, int pin3,
unsigned long t_inicial){
bool estado = false;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("conf. erronea");
digitalWrite(pin1,1);
digitalWrite(pin2,1);
digitalWrite(pin3,1);
delay(100);
digitalWrite(pin1,0);
digitalWrite(pin2,0);
digitalWrite(pin3,0);}
void setup() {
pinMode(7,INPUT);
pinMode(6,INPUT);
pinMode(5,INPUT);
pinMode(4,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);
Serial.begin(9600);
sensors.begin();
lcd.begin(16,2);
t_inicial = millis();}
void loop() {
// estados
estado1 = digitalRead(7);
estado2 = digitalRead(6);
estado3 = digitalRead(5);
estado = estado1+estado2+estado3;
// lectura del sensor
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
// medir tiempo
if (millis()-t_inicial >= 10){
contador_min++;
contador++;
t_inicial = millis();
//guardar temperatura
if (contador<60){
t_minutos[contador]=temp;
if(contador2<1){
promedio = promedio_array(t_minutos,contador);
maximo_array(t_minutos,contador,maxima,contador2);
minimo_array(t_minutos,contador,minima,contador2);}}
else{
lcd.clear();
contador = 0;
if (contador2<24){
contador2++;
promedio = promedio_array(t_minutos,60);
maximo_array(t_minutos,60,maxima,contador2);
minimo_array(t_minutos,60,minima,contador2);
t_max_horas[contador2] = maxima[0];
t_min_horas[contador2] = minima[0];
t_promedio_horas[contador2]=promedio;}
else{
lcd.clear();
contador2 = 0;
maximo_array(t_minutos,24,maxima,0);
minimo_array(t_minutos,24,minima,0);
max_dia = maxima[0];
tiempo_max_dia = maxima[1];
min_dia = maxima[0];
tiempo_min_dia = minima[1];
promedio_dia = promedio_array(t_promedio_horas,24);}}}
if (estado1 == 0 && estado2 == 0 && estado3 == 0){
imprimir_actual(contador,t_minutos,contador_min,2,3,4);}
else{
if (estado1 == 1 && estado2 == 0 && estado3 == 0){
imprimir_min(minima[0], minima[1],2,3,4);
}
else{
if (estado1 == 0 && estado2 == 1 && estado3 == 0){
imprimir_max(maxima[0], maxima[1],2,3,4);}
else{
if (estado1 == 0 && estado2 == 0 && estado3 == 1){
imprimir_promedio(promedio,2,3,4);}
else{
if (estado > 1){
imprimir_error(2,3,4,t_inicial);}}}}}}