Go Down

Topic: ¿Qué formato tiene la String para la librería MD_Parola.h? (Read 269 times) previous topic - next topic

robertoxyz20

Quiero desarrollar un programa que envíe texto y configuración a través de bluetooth del teléfono hacia una pantalla led de 8x32.

Logré enviar un texto hacia la pantalla con las siguientes líneas
donde BT1 es el nombre para el bluetooth...
Esta parte del buffer es no la entiendo bien:
Code: [Select]

char buffer[65];

Esto es lo que está en en el loop:
Code: [Select]

if (BT1.available())
  {
    delay(10); // Esperar la captura de todos los caracteres
  dato = BT1.read();
 
    buffer[BT1.readBytes(buffer, BT1.available())] = 0;
 
    Serial.write(buffer);
        P.displayText(buffer, PA_LEFT, speed1, 2000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
   
    BT1.flush();
   
  }
 if( P.displayAnimate())
 {
  P.displayReset();
 }

Lo anterior envía un texto, pero si intento usar otra variable no funciona bien o no funciona...

con lo siguiente, por ejemplo le puedo cambiar la velocidad al texto:
Code: [Select]

dato = BT1.read();
      switch (dato)
      {
      case '1':
      speed1++;
      break;
      case '2':
      speed1--;
      break;
      }


Lo que quiero es usar lo que envío desde la app, tanto para desplegar un texto, como para configurar los demás detalles como la velocidad y el tipo de animación.
Sin embargo cuando intento colocar una String desde BT1 con un simple read, no lo sé hacer.

Mi duda mayor es que no sé qué tipos de datos entran por el BT1 y cómo puedo transformarlos en cadena, de verdad he leído y no entiendo lo de char, char* y esta línea que ya no recuerdo de dónde la saqué:

Code: [Select]

buffer[BT1.readBytes(buffer, BT1.available())] = 0;

aunque funciona bien para enviar el texto, para mí es incomprensible.

Este es mi primer post, intenté escribirlo lo mejor posible.
Dejo el código que funciona para cambiar el tipo de animación si se envían los números 1 ó 2.

surbyte

Code: [Select]
   delay(10); // Esperar la captura de todos los caracteres
  dato = BT1.read();


Esto es un contrasentido porque luego de que el sistema detecta que ingresó un caracter esperas 10 mseg para leer un caracter hacer todo lo que crees haces bien y luego

Code: [Select]
BT1.flush();

borras todo entonces,  Esperar la captura de todos los caracteres? Qué caracteres?

Si en ese caso los leyeras dentro de un while te creo pero asi esta mal y delay mas flush no tienen sentido a menos que solo quieras borar LF y CR que son introducidos a veces.

Hay muchos ejemplos en este foro en Documentación => Indice de temas tutoriales => Serial para que leas o bien en google o en la lupa que es google restringido a este foro.


robertoxyz20

Hola, bueno es que lo del flush() no lo entiendo. porque en el foro dice que en actualizaciones han cambiado su función, lo dejé allí porque creo que funciona.
El delay también está ahí porque vi varios ejemplos donde lo tenía.
También he intentado con while viendo otros ejemplos, pero creo que tengo varios problemas con la captura de los datos, el largo de las strings y la transformación de estos para lo que quiero, seguiré explorando.
El otro problema es que no sé qué tipo de datos y en qué formato los envía la app del teléfono.

surbyte

Vaya que tienes muchas dudas!!

Quote
Hola, bueno es que lo del flush() no lo entiendo. porque en el foro dice que en actualizaciones han cambiado su función, lo dejé allí porque creo que funciona.
Flush borraba, borra y seguirá borrando todo el buffer de datos enviados y por eso te digo que es un contrasentido tenerlo y decir que esperas a recibir mas datos.
Entonces eso se usa cuando YA sabes que no habrá mas caracteres en el buffer Serial.

Quote
El delay también está ahí porque vi varios ejemplos donde lo tenía.
Personalmente no me gusta el delay en ningún sitio pero... a veces si se digita lento puede tener sentido, no con 1 caracter como lo que esperas, asi que eliminalo.

Quote
También he intentado con while viendo otros ejemplos, pero creo que tengo varios problemas con la captura de los datos, el largo de las strings y la transformación de estos para lo que quiero, seguiré explorando.
En este caso si no se tiene criterio terminas haciendo cualquier cosa.
Basicamente tu lees un caracter por vez con Serial.read() y ese caracter debes concatenarlo a un String dentro de un loop que espera ALGO que le dice no hay mas caracteres. Esa es la secuencia a seguir.

Como te he dicho y te di 3 datos para buscar hay numeros ejemplos en Documentación, asi que ve y busca ahi.


robertoxyz20

Gracias!!! Leí lo que me recomendaste. :)  :)  :)
Logré cambiar el texto, cambiar la animación y la velocidad, pero cuando cambia algo distinto al texto, la pantalla se queda paralizada. Leo la "cadena" por el serial normal pero no veo por qué no conserva el mensaje anterior.. es algo sobre la lógica pero no lo veo.
Falta cambiar esa cantidad de condicionales por algo así como un catálogo.
Acá el código del loop:
Code: [Select]

void loop()
{
if (BT1.available())
  {
    delay(10); // Esperar la captura de todos los caracteres ----> borrar esto
      dato=BT1.read();
      buffer[BT1.readBytes(buffer, BT1.available())] = 0;
//condicionales para el primer caracter
//entregan la cadena a la pantalla lcd a partir del segundo caracter
            if (dato=='.')
              {
              mensacti=buffer;
              }
            if (dato=='1')
              {
              speed1++;
              mensacti=mensprev;
              }
            if (dato=='2')
              {
              speed1--;
              mensacti=mensprev;
              }
            if (dato=='m')
              {
              i++;
              mensacti=mensprev;
              }
            if (dato=='n')
              {
              i--;
              mensacti=mensprev;
              }
    mensprev=buffer;
     P.displayText(mensacti, PA_LEFT, speed1, 2000, catalog[i].effect, catalog[i].effect);

   
  }
 if( P.displayAnimate())
   {
    P.displayReset();
   }
}

surbyte

Este es un ejemplo leyendo un string

Code: [Select]
String a;

void setup() {
      Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {

    while (Serial.available()) {
             a= Serial.readString();// read the incoming data as string
             Serial.println(a);
    }
}

robertoxyz20

Hola!

Creo que no había intentado con readString().

Veré si resulta también en los condicionales.

Gracias!

robertoxyz20

Amigo, este código no funciona si lo quiero colocar dentro del llamado a la pantalla...
Me sale este error:

Code: [Select]
no matching function for call to 'MD_Parola::displayText(String&, textPosition_t, int&, int, textEffect_t&, textEffect_t&)'

Luego, ¿cómo debería transformar ese string leído del bluetooth al string del llamado de la pantalla de la librería parola?
He buscado esa transformación pero no la encuentro.

surbyte

Evidentemente no sabes que la librería Parola pide esto un array de char que es además lo que tu mismo posteaste

Code: [Select]
char buffer[65];

Y yo te he  sugerido algo con una Clase String porque no he prestado atención a ese detalle.

Code: [Select]
String buffer;

Asi que lo que necesitas es convertir ese String a char o bien leerlo directamente en el buffer.
Lo haces con esto .toCharArray() o bien tienes esta otra solución:

Pero entre los ejemplos de la librería parola tienes este

Parola Scrolling

que toma valores por el puerto Serie, obviamente no lo viste


robertoxyz20

"obviamente no lo viste"... No lo vi, amigo...
No soy programador, vi ese ejemplo pero no me funcionó el código porque la app mandaba un inicio de cadena que el programador no advirtió y la librería perdía compatibilidad en ese punto... ese error logré verlo haciéndolo retornar a través del monitor del serial.

Luego programé una app sin ese inicio de cadena con el MIT app inventor y lo resolví.

Lo que no me queda claro es lo de la matriz que usa la librería en "displayText(...", porque también usa char y char*. Estudiaré eso esta noche.

Gracias.

P.D.: Dejo la app en caso que alguien tenga el mismo problema.

Go Up