[SOLUCIONADO] Duda con switch case

Hola amigos, mi nombre en Vicente y estoy estudiando este gran mundo de arduino,

Me surge una duda con Switch case, os cuento, tengo una pantalla Nextion en la cual he creado unos botones y cada vez que pulso uno de ellos mando un carácter por el puerto serie

if(boton1.val==1)
{
print "A"
}

y después en arduino hago esto:

char lectura;

if (Serial.available() >0)
{
lectura = Serial.read();

switch(lectura)
{
case 'A':
digitalWrite(10, HIGH);
break;
}

Cual es mi problemas, que he creado 140 botones en diferentes paginas de esta pantalla y me quedo sin caracteres para mandar al switch, ya que si mando esto.

if(boton120.val==1)
{
print "AA"
}

No lo puedo leer con Switch por que solo acepta un carácter, hay alguna manera de hacerlo.

Gracias

Por supuesto. Puedes enviar caracteres distintos a las letras ( A --- Z) , por ejemplo letras minúsculas, numeros, +, -, *,/, o cualquier caracter ASCII desde el 33(!) hasta el 254.

Gracias amigo, lo probé y funciona bien.

Buenas amigos, he abierto este post con el mismo titulo que este otro

https://forum.arduino.cc/index.php?topic=685278.0

Ya que lo di por solucionado, pero me surge un problema y como ya esta cerrado,pues no se si hago bien en abrir este con el mismo problema.

Os resumo, tengo una Nextion y he creado 140 botones y los leo de la siguiente manera, envio un dato desde la pantalla y hago esto:

char lectura;

if (Serial.available() >0)
{
lectura = Serial.read();

switch(lectura)
{
case 'A':
digitalWrite(10, HIGH);
break;
}

El amigo Pablo_Lucini me sugerio que podia mandar codigos ASCII del 33 al 254.

Que ocurre que lo probé con uno y funciono, pero ahora que he tenido tiempo me puse a hacerlo y la Nextion(pantalla HMI) no reconoce la mayoria de los caracteres.

Leyendo las intruciones de esta pantalla, me permite enviar valores en HEX, 0x01.......

Como hago para leer esos codigos y meterlos en el Switch case.

Gracias

Cuando realizas:

if ( Serial.available()>0 )
  lectura = Serial.read();

En lectura tienes un byte, es decir puede valer de 0 a 255. El código ascii también usa un byte para codificar caracteres. Por ejemplo 'A' en hexadecimal es 0x41, pero también lo puedes escribir como decimal, 65.

Así que básicamente debes olvidar que lo que te envia la nextion es un caracter: es un número, que ese número representa un caracter, qué mas da. Solo tienes que tener en cuenta que un caracter tiene un valor numérico.

Cuando hagas el switch-case puedes hacer lo siguiente:

if ( Serial.available() > 0 ) {
  lectura = Serial.read();
  switch ( lectura ) {
    case 0: /* tu codigo */ break;
    case 1: /* tu codigo */ break;
    case 2: /* tu codigo */ break;
    /* todo los case X siendo X un numero entre 0 y 255 */
    case 255: /* tu codigo */ break;
}

Solo que al tener 140 botones no todos los valores númericos estarán disponibles. Utiliza solo aquellos valores que te envie la nextion al pulsar un botón.

En la Wikipedia puedes encontrar la tabla ASCII y verás que hay muchos caracteres, algunos se imprimen otros no, pero a ti te da igual que sea caracter o no.

Cuando creas un nuevo proyecto en Nextion Editor ,despues de elegir el tipo de pantalla ,te pide que elijas la orientacion y debajo hay un combobox que permite elegir la codificacion,que por defecto es iso 8859-1 .La cambiaste a ascii?

Buenas victorjam la Nextion dice esto para enviar datos;

print “123” // return 3 bytes for text “123” 0x31 0x32 0x33
print 123 // return 4 bytes for value 123 0x7B 0x00 0x00 0x00

Si yo hago, esto solo tengo para 92 botones

Nextion:
print "1"
print "A"

etc...

Arduino

case "1"...............
case "A"..............

Si lo hago asin, me pasa igual solo me deja enviar hasta 126

Nextion:

print 33
print 110...

Arduino:

case 33......
case 110....

Despues nextion tambien dice que se pueden mandar datos en Hex asin:

printh 0d // send single byte: value 13 hex: 0x0d
printh 0d 0a // send two bytes: value 13,10 hex: 0x0d0x0a

Por eso pensé que de esta manera tendría mas opciones

jose:
Cuando creas un nuevo proyecto en Nextion Editor ,despues de elegir el tipo de pantalla ,te pide que elijas la orientacion y debajo hay un combobox que permite elegir la codificacion,que por defecto es iso 8859-1 .La cambiaste a ascii?

Buenas jose, si que lo hice, pero estoy en las mismas, mirando la tabla de ASCII de la WIKI, tengo solo del 33 al 126, 92 botones.

Lo podria hacer con las libreiras Oficiales de Nextion, pero son muy lentas a la hora de enviar y recibir datos a la vez.

Bueno haber si me podéis echar una mano.

La nextion cuando pulsamos un botón(si activamos una casilla) manda una trama diferente para cada botón como esta:

65 00 02 00 FF FF FF

como puedo hacer para capturar esas tramas y mandarla a un switch case.

Gracias

Moderador
Acabo de editar el enlace del post inicial. Creo haberte enviado un privado solicitándolo. De no ser así recuerda que nada se pega como texto simple en este foro.

Lee las Normas del foro

Enterado surbyte, disculpadme por el error.

Saludos

Moderador
Espero no te moleste @vincentdali pero uní los hilos para mejor comprensión de lo que estas consultando.

En el futuro si quieres reabrir tu hilo simplemente me lo pides por privado.
Cuando yo leo solucionado lo cierro porque sino mas tarde debe estar explicando a los que no entienden las letras rojas del Warning que no deben revivir hilos viejos.

En tu caso por ser el autor eso no ocurre y tienes la potestad de pedirlo cuando quieras y no tendré problemas en hacerlo.

Gracias.

Muchas gracias surbyte por la aclaración, en el futuro lo tendré en cuenta.

He estado leyendo mucho, para ver como podía capturar la trama y he llegado a esta conclusión y mas o menos lo entiendo:

void loop() {

  int array[16];                             // Creo un array para guardar los datos         
  while (Serial.available() > 0) {    // mientras existan 1 o mas datos de entrada por el serial
    for (int i = 1; i < 16; i++) {     // inicializa for con variable i para contar de 1 a 8(7) datos
       array[i] = Serial.read();        // array i es igual a lo que lea por serial
      delay(20);                            // espera de 20 milisegundoes por iteracion
    }

Pero ahora como hago para decir si lee esta trama enciende este led, etc..... con cada trama.
Lo quiero hacer con switch case, que he leido que es menor que if...else

Gracias a todos

Buenas, yo no soy un experto en programación, pero en este foro me han ayudado hace poco y desde entonces no pare de estudiar.

Yo haría lo siguiente, olvídate de la trama que te manda la Nextion cuando pulsa un botón, ya que manda la misma trama si el boton esta en ON que en OFF.

Yo en la nextion mandaría un datos en HEX de esta manera.

printth 65 01 FF

Y en arduino haría esto, crearía un array de tre posiciones, donde la primera y la ultima serian como un identificador para saber en que pagina de la Nextion estas, bueno eso si es que vas a poner los botones en diferentes paginas, el byte del medio lo dejaria para saber si el boton esta en 1 o 0:

byte ReadByte[3];    // Creamos el array
   
int contador = 0;     

void loop() {
  while (Serial.available() > 0) {
    ReadByte[contador] = Serial.read(); 
    contador++;
  }

  if (contador == 3) { 
    if (ReadByte[0] == 0x65 && ReadByte[2] == 0xFF) { // Si el primer byte vale XX y el ultimo vale YY
      switch (ReadByte[1]) { 
        case 0x01:              // Si el valor del 2 bytes es....haz......
          digitalWrite(led, HIGH);
          break;
        case 0x02:
          digitalWrite(led, LOW);
          break;
      }
    }

 contador = 0;        // Aqui ponemos el contador a cero
  }

}

No se si estará bien, pero creo que si.

Saludos

Perfecto, entiendo mas o menos lo que me dices, pero como mando lo que yo quiera con la Nextion

Gracias

vincentdali:
Perfecto, entiendo mas o menos lo que me dices, pero como mando lo que yo quiera con la Nextion

Gracias

Pues creas un boton de doble estado y en Touch Press Event o en Touch Relese Event escribes esto

if (bt0.val == 1)
{
printh 65 01 FF
}

 if (bt0.val == 0)
{
printh 65 02 FF
}

Donde bt0 sera el nombre que le quieras poner al boton, por defecto Nextion pone bt0, bt1......y la trama igual pones la que tu quieras.

Lo probe ayer y funciona perfecto, con la posibilidad de usar todos los botones que quiera.

Muchas Gracias