Archivi categoria: tutorial

Esercizio Arduino in 60 minuti – usare un display OLED

Avevo fatto una promessa ad un amico per un progetto ed ora è arrivato il tempo… 🙂

Qualche tempo fa feci una serie di acquisti elettronici da utilizzare in sperimentazioni che sto conducendo in queste settimane, tra questi un piccolo display OLED da utilizzare per dare espressione ad un piccolo robot didattico di cui sto progettando la struttura da stampare in 3D.
Come sempre questo breve articolo oltre ad essere un tutorial per quanti lo vorranno utilizzare, sarà la mia nota su cui svolgere lezioni con gli allievi.

Ciò che utilizzo è un piccolo display da 0,96 pollici OLED con risoluzione di 128×64 pixel, monocromatico bianco e quindi dalle dimensioni contenutissime solo 2.7 x 2.8 cm che utilizza il protocollo SPI, interessantissimo l’angolo di visione che è maggiore di di 160°. Acquistato su banggood ad un prezzo estremamente contenuto. Fate attenzione che le immagini riportate differiscono leggermente dal prodotto che vi verrà consegnato.
Le dimensioni del display sono tali che lo rendono ad esempio particolarmente adatto per realizzare ad orologi da polso, piccoli dispositivi medici elettronici, o sistemi wearable.
Per ora mostrerò come visualizzare caratteri e immagini, lascerò a voi gli ulteriori sviluppi.

Il driver che pilota il display è un SSD1306, tensione di alimentazione dai 3,3V ai 6V circa.
Il pilotaggio avviene utilizzando solo due pin I/O

oled

oled01

Ma cosa è il protocollo SPI?

Come probabilmente saprete per rendere semplice il trasferimento di informazioni tra sensori e microcontrollori sono stati realizzati due tipologie di protocolli: I2C (Inter-Integrated Circuit) e SPI (Serial Peripheral Interface). Le librerie di arduinio permettono di utilizzare questi protocolli con estrema facilità.
In fase progettuale la scelta del protocollo dipende dal tipo di dispositivo che si vuole utilizzare. Sicuramente potrete trovare in commercio dispositivi che permettono di utilizzare entrambi i protocolli ma è più comune trovare dispositivi che supportano un solo standard.

Non mi dilungherò in questa fase sui pregi e difetti dell’uno o dell’altro protocollo, sarà oggetto di un futuro articolo (già in cantiere) vi dico solamente che il vantaggio principale di I2C e che richiede solamente due linee, una di clock e una linea unica per i dati utilizzata sia come input che come output, per tutti i dispositivi I2C collegati al microcontrollore in cascata, quindi solo due linee a cui collegherete tutti i dispositivi I2C, però la velocità di trasmissione dei dati è inferiore a quella del protocollo SPI, nell’I2C i dati possono viaggiare solo in una direzione alla volta, ciò che non accade nell’SPI.
Nell’SPI i dati possono viaggiare ad una velocità maggiore le linee di input e di output sono separate per cui potrete inviare e ricevere dati contemporaneamente, per contro l’utilizzo di dispositivi SPI richiede una linea di connessione in più che permette di selezionare da parte del master SPI, nel nostro caso Arduino, il dispositivo che si desidera utilizzare.

Vedremo più avanti, con specifici tutorial, la differenza precisa tra questi due protocolli di comunicazione.

SPI dispone di due linee separate per l’input identificata con la sigla MOSI e per l’output identificata con la sigla MISO ed una linea per il clock. A queste tre linee vengono collegati uno o più slave e questi vengono selezionati dal master SPI attraverso la linea Slave Select (SS). Il disegno che segue chiarisce meglio quanto appena detto.

collegamenti-master-slave-spi

Partiamo con la sperimentazione

Schema di collegamento

schema-collegamento01

schema-collegamento02

schema-collegamento03

la corrispondenza di collegamento display -> Arduino è la seguente:

GND -> GND
Vcc -> 3.3V
MOSI -> 11
CLK -> 12
DC -> 9
CS -> 8

Passo 1

E’ indispensabile effettuare il download della libreria da GitHub della libreria Adafruit_SSD1306, fate click sul pulsante “Download ZIP”

github01

Nella pagina di riferimento, su GitHub trovate il link alla libreria Adafruit-GFX che deve essere anch’essa prelevata, anche in questo caso click su “Download Zip” per scaricare la libreria

Nella pagina di riferimento della libreria GFX trovate due risorse utili per la conversione di un immagine BMP in codice esadecimale, saranno utilizzeremo durante questo tutorial.

github02

Passo 2

Rinominiamo le librerie:

Adafruit_SSD1306-master -> Adafruit_SSD1306
Adafruit-GFX-Library-master -> Adafruit-GFX-Library

librerie01

librerie02

Passo 3

Spostiamo le librerie nella cartella “libraries” di Arduino e riavviamo l’IDE

librerie03

Se non ricordate dove è allocata la vostra libraries di Arduino, aprite l’IDE: File -> Preferences
Il percorso della cartella in cui sono memorizzati i vostri sketch è indicata in “Sketchbook location” in essa troverete anche la cartella libraries

librerie04

librerie05

Passo 4

Nella cartella Adafruit_SSD1306 trovate la cartella examples

librerie06

Passo 5

Selezionate l’esempio corrispondente al vostro display, nel mio caso ssd1306_128x64_spi

Il codice che segue vi permetterà di visualizzare a centro display il testo “Salve mondo”:

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

// visualizzazione di un testo su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);

  // cancelliamo lo schermo
  display.clearDisplay();

  // impostiamo il colore a bianco (in questo tipo di dsiplay possimo impostare solo bianco e nero)
  display.setTextColor(WHITE);

  // fissiamo la dimensione del testo
  display.setTextSize(1);

  // posizioniamo il cursore nella posizione x: 35; y: 32
  display.setCursor(32,32);

  // stampiamo su display il messaggio
  display.print("Salve mondo");

  // abilitiamo il display alla visualizzazione
  display.display();
}


void loop() {
// loop vuoto
}

Passo 6

Vediamo ora come muovere un testo sullo schermo, faremo oscillare il testo “Salve mondo” dall’alto verso il basso”

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

// visualizzazione di un testo in movimento su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);

  // cancelliamo lo schermo
  display.clearDisplay();

  // impostiamo il colore a bianco (in questo tipo di dsiplay possimo impostare solo bianco e nero)
  display.setTextColor(WHITE);

  // fissiamo la dimensione del testo
  display.setTextSize(1);
}


void loop() {
  // movimento verso il basso
  for (int i = 0; i < 56; i++) {
    // incrementiamo la coordinata i (coordinata y)
    // fino a quando i < 56
    // Viene fissata la coordinata x
    // per far scorrere il testo sulla stessa colonna

    display.setCursor(32, i);
    display.print("Salve mondo");
    display.display();
    display.clearDisplay();
  }
  // movimento verso l'alto
  for (int i = 56; i > 0; i--) {
    // decrementiamo la coordinata i (coordinata y)
    // fino a quando i > 0
    // Viene fissata la coordinata x
    // per far scorrere il testo sulla stessa colonna

    display.setCursor(32, i);
    display.print("Salve mondo");
    display.display();
    display.clearDisplay();
  }
}

Come specificato nei commenti per consentire il movimento sulla verticale incrementiamo e decrementiamo la coordinata y della funzione display.setCursor(x, y);

Passo 7

Vediamo ora come visualizzare un’immagine sul display.
Per effettuare questa conversione, come detto in precedenza è necessario convertire un’immagine bitmap in un array di codici esadecimali che verranno inseriti come matrice all’interno dello sketch Arduino, questo tipo di conversione potete effettuarla in diversi modi, per gli utenti Windows esiste l’utilissimo programma: LCD Assistant che vi permetterà di convertire immagini adatte per un gran numero di tipi di display.
Il programma genera un file che può essere utilizzato con qualsiasi compilatore C per AVR, ARM, PIC, 8051 e molti altri.

Poiché sono utente Mac ho utilizzato l’applicazione Java Img2Code che trovate seguendo il link da cui avete prelevato Adafruit-GFX-Library

Al fondo della pagina trovate il link al programma java Img2Code
(Per chi volesse provate trovate sempre nella stessa pagina trovate un link ad un plug-in di GIMP)

scaricate sul vostro computer e fate doppio click su: Image2Code.jar

image2code

Create la vostra immagine, che ovviamente deve essere di dimensione non superiore a 128×64

faccina-uno

Dal programma Image2Code.jar click sul pulsante “Choose file”

image2code02

image2code03

image2code04

image2code05

Selezionate il codice esadecimale generato e inseritelo all’interno dell’array a cui abbiamo dato il nome faccinaUno così come potete visualizzare nel codice

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

// visualizzazione di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xc0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfe,0x0,0x0,0x3f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaUno, 128, 64, WHITE);

  // attiviamo il display
  display.display();
}

Passo 8

Nell’esempio ho utilizzato una immagine di dimensioni 128×64 ma ovviamente avrei potuto utilizzare immagini più piccole, come mostrato nel codice seguente in cui utilizzo il bitmap di dimensioni 48×48 px:

faccina-uno

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

// visualizzazione di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0xff,0xff,0xff,0xff,0x0,
0x1,0xff,0xff,0xff,0xff,0x80,
0x3,0xff,0xff,0xff,0xff,0xc0,
0x7,0xff,0x3f,0xfc,0xff,0xc0,
0x7,0xfe,0x1f,0xf8,0x7f,0xe0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x3f,0xfc,0xf,0xf0,0x3f,0xfc,
0x3f,0xfe,0x1f,0xf8,0x7f,0xfc,
0x3f,0xff,0x3f,0xfc,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xe7,0xff,0xff,0xe7,0xfc,
0x3f,0xcf,0xff,0xff,0xf3,0xfc,
0x3f,0x9f,0xff,0xff,0xf9,0xfc,
0x1e,0xf,0xff,0xff,0xf0,0x78,
0x1f,0xcf,0xff,0xff,0xf3,0xf8,
0x1f,0xe7,0xff,0xff,0xe7,0xf8,
0xf,0xf3,0xff,0xff,0xcf,0xf0,
0xf,0xf9,0xff,0xff,0x9f,0xf0,
0x7,0xfc,0x7f,0xfe,0x1f,0xe0,
0x3,0xfe,0x1f,0xf8,0x7f,0xc0,
0x3,0xff,0x0,0x0,0xff,0xc0,
0x1,0xff,0xc0,0x3,0xff,0x80,
0x0,0xff,0xfc,0x3f,0xff,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (40,8) impostando il colore a bianco
  display.drawBitmap(40, 8, faccinaUno, 48, 48, WHITE);

  // attiviamo il display
  display.display();
}

Passo 9

Vediamo ora come visualizzare in sequenza tre immagini differenti.
Il procedimento è molto semplice, e sufficiente inserire gli array corrispondenti al bitmap che si intendono utilizzare.
Nell’esempio che segue ho utilizzato tre immagini:

faccina-uno

faccina-due

faccina-tre

Ho utilizzato i tre array con nome: faccinaUno, faccinaDue, faccinaTre

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

// visualizzazione tre bitmap in sequenza su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI  11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xc0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfe,0x0,0x0,0x3f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const unsigned char PROGMEM faccinaDue [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0x80,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0xc0,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf0,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xfe,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0x80,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xc0,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7e,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0xe0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xfe,0x0,0x0,0x3f,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const unsigned char PROGMEM faccinaTre [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xe0,0x0,0x0,0x3,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xc0,0x1,0xff,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xff,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaUno, 128, 64, WHITE);

  // attiviamo il display
  display.display();

  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);

  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaDue nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaDue, 128, 64, WHITE);
  display.display();

  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);

  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaTre nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaTre, 128, 64, WHITE);
  display.display();

  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);
}

Passo 10

Vediamo ora come muovere un’immagine su schermo, utilizzeremo una tecnica simile a quanto visto nel secondo sketch di questo tutorial.
Muoviamo da sinistra verso destra l’immagine:

faccina-uno

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

// movimento di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI  11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0xff,0xff,0xff,0xff,0x0,
0x1,0xff,0xff,0xff,0xff,0x80,
0x3,0xff,0xff,0xff,0xff,0xc0,
0x7,0xff,0x3f,0xfc,0xff,0xc0,
0x7,0xfe,0x1f,0xf8,0x7f,0xe0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x3f,0xfc,0xf,0xf0,0x3f,0xfc,
0x3f,0xfe,0x1f,0xf8,0x7f,0xfc,
0x3f,0xff,0x3f,0xfc,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xe7,0xff,0xff,0xe7,0xfc,
0x3f,0xcf,0xff,0xff,0xf3,0xfc,
0x3f,0x9f,0xff,0xff,0xf9,0xfc,
0x1e,0xf,0xff,0xff,0xf0,0x78,
0x1f,0xcf,0xff,0xff,0xf3,0xf8,
0x1f,0xe7,0xff,0xff,0xe7,0xf8,
0xf,0xf3,0xff,0xff,0xcf,0xf0,
0xf,0xf9,0xff,0xff,0x9f,0xf0,
0x7,0xfc,0x7f,0xfe,0x1f,0xe0,
0x3,0xfe,0x1f,0xf8,0x7f,0xc0,
0x3,0xff,0x0,0x0,0xff,0xc0,
0x1,0xff,0xc0,0x3,0xff,0x80,
0x0,0xff,0xfc,0x3f,0xff,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

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

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // partendo dalla posizione (0,8) spostiamo da sinistra verso destra
  // l'immagine di dimensione 48x48 px con nome: faccinaUno fino alla coordinata (48,8)

  // movimento da SX a DX
  for (int i = 0; i < 80; i++){
    display.drawBitmap(i, 8, faccinaUno, 48, 48, WHITE);
    // attiviamo il display
    display.display();
    // cancelliamo lo schermo
    display.clearDisplay();
  }

  // movimento da DX a SX
  for (int i = 80; i > 0 ; i--){
    display.drawBitmap(i, 8, faccinaUno, 48, 48, WHITE);
    // attiviamo il display
    display.display();
    // cancelliamo lo schermo
    display.clearDisplay();
  }
}

Grazie per aver sperimentato insieme a me 🙂

Le slide del corso: Insegnare a progettare il proprio apprendimento

Oggi dalle ore 15 alle ore 17 sarò presso L’unità territoriale di servizi professionali per i docenti Necessità Educative Speciali di Torino, presso l’ITSSE “Carlo Levi – Vera e Libera Arduino”, presso la sede “Vera e Libera Arduino”.

Sarò relatore del corso:

Insegnare a progettare il proprio apprendimento. Migliorare le competenze matematiche e logiche degli allievi con la programmazione (workshop in laboratorio)

La seguente presentazione nasce dal mio contributo al “69° carnevale della matematica” con tema: “Macchine matematiche antiche e moderne” e si sviluppa con ulteriori contributi.

Il mio intervento si è concentrato su esempi pratici, sperimentati durante le mie lezioni, in cui espongo suggerimenti ed idee su come insegnare ai bambini e agli adolescenti a programmare questa “macchina matematica” (il computer), in modo che possano da grandi imparare a programmare “macchine matematiche” più complesse.

Il metodo adottato per lo svolgimento delle lezioni è assolutamente sperimentale, e queste slide condurranno il lettore a provare alcuni software e giochi di facile utilizzo che potrebbero essere utilizzati in un percorso di informatica nella scuola elementare e media e nel biennio della scuola superiore.

Le slide del corso:

Documentare con Read the Docs

readthedocs

Ho sempre pensato che una delle azioni più importanti dell’insegnante sia quella del documentare l’azione didattica. Mi è capitato spessissimo incontrare in questi anni colleghi bravissimi che avevano escogitato tecniche didattiche o realizzato appunti personali che potevano essere sostituiti ai libri di testo, perché questi erano diventati gli argomenti di reale necessità dell’allievo, appunti che nel tempo si arricchivano delle esperienze di altri. Il peggio arriva quando giunti alla pensione molti portano con se appunti ed esperienza ed ogni cosa cade nell’oblio… nessuna documentazione nessuna esperienza tramandata…

Ma come documentare in modo agevole, elegante, usabile, veloce?

Non so darvi la giusta soluzione, certo è che i primi due passi in ogni azione lavorativa, sono:

  1. progettare il modo di documentare;
  2. documentare;

fatto ciò gli anni di lavoro che verranno saranno più semplici.

Le soluzioni possono essere tantissime, da un semplice blog in WordPress come questo, ad un Wiki, oppure, anche se un po’ più complicato usando un sistema di revisioning che conserva anche lo storico di tutte le modifiche effettuate.

Un po’ per curiosità ed un po’ per necessità sto analizzando Read the Docs, un servizio gratuito che vi permette di creare e ospitare la vostra documentazione, in modo che l’azione del costruire e ricercare sia molto semplice.
Potete importare i vostri documenti utilizzando qualsiasi sistema di controllo di versione inclusi: Mercurial, Git, Subversion e Bazaar. Supporta i webhooks ed è inoltre possibile avere anche un controllo sulla versione.

Vedremo se questa sarà la soluzione, in ogni caso il messaggio ai miei studenti è: “sforzarsi il più possibile di rendere l’azione del documentare un azione costante, un’abitudine, una fase necessaria proprio lavoro“.

Insegnare ad imparare per diventare abili programmatori con Scratch (workshop svolto nel laboratorio di informatica).

scratch

Il CTS (Centro Territoriale di Supporto) Nuove Tecnologie e Disabilità di Torino e Provincia organizza un ciclo di tre seminari a tema, denominato “Sabati al CTS”.
L’iniziativa si propone la finalità di far conoscere le attività di altri CTS del Piemonte, i loro referenti e di trattare argomenti legati alle tecnologie, ai Bisogni Educativi Speciali e all’inclusione.

Gli incontri si svolgeranno all’ITSSE Levi – Arduino, sede via Figlie dei Militari 25, dalle 9.30 alle 12.30.

Nel secondo seminario organizzato dal CTS, che sarà svolto il  29 marzo 2014, sarò relatore con il seguente argomento:

Insegnare ad imparare per diventare abili programmatori con Scratch.

L’incontro, che verrà svolto il laboratorio di informatica, ha come obiettivo quello di fornire le competenze necessarie per introdurre all’uso di scratch fornendo all’insegnante o al genitore le nozioni di base per affrontare una possibile progettazione da utilizzare per la migliorare le competenze logico/matematiche dello studente.

  • Durante il corso: esercizi, esempi pratici e suggerimenti da applicare con gli studenti.
  • L’iscrizione al corso può essere fatta esclusivamente on-line al seguente link.
  • Il corso è indirizzato a tutti gli insegnanti di ogni ordine e grado, agli educatori e ai genitori.
  • Termine delle iscrizioni: 10 febbraio 2014.
  • Al corso saranno ammessi al massimo 30 persone e la selezione sarà fatta in base all’ordine di arrivo delle domande.

Registrazione domini gov.it – variazione sito

Come evidenziato oggi durante l’ultima lezione svolta ai DSGA neo immessi in ruolo, durante la descrizione della modalità di registrazione dei domini gov.it, l’indirizzo http://www.digitpa.gov.it è stato soppresso, sostituito dal seguente: http://www.agid.gov.it.

Dal sito:

Ai sensi del decreto legge n. 83/2012, convertito in legge n. 134/2012, l’ente DigitPA è stato soppresso ed è stata istituita
l’Agenzia per l’Italia digitale.

Il sito dell’Agenzia per l’Italia digitale è visibile all’indirizzo:
http://www.agid.gov.it

Il sito di archivio di DigitPA è visibile all’indirizzo:
http://archivio.digitpa.gov.it

La struttura del sito e i passi da effettuare per la registrazione del dominio gov.it differiscono leggermente da quanto indicato nelle mie slide. Di seguito i passi necessari per il raggiungimento della sezione:

gov-it-01

gov-it-02

gov-it-03

Questa variazione viene aggiunta anche alla pagina dedicata del corso.