Questo è un esempio per l’utilizzo della Multimedia Board (mmb) con i display oled I2C SSD1306 che trovi come sempre sul repository su GitHub.

Maggiori informazioni sulla connessione della mmb con i display le trovi qui

Anche in questo caso l’esempio può essere riprodotto e/o modificato anche su una classica breadboard in mancanza di una mmb.


Per iniziare ad utilizzare gli esempi, è necessario clonare in locale il repository . Informazioni dettagliate su come clonare un repository remoto le trovi nell’apposito articolo.

Andiamo ad analizzare come sempre prima la configurazione su platformio.ini e poi il sorgente.

Per utilizzare i display oled SSD1306 facciamo affidamento alla libreria Adafruit_SSD1306, che a sua volta dipende dalla libreria BusIO. Le andiamo quindi ad includere tra le dipendenze.

Dobbiamo inoltre adattare alcune variabili che troviamo sotto build_flags. I display SSD1306 solitamente hanno un formato di 128x64px oppure 128x32px. L’indirizzo I2C solitamente è 0x3C e non è necessario cambiarlo. Ma se qualcosa non dovesse funzionare, probabilmente il problema è quello, e devi trovare l’indirizzo I2C del tuo display :wink: Se stai usando una mmb i pin SDA ed SCL sono il 15 ed il 13.

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed  = 921600
monitor_filters = esp32_exception_decoder
lib_deps      =     https://github.com/adafruit/Adafruit_SSD1306
                    https://github.com/adafruit/Adafruit_BusIO
build_flags = 
        -D SCREEN_WIDTH=128
        -D SCREEN_HEIGHT=32
        -D SCREEN_ADDRESS=0x3C
        -D SCREEN_SDA=15
        -D SCREEN_SCL=13

Di seguito trovi il sorgente completo dell’esempio.

Includiamo ed inizializziamo le librerie, definiamo un logo 32x32px che abbiamo precedentemente convertito. Nel setup() utilizziamo delle semplici funzioni per visualizzare il logo e del testo.

NB: Un tool online che trovo utilissimo per convertire le immagini in codice cpp pronto è image2cpp.

#include <Arduino.h>

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

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define LOGO_HEIGHT   32
#define LOGO_WIDTH    32
static const unsigned char PROGMEM logo_bmp[] =
  { 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 
	0xf8, 0xff, 0xff, 0x1f, 0xf3, 0xff, 0xff, 0xcf, 0xe7, 0xff, 0xff, 0xe7, 0xe7, 0xff, 0xff, 0xe7, 
	0xcf, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xfb, 0x9f, 0x3f, 0xff, 0xf9, 0x9f, 0x3f, 0xff, 0xf9, 
	0xbf, 0x3f, 0xff, 0xfd, 0xb8, 0x07, 0xe0, 0x1d, 0xbf, 0x3f, 0xff, 0xfd, 0x3f, 0x3f, 0xff, 0xfc, 
	0x3f, 0x3f, 0xff, 0xfc, 0xbf, 0xbf, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xfd, 
	0x9f, 0xf8, 0x1f, 0xf9, 0x9e, 0xf0, 0x0f, 0x79, 0xde, 0x00, 0x00, 0x7b, 0xcf, 0x00, 0x00, 0xf3, 
	0xe7, 0x01, 0x80, 0xe7, 0xe7, 0xc3, 0xc3, 0xe7, 0xf3, 0xff, 0xff, 0xcf, 0xf8, 0xff, 0xff, 0x1f, 
	0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xfe, 0x7f, 0xff };


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

  Wire.begin(SCREEN_SDA, SCREEN_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  display.clearDisplay();

  display.drawBitmap(0, 0, logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();

  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(WHITE);        // Draw white text
  display.setCursor(35,5);             // Start at top-left corner
  display.println(F("ZioTester Lab"));
  display.setCursor(35,15);             // Start at top-left corner
  display.println(F("I2C Oled"));
  display.setCursor(35,25);             // Start at top-left corner
  display.println(F("example"));
  display.display();

}

void loop() {}