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.
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.
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.
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?
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.
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.
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.
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
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
}
}