Proyecto sensor de temperaturas con menu y pantalla lcd

Hola a todos! Quiero armar con arduino uno, 2 sondas DS18B20 y una lcd keypad shield, un sensor de temperaturas con un menu simple en pantalla para que ademas de las temperaturas mostradas pueda visualiarse la temperatura minima y la maxima, poder fijar hora y fecha y que los datos de las temperaturas se vallan grabando en la memoria del arduino, mas adelante agregare un dattalogger y tarjeta SD al proyecto. Tb necesito se apague la pantalla al no usarse y se prenda al oprimir cualquier boton del keypad shield, es para ahorrar energia ya que la idea es conectar las sondas y dejarlas durante 2 o tres dias, las lecturas de temperaturas se pueden hacer cada 1 o 5 minutos.

Estuve programando y viendo tutoriales pero no logro hacer el menu de minimo y maximo, ni hablar de todo lo otro jaja

Este es el codigo que hice hasta ahora:

#include <OneWire.h>                
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

OneWire ourWire1(2);                //Se establece el pin 2  como bus OneWire
OneWire ourWire2(3);                //Se establece el pin 3  como bus OneWire

DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1
DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
delay(500);
lcd.begin(16, 2);
Serial.begin(9600);
sensors1.begin();   //Se inicia el sensor 1
sensors2.begin();   //Se inicia el sensor 2
}

void loop() {
sensors1.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1

sensors2.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2

Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print("   Temperatura 2 = ");
Serial.print(temp2);
Serial.println(" C");

lcd.setCursor(0, 0);
lcd.print("Temp1 = ");
lcd.print(temp1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Temp2 = ");
lcd.print(temp2);
lcd.println(" C");
delay(500);          

}

Moderador
Por favor edita tu post usando etiquetas de código. Normas del foro

Cuando edites respondo.

OK, gracias por avisar, ya lo edite, slds

Hice el siguiente codigo:

#include <OneWire.h>                
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

OneWire ourWire1(2);                //Se establece el pin 2  como bus OneWire
OneWire ourWire2(3);                //Se establece el pin 3  como bus OneWire

DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1
DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


unsigned long tiempo; //esta variable permite el funcionamiento de la funcion despierto()


//esta funcion maneja el estado del display (encendido o apagado) para ahorrar energia
bool despierto(bool ajuste = false, int ajusteDormir = 0){
  static bool estadoLCD = false;
  static unsigned int dormir = 15;
  if(ajusteDormir != 0){ 
    dormir = ajusteDormir;
  }
  if(ajuste){ 
    //se captura cuando fue la ultima vez que el parametro 
    //"ajuste" fue verdadero (esto se usara para
    //cuando se precione un boton)    
    tiempo = millis() + (dormir * 1000);

    if(estadoLCD == false){
      backlight(); //enciende la pantalla LCD
      estadoLCD = true;
    }
  } else if((estadoLCD == true) && (millis() >= tiempo)){
      noBacklight(); //se apaga la pantalla LCD
      estadoLCD = false;
  }
  return estadoLCD;
}


void setup() {
delay(500);
lcd.begin(16, 2);
Serial.begin(9600);
sensors1.begin();   //Se inicia el sensor 1
sensors2.begin();   //Se inicia el sensor 2

//Enciende la pantalla del display, ajusta el tiempo de espera (en segundos) y comienza a contar
despierto(true, 15);
}

void loop() {
sensors1.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1

sensors2.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2

Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print("   Temperatura 2 = ");
Serial.print(temp2);
Serial.println(" C");

if(despierto()){
  lcd.setCursor(0, 0);
  lcd.print("Temp1 = ");
  lcd.print(temp1);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("Temp2 = ");
  lcd.print(temp2);
  lcd.println(" C");
} else {
  lcd.clear();
}
delay(500);
     

}

Cree la función "despierto( )" que devuleve el estado del programa (devuelve falso si tiene que estar dormido o verdadero si tiene que estar despierto).
En el setup (y si es necesario también puedes hacerlo en el loop) puedes configurar la función, tiene dos parametros, en el primero si pones true empesará a contar la cantidad de segundos que especifiques en el segundo parámetro, por ejemplo haces lo siguiente:

void setup(){
  despierto(true, 20);
}

Ese código pondrá en modo despierto por 20 segundos a tu arduino. Lo que se considera como "modo despierto" lo tienes que desarrollar dentro de algún IF o ciclo WHILE con la condición "despierto( )" y en la parte del ELSE va el codigo que se considere como dormido. Por ejemplo:

void loop(){
  if(despierto()){
    Serial.println("Estoy despierto! :D");
  } else {
    Serial.println("Tengo sueño.. mejor ire a dormir zZZ"); 
  }
}

Para implementar esta función dentro de un botón se hace así:

int boton1 = 4;
int boton2 = 5;
int boton3 = 6;
//el resto del codigo aqui

void setup(){
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  //el resto del codigo aquí
}
loop(){
  //si se preciona cualquier boton y el programa esta dormido, pasara a estar despierto
  //y esa pulsacion no afectara mas que solo para despertar la pantalla
  if( (digitalRead(boton1) || digitalRead(boton2) || dogitalRead(boton3)) && !despierto()){
    despierto(true); //esto despierta el arduino
  } else {
    if(digitalRead(boton1)){
      despierto(true); //mantiene despierto el programa reiniciando la cuenta regresiva
      //AQUI VA EL CODIGO DEL boton1
    }
    if(digitalRead(boton2)){
      despierto(true);
      //AQUI VA EL CODIGO DEL boton2
    }
    if(digitalRead(boton3)){
      despierto(true);
      //AQUI VA EL CODIGO DEL boton3
    }
  }
}

Espero que te sea útil y que lo comprendas, cualquier cosa me preguntas :smiley:

Moderador:
Lo editaste mal pero ya que al menos lo intentaste, la próxima te saldrá bien.
Lo acabo de corregir.