#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);}}}}}}
$abcdeabcde151015202530354045505560fghijfghij
Loading
ds18b20