Duda arreglo de caracteres y condición

buenas noches compañeros, tengo una duda y espero me puedan orientar, el problema es el siguiente:

Recibo via bluetooth un codigo de 4 numeros por ejemplo: 1820, es recibido y almacenado en un arreglo de caracteres como se muestra abajo, sin embargo me interesa poder sepaarar los dos primero numeros y los dos ultimos para asi establecer una condicion que dependera de dos codigos.

Código actual

void setup() {
  
  Serial.begin(9600);
  pinMode(5,OUTPUT);
  pinMode(5,LOW);

  }
  char cadena[20];
  int contador=0;
  int valor;
  



void loop() {
 
if(Serial.available()){



  while(Serial.available()>0){

    delay(5);
    cadena[contador]=Serial.read();
    contador++;
  }

  
if(cadena[0]=='a'){
    if(cadena[1]=='m'){
     Serial.println("prende relevador 2 por 5 min");
     digitalWrite(5,HIGH);
     delay(300000);
     digitalWrite(5,LOW);
    }

En el ejemplo realizo la conexión vía serial y realizo las condiciones con letras, sin embargo me gustaria hacer una condición algo así

if(cadena[0]+cadena[1]=='18'){
 if(cadena[2]+cadena[3]==20'){
     Serial.println("prende relevador 2 por 5 min");
     digitalWrite(5,HIGH);
     delay(300000);
     digitalWrite(5,LOW);
    }

Espero haberme dado a entender.

y espero puedan orientarme.

De antemano muchas gracias.

Tu código esta incompleto. En el setup() hay un error:

pinMode(5, LOW);       //Error
digitalWrite(5, LOW);  //Ok

Estas usando los pines 0 y 1 para el monitor serie y para el bluetooth ?

Debes desterrar ese delay(300000); busca el ejemplo de 02. Digital > Blink without Delay

Otro errror: la comilla simple se usa para un solo carácter asi que:

if (cadena[0]+cadena[1] == '18'){   //Error
if (cadena[0]+cadena[1] == "18"){   //Ok
if (cadena[0]+cadena[1] == "18"){   //Ok

esto funciona? Lo dudo
Habria que concatenar los dos caracteres. Sumados me huele a suma de su valor.

Muchas gracias a ambos por su respuestas y efectivamente ambos tenían razón en las observaciones, ya corregí los errores de inicio y sigo probando únicamente con el monitor serie , por ello aun no incluyo los pines de transmisión de bluetooth, sin embargo a la brevedad publicare como queda el código final.

El problema en relación a la condición lo resolví utilizando el operador && ,

if(cadena[0]=='1'&& cadena[1]=='2'){
    if(cadena[2]=='0'&& cadena[3]=='5'){
     Serial.println("prende led 2 por 5 min");
     digitalWrite(5,HIGH);
     delay(300000);
     digitalWrite(5,LOW);
    }
    if(cadena[2]=='1'&& cadena[3]=='0'){
     Serial.println("prende led 2 por 10 min");
     digitalWrite(5,HIGH);
     delay(600000);
     digitalWrite(5,LOW);
    }
 if(cadena[2]=='1'&& cadena[3]=='0'){
     Serial.println("prende led 2 por 15 min");
     digitalWrite(5,HIGH);
     delay(600000);
     digitalWrite(5,LOW);
    }

    if(cadena[2]=='1'&& cadena[3]=='0'){
     Serial.println("prende led 2 por 20 min");
     digitalWrite(5,HIGH);
     delay(600000);
     digitalWrite(5,LOW);
    }

tan simple como eso :slight_smile: jejeje

Por otro lado he revisado la funcion millis() pero siendo honesto sigo sin poder materializar la idea dentro de mi código. Por ejemplo para la ejecucion durante 20 minutos mi idea es esta:

if(cadena[0]=='1'&& cadena[1]=='2'){
   if(cadena[2]=='1'&& cadena[3]=='0'){
     Serial.println("prende led 2 por 20 min");

     tiempo1=millis();     
     digitalWrite(5,HIGH);

     tiempo2=millis();
     if(tiempo2>(tiempo1 +1200000)){

         digitalWrite(5,LOW);

}
    }}

Podrían por favor echarme una mano con eso, en verdad se los agradecería. :slight_smile: :slight_smile: :slight_smile: :frowning:

Saludos.

surbyte:

if (cadena[0]+cadena[1] == "18"){   //Ok

esto funciona? Lo dudo
Habria que concatenar los dos caracteres. Sumados me huele a suma de su valor.

No lo había probado, pero tienes razón Surbyte, se suman los valores ASCII (49+56=105).

Lo correcto seria asi:

if (cadena[0] == '1' && cadena[1] == '8'){

CarBigos, cuando detectes tu cadena en el primer if() haces 3 cosas:

  1. Guarda a que hora se prende
  2. Borras algo para no repetir este bloque
  3. Prendes

Luego con otro if fuera del primero comparas tiempo y apagas.

if (cadena[0]=='1' && cadena[1]=='8' && cadena[2]=='2' && cadena[3]=='0'){
   tiempo = millis();
   cadena[0] = '':
   digitalWrite(5, HIGH);

}

if (millis() - tiempo >= 120000){
   digitalWrite(5, LOW);
}

Mmuchas gracias por la respuesta Kike_GL, aunque no logro entender la parte de:

" borras algo para no repetir este bloque"

si copio tal como muestras el código a la hora de compilar me arroja un error"empty character constant", podrías comentarme a que te refieres con esa parte, agradezco enormemente tu atención

He intentado en correrlo sin la parte de :

cadena[0] = '';

y compila pero no realiza el apagado del led.

Ayuda por favor

Muchas gracias por su ayuda , finalmente logré resolver el problema, se los agradezco en verdad , cuando finalice totalmente el codigo lo subiré para que puedan checarlo si alguien llega a tener alguna duda similar.

Saludos Kike