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
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();
}
}
}
}
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);
}
}
#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);
}
}
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...