lunes, 11 de agosto de 2025

Arduino y pantalla OLED

La pantalla que he utilizado es una OLED I2C SSD1306 de 0,96 pulgadas (9E3318A1) con dirección 0X3C y 128x64 pixeles, comprada por 3,95 euros en Aliexpress. Para controlar la pantalla OLED desde el IDE de Arduino se necesitan las bibliotecas adafruit_SSD1306.h y adafruit_GFX.h

Escribiendo texto

Este programa para el IDE de Arduino permite escribir un texto en la pantalla.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // Anchura en pixels de la pantalla OLED
#define SCREEN_HEIGHT 64 // Altura en pixels de la pantalla OLED
// Creación de un objeto SSD1306 display conectado por I2C (pines SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // dirección 0x3C en I2C
    Serial.println(F("SSD1306 conexión fallida"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
  //Tamaño de letra
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  // Texto para mostrar en la pantalla
  display.println("Hola Mundo!");
  display.display();
}

void loop() {
 
}

Conocer la dirección de la pantalla en el bus I2C

Con el siguiente programa, a través de la Consola del puerto serie podemos conocer cual es la dirección de los elementos que tengamos conectados en el bus I2C, como la pantalla OLED.

#include <Wire.h>

   void setup() {
     Wire.begin();
     Serial.begin(115200);
     Serial.println("\nI2C Scanner");
   }

   void loop() {
     byte error, address;
     int nDevices;
     Serial.println("Scanning...");
     nDevices = 0;
     for(address = 1; address < 127; address++ ) {
       Wire.beginTransmission(address);
       error = Wire.endTransmission();
       if (error == 0) {
         Serial.print("I2C device found at address 0x");
         if (address<16) {
           Serial.print("0");
         }
         Serial.print(address,HEX);
         Serial.println(" !");
         nDevices++;
       }
       else if (error==4) {
         Serial.print("Unknow error at address 0x");
         if (address<16) {
           Serial.print("0");
         }
         Serial.println(address,HEX);
       }    
     }
     if (nDevices == 0) {
       Serial.println("No I2C devices found\n");
     }
     else {
       Serial.println("done\n");
     }
     delay(5000);          
   }


Uso de otras fuentes: pantalla OLED  
 
La biblioteca Adafruit GFX permite usar fuentes alternativas además de las integradas. Permite elegir entre Serif, Sans y Mono. Cada fuente está disponible en negrita, cursiva y en diferentes tamaños.

Los tamaños se establecen según la fuente real. Por lo tanto, setTextSize() no funciona con estas fuentes. Están disponibles en tamaños de 9, 12, 18 y 24 puntos y también contienen caracteres de 7 bits (códigos ASCII) (descritos como 7b en el nombre de la fuente).

Se puede elegir entre la siguiente selección de fuentes:

FreeMono12pt7b.h                         FreeSansBoldOblique12pt7b.h
FreeMono18pt7b.h                         FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h                         FreeSansBoldOblique24pt7b.h
FreeMono9pt7b.h                 FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h                 FreeSansOblique12pt7b.h
FreeMonoBold18pt7b.h                 FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h                 FreeSansOblique24pt7b.h
FreeMonoBold9pt7b.h                 FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h         FreeSerif12pt7b.h
FreeMonoBoldOblique18pt7b.h         FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h         FreeSerif24pt7b.h
FreeMonoBoldOblique9pt7b.h         FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h         FreeSerifBold12pt7b.h
FreeMonoOblique18pt7b.h         FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h         FreeSerifBold24pt7b.h
FreeMonoOblique9pt7b.h         FreeSerifBold9pt7b.h
FreeSans12pt7b.h                         FreeSerifBoldItalic12pt7b.h
FreeSans18pt7b.h                         FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h                         FreeSerifBoldItalic24pt7b.h
FreeSans9pt7b.h                 FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h                 FreeSerifItalic12pt7b.h
FreeSansBold18pt7b.h                 FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h                 FreeSerifItalic24pt7b.h
FreeSansBold9pt7b.h                 FreeSerifItalic9pt7b.h

Un ejemplo de programa que utiliza otras fuentes de texto es el siguiente.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeMonoOblique18pt7b.h>

#define SCREEN_WIDTH 128 // Anchura en pixeles de la pantalla OLED
#define SCREEN_HEIGHT 64 // Altura en pixeles de la pantalla OLED

// Creación de un objeto SSD1306 display conectado por I2C (pines SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("Ha fallado la conexión con SSD1306");
    for(;;);
  }
  delay(2000);

  display.setFont(&FreeMonoOblique18pt7b);
  display.clearDisplay();
  display.setTextSize(1);            
  display.setTextColor(WHITE);        
  display.setCursor(0,20);            
  display.println("Hola mundo!");
  display.display();
  delay(2000);
}
void loop() {
 
}



Texto deslizante

Podemos conseguir que un texto largo se vaya desplazando por la pantalla con un programa similar al que se muestra a continuación.

#include <Adafruit_GFX.h>
 #include <Adafruit_SSD1306.h>

 Adafruit_SSD1306 display(4);

   char mensaje[]="Bienvenidos a bordo de este barco tan bonito";
   int x, minX;

  void setup(){
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setTextWrap(false);
  x = display.width();
  minX = -12 * strlen(mensaje);  // 12 = 6 pixels/caracter * tamaño de texto 2
  }

  void loop(){
       
   display.clearDisplay();
   display.setTextSize(2);
   display.setCursor(x,0);
   display.print(mensaje);  
   display.display();
   x=x-8; // Velocidad de desplazamiento
   if(x < minX) x= display.width();
}

Texto deslizante hacia arriba

El siguiente programa desplaza el texto hacia arriba sucesivamente. Solamente puede desplazar la cantidad de texto que le cabe en la pantalla.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* texto = "Este es un ejemplo de texto largo.";
int yPos = SCREEN_HEIGHT; // Inicia fuera de la pantalla
int velocidad = 2; // Ajusta la velocidad de desplazamiento

void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección I2C por defecto
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // No continuar
  }
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(2);
}

void loop() {
  display.clearDisplay();
  display.setCursor(0, yPos);
  display.print(texto);
  display.display();
  yPos -= velocidad; // Mueve el texto hacia arriba
  if (yPos + 12 < 0) { // 8 es el alto del texto de tamaño 1, ajustar si es diferente
    yPos = SCREEN_HEIGHT; // Reinicia la posición al llegar al borde inferior
  }
  delay(50); // Ajusta la velocidad de desplazamiento
}

Otro programa para textos deslizantes

Con el siguiente programa podemos conseguir que el texto se desplace hacia la derecha o hacia la izquierda.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Creación de un objeto SSD1306 display conectado por I2C (pines SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //Dirección para el puerto I2C
    Serial.println(F("Ha fallado la comunicación con SSD1306"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  // Display static text
  display.println("Buenos dias");
  display.display();
  delay(100);
 
}

void loop() {
  // Deslizándose a derecha e izquierda
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}


Dibujando figuras geométricas

Este programa dibuja líneas, rectángulos, círculos y triángulos, rellenos o no,

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// Creamos un objeto SSD1306 display conectado por I2C (Pines SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Ha fallado la conexión con SSD1306"));
    for(;;);
  }
  delay(2000); // Pausa de dos segundos

  // Limpieza del buffer
  display.clearDisplay();

  // Dibujando un solo pixel en blanco
  display.drawPixel(64, 32, WHITE);
  display.display();
  delay(3000);

  // Dibujando una línea
  display.clearDisplay();
  display.drawLine(0, 0, 127, 20, WHITE);
  display.display();
  delay(3000);
 
  // Dibujando un rectángulo
  display.clearDisplay();
  display.drawRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);
  // Rellenando el rectángulo
  display.fillRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);

  // Dibujando un rectángulo con las esquinas redondeadas
  display.clearDisplay();
  display.drawRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
  // Rellenando el rectángulo anterior
  display.clearDisplay();
  display.fillRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
 
  // Dibujando un círculo
  display.clearDisplay();
  display.drawCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
  // Rellenando el círculo
  display.fillCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
 
  // Dibujando un triángulo
  display.clearDisplay();
  display.drawTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);
  // Rellenando el triángulo
  display.fillTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);

  // Invirtiendo (negro/blanco) los pixeles de la pantalla y volviendo atrás el efectoi
  display.invertDisplay(true);
  delay(3000);
  display.invertDisplay(false);
  delay(3000);
}

void loop() {
 
}


Bitmap

Estas librerías permiten definir un mapa de bits para representar de una sola vez toda una imagen de 128 x 64 puntos. Esta información se guarda previamente en una matriz (static const unsigned char PROGMEM image_data_Saraarray[]). 

Para realizar fácilmente la conversión de una imagen cualquiera a mapa de bits podemos utilizar el espacio web LCD Bitmap Converter Online.


Primeramente hemos de cargar una imagen y he escogido esta:


Debajo aparece el código correspondiente de este bitmap.


Este código se ha de copiar y colocar como contenido de la matriz (static const unsigned char PROGMEM image_data_Saraarray[]). 

Una vez realizado todo el proceso, el siguiente programa muestra en la pantalla el anagrama de la empresa de vehículos Barreiros.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

static const unsigned char PROGMEM image_data_Saraarray[] = {
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
      0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x01, 0xF8, 0xE7, 0xF0, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0,
      0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x07, 0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x1E, 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x1E, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
      0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00,
      0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0,
      0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x0E, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x1E, 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
      0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0, 0xF8, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8,
      0xE7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
      0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x03, 0xF0, 0xE3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0, 0xF8, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x0F, 0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E,
      0x00, 0xE0, 0x1E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x0E, 0x03, 0xFE, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00,
      0xE0, 0x0F, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x3F, 0x0F, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0,
      0x07, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x3C, 0xE7, 0x80, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xE0, 0x07,
      0x19, 0xC3, 0xC0, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x7D, 0xE0, 0x00,
      0x00, 0x78, 0x00, 0xE0, 0x07, 0x03, 0xC3, 0xC0, 0x00, 0x0F, 0x1F,
      0x00, 0x00, 0x7B, 0xE0, 0x00, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x07,
      0x9F, 0x80, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x1C,
      0x38, 0x01, 0xE0, 0x0F, 0x07, 0x3E, 0x00, 0x79, 0x0E, 0x1E, 0x07,
      0xE1, 0x83, 0xE0, 0xF8, 0x70, 0x3C, 0x01, 0xE0, 0x0F, 0x0F, 0xF8,
      0x01, 0xF7, 0x8F, 0xAF, 0x1F, 0x27, 0xC5, 0xE3, 0xE6, 0x70, 0x3C,
      0x01, 0xE0, 0x0F, 0x0E, 0x78, 0x07, 0x8F, 0x1F, 0x5E, 0x3C, 0x4F,
      0x93, 0xEF, 0x88, 0x70, 0x1E, 0x01, 0xE0, 0x1E, 0x1C, 0x3C, 0x0F,
      0x1E, 0x3E, 0xBE, 0x79, 0x1F, 0x27, 0xDF, 0x10, 0xF0, 0x1E, 0x01,
      0xE0, 0x3E, 0x3C, 0x3E, 0x1E, 0x3D, 0x7D, 0x78, 0xF8, 0x3E, 0x9F,
      0x3E, 0x20, 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x38, 0x1F, 0x3C, 0x78,
      0x7A, 0xF9, 0xF0, 0x7C, 0x3E, 0x3C, 0x40, 0xF0, 0x07, 0x81, 0xE0,
      0x7C, 0x79, 0xCF, 0x3D, 0xFD, 0xF5, 0xE3, 0xC1, 0xFC, 0x7C, 0xF9,
      0x3C, 0xE0, 0x07, 0xE1, 0xE1, 0xF0, 0x73, 0xFE, 0x3D, 0xF9, 0xF9,
      0xF9, 0xE1, 0xF8, 0x7C, 0x3C, 0x3F, 0xC0, 0x03, 0xF9, 0xE7, 0xE0,
      0xF1, 0xFC, 0x38, 0xE0, 0x60, 0x60, 0x60, 0x20, 0x10, 0x00, 0x0F,
      0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xF0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
      0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0x81, 0xFF,
      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
      0x00, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
      };
 
void setup() {
  Serial.begin(115200);
 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 conexión fallida"));
    for(;;);
  }
  delay(2000); // Pausa de dos segundos
 
  // Limpiando el buffer.
  display.clearDisplay();
 
  // Dibujando el bitmap en la pantalla
  display.drawBitmap(0, 0, image_data_Saraarray, 128, 64, 1);
   display.invertDisplay(true);
  display.display();
}
 
void loop() {
 
}

Animaciones

En el siguiente video se puede ver como programar el conocido como Juego de la vida para ser representado en una pantalla OLED.


Trabajando con la librería SSD1306Ascii.h

Dado que la librería Adafruit_SSD1306.h a veces resulta incompatible con la librería SD.h que controla las tarjetas de memoria MicroSD, vamos a utilizar ahora otra librería para controlar la pantalla OLED, se trata de la librería SSD1306Ascii.h.

El siguiente programa escribe en diferentes líneas con dos tamaños de letra.

#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

#define I2C_ADDRESS 0x3C
#define RST_PIN -1

//Creación de un objeto de tipo SSD1306AsciiAvrI2c llamado oled
SSD1306AsciiAvrI2c oled;

void setup() {

#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
 
  oled.setFont(Adafruit5x7);

  uint32_t m = micros();
  oled.clear();
  oled.println("Hola Mundo!");
  oled.println("Una larga linea");
  oled.println();
  oled.set2X();//El tamaño de la letra se hará el doble
  oled.println("2X demo");
  oled.set1X();//Se vuelve al tamaño de letra original
  oled.print("\nmicros: ");
  oled.print(micros() - m);
}


void loop() {

}

Otro programa que escribe

Este programa también escribe texto en diferentes líneas de la pantalla.

#include <Adafruit_SSD1306.h>  // incluye la libreria de adafruit para el driver del display OLED

Adafruit_SSD1306 display(128, 64);  // declara la resolucion del display

int cont=0;
int tam=0;
void setup(){                

  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicia la comunicacion I2C con el display que tiene la direccion 0x3C
  display.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  display.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco

  //esto solo es visible al iniciar el programa:
 
  display.clearDisplay();  // limpia el buffer del display
  display.setTextSize(2);  // cambia tamaño de letra a 2
  display.setCursor(0, 0); //(x,y) pone el cursor en el origen del display
  display.println("Iniciando"); //escribe en buffer del display
  display.display(); // muestra la informacion del buffer en la pantalla
  delay(2000); //pausa de 2 segundos o 2000 milisegundos
}

void loop(){

// primera pantalla de presentacion
 
  display.clearDisplay();  
  display.setTextSize(1); // selecciona el tamaño de la letra puede ser u entre 1 y 10
  display.setCursor(0, 0);  // (x,y) pone el cursor en el origen del display
  display.println("VARIAS LINEAS");
  display.setCursor(0, 20);  // (x,y) pone el cursor mas o menos en la mitad horizontal del display
  display.println("En mayuscula y minuscula");
  display.setCursor(30, 50); //(x,y)
  display.println("Con sangria");
  display.display();
  delay(5000); //pausa de 5 segundos o 5000 milisegundos


// segundo pantallazo, bajamos el brillo del display
 
  display.clearDisplay();  
  display.setTextSize(2);  // cambia tamaño de letra a 2
  display.setCursor(0, 0);  
  display.println("Escala de letra 2.  Probando texto largo y desborde"); //Por defecto el texto largo se desborda y continua en la siguiente linea
  display.display();
  delay(5000);

// tercer pantallazo

  display.clearDisplay();  
  display.setTextWrap(false); // desactiva el desborde de texto
  display.setTextSize(2);  
  display.setCursor(0, 0);  
  display.println("Desborde desactivado con la instruccion display.setTextWrap(false) ...");
  display.display();
  delay(5000);

// cuarto pantallazo
 
  display.clearDisplay();  
  display.setTextWrap(true); // activa el desborde de texto
  display.setTextSize(1);  
  display.setCursor(0, 30);  
  display.println("Vamos a desplegar una variable entera en diferentes escalas del 1 al 9 ");
  display.display();
  delay(7000);

// pantalla final varia con el incremento de las variables de los ciclos "for"

  for(int tam = 1; tam < 10; tam++){  // creamos un ciclo con la variable tam (tamaño) que va desde 1 hasta 9
    display.setTextSize(tam); // usa la variable tam para cambiar el tamaño del texto en cada ciclo
      for(int cont=0; cont<10; cont++){ //creamos un ciclo con la variable cont (contador) que va de 0 a 9 y se muestra en la pantalla
        display.clearDisplay();
        display.setCursor(0, 0);  
        display.println(cont); // escribe el valor de la variable en el bufer
        display.display();
        delay(100);
      }

  }
 
}  // Final de la funcion principal, salta al inicio del "void loop"

Escribiendo en columnas

Este programa escribe en columnas generando unos valores aleatorios que introduce en la tabla.

// Form with proportional font.
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C

// Define proper RST_PIN if required.
#define RST_PIN -1

SSD1306AsciiWire oled;

uint8_t col0 = 0;  // First value column
uint8_t col1 = 0;  // Last value column.
uint8_t rows;      // Rows per line.
//------------------------------------------------------------------------------
void setup() {
  const char* label[] = {"Voltage:", "Load:", "Runtime:"};
  const char* units[] = {"volts", "watts", "mins"};  
  Wire.begin();
  Wire.setClock(400000L);

#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0

  oled.setFont(Callibri15);
// oled.setFont(Arial14);
// oled.setFont(Callibri11_bold);
// oled.setFont(TimesNewRoman13);

  // Increase space between letters.
  oled.setLetterSpacing(2);
 
  oled.clear();

  // Setup form and find longest label.
  for (uint8_t i = 0; i < 3; i++) {
    oled.println(label[i]);
    uint8_t w = oled.strWidth(label[i]);
    col0 = col0 < w ? w : col0;
  }
  // Three pixels after label.
  col0 += 3;
  // Allow two or more pixels after value.
  col1 = col0 + oled.strWidth("99.9") + 2;
  // Line height in rows.
  rows = oled.fontRows();

  // Print units.  
  for ( uint8_t i = 0; i < 3; i++) {
    oled.setCursor(col1 + 1, i*rows);
    oled.print(units[i]);
  }
  delay(3000);  
}
//------------------------------------------------------------------------------
void clearValue(uint8_t row) {
  oled.clear(col0, col1, row, row + rows - 1);
}
//------------------------------------------------------------------------------
void loop() {
  // Fake system model.
  double volts = 0.1*random(110, 130);
  double watts = 0.1*random(200, 500);
  // 100 Wh battery.
  int run = 100*60/(int)watts;
  clearValue(0);
  oled.print(volts, 1);
  clearValue(rows);
  oled.print(watts, 1);
  clearValue(2*rows);
  oled.print(run);  
  delay(1000);
}

Otro ejemplo de escritura

 // benötigte Bibliotheken einbinden

#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// Adresse I2C
#define I2C_ADDRESS 0x3C

// Name des OLED festlegen
SSD1306AsciiWire oled;

void setup()
{
  // OLED starten
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);

  oled.setFont(TimesNewRoman16);

  // Scrollen einschalten
  oled.println("Einmaleins der 10");
  delay(1000);
  oled.clear();

  // Scrollen einschalten
  oled.setScrollMode(SCROLL_MODE_AUTO);
  for (int i = 1; i <= 10; i++)
  {
    oled.println(String(i) + " * 10 = " + String(i * 10));
    /*
      nach jeweils 3 Zeilen, wenn i geteilt durch 3
      ohne Rest aufgeht (i % 3 == 0) -> Bildschirm löschen
    */
    if (i % 3 == 0)
    {
      delay(1000);
      oled.clear();
    }
    delay(500);
  }
  delay(2000);
  oled.clear();

  // Scrollen ausschalten
  oled.setScrollMode(SCROLL_MODE_OFF);

  // Beispiele für Schriftarten
  oled.setFont(X11fixed7x14);
  oled.println("X11fixed7x14");

  oled.setFont(utf8font10x16);
  oled.println("utf8font10x16");

  oled.setFont(Callibri11);
  oled.println("Callibri11");

  oled.setFont(Arial14);
  oled.println("Arial14");
  delay(2000);
  oled.clear();

  // Bildschirm um 180° drehen
  oled.setFont(Callibri11);
  oled.displayRemap(true);
  oled.print("Bildschirm gedreht");
  delay(2000);
  oled.clear();

  // Cursor setzen
  oled.displayRemap(false);
  oled.setCursor(20, 5);
  oled.print("Spalte 20, Zeile 5");
  delay(2000);
  oled.clear();

  // Bildschirmfarben tauschen
  oled.invertDisplay(true);
  oled.setFont(Arial14);
  oled.print("Farben getauscht");
  delay(2000);
  oled.clear();

  // Abstand der Buchstaben
  oled.invertDisplay(false);
  oled.setFont(TimesNewRoman13);
  oled.setLetterSpacing(2);
  oled.print("Abstand Buchstaben");
}

void loop()
{
  // nichts zu tun, Programm läuft nur einmal
}


Bitmap con el logo de BMW

Este programa muestra el logo de BMW que se desplaza continuamente desde la derecha hacia el centro de la pantalla.

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// 0X3C+SA0 - 0x3C o 0x3D
#define I2C_ADDRESS 0x3C

// Es necesario definir el RST_PIN
#define RST_PIN -1

const byte Logo[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
  0x40, 0x60, 0x20, 0x30, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0xf4, 0x74, 0xc4, 0x04,
  0x04, 0xe4, 0x74, 0xf4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x30, 0x20, 0x60, 0x40,
  0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x10, 0x48, 0xe4, 0x92, 0x89, 0xc9, 0x78,
  0x20, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x27, 0x20, 0x21, 0x27,
  0xa7, 0xe1, 0xe0, 0xa7, 0xa0, 0xe0, 0xc0, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0,
  0x98, 0x4d, 0x41, 0xe2, 0x64, 0x08, 0x10, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xc0, 0x38, 0x0e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0xc4,
  0x32, 0x19, 0x0c, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfb, 0xfe, 0xec, 0xd9, 0xb1,
  0xc0, 0x0c, 0x0f, 0x05, 0x06, 0x02, 0x03, 0x01, 0x00, 0x03, 0x0e, 0x38, 0xc0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xfc, 0x67, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00,
  0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe6, 0x7f,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00,
 a 0x00, 0x00, 0x00, 0x03, 0x1c, 0x70, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
  0x0d, 0x1b, 0x37, 0x6f, 0xdf, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c,
  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x1c, 0x03, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x07, 0x05, 0x05, 0x07, 0x07, 0x05,
  0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
  0x02, 0x06, 0x04, 0x0c, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x0c, 0x04, 0x06, 0x02,
  0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };


//Crea un objeto de tipo SSD1306AsciiWire y nombre oled
SSD1306AsciiWire oled;


void setup() {

  Wire.begin();
  Wire.setClock(400000L);

#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0

}

void loop() {

   for( byte c = 127; c > 32; c-- ){
   byte r = 0; // Start row - Modify as needed
   int a = 0; // Position in array - Don't change
   for (byte b = 0; b < 8; b++) {
     oled.setCursor (c,(r+b));
     for (byte i = 0; i < 64; i++) {
       oled.ssd1306WriteRam(pgm_read_byte(&Logo[a]));
       a++;
      }  
    }
  }
}

Prueba


#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// 0X3C+SA0 - 0x3C o 0x3D
#define I2C_ADDRESS 0x3C
int a = 0; // Position in array - Don't change
// Es necesario definir el RST_PIN
#define RST_PIN -1

const byte Logo[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
      0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x01, 0xF8, 0xE7, 0xF0, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0,
      0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x07, 0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x1E, 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x1E, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
      0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00,
      0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0,
      0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x0E, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x1E, 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
      0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0, 0xF8, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8,
      0xE7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
      0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x03, 0xF0, 0xE3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xE0, 0xF8, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x0F, 0x80, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xE0, 0x3C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E,
      0x00, 0xE0, 0x1E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x0E, 0x03, 0xFE, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00,
      0xE0, 0x0F, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0x0F, 0x3F, 0x0F, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xE0,
      0x07, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x3C, 0xE7, 0x80, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xE0, 0x07,
      0x19, 0xC3, 0xC0, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x7D, 0xE0, 0x00,
      0x00, 0x78, 0x00, 0xE0, 0x07, 0x03, 0xC3, 0xC0, 0x00, 0x0F, 0x1F,
      0x00, 0x00, 0x7B, 0xE0, 0x00, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x07,
      0x9F, 0x80, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x1C,
      0x38, 0x01, 0xE0, 0x0F, 0x07, 0x3E, 0x00, 0x79, 0x0E, 0x1E, 0x07,
      0xE1, 0x83, 0xE0, 0xF8, 0x70, 0x3C, 0x01, 0xE0, 0x0F, 0x0F, 0xF8,
      0x01, 0xF7, 0x8F, 0xAF, 0x1F, 0x27, 0xC5, 0xE3, 0xE6, 0x70, 0x3C,
      0x01, 0xE0, 0x0F, 0x0E, 0x78, 0x07, 0x8F, 0x1F, 0x5E, 0x3C, 0x4F,
      0x93, 0xEF, 0x88, 0x70, 0x1E, 0x01, 0xE0, 0x1E, 0x1C, 0x3C, 0x0F,
      0x1E, 0x3E, 0xBE, 0x79, 0x1F, 0x27, 0xDF, 0x10, 0xF0, 0x1E, 0x01,
      0xE0, 0x3E, 0x3C, 0x3E, 0x1E, 0x3D, 0x7D, 0x78, 0xF8, 0x3E, 0x9F,
      0x3E, 0x20, 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x38, 0x1F, 0x3C, 0x78,
      0x7A, 0xF9, 0xF0, 0x7C, 0x3E, 0x3C, 0x40, 0xF0, 0x07, 0x81, 0xE0,
      0x7C, 0x79, 0xCF, 0x3D, 0xFD, 0xF5, 0xE3, 0xC1, 0xFC, 0x7C, 0xF9,
      0x3C, 0xE0, 0x07, 0xE1, 0xE1, 0xF0, 0x73, 0xFE, 0x3D, 0xF9, 0xF9,
      0xF9, 0xE1, 0xF8, 0x7C, 0x3C, 0x3F, 0xC0, 0x03, 0xF9, 0xE7, 0xE0,
      0xF1, 0xFC, 0x38, 0xE0, 0x60, 0x60, 0x60, 0x20, 0x10, 0x00, 0x0F,
      0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xF0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
      0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0x81, 0xFF,
      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
      0x00, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
      };


//Crea un objeto de tipo SSD1306AsciiWire y nombre oled
SSD1306AsciiWire oled;


void setup() {

  Wire.begin();
  Wire.setClock(400000L);

#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0

}

void loop() {

   for( byte c = 128; c > 0; c-- ){
   //byte r = 0; // Start row - Modify as needed
   //int a = 0; // Position in array - Don't change
   //for (byte b = 0; b < 8; b++) {
     
     for (byte i = 0; i < 64; i++) {
      oled.setCursor (c,i);
       oled.ssd1306WriteRam(pgm_read_byte(&Logo[a]));
       a++;
      }  
    }
  }
//}

































 

No hay comentarios: