HC06 no interpreta bien cuando envio datos por serial al Bluetooth

Hola disculpen llevo en este proyecto atascado mucho tiempo, puesto que no logro que se interpreten el dato string o cadena de char en el arduino y por lo tanto solo muestra esto, ya no se que hacer adjunto el codigo y la respuesta de la salida serial:

#include <SPI.h>       
#include <DMD.h>    
#include <TimerOne.h>  
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "SystemFont5x7.h"
#include <SoftwareSerial.h>

#define DISPLAYS_ACROSS 3 // Número de paneles P10 usados, de lado a lado.
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
SoftwareSerial bluetooth(0, 1); // Módulo Bluetooth
char Text[50]; // Array para almacenar el texto
bool bluetoothConnected = false; // Variable para verificar la conexión Bluetooth

void ScanDMD() { 
  dmd.scanDisplayBySPI();
}

void setup(void) {
  
  Timer1.initialize(1000);          
  Timer1.attachInterrupt(ScanDMD);   
  dmd.clearScreen(true);   
  Serial.begin(115200);

  // Inicialización del Bluetooth
  bluetooth.begin(9600);  // Módulo Bluetooth
  bluetooth.setTimeout(1000);
  
  // Mensaje inicial en el puerto serie
  Serial.println("Esperando conexión Bluetooth...");
}

void loop(void) {
  if (Serial.available() > 0) {
    // Leer el texto desde el puerto serie hasta el salto de línea
    String inputText = Serial.readStringUntil('\n'); 
    inputText.toCharArray(Text, sizeof(Text)); // Convertir String a char array

    // Marcar la conexión Bluetooth después de recibir el primer mensaje
    if (!bluetoothConnected) {
      bluetoothConnected = true;
      Serial.println("Conexión Bluetooth establecida.");
    }
    
    // Asegúrate de que solo se envían caracteres ASCII válidos
    for (int i = 0; i < sizeof(Text); i++) {
      if (Text[i] < 0 || Text[i] > 127) {
        Text[i] = '?'; // Reemplaza caracteres no válidos con '?'
      }
    }
    
    // Mostrar el texto recibido en el DMD
    dmd.selectFont(Arial_Black_16_ISO_8859_1);
    dmd.drawMarquee(Text, strlen(Text), (32 * DISPLAYS_ACROSS) - 1, 0);
    
    // Enviar el texto al módulo Bluetooth
    bluetooth.println(Text); // Envía el texto recibido al Bluetooth
    Serial.println("Texto enviado: " + inputText); // Imprime el texto recibido

    long start = millis();
    long timer = start;
    boolean ret = false;
    int interval = 10;

    while (!ret) {
      if ((timer + interval) < millis()) {
        ret = dmd.stepMarquee(-1, 0);
        timer = millis();
      }
    }
  }
}

Y esta es la respuesta serial:

3:04:10.630 -> Esperando conexión Bluetooth...

23:04:30.782 -> Conexión Bluetooth establecida.

23:04:30.814 -> Texto enviado: �

23:04:42.210 -> Texto enviado: �

23:04:44.721 -> Texto enviado: ��

23:04:49.196 -> Texto enviado: ��

23:04:53.629 -> Texto enviado: ��

es para cconectarlo en un letrero con placas p10 pero ni el serial lee bien, peor muestra correctamente el mensaje en el letrero, si alguien me ayuda, gracias

Acá veo una posible fuente de conflicto

SoftwareSerial bluetooth(0, 1); // Módulo Bluetooth

¿Qué placa arduino usas?

Uso arduino UNO

los pines 0 y 1 son los que usa el monitor serie.
Usa otros pines para el SoftwareSerial ejemplo 2 y 3

Ademas tienes definido el Serial hardware en 0 y 1

 Serial.begin(115200);

y envias periodicamente información lo que colisiona con lo que debe recibir enviar el HC-06
Cambia los pines y todo empezará a fluir.

ya funciona al momento de enviarle datos desde el monitor serial del IDE de arduino, pero al querer enviarlos al bluetooth quedo asi:

#include <SPI.h>       
#include <DMD.h>    
#include <TimerOne.h>  
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "SystemFont5x7.h"
#include <SoftwareSerial.h>

#define DISPLAYS_ACROSS 3 // Número de paneles P10 usados, de lado a lado.
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
SoftwareSerial bluetooth(2, 3); // Módulo Bluetooth
char Text[50]; // Array para almacenar el texto
bool bluetoothConnected = false; // Variable para verificar la conexión Bluetooth

void ScanDMD() { 
  dmd.scanDisplayBySPI();
}

void setup(void) {
  
  Timer1.initialize(1000);          
  Timer1.attachInterrupt(ScanDMD);   
  dmd.clearScreen(true);   
  Serial.begin(9600);

  // Inicialización del Bluetooth
  bluetooth.begin(9600);  // Módulo Bluetooth
  bluetooth.setTimeout(1000);
  
  // Mensaje inicial en el puerto serie
  Serial.println("Esperando conexión Bluetooth...");
}

void loop(void) {
  if (bluetooth.available() > 0) {
    // Leer el texto desde el puerto serie hasta el salto de línea
   String inputText = bluetooth.readStringUntil('\n'); 

    inputText.toCharArray(Text, sizeof(Text)); // Convertir String a char array

    // Marcar la conexión Bluetooth después de recibir el primer mensaje
    if (!bluetoothConnected) {
      bluetoothConnected = true;
      Serial.println("Conexión Bluetooth establecida.");
    }
    
    // Asegúrate de que solo se envían caracteres ASCII válidos
    for (int i = 0; i < sizeof(Text); i++) {
      if (Text[i] < 0 || Text[i] > 127) {
        Text[i] = '?'; // Reemplaza caracteres no válidos con '?'
      }
    }
    
    // Mostrar el texto recibido en el DMD
    dmd.selectFont(Arial_Black_16_ISO_8859_1);
    dmd.drawMarquee(Text, strlen(Text), (32 * DISPLAYS_ACROSS) - 1, 0);
    
    // Enviar el texto al módulo Bluetooth
    bluetooth.println(Text); // Envía el texto recibido al Bluetooth
    Serial.println("Texto enviado: " + inputText); // Imprime el texto recibido

    long start = millis();
    long timer = start;
    boolean ret = false;
    int interval = 10;

    while (!ret) {
      if ((timer + interval) < millis()) {
        ret = dmd.stepMarquee(-1, 0);
        timer = millis();
      }
    }
  }
}

y el serial me responde asi al mandar un hola:

utilizo esta aplicacion para conectarme al bluetooth:

image

Te responde asi porque tienes mal el serial
imageo
Debes ponerlo en
image
No se si CR pero NL si.
Por qué? porque en tu código dice

if (bluetooth.available() > 0) {
    // Leer el texto desde el puerto serie hasta el salto de línea
   String inputText = bluetooth.readStringUntil('\n'); 

Espera un fin de línea y como nunca llega corta por timeout

bluetooth.setTimeout(1000);

Hola, como tal le hice el codigo mas sencillo para saber donde falla, me di cuenta que al enviar al bluetooth si capta correctamente, el problema es que como quiero mostrarlo en una matriz led p10, el comando DMD.begin de la libreria DMD2 no lee bien o causa falla, no se si esto se pueda arreglar?.

Mi codigo sin el dmd begin que lee bien el mensaje enviado al bluetooth.

#include <SPI.h>       
#include <DMD2.h>
#include "Arial_black_16.h"
#include "Arial14.h"
#include "SystemFont5x7.h"
#include <SoftwareSerial.h>

#define DISPLAYS_ACROSS 3 // Número de paneles P10 usados, de lado a lado.
#define DISPLAYS_DOWN 1
SoftDMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);  // Inicializar objeto DMD

SoftwareSerial BT(2, 3);

char palabra[1000];  // Buffer de tamaño 100 para almacenar la palabra


void setup() {
  BT.begin(9600);
  Serial.begin(9600);
  Serial.println("OK, LISTO!");
 
  // Configurar el temporizador para actualizar el panel
   dmd.setBrightness(255);
  dmd.selectFont(Arial_Black_16);
}


void loop() {
  if (BT.available()) {
       int len = BT.readBytesUntil('\n', palabra, sizeof(palabra) - 1);  // Leer hasta un salto de línea

        Serial.println(palabra);  // Mostrar la palabra en el monitor serial
  delay(1000);
   
  }
  
}

y cuando añado el begin.:

#include <SPI.h>       
#include <DMD2.h>
#include "Arial_black_16.h"
#include "Arial14.h"
#include "SystemFont5x7.h"
#include <SoftwareSerial.h>

#define DISPLAYS_ACROSS 3 // Número de paneles P10 usados, de lado a lado.
#define DISPLAYS_DOWN 1
SoftDMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);  // Inicializar objeto DMD

SoftwareSerial BT(2, 3);

char palabra[1000];  // Buffer de tamaño 100 para almacenar la palabra


void setup() {
  BT.begin(9600);
  Serial.begin(9600);
  Serial.println("OK, LISTO!");
 
  // Configurar el temporizador para actualizar el panel
   dmd.setBrightness(255);
  dmd.selectFont(Arial_Black_16);
  dmd.begin();
}


void loop() {
  if (BT.available()) {
       int len = BT.readBytesUntil('\n', palabra, sizeof(palabra) - 1);  // Leer hasta un salto de línea

        Serial.println(palabra);  // Mostrar la palabra en el monitor serial
  delay(1000);
   
  }
  
}

Me sale el mismo mensaje asi:

Por favor muestra el resultado de la compilación. Cuanta flash y cuanta RAM ocupan? Creo que tienes un problema de desbordamiento.
De hecho esto

char palabra[1000];

En un UNO es una exageración.
Reduce a 200 nada mas y prueba.

Aparte del tamaño del array que con justa razón te marca @Surbyte...

Hay algo conectado en el pin 1?

Lo tenía al comienzo, tenia el HC06 al 0 y 1 pero ahora lo puso en 2 y 3

¿No te llaman la atención los caracteres que aparecen antes de "OK, LISTO!"?

Hola ya cambié a [200] pero sigue dándome este error:

frase o palabra que envio:

Esto lee el bluetooth, pero solo sucede con el dmd.begin():
image

Segun lo que entiendo no esta utilizando tanto:

Supongo que aparecen porque vinculo el bluetooth del telefono con el hc06

alguna sugerencia a lo ocurrido?

Subí un esquema de las conexiones tal y como las tienes, puedes hacerlo a mano y subir una foto.

En la captura de la consola de #12 no aparecen los caracteres previos a "Ok...", pareciera que algo cambió.

El uso de variables que informa el compilador no incluye los arrays, si creas un array char de 1000 items, o sea 1000 bytes, y el compilador dice que usa 830 es obvio que las cuentas no cierran, ¿no?

Tienes unos 1830 bytes de RAM ocupados así que quedan apenas unos 200 bytes para uso interno del micro, y por experiencia te digo que con menos de 400 bytes libres funciona mal, empieza a hacer cosas raras.

Viendo la última captura de la consola, aparentemente está interpretando mal los caracteres de a 2 en 2. Raro...

¿Qué aplicación usas en el celu?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.