LCD oled 1.3» I2C 128×64

Este pequeño LCD de 128×64 pixels es ideal para pequeños proyectos wifi con el ESP8266, ocupa poco espacio, funciona a 3.3v (y también a 5v) y es luminoso y con inmejorable definición. Lo he encontrado con una diversidad de precios inmensa, por lo que es recomendable buscar un poco y vigilar que la conexión sea I2C y que el chip de control sea el SSH1106. Este chip tiene una biblioteca para el ESP con grandes posibilidades.

Generador de fuentes

La biblioteca, esp8266-oled-ssd1306, vale tanto para los chips SSH1106 como para los SSD1306. Esta biblioteca además nos permite diseñar nuestra propias fuentes online, para después añadirlas al proyecto a través de un fichero de cabecera .h

El fichero de cabecera que crea el generador de fuentes es erróneo, corresponde a las versiones 3.x de la librería. Hay que cambiar const char por const uint8_t en la definición de la matriz.

Las fuentes ocupan una enorme cantidad de memoria, por lo que conviene reducir su uso. Una práctica recomendable es editar el fichero de cabecera que nos da la aplicación para reducirlo exactamente al número de caracteres que vamos a necesitar:

// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t  Lato_Heavy_40[] PROGMEM = {
  0x2A, // Width: 42
  0x31, // Height: 49
  0x20, // First Char: 32
  // del 32 al 58 incluye espacio ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 :
  0x1B, // Numbers of Chars: 27 
  //0xE0, // Numbers of Chars: 224

  // Jump Table:
  0xFF, 0xFF, 0x00, 0x0A,  // 32:65535
  0x00, 0x00, 0x3D, 0x0B,  // 33:0
  ...
  0x0C, 0x2D, 0x36, 0x0A,  // 58:3117
  /*
  0x0C, 0x63, 0x3D, 0x0B,  // 59:3171
  ...
  */

  // Font Data:
  0x00,0x00,0x00,0x00,0x00,
  ...
  ... 1,0x78,  // 58
  /*
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  ...
  */
};

Generador de imágenes X Bitmap

Es posible diseñar nuestra propias imágenes, a la resolución adecuada a nuestro LCD (en este caso como máximo 128×64 px), en formato XBM, a dos colores BN, y visualizarlas en cualquier parte de la pantalla.

Hay una descripción detallada (aunque algo obsoleta en cuanto a herramientas gráficas) en https://sandhansblog.wordpress.com/2017/04/16/interfacing-displaying-a-custom-graphic-on-an-0-96-i2c-oled/.

Una vez generado incorporamos su contenido en una fichero de cabecera .h y lo importamos a nuestro scketch.

Las conexiones

[supsystic-tables id=3 ]

La librería y el scketch básico

Todas las funciones: https://github.com/ThingPulse/esp8266-oled-ssd1306

#include "SH1106Wire.h"
#include "fuente_grande.h" // fuente personalizada

// Initialize the OLED display using Wire library
// D3 -> SDA
// D5 -> SCL
SH1106Wire display(0x3c, D3, D5);

void setup() {
  // Initialising the UI will init the display too.
  display.init();
  display.flipScreenVertically();
}

void texto() {
  // clear the display
  display.clear();
  // Specifies relative to which anchor point
  // the text is rendered. Available constants:
  // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  // Sets the current font. Available default fonts
  // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24
  // Or create one with the font tool at http://oleddisplay.squix.ch
  //display.setFont(ArialMT_Plain_24);
  display.setFont(Lato_Heavy_40);
  // OLED 128x64 Las coordenadas corresponde a la esquina superior izquierda
  display.drawString(64, -5, "22.3");
  // x, y, longitud
  //display.drawHorizontalLine(0, 42, 128);
  display.drawRect(0, 43, 128, 21);
  display.setFont(ArialMT_Plain_16);
  display.drawString(64, 44, "Ext: -22.3/100%");
}

void loop() {
  texto();
  // write the buffer to the display
  display.display();
}