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