[SOLUCIONADO] Enviar datos recibidos por modulo BT a pantalla

Buenas,

Estoy trabajando con el siguiente código:

#include <SPI.h> //Incluimos la librería SPI
#include <Wire.h> //Incluimos la librería Wire
#include <Adafruit_GFX.h> //Incluimos la librería Adafrutit GFX para efectos de la pantalla
#include <Adafruit_SSD1306.h> //Incluimos la librería Adafruit SSD1306 para funcionamiento de la pantalla
#include <SoftwareSerial.h>   // Incluimos la librería  SoftwareSerial 

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define SSD1306_LCDHEIGHT 64
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

SoftwareSerial BT(10,11);    // Definimos los pines RX y TX del Arduino conectados al Bluetooth

void setup()   {  

  BT.begin(9600);       // Inicializamos el puerto serie BT (Para Modo AT 2)
  Serial.begin(9600);   // Inicializamos  el puerto serie  

 
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.

  // Clear the buffer.
  display.clearDisplay();

 
  display.drawPixel(10, 10, WHITE);  // dibuja un pixel
  // Show the display buffer on the hardware.
  // NOTE: You _must_ call display after making any drawing commands
  // to make them visible on the display hardware!
  display.display();
  delay(2000);
  display.clearDisplay();


  // draw scrolling text
  testscrolltext();
  delay(2000);
  display.clearDisplay();

  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.clearDisplay();
}


void loop()
{
  if(BT.available())    // Si llega un dato por el puerto BT se envía al monitor serial -> creo que es este el que tengo que hacer que salga por pantalla <-
  {
    Serial.write(BT.read());
  }
 
  if(Serial.available())  // Si llega un dato por el monitor serial se envía al puerto BT
  {
     BT.write(Serial.read());
  }
}
  


void testscrolltext(void) {
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(15,25); //(horizontal,vertical)
  display.clearDisplay();
  display.println("valor_pantalla");
  display.display();
  delay(1);

  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  display.clearDisplay();
 
}

pero no consigo configurar una variable para introducirlo en

display.println("valor_pantalla");

dónde “valor_pantalla” es lo que se muestra por una pantalla que tengo conectada a Arduino.

La configuración actual que tengo para la pantalla es que muestre un primer pixel de inicio, y luego el texto con un pequeño scroll que se para.

Y has ejecutado los ejemplos de la librería? Porque toda librería tiene ejemplos y de ellos se aprende.
En el ejemplo de tu librería leo esta inicialización para I2C (tu caso)

  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)

probaste el ejemplo ssd1306_128x64_i2c.ino disponible?

Si te entendido bien, creo que te refieres a si se muestra la informacion por la pantalla (una pequeña OLED), si es asi, la respuesta es si. Todo lo que pongo en la variable

display.println("valor_pantalla");

aparece sin problemas.

Lo que no consigo hacer es que lo que lea el modulo bluetooth (informacion que yo le mando por el movil) aparezca en la pantalla OLED. Lo unico que he conseguido es que dicha informacion que le mando por el movil aparezca por el Monitor Serie.

Salu2

No te había comprendido.

if(BT.available())    // Si llega un dato por el puerto BT se envía al monitor serial -> creo que es este el que tengo que hacer que salga por pantalla <-
  {
    Serial.write(BT.read());
  }
 
}

Aca no guardas nada. Deberías almacenar lo enviado en una variable. Es por aca que va tu consulta?

nitoino:
Lo que no consigo hacer es que lo que lea el modulo bluetooth (informacion que yo le mando por el movil) aparezca en la pantalla OLED. Lo unico que he conseguido es que dicha informacion que le mando por el movil aparezca por el Monitor Serie.

Entonces has esto:

char mensaje[65]; // Tamaño máximo de una línea - 1

// Esto último iría dentro de una función
mensaje[BT.readBytesUntil('\r', mensaje, BT.available() < sizeof(mensaje) - 1 ? BT.available() : sizeof(mensaje) - 1)] = 0;
BT.flush();

// Cuando sea el momento
display.println(mensaje);

surbyte:
No te había comprendido.

if(BT.available())    // Si llega un dato por el puerto BT se envía al monitor serial -> creo que es este el que tengo que hacer que salga por pantalla <-

{
    Serial.write(BT.read());
  }

}




Aca no guardas nada. Deberías almacenar lo enviado en una variable. Es por aca que va tu consulta?

Si, por ahi va mi consulta

Lucario448:
Entonces has esto:

char mensaje[65]; // Tamaño máximo de una línea - 1

// Esto último iría dentro de una función
mensaje[BT.readBytesUntil(’\r’, mensaje, BT.available() < sizeof(mensaje) - 1 ? BT.available() : sizeof(mensaje) - 1)] = 0;
BT.flush();

// Cuando sea el momento
display.println(mensaje);

No me ha funcionado. Aparece el primer pixel (que lo tengo puesto como comprobación de que funcione bien) pero luego se queda la pantalla en negro a pesar de que el Monitor Serie sigue leyendo los datos recibidos por Bluetooth

A ver si lo estás haciendo como lo tenía planeado:

char mensaje[65];

Esto es una variable global.

mensaje[BT.readBytesUntil('\r', mensaje, BT.available() < sizeof(mensaje) - 1 ? BT.available() : sizeof(mensaje) - 1)] = 0;
BT.flush()

Esto va al momento de verificar la entrada, después de if (BT.available()).

display.println(mensaje);

Esto va cuando ya decidas imprimir el mensaje recibido.

PD: antes del proceso de lectura podrías colocar un pequeño retraso. Posiblemente la velocidad del puerto es tan baja que ni llega el siguiente caracter cuando ya terminó.

Si no lo he entendido mal, creo que te refieres a esto, no?

#include <SPI.h> //Incluimos la librería SPI
#include <Wire.h> //Incluimos la librería Wire
#include <Adafruit_GFX.h> //Incluimos la librería Adafrutit GFX para efectos de la pantalla
#include <Adafruit_SSD1306.h> //Incluimos la librería Adafruit SSD1306 para funcionamiento de la pantalla
#include <SoftwareSerial.h>   // Incluimos la librería  SoftwareSerial 

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define SSD1306_LCDHEIGHT 64
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

SoftwareSerial BT(10,11);    // Definimos los pines RX y TX del Arduino conectados al Bluetooth

char mensaje[65]; // Tamaño máximo de una línea - 1

void setup()   {  

  BT.begin(9600);       // Inicializamos el puerto serie BT (Para Modo AT 2)
  Serial.begin(9600);   // Inicializamos  el puerto serie  

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)

  display.clearDisplay();

  display.drawPixel(10, 10, WHITE);  // dibuja un pixel
  display.display();
  delay(2000);
  
  display.clearDisplay();
  
  // draw scrolling text
  testscrolltext();
  delay(2000);
  display.clearDisplay();

  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.clearDisplay();
}

void testscrolltext(void) {
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(15,25); //(horizontal,vertical)
  display.clearDisplay();
  display.println(mensaje);
  display.display();
  delay(1);

  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  display.clearDisplay();


 
}



void loop()
{
  
  if(BT.available())    // Si llega un dato por el puerto BT se envía al monitor serial
    mensaje[BT.readBytesUntil('\r', mensaje, BT.available() < sizeof(mensaje) - 1 ? BT.available() : sizeof(mensaje) - 1)] = 0;
BT.flush();
  
  
    delay(1000);
    Serial.write(BT.read());
  }
 
  if(Serial.available())  // Si llega un dato por el monitor serial se envía al puerto BT
  {
     BT.write(Serial.read());
  }
}

Tras utilizar el código que me sugeriste Lucario, me dado cuenta que el Monitor Serie ya no recibe los datos que le mando por el móvil de forma correcta. Ahora, en el Monitor Serie, aparece solo este símbolo ⸮ cada vez que le mando valores.

¿Conexión? ¿Baudios?

Ya esta. Estaba utilizandolo mal el codigo que me habais proporcionado. Gracias!

Voy a abrir otro post porque tengo dudas de otra cosa.

SOLUCIONADO