No logro activar o Desactivar salidas digitales y leer variable analogica a la vez

Ante todo , un cordial saludo y agradecido en pertenecer a este glorioso forum, les comento mi problema y lo que he hecho.

estoy realizando un proyecto que consiste en control de temperatura on-off con histeresis de un horno electrico, atravez de una aplicacion ya creada previamente con app inventor, y haciendo uso tambien de un arduino bt hc-05 y un arduino UNO. todo el sistema corre de maravilla al enlazar mi aplicacion con el hardware y realizar solo el control on off, este activa o desactiva una salida digital (pin8) cuando se sale de los rangos de la histeresis seleccionados, el problema viene cuando decido agregarle botones para un control manual del horno (apagado y encendido), estos botones al accionarlos desde mi aplicacion no funcionan para la tarea de activar o desactivar la salida (pin 8). realizé otra rutina dentro de la app para que al desconectar el bluetooth reestableciera todo a un estado inicial (salida pin 8 a nivel 0) para que me desactive el relé), esta tarea tampoco me la esta realizando el sistema, por el contrario al desconectar el bluetooth me queda encendida la salida, o a veces antes de desconectar está apagada y despues de desconectar se enciende cuando no le ha dado esa orden.

infinitamente agradecido por su ayuda---

aca les paso el codigo que realize

float temperatura;    //se definen las variables locales.
int pinlm35 = 5;      //El LM35 va conectado a una entrada anolgica, en este caso se define en 5
int Relepin = 8;      //El rele va conectado a una salida digital, a la salida 8
String datorecibido; // Dato recibido que va a ser la temperatura que se establece como limite
char val; // variable tipo texto para enviar recibir letras y comandos por puerto serie
int variableT = 0;


void setup() {
  Serial.begin(9600); //se activa el puerto serie comun del arduino
  pinMode(pinlm35, INPUT); //se configura el LM35 como entrada analoga
  pinMode(Relepin, OUTPUT); //se configura el Relay como salida digital
  digitalWrite(Relepin, HIGH);  //se establece desde un principio un voltaje HIGH, para evitar que el rele funcione.
}

void loop() {
  if (Serial.available())  {
    
   datorecibido = String("");  //se recibe el dato desde el bluetooth
  
    while (Serial.available()) {
      
        val = Serial.read();// Si el pto serie esta disponible lee el valor enviado por el bluetooth datorecibido = String("");  //se recibe el dato desde el bluetooth
    
    if( val == 'a' ){ // BOTON parada de emergencia, si es A apaga el sistema// la bobina del rele arduino se apaga con 1
  digitalWrite (Relepin, HIGH);
  }
   if( val == 'b' ){ // BOTON PARA ENCENDIDO MANUAL, si es b enciende el sistema// la bobina del rele arduino se acciona con 0
  digitalWrite (Relepin, LOW);
   } 
      datorecibido = datorecibido + char(Serial.read()); //como el dato se recibe en forma de caracteres, 
      delay(1);                                         //se hace una especie de arreglo de estos para formar un entero
      variableT = datorecibido.toInt(); //Se convierte el dato recibido de String a Int
      temperatura = analogRead(pinlm35);  //se hace la lectura de la entrada analoga
      temperatura = 5.0 * temperatura * 100.0 / 1024.0; //se hace la conversion de la entrada analoga a un valor
      //de temperatura en °C, mediante la ecuacion dada
      Serial.println(temperatura);    //se imprime el valor de la temperatura
      delay(1000);      //el retraso será de 1 segundo

      if (temperatura > 31)   //Se programa para que cuando la lectura de temperatura sea mayor a 31, se desactive el rele
      {
        digitalWrite(Relepin, HIGH);
      }
      if (temperatura <= variableT)//Se programa para que cuando la lectura de temperatura sea menor a la temperatura recibida por el bluetooth, se active el rele
      {
        digitalWrite(Relepin, LOW);
      }
    }
  }
}

Moderador:
Por favor, achica el título a algo mas conciso.
No relates lo que te ocurre en un título, eso lo dejas para la descripción del problema.
Edita por favor.

Cuando dos elementos terminan actuando sobre la misma salida no puedes hacer que al acción de una tape la otra o vice verza.
El problema que tienes es que por un lado el sensor de temperatura LM35 apagará siempre el relé (a pesar de ponerlo en HIGH un rele normalmente cuando se le envia HIGH se apaga) y por otro lado tienes una punto llamado variableT para el cual si estas por debajo se vuelve a activar. Eso seguramente funciona perfecto entre tu app y arduino+BT.
Pero ahora tu quieres activar o desactivar esto anterior sin tener en cuenta lo que viene haciendo, y no es posible.
Una manera elegante seria tener un control Manual Automático en tu APP Inventor que le diga al sistema como trabajar si en forma automática controlado por LM35 y su histeresis dado por la APP o en forma manual con 'a' y 'b'
Mi consejo es que implementes un botón extra en tu APP Inventor Manual/AUTO
Que lo leas, en el loop y si estas en automático sigue funcionando como lo venia haciendo y si esta en manual desactivas el control de temperatura y respetas las acciones manuales.

gracias por su respuesta amigo, ya cambie el titulo como sugirio, en verdad me abrio la mente con su consejo. En si el objetivo principal de lo que quiero lograr es poder usar un boton como parada de emergencia, necesario en la mayoria de los sistemas, que miestras se esté ejecutando el control de temperatura, en cualquier momento de accionar este boton (en la APP), enviar solo una señal (HIGH) a salida digital (pin8) para desactivar el horno, ya la desactivacion del bluetooth la haria con el app inventor. ¿se podria hacer de esta manera amigo?

desviandome un poquito del tema y mil disculpas, quiero saber si por este forum puedo realizar consultas sobre fallas generadas en el uso del app inventor?

Si que se puede hacer lo que pretendes pero debes replantear tu código, no está bien.

Un primer detalle: lees un caracter, lo guardas en val y si no es "a" o "b" lo olvidas porque luego pasas a leer el siguiente caracter y guardarlo en datorecibido y lo que sigue...
¿Y si el primer caracter era el primer dígito del número?

Otro: Lees cada caracter e inmediatamente lo pasa a entero y lo comparas con la temperatura.
Entonces, para 160° comparas con 1°, luego con 16° y finalmente con 160°. ¿Se entiende?

Por otro lado, Serial.read() ya devuelve un char no hace falta que lo vuelvas a tipificar, o sea

char(Serial.read())

es algo redundante.

Sobre lo de AppInventor, en realidad no pero prueba presentando tu consulta como [off-topic]

Saludos

buenas noches amigo gracias por tu apoyo y tus sugerencias, las tomare en cuenta en mi codigo, la parte del control de temperatura con histeresis me funciona muy bien, lo ue necesito y no doy con el resultado es habilitar el boton de parada como seguridad y poder asi deshabilitar el horno controlado, ya que cuando desconecto el control de temperatura esta salida digital (pin 8) siempre me queda en nivel LOW y por ende me queda el horno encendido, lo cual no es nada conveniente.. agradecido me puedas ayudar tambien en este pequeño dilema.. un millon de gracias.

Cuantas veces vas a repetir la misma respuesta? Acabo de borrarte una, no lo volveré a hacer porque no quiero resultar un censor pero mira, te dejo la respuesta anterior y compara tu post 3 con el 5 y el 6.

mil discupas amigo, no lo hago de manera intencional, aca donde vivo (venezuela) especialmente en mi zona, el servicio de internet es super deficiente, y a veces envio información varias veces pensando que no se han enviado, le tomare la palabra en cuanto a los post, muchas gracias por su tiempo, espero me pueda echar una mano en la rutina del paro de emergencia, sin tener que desviarme a la rutina de trancisión manual/automatico, no logro dar con la solucion¡¡

Pero entendés que tu código no está bien planteado?
Por más que al final haga lo que quieres, antes hace cosas que no debería hacer.

O sea, no es "agrego un par de instrucciones" para hacer el cierre de emergencia y listo, hay que reescribir casi todo para poder hacerlo.

Saludos

si entiendo amigo. dejame replantear el codigo y te lo muestro, debo decir que apenas estoy incursionando en este tipo de control, agradecido por tu tiempo

Moderador:

Ok, te comprendo pero no me dirás que luego de hacerlo no puedes verificar que has hecho? Si te das cuenta que lo enviaste 2 veces pues simplemente vuelves y lo eliminas. Un usuario del foro puede eliminar sus propios posteos.

Además comprendo lo que me dices pero confía en que cuando le das enviar el proceso aunque no te de una respuesta se cumplirá y en el peor de los casos quedará como grabado y cuando vuelvas a tu hilo por segunda vez encontrarás tu respuesta pendiente si no fue enviada.

hola amigo buen dia, podria darme su punto de vista en cuanto a lo que debo mejorar en mi codigo, en especial en las sugerencias que me plantea en el post 4, me esta costando rehacerlo, agradecido de antemano.

No es de mis mejores códigos, es mas lo considero de los peores, pero funciona

#include <Arduino.h>
float temperatura;        // se definen las variables locales.
float tempAnt;
int pinlm35     = 5;      // El LM35 va conectado a una entrada anolgica, en este caso se define en 5
int Relepin     = 8;      // El rele va conectado a una salida digital, a la salida 8
String datorecibido;      // Dato recibido que va a ser la temperatura que se establece como limite
char val;                 // variable tipo texto para enviar recibir letras y comandos por puerto serie
int variableT    = 0;
bool leyendotemp = false;
bool desactivoRele  = false, desactivoReleAnt;
bool activaLM35  = false, activaLM35Ant;

void setup() {
  Serial.begin(9600); //se activa el puerto serie comun del arduino
  pinMode(pinlm35, INPUT); //se configura el LM35 como entrada analoga
  pinMode(Relepin, OUTPUT); //se configura el Relay como salida digital
  digitalWrite(Relepin, HIGH);  //se establece desde un principio un voltaje HIGH, para evitar que el rele funcione.
}

void loop() {

  
  while (Serial.available()> 0) {
    val = Serial.read();// Si el pto serie esta disponible lee el valor enviado por el bluetooth datorecibido = String("");  //se recibe el dato desde el bluetooth
    // BOTON parada de emergencia, si es A apaga el sistema// la bobina del rele arduino se apaga con 1
    switch (val) {
      // BOTON parada de emergencia, si es A apaga el sistema
      // la bobina del rele arduino se apaga con 1
      case 'A': desactivoRele = true;
                Serial.println("Pasé por A");
                break;
      // BOTON PARA ENCENDIDO MANUAL, si es b enciende el sistema
      // la bobina del rele arduino se acciona con 0
      case 'B': desactivoRele = false;
                Serial.println("Pasé por B");
                break;
                // como el dato se recibe en forma de caracteres, 
      case '0'...'9': //Serial.println(datorecibido);
                      leyendotemp = true;
                      datorecibido += val;
                      break;
      case 0x0a:  if (leyendotemp) {
                    //Serial.println("Recibido : "+ datorecibido);
                    variableT = datorecibido.toInt();
                    //Serial.println("variableT : "+ String(variableT));
                    leyendotemp = false;  
                    datorecibido = "";  //se recibe el dato desde el bluetooth
                  }
                  break;
    }
  }

  temperatura = 500.0 * analogRead(pinlm35) / 1023.0;   // se hace la conversion de la entrada analoga a un valor
  // de temperatura en °C, mediante la ecuacion dada
  
 
  if (tempAnt != temperatura)
      Serial.println(temperatura);    // se imprime el valor de la temperatura
   tempAnt = temperatura;
  //Se programa para que cuando la lectura de temperatura sea mayor a 31, se desactive el rele
  if (temperatura > 31.0) {
     activaLM35 = true;
     desactivoRele = false;
  }

  //Se programa para que cuando la lectura de temperatura sea menor a la temperatura recibida por el bluetooth, se active el rele
  if (temperatura <= variableT) {
    activaLM35 = false;
  }
  
  if (activaLM35 != activaLM35Ant) {
      Serial.println(activaLM35?"activaLM35  ON":"activaLM35 OFF");
      // si la temp > 31 o se activo 'a' boton emergencia el rele se apaga
      if (activaLM35)   {
          digitalWrite(Relepin, HIGH);  // rele desactivado 
          Serial.println("Desactivo Horno");
      }  

      // la opcion manual debe estar en falso para que funcione auto
      if (!activaLM35 && !desactivoRele ) {
          digitalWrite(Relepin, LOW);
          Serial.println("Activo Horno");
      }
  }
  activaLM35Ant = activaLM35;
  
  if (desactivoReleAnt != desactivoRele) {
      Serial.println(desactivoRele?"desactivoRele  ON":"desactivoRele OFF");
      if (desactivoRele) {
          digitalWrite(Relepin, HIGH);  // rele desactivado 
          Serial.println("Desactivo Horno");
      }  
      if (!desactivoRele && !activaLM35) {
          digitalWrite(Relepin, LOW);
          Serial.println("Activo Horno");
      }
  }   
  desactivoReleAnt = desactivoRele;
}

Agregué muchas salidas para ver como se comporta.
Prueba a ver si funciona.
A desactiva el horno
B lo vuelve a activar
Cuando el LM35 supera 31.0 desactiva el horno y por debajo del valor que envies por APP Inventor activará el horno.
Yo todo lo simulé con el puerto serie.
A ver que cuentas.

Puedes quietar o comentar la primera linea

#include <Arduino.h>

lo pruebo y te aviso hermano, agradecido.

estimado Surbyte corri el codigo anclado a la app y me surgio esa falla. y no me deja ejecutar las demas funciones de la misma, disculpame si note sigo el ritmo, pero tenemos mucha diferencia de nivel, yo a penas estoy adaptandome a este entorno, por ello aprecio mucho tu paciencia y disposicion en ayudarme, por otro lado me dedique a analizar tu codigo, pero no logro entender la parte del encendido y apagado manual, lo hiciste con la premisa de usar un selector desde la app para seleccionar entre aut o manual? o el codigo hace esa seleccion de manera automatica, no doy con eso¡¡

En realidad no use el criterio manual automático
Sino que segui la idea de @MaximoEsfuerzo que dijo que se podia hacer pero modificando.
Bueno le agregué las cosas, quedó un super parche pero a mi me funcionó.
Claro que como lo simulo no tengo el ruido que genera que la temperatura se mueva como te pasa a ti y veo que eso molesta
las teclas ahora son
A para desactivar
B para activar
no uses minúscula

surbyte pero tienes alguna idea de la causa de ese error, de momento solo requiero poder desaparecerlo de la pantalla y verificar si funcionan las demas herramientas de mi app (botones apag y enc), la lectura dela temp si la hace bien a lo poco que alcance a ver antes de que apareciera el error. saludos

Comenta todas las líneas que contengan Serial.println() menos el que imprime la temperatura, obvio.

Por favor, no es un error, es lo mismo que tenias tu pero yo he aumentado la cantidad de Serial.print para poder imaginar las situaciones y te lo he explicado.
He probado este codigo y funciona en el simulador. Ahora quité todo.

#include <Arduino.h>

float temperatura;        // se definen las variables locales.
float tempAnt;
int pinlm35 = 5;      // El LM35 va conectado a una entrada anolgica, en este caso se define en 5
int Relepin = 8;      // El rele va conectado a una salida digital, a la salida 8
String datorecibido;      // Dato recibido que va a ser la temperatura que se establece como limite
char val;                 // variable tipo texto para enviar recibir letras y comandos por puerto serie
int variableT = 24;
bool leyendotemp = false;
bool desactivoRele = false, desactivoReleAnt;
bool activaLM35 = false, activaLM35Ant;

void setup() {
  Serial.begin(9600); //se activa el puerto serie comun del arduino
  pinMode(pinlm35, INPUT); //se configura el LM35 como entrada analoga
  pinMode(Relepin, OUTPUT); //se configura el Relay como salida digital
  digitalWrite(Relepin, HIGH);  //se establece desde un principio un voltaje HIGH, para evitar que el rele funcione.
}

void loop() {

  while (Serial.available() > 0) {
    val = Serial.read();// Si el pto serDEBUG_PRINTie esta disponible lee el valor enviado por el bluetooth datorecibido = String("");  //se recibe el dato desde el bluetooth

    //Serial.print(String(val) + " ");
    //Serial.println(val, HEX);

    // BOTON parada de emergencia, si es A apaga el sistema// la bobina del rele arduino se apaga con 1
    switch (val) {
      // BOTON parada de emergencia, si es A apaga el sistema
      // la bobina del rele arduino se apaga con 1
    case 'A': desactivoRele = true;

      //Serial.println("Pasé por A");

      break;
      // BOTON PARA ENCENDIDO MANUAL, si es b enciende el sistema
      // la bobina del rele arduino se acciona con 0
    case 'B': desactivoRele = false;

      //Serial.println("Pasé por B");

      break;
      // como el dato se recibe en forma de caracteres, 
    case '0'...'9': // //Serial.println(datorecibido);
      leyendotemp = true;
      datorecibido += val;
      break;
    case 0x0a:
    case 0x0d:
      if (leyendotemp) {
        ////Serial.println("Recibido : "+ datorecibido);
        variableT = datorecibido.toInt();
        ////Serial.println("variableT : "+ String(variableT));
        leyendotemp = false;
        datorecibido = "";  //se recibe el dato desde el bluetooth
      }
      break;
    }
  }

  temperatura = 500.0 * analogRead(pinlm35) / 1023.0;   // se hace la conversion de la entrada analoga a un valor
  // de temperatura en °C, mediante la ecuacion dada

  if (tempAnt != temperatura)

    //Serial.println(temperatura);    // se imprime el valor de la temperatura
    
  tempAnt = temperatura;
  //Se programa para que cuando la lectura de temperatura sea mayor a 31, se desactive el rele
  if (temperatura > 31.0) {
    activaLM35 = true;
    desactivoRele = false;
  }

  //Se programa para que cuando la lectura de temperatura sea menor a la temperatura recibida por el bluetooth, se active el rele
  if (temperatura <= variableT) {
    activaLM35 = false;
  }

  if (activaLM35 != activaLM35Ant) {

    //Serial.println(activaLM35 ? "activaLM35  ON" : "activaLM35 OFF");

    // si la temp > 31 o se activo 'a' boton emergencia el rele se apaga
    if (activaLM35) {
      digitalWrite(Relepin, HIGH);  // rele desactivado 

      //Serial.println("Desactivo Horno");

    }

    // la opcion manual debe estar en falso para que funcione auto
    if (!activaLM35 && !desactivoRele) {
      digitalWrite(Relepin, LOW);

      //Serial.println("Activo Horno");

    }
  }
  activaLM35Ant = activaLM35;

  if (desactivoReleAnt != desactivoRele) {
    
    //Serial.println(desactivoRele ? "desactivoRele  ON" : "desactivoRele OFF");
    
    if (desactivoRele) {
      digitalWrite(Relepin, HIGH);  // rele desactivado 

      //Serial.println("Desactivo Horno");
      
    }
    if (!desactivoRele && !activaLM35) {
      digitalWrite(Relepin, LOW);

      //Serial.println("Activo Horno");
      
    }
  }
  desactivoReleAnt = desactivoRele;
}

@Surbyte lo que pasa es que como el módulo BT está conectado a Rx y Tx, los textos llegan a la aplicación y como no son lo esperado se lo marca como error (o eso interpreto).

Pero que quede claro que está perfecto para ver la salida por consola y entender lo que hace el código al ejecutarse. Tal vez te faltó explicarle con más detalle cómo debía probar el código.

Saludos

Ya esta dicho entonces.