Enviar datos por Bluetooth y mostrar en matriz de LEDs [SOLUCIONADO]

Hola, muy buenas a tod@s, de nuevo vengo a pedirles ayuda con algo que seguro es una tonteria.

Hace unos dias adquirí una matriz 8x8 LED y me puse a “juguetear” un poco, tras varios fracasos conseguí que me mostrase caracteres y alguna “carita sonriente”.

Decidí ir un poco mas lejos, conecté mi modulo Bluetooth HC-06 para enviar datos de una aplicación andoid (AurdinoBluetooth) a arduino y se mostraran en la matriz de LEDs. Este es el código:

#include <SoftwareSerial.h>
#include "LedControlMS.h"
#define NumMatrix 1       // Cuantas matrices vamos a usar

SoftwareSerial BT1(4,2); // RX, TX recordar que se cruzan
LedControl lc=LedControl(12,11,10, NumMatrix);  // Creamos una instancia de LedControl

void setup()
{
   Serial.begin(9600);
   BT1.begin(9600);
   Serial.println("Enter AT commands:");
   for (int i=0; i< NumMatrix ; i++)
   {
     lc.shutdown(i,false);    // Activar las matrices
     lc.setIntensity(i,8);    // Poner el brillo a un valor intermedio
     lc.clearDisplay(i);      // Y borrar todo
   }
}

void loop()
{
  if (BT1.available())
  {
    int dato = BT1.read();
    Serial.write(dato);
    char caracteres = (char)dato; // ¿¿Hay que convertir en char??????
    lc.writeString(0,caracteres); // <--------------------- MAL
  } 
  
  if (Serial.available())
  {
    String S = GetLine();
    BT1.print(S);
    Serial.println("---> " + S);
  }
}

String GetLine()
{
  String S = "" ;
  if (Serial.available())
  {
   char c = Serial.read(); ;
   while ( c != '\n')
   {
     S = S + c ;
     delay(25) ;
     c = Serial.read();
   } 
   return( S + '\n') ;
  }
}

Uso varias librerias:

El problema que me ocurre es que en la matriz de LEDs me muestra el caracter “B” o “N” aleatoriamente e independientemente de lo que envie por bluetooth.

yo creo que el problema está en esta parte del codigo:

  if (BT1.available())
  {
    int dato = BT1.read();
    Serial.write(dato);
    char caracteres = (char)dato; // ¿¿Hay que convertir en char??????
    lc.writeString(0,caracteres); // <--------------------- MAL
  }

Probé esto: (no funciona)

  if (BT1.available())
  {
    int dato = BT1.read();
    Serial.write(dato);
    lc.writeString(0,dato);
  }

Tambien esto:

  if (BT1.available())
  {
    int dato = BT1.read();
    Serial.write(dato);
    String caracteres = (String)dato;
    lc.writeString(0,caracteres); 
  }

y me tira un error…

No se me ocurre mucho mas que hacer… seguro que es facil de solucionar pero mi falta de experiencia no me permite avanzar.
Les agradezco su tiempo :slight_smile:

La definición de la función es la siguiente:

void LedControl::writeString(int mtx, char * displayString)

Primer parámetro: int que representa el índice del la matriz por manipular (en caso de ser solo una, este valor debe ser siempre cero. Segundo parámetro: el parámetro se interpretará como un puntero de char, lo mismo a decir que ahí lo que espera es una cadena de caracteres. Cuando le pasabas un único caracter, su valor es reinterpretado como un puntero; lo cuál lleva a leer en posiciones de memoria indebidas.

Supongo que la idea es para hacer un "scrolling" horizontal de toda la cadena. La solución al problema considero que es la siguiente:

if (BT1.available())
  {
    delay(100); // Esperar la captura de todos los caracteres
    buffer[BT1.readBytes(buffer, BT1.available())] = 0;
    Serial.write(buffer);
    lc.writeString(0,buffer);
    BT1.flush();
  }

Declaración a agregar entre las variables globales:

char buffer[65];

Muchas gracias por su respuesta Lucario448, como dicen en mi pueblo, eres un artista! funciona perfecto! Yo por mas que quise interpretar

void writeString(int mtx, char * displayString);

en LedControlMS.h, no coseguí entender, gracias por su forma de explicarlo, ahora lo entiendo perfectamente.

Doy el problema por solucionado

Gracias! :)