lo que hace el SSD1306 es comunicar con el microcontrolador mediante I2C o SPI para obtener los datos y enviarlos a la pantalla OLED para que dibuje esos datos.
PULGADAS | PÍXELES |
---|---|
0,69″ | 128 x 32 |
0,96″ | 128 x 64 |
Las librerías pantalla OLED con Arduino y ESP8266 son dos: Adafruit_SSD1306 y Adfruit-GFX-Library.
1 | Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1); |
Donde:
- ANCHO_PANTALLA: es la constante donde se almacena el ancho de la pantalla.
- ALTO_PANTALLA: es la constante donde se almacena el alto de la pantalla.
- &Wire: el un puntero a la clase estática Wire.
- -1: es el pin de Arduino o ESP8266 que se utiliza para resetear la pantalla.
En estos sketchs podemos ver como se expresan las funciones de las librerias,funcionando ambas
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled_1(128,64, &Wire,-1);
void setup(){
oled_1.begin(SSD1306_SWITCHCAPVCC,0x3C);//inicialización de pantalla en direccion 0x3c
oled_1.clearDisplay();
oled_1.display();
oled_1.setTextSize(1);
oled_1.setTextColor(WHITE);
oled_1.setCursor(25,32);//posición texto x,y
oled_1.print("TEST SSD1306");//escribir texto
oled_1.display();//envío a pantalla
}
void loop() {}
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() {
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
// Limpiar buffer
display.clearDisplay();
// Tamaño del texto
display.setTextSize(1);
// Color del texto
display.setTextColor(SSD1306_WHITE);
// Posición del texto
display.setCursor(10, 32);
// Escribir texto
display.println("¡¡Hola mundo!!");
// Enviar a pantalla
display.display();
}
void loop() {}
Dibujar un punto en la pantalla
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() {
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
}
void loop() {
// Recorrer pantalla
for (int x = 0; x < ANCHO_PANTALLA; x++) {
for (int y = 0; y < ALTO_PANTALLA; y++) {
// Limpiar buffer
display.clearDisplay();
// Dibujar un píxel
display.drawPixel(x, y, SSD1306_WHITE);
// Enviar a pantalla
display.display();
}
}
}
TEXTO EN MOVIMIENTO
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() {
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
// Limpir buffer
display.clearDisplay();
// Tamaño del texto
display.setTextSize(1);
// Color del texto
display.setTextColor(SSD1306_WHITE);
// Posición del texto
display.setCursor(10, 32);
//Activar página de código 437
display.cp437(true);
// Escribir el carácter ¡ dos veces
display.write(173);
display.write(173);
// Escribir texto
display.println("Hola mundo!!");
// Enviar a pantalla
display.display();
delay(2000);
// Mover texto de izquierda a derecha
display.startscrollright(0x00, 0x0F);
delay(5000);
display.stopscroll();
// Mover texto de derecha a izquierda
display.startscrollleft(0x00, 0x0F);
delay(5000);
display.stopscroll();
// Mover texto en diagonal hacia la derecha
display.startscrolldiagright(0x00, 0x07);
delay(5000);
display.stopscroll();
// Mover texto en diagonal hacia la izquierda
display.startscrolldiagleft(0x00, 0x07);
delay(5000);
display.stopscroll();
}
void loop() {}
Dibujar figuras en pantalla
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() {
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
// Limpir buffer
display.clearDisplay();
// Dibujar línea horizontal
display.drawLine(0, 18, display.width(), 18, SSD1306_WHITE);
// Dibujar línea vertical
display.drawLine(63, 0, 63, display.height(), SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Limpir buffer
display.clearDisplay();
// Dibujar un rectángulo
display.drawRect(10, 18, 20, 28, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Rellenar rectángulo
display.fillRect(10, 18, 20, 28, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Limpir buffer
display.clearDisplay();
// Dibujar un ciículor
display.drawCircle(64, 32, 10, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Rellenar cículo
display.fillCircle(64, 32, 10, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Limpir buffer
display.clearDisplay();
// Dibujar un rectángulo redondeado
display.drawRoundRect(10, 18, 20, 28, 5, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Rellenar rectángulo redondeado
display.fillRoundRect(10, 18, 20, 28, 5, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Limpir buffer
display.clearDisplay();
// Dibujar un rectángulo redondeado
display.drawTriangle(10, 18, 50, 18, 30, 58, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
// Rellenar rectángulo redondeado
display.fillTriangle(10, 18, 50, 18, 30, 58, SSD1306_WHITE);
// Enviar a pantalla
display.display();
delay(2000);
}
void loop() {}
MOSTRAR TIEMPO TRANSCURRIDO
#define __DEBUG__
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Temporizador
unsigned long marcaTiempoDate = 0;
unsigned long tiempoRefreshDate = 1000;
// Variables almacena tiempo millis
int dias;
int horas;
int minutos;
int segundos;
// Cadena para almacenar texto formateado
char cadenaTiempo[16];
/*
Función que convierte millis() a segundos, minutos, horas y días
Almacena la información en variables globales
*/
void millisToTiempo(unsigned long valMillis) {
// Se obtienen los segundos
valMillis = valMillis / 1000;
segundos = valMillis % 60; // se divide entre segundos por minuto y te quedas con el resto
minutos = valMillis / 60; // Se convierte a minutos
minutos = minutos % 60; // se divide entre minutos por hora y te quedas con el resto
horas = (valMillis / 60) / 60; // Se convierte en horas
horas = horas % 24; // se divide entre horas al día y te quedas con el resto
dias = ((valMillis / 60) / 60) / 24; // Se convierte en días
#ifdef __DEBUG__
Serial.print("Segundos = ");
Serial.println(valMillis);
Serial.print(dias);
Serial.print(":");
Serial.print(horas);
Serial.print(":");
Serial.print(minutos);
Serial.print(":");
Serial.println(segundos);
#endif
}
void setup() {
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
}
void loop() {
// Protección overflow
if (millis() < marcaTiempoDate) {
marcaTiempoDate = millis();
}
// Comprobar is hay que actualizar temperatura
if (millis() - marcaTiempoDate >= tiempoRefreshDate)
{
// Actualizar variables de tiempo
millisToTiempo(millis());
// Componer cadena con la información del tiempo formateada
sprintf(cadenaTiempo, "%02d:%02d:%02d:%02d", dias, horas, minutos, segundos);
// Marca de tiempo
marcaTiempoDate = millis();
}
// Limpiar buffer pantalla
display.clearDisplay();
// Dibujar línea horizontal
display.drawLine(0, 18, display.width(), 18, SSD1306_WHITE);
// Dibujar texto tiempo
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(cadenaTiempo);
// Enviar a pantalla
display.display();
}