Parar codigo para iniciar otro

Buenas compañeros.

Os cuento lo que tengo montado y donde quiero llegar. Coimence con mi proyecto capturando la humedad y temperatura y mostrandolo en un LCD, hasta aqui todo perfecto.

Ahora quiero ampliar el proyecto colocandole el rfid de 125KHz o NFC el problema me surge cuando mi display esta mostrando los datos de humedad y temp, si paso la tarjeta RF el codigo no se va hacia la verificación de esta tarjeta, hasta que termina la función de mostrar en el LCD la humedad.. No se si me explique bien...

Como puedo hacer para que este permanentemente el lector rfid leyendo,y me siga mostrando los datos de humedad en el LCD????

Hola johnnie

Suele ser conveniente poner el código para ver mejor lo que estás haciendo. Como no lo has puesto te responderé pensando lo que has programado y donde puedes estár teniendo el problema.

Al LCD no creo que tengas que enviar información a no ser que haya algún cambio. Por lo que una solución sería que estuviera leyendo los 2 sensores y el RFID todo el rato y cuando alguno de los sensores tuvieran algún cambio que cambiase en ese momento el LCD.

Aun yo he probado a mandar información a un lcd 16x2 y apenas necesita tiempo para mandar la información, por lo que no debería de darte problemas si ejecutases un código menos optimizado como:
Leer Humedad
Leer temperatura
Leer RFID
Enviar a LCD información

Todo esto ejecutándose constantemente por supuesto. Sin el código esto es todo lo que puedo decirte. Salu2

Te dejo mi codigo, en la funcion loop voy haciendo llamadas a otras funciones, que estas a su vez hacen las instruciones.

Por ejemplo la funcion pintarLCD es la que mas me tarda ya que aparte de pintar en el LCD y tener un delay en el me enciende un led a mode de emergencia si la temp es max.
Quizas deberia de modificar mi codigo para que pueda hacer las dos cosas a la vez como tu me comentas.

Espero tu respuesta.

void loop()
{
  SHT1x sht1x(dataPin, clockPin);
  float tempC = sht1x.readTemperatureC();
  // Temperatura en F
  //float tempF = sht1x.readTemperatureF();
  float humidity = sht1x.readHumidity();
  float rocio  = calcularRocio(humidity, tempC);

  if (tempC > maxtemp){
    int warning = 2;
    pintarLCD(warning, tempC, humidity, rocio);
    //Serial.print("WARNING - HIGH TEMP: ");
  }

  if (tempC < mintemp){
    int warning = 1;
    pintarLCD(warning, tempC, humidity, rocio);
    //Serial.print("WARNING - LOW TEMP: ");
  }

  if (tempC > mintemp && tempC < maxtemp){
    int warning = 0;
    pintarLCD(warning, tempC, humidity, rocio);
  }

}
void pintarLCD(char valueWarning, float valueTempC, float valueHumidity, float valueRocio){
//lcd.autoscroll();
//lcd.noAutoscroll();
  switch (valueWarning){
    case 1:    // Warging minTemp
      Serial.print("WARNING...");       // Serial
      Serial.print("LOW TEMP! ");       // Serial
      for (int i=0; i<=emergencia; i++){
        lcd.print("WARNING...");          //print...
        lcd.setCursor(0,1);            //move the cursor to the 2nd line
        lcd.print("LOW TEMP!");        //print...
        digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
        digitalWrite(led2, LOW);   // turn the LED on (HIGH is the voltage level)
        delay(1000);                   //wait...
        digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
        digitalWrite(led2, HIGH);    // turn the LED off by making the voltage LOW
        lcd.clear();                   //clear LCD, since we are still on 2nd line...
        delay(1000);                   //wait...
        lcd.home();                    //set the cursor to top left
      }
    break;
    case 2:    // Warging maxTemp
      Serial.print("WARNING...");       // Serial
      Serial.print("HIGH TEMP! ");       // Serial
      for (int i=0; i<=emergencia; i++){
        lcd.print("WARNING...");          //print...
        lcd.setCursor(0,1);            //move the cursor to the 2nd line
        lcd.print("HIGH TEMP!");        //print...
        digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
        digitalWrite(led2, LOW);   // turn the LED on (HIGH is the voltage level)
        delay(1000);                   //wait...
        digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
        digitalWrite(led2, HIGH);    // turn the LED off by making the voltage LOW
        lcd.clear();                   //clear LCD, since we are still on 2nd line...
        delay(1000);                   //wait...
        lcd.home();                    //set the cursor to top left
      }
    break;
    default:
      digitalWrite(led, HIGH);    // turn the LED off by making the voltage LOW
      delay(10);                   //wait...
  }
  
  /* Mostramos por el Serial antes que por LCD */
  Serial.print("Temp: ");
  Serial.print(valueTempC);
  Serial.print("'C,");
  Serial.print(" HR: ");
  Serial.print(valueHumidity);
  Serial.print(" %, Temp de rocio: ");
  Serial.print(valueRocio);
  Serial.print("'C");
  Serial.print("#");            // El # es necesario para c#
  /* End Serial */

  digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)  
  digitalWrite(led2, LOW);   // turn the LED on (HIGH is the voltage level)

  lcd.print("Temp: ");           //print with extra spaces to overwrite
  lcd.print(valueTempC);         //Ponemos la temperatura
  lcd.print("'C");
  lcd.setCursor(0,1);            //cursor to 2nd line
  lcd.print("HR: ");             //Make It becomes Makes Us
  lcd.print(valueHumidity);
  lcd.print(" %");

  delay(15000);                   //wait...

  lcd.clear();                   //clear LCD, since we are still on 2nd line...
  lcd.home();                    //set the cursor to top left
  lcd.print("Temp de Rocio:");  //print with extra spaces to overwrite
  lcd.setCursor(0,1);            //cursor to 2nd line
  lcd.print(valueRocio);         //Ponemos la temperatura
  lcd.print("'C");
  delay(5000);                   //wait...

  lcd.clear();                   //clear LCD, since we are still on 2nd line...
  lcd.home();                    //set the cursor the top left  
}

De primeras te diria que quites los delays y si son fundamentales los sustituyas por algo como blinkwhithout delay. Hay un tutorial donde se explica el blinkwhithout delay en la pagina arduino. Desde el movil no puedo mirar todo el codigo, haber si cuando este con un pc me acuerdo de mirarlo. Salu2

ok, le echare un ojo.

Esos delay son para mantener el display en el LCD

Lo dicho esos delay tan grandes 1 segundo, 5 segundos 15 segundos son un horror desde el punto de vista de ejecución del programa. Ten en cuenta que cuando se ejecuta un delay el micro se queda tonto ese tiempo, no hace nada. Por lo que ya puedes pasar el RFID o puede caer la temperatura a 0ºC que no se va a enterar.

Como te he dicho antes valora si realmente necesitas esos delays y si es imprescindible estudia sustituirlos por blinkwithout delay. Me imagino que usas los delay para que no se borre el lcd con la función lcd.clear(); Has pensado en hacer el programa con menos lcd.clear(); al fin y al cabo aunque varien los grados serán 2 digitos por lo que aunque no borres el lcd al enviar la nueva lectura saldrá en la misma posición el texto. Tiene un poco de trabajo para casarlo todo pero es lo que te recomiendo porque sin lcd.clear(); no creo que necesitases los delays. Miratelo. SAlu2

Ok , gracias por la ayuda, le daré un repaso al codigo y quitar los delay y el lcd.clear()

Esto es lo que tengo en el LCD

warning....

temp:

humedad

temp rocio

Por eso necesitaba hacer un limpiado del LCD y tener un delay para que no me lo quite en el instante. Como podria hacer para que me muestre las siguientes lineas ??? sin delays???, porque el led si lo podria sustituir por blinkwithout()

Creo que ya lo entiendo no has comentado cuantas lineas tiene el lcd. Pensaba que toda la información te entraba en la pantalla del lcd. La verdad es que necesitas borrar la pantalla para poder ir sacando toda la información.

Se puede hacer de muchas maneras una manera podría ser donde tienes los delay los sustituiria por un blick withoutdelay donde haría que el programa entrase en un bucle (for o while) para que no saliese de ese bucle hasta que hubiera pasado el tiempo. Dentro de ese bucle deberías de poner las funciones que llaman a leer el RFID. De esa manera mientras espera que pase el tiempo va comprovando si el RFID ha sido activado.

claro el LCD es 16x2 y no cabe todo en esa pantalla, por eso tenia que ponerlo en en varias tandas.

Intentaré lo que me dices

Muy interesante, me apunto por aquí para cuando añada el LCD a mi control de acceso...

jejeje.....en cuanto me llegue todo el material que necesito lo continuo :grin:

¿No será mas fácil usar un display 4x20? Por menos de €15, fuera líos. Y mas elegante.

Jopapa www.jopapa.me