Mantener un texto en LCD mientras cambia valor [SOLUCIONADO]

Hola a todos, y como siempre y antes de nada agradecer a todos los que participais en este foro, a los que comparten sus problemas y a los otros que los solucionan (con ambos se aprende bastante).

La cuestión es una duda a la que le estoy dando y dando vueltas y no doy con ella.

Una alarma de temperatura (algo que no es muy complicado), que al llegar a cierta temperatura salta un ventilador y suena una alarma. Y cuando baje a otra temperatura (con unos grados de margen para que no esté constantemente el sistema del ventilador saltando, sino que le dé unos grados de tiempo de recuperación), se detenga el ventilador y se apague el buzzer.

La pregunta es…

Todo esta correcto. Cuando sube la temperatura y se dispara el sistema, e incluso mientras siga subiendo, en la pantalla sale el texto indicando lo que está ocurriendo (Alarma por alta temperatura), pero una vez que baja de esa temperatura concreta a la que he colocado como alarma desaparece el texto y vuelve al estado general (lectura en pantalla de los grados etc como antes de saltar la alarma) , a pesar de que como dije mantengo unos grados de diferencia hasta la desconexión del ventilador y la alarma una vez que ha saltado.

¿Como podría hacer para mantener el texto (Alarma por alta temperatura) tanto cuando debe estar (cuando llega a la temperatura marcada para ello) como mientras la temperatura va bajando a la de desconexión del ventilador y el buzzer, que como digo es unos grados inferior a la que salta la alarma?

Lo máximo que llegué a conseguir es que en la bajada de grados despues de saltar siga la lectura, vinculando el mismo al tiempo en que las salidas de alarma están activadas, pero lo unico que conseguí con ello era que se quedará así eternamente, y aunque bajaran los grados no se me desconectaba nunca.

Si hay solución para este tema gracias por vuestra ayuda, y si no la hay tambien gracias por el tiempo empleado en este tema y en todos los demás, que todos ayudan. Saludos.

#include <Wire.h>              
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x3F, 16, 2);
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT11 

/////////////////////////////////////////////////////////////////////
#define fan_temp 10
#define fan_hum 13
#define buzzer_temp 11
#define buzzer_hum 12
/////////////////////////////////////////////////////////////////////
int maxHum = 70;       
int minHum = 65; 
int maxTemp = 27;
int minTemp = 24; 
/////////////////////////////////////////////////////////////////////

DHT dht(DHTPIN, DHTTYPE);

/////////////////////////////////////////////////////////////////////

void setup() 
/////////////////////////////////////////////////////////////////////
{
  pinMode(fan_temp, OUTPUT); 
  pinMode(fan_hum, OUTPUT);
  pinMode(buzzer_temp, OUTPUT);
  pinMode(buzzer_hum, OUTPUT);
/////////////////////////////////////////////////////////////////////

Serial.begin(9600);

Wire.begin();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);
 
dht.begin();
}

/////////////////////////////////////////////////////////////////////

void loop() 

{ 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
   
   
//////////////////////////////////////////////////////////////////////
   
if (isnan(h) || isnan(t)) {        
    lcd.clear();
    Serial.println("ATENCION FALLO EN EL SENSOR DTH!");
    lcd.setCursor(0,0);                 
    lcd.print(" ATENCION FALLO ");
    lcd.setCursor(0,1);
    lcd.print("EN EL SENSOR DTH");
    delay (1000);
    return;
    }


/////////////////////////////////////////////////// 

if (t >= maxTemp){
digitalWrite(fan_temp, HIGH);
digitalWrite(buzzer_temp, 128);

lcd.clear();
Serial.println("ATENCION TEMPERATURA ALTA!");
lcd.setCursor(0,0);
lcd.print("ALARMA-->"); 
lcd.setCursor(10,0);
lcd.print(t);
lcd.setCursor(14,0);
lcd.print((char)223);
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("TEMPERATURA ALTA");
    delay (1000);
    return;


}
else if ( t <= minTemp){ 
digitalWrite(fan_temp, LOW);
digitalWrite(buzzer_temp, LOW); 
delay(200);
lcd.clear();


Serial.println("Humedad: "); 
Serial.println(h);
Serial.println("Temperatura: ");
Serial.println(t);
  
lcd.clear();
lcd.setCursor(0,0);
lcd.print("HUMEDAD RELATIVA"); 
lcd.setCursor(5,1);
lcd.print(h);
lcd.setCursor(9,1);
lcd.print(" %     ");     
delay(2000);
lcd.setCursor(0,0);
lcd.print("TEMPERATURA AIRE");
lcd.setCursor(5,1);
lcd.print(t);
lcd.setCursor(9,1);
lcd.print((char)223);
lcd.setCursor(10,1);
lcd.print("C    ");
 delay(1000);

}
/////////////////////////////////////////////////////
Serial.println("Humedad: "); 
Serial.println(h);
Serial.println("Temperatura: ");
Serial.println(t);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("HUMEDAD RELATIVA"); 
lcd.setCursor(5,1);
lcd.print(h);
lcd.setCursor(9,1);
lcd.print(" %     ");     
delay(2000);
lcd.setCursor(0,0);
lcd.print("TEMPERATURA AIRE");
lcd.setCursor(5,1);
lcd.print(t);
lcd.setCursor(9,1);
lcd.print((char)223);
lcd.setCursor(10,1);
lcd.print("C    ");
 delay(1000); 
 
}

////////////////////////////////////////////////////////////////

Solo agrega una variable bool que se pone en true cuando tengas alta temperatura y en false cuando baje la temperatura.
Que quieres hacer con eso no se?
algo asi

#include <Wire.h>              
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x3F, 16, 2);
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT11 

/////////////////////////////////////////////////////////////////////
#define fan_temp      10
#define fan_hum       13
#define buzzer_temp   11
#define buzzer_hum    12

int maxHum = 70;       
int minHum = 65; 
int maxTemp = 27;
int minTemp = 24; 

DHT dht(DHTPIN, DHTTYPE);
bool altaTemperatura = false;        // Agregué esto

/////////////////////////////////////////////////////////////////////

void setup() {
  pinMode(fan_temp, OUTPUT); 
  pinMode(fan_hum, OUTPUT);
  pinMode(buzzer_temp, OUTPUT);
  pinMode(buzzer_hum, OUTPUT);
  /////////////////////////////////////////////////////////////////////

  Serial.begin(9600);

  Wire.begin();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);
 
  dht.begin();
}

/////////////////////////////////////////////////////////////////////

void loop() { 
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
   
   
  //////////////////////////////////////////////////////////////////////
   
  if (isnan(h) || isnan(t)) {        
      lcd.clear();
      Serial.println("ATENCION FALLO EN EL SENSOR DTH!");
      lcd.setCursor(0,0);                 
      lcd.print(" ATENCION FALLO ");
      lcd.setCursor(0,1);
      lcd.print("EN EL SENSOR DTH");
      delay (1000);
  }


  /////////////////////////////////////////////////// 

  if (t >= maxTemp || altaTemperatura){  // Agregué esto
      digitalWrite(fan_temp, HIGH);
      digitalWrite(buzzer_temp, HIGH); // 128 no se que es
     
      altaTemperatura = true;            // Agregué esto
      Serial.println("ATENCION TEMPERATURA ALTA!");

      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ALARMA-->"); 
      lcd.setCursor(10,0);
      lcd.print(t);
      lcd.setCursor(14,0);
      lcd.print((char)223);
      lcd.setCursor(15,0);
      lcd.print("C");
      lcd.setCursor(0,1);
      lcd.print("TEMPERATURA ALTA");
      delay (1000);
  }
  else 
  if ( t <= minTemp){ 
      digitalWrite(fan_temp, LOW);
      digitalWrite(buzzer_temp, LOW); 
      altaTemperatura = false;            // Agregué esto
      delay(200);

      lcd.clear();
      Serial.println("Humedad: "); 
      Serial.println(h);
      Serial.println("Temperatura: ");
      Serial.println(t);
        
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("HUMEDAD RELATIVA"); 
      lcd.setCursor(5,1);
      lcd.print(h);
      lcd.setCursor(9,1);
      lcd.print(" %     ");     
      delay(2000);
      lcd.setCursor(0,0);
      lcd.print("TEMPERATURA AIRE");
      lcd.setCursor(5,1);
      lcd.print(t);
      lcd.setCursor(9,1);
      lcd.print((char)223);
      lcd.setCursor(10,1);
      lcd.print("C    ");
      delay(1000);
  }
  /////////////////////////////////////////////////////
  Serial.println("Humedad: "); 
  Serial.println(h);
  Serial.println("Temperatura: ");
  Serial.println(t);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("HUMEDAD RELATIVA"); 
  lcd.setCursor(5,1);
  lcd.print(h);
  lcd.setCursor(9,1);
  lcd.print(" %     ");     
  delay(2000);
  lcd.setCursor(0,0);
  lcd.print("TEMPERATURA AIRE");
  lcd.setCursor(5,1);
  lcd.print(t);
  lcd.setCursor(9,1);
  lcd.print((char)223);
  lcd.setCursor(10,1);
  lcd.print("C    ");
  delay(1000); 
 
}

Hola, muchas gracias por la respuesta. Aunque lo he probado y no ha sido solucion, le ocurre más o menos lo mismo a lo que yo llegué, aunque sinceramente no tuve esa idea que me has dado.

Ahora asi lo que hace es que mantiene el texto de "alarma..." todo el rato cada vez que resetea para medir temperatura escribe tambien el texto, sea a la temperatura que sea (aunque donde yo llegué era peor porque lo que realmente me hacia era bloquear el texto aunque bajara la temperatura.

Tan solo pretendo que el sistema esté constantemente midiendo temperatura (la humedad realmente no es muy importante pues es casi imposible que llegue a unos extremos peligrosos), y una vez que alcance el limite marcado salte un ventilador y una alarma sonora.

Todo esto debe mantenerse hasta que baje hasta el mínimo marcado, que es de unos grados menos (tanto la alarma, como el ventilador los pude mantener, pero el texto es lo que no consigo que se quede, ya que tan solo bajar de la temperatura a la que salta vuelve a indicar en la pantalla la temperatura y humedad alternativamente).

Lo de mantener el texto no es algo muy importante, ya que como digo el ventilador y la alarma si se mantienen, pero quisiera intentar que lo indicará en pantalla.

De nuevo y una vez más muchas gracias por la ayuda, al menos he tenido la posibilidad de tener otro punto de vista, que nunca viene de más en estos temas.

PD: lo de los 128 era porque el buzzer en si no era más que un pequeño altavoz y si le ponia HIGH no me mandaba más que un sonido un instante... un "bip", y con 128 me da un sonido permanente.

Te puede servir esto.
Uso funciones cuando necesito ejecutar unas lineas mas de una vez en todo el programa y para ordenar el código.

#include <Wire.h>              
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT11 

/////////////////////////////////////////////////////////////////////
#define fan_temp      10
#define fan_hum       13
#define buzzer_temp   11
#define buzzer_hum    12
///////////cambio a define porque estos valores no cambian cuando el programa se esta ejecutando
#define maxHum = 70;
#define minHum = 65; 
#define maxTemp = 27;
#define minTemp = 24;

LiquidCrystal_I2C lcd (0x3F, 16, 2);//es por mero gusto que este por acá 

DHT dht(DHTPIN, DHTTYPE);

// estas variables como globales van bien si estan presentes en mas de una funcion
float h = 0;
float t = 0;



void setup() {

  pinMode(fan_temp, OUTPUT); 
  pinMode(fan_hum, OUTPUT);
  pinMode(buzzer_temp, OUTPUT);
  pinMode(buzzer_hum, OUTPUT);
  /////////////////////////////////////////////////////////////////////
  
  Serial.begin(9600);
  
  Wire.begin();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);

  dht.begin();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop(){//funcion principal

  if (isnan(h) || isnan(t)) {//verifica que los sensores trabajen   
      lcd.clear();
      Serial.println("ATENCION FALLO EN EL SENSOR DTH!");
      lcd.setCursor(0,0);                 
      lcd.print(" ATENCION FALLO ");
      lcd.setCursor(0,1);
      lcd.print("EN EL SENSOR DTH");
      delay (1000);
  }

  Sensor();//lee sensores
  Normal();//imprime por puerto serial y LCD el estado de temperatura y humedad en estado norlmal

  if(temperatura >= maxTemp){//si la temperatura es mayor
    while(temperatura >= minTemp){//entra en while hasta que la temperatura sea menor y asi la condicion puesta en el argumento sea falsa
      //dentro de while se ejecutara estod dos programas 
      Sensor();
      Alarma();
    }
  }
}

void Sensor(){
  h = dht.readHumidity();
  t = dht.readTemperature();
}

void Alarma(){//funcion para la alarma de temperatura o humedad
  digitalWrite(fan_temp, HIGH);
  digitalWrite(buzzer_temp, 128); // 128 no se que es

  Serial.println("ATENCION TEMPERATURA ALTA!");

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("ALARMA-->"); 
  lcd.setCursor(10,0);
  lcd.print(t);
  lcd.setCursor(14,0);
  lcd.print((char)223);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("TEMPERATURA ALTA");
  delay (1000);
}

void Normal(){

  digitalWrite(fan_temp, LOW);
  digitalWrite(buzzer_temp, LOW); 
  delay(200);

  Serial.println("Humedad: "); 
  Serial.println(h);
  Serial.println("Temperatura: ");
  Serial.println(t);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("HUMEDAD RELATIVA"); 
  lcd.setCursor(5,1);
  lcd.print(h);
  lcd.setCursor(9,1);
  lcd.print(" %     ");     
  delay(2000);

  lcd.setCursor(0,0);
  lcd.print("TEMPERATURA AIRE");
  lcd.setCursor(5,1);
  lcd.print(t);
  lcd.setCursor(9,1);
  lcd.print((char)223);
  lcd.setCursor(10,1);
  lcd.print("C    ");
  delay(1000);
}

Hola de nuevo. Acabo de probar ahora mismo el que me ha dejado StringCGE, y PERFECTO!!!.

Lo unico que tuve que volver a ponerles de nuevo de

define maxHum = 70;

define minHum = 65;

define maxTemp = 27;

define minTemp = 24;

a

int maxHum = 70; int minHum = 65; int maxTemp = 27; int minTemp = 24;

porque sino me daba error en la compilación, pero cambiando eso... VA PERFECTO!!!.

Surbyte un millon de gracias por tu ayuda.

StringCGE otro millon de gracias por tu ayuda, me has solucionado todo.

Gracias a todos como siempre por vuestra ayuda.

Bueno saber que ha funcionado y eso de los #define no tengo palabras porque aun no me llevo bien con esa instrucción Hay estamos para ayudarnos

define solo es una instrucción para el compilador es como poner

#define maxHum = 70;

es como

const byte maxHum = 70

solo que el compilador define el tipo de variable. puedes usarlo con floats

#define SETpoint 3.45F // pero aca le digo con la F que sera un float

Ya vi mi error y no es en el uso de define como tal aunque con esto aprendí que también se puede especificar el tipo de dato que se define

mi error fue de tipo

#define maxHum = 70;

cuando define no es una variable y no lleva = y no se finaliza instrucción con ; quedando así esa linea

#define maxHum 70

de hay no seria necesario cambiar el define por int

int maxHum  = 70 ;

Gracias surbyte y Gracias Mikms ayudando también se aprende