Continuo la lezione cominciata la scorsa settimana con i miei studenti di 5A Automazione dell’ITIS G.B. Pininfarina di Moncalieri in merito alla gestione degli input mediante pulsanti e segnalazione stato LED sulla Serial Monitor, questa volta utilizzeremo come sistema di output un Display 16×2 con modulo I2C.
Rispetto all’esercizio svolto nella precedente lezione questa volta utilizzeremo 3 pulsanti la cui pressione provocherà l’accensione rispettivamente di un LED Rosso un LED Verde ed un LED Giallo.
L’esercizio è suddiviso in due parti, la prima parte prevede che l’accensione dei LED avvenga premendo il pulsante ad esso associato, il rilascio provoca lo spegnimento del LED. Lo stato del LED dovrà essere segnalato con il testo ON oppure OFF e nel momento in cui lo stato risulta ON a fianco del testo ON dovrà comparire una sequenza di caratteri che simula la rotazione di un’elica, così come evidenziato dalle immagini che seguono.
Le lettere R, V, G indicano rispettivamente il colore: Rosso, Verde, Giallo dei LED la cui accensione è comandata da un pulsante NO.
La seconda parte dell’esercizio consiste nella realizzazione di uno sketch che permette il mantenimento dello stato ON oppure OFF anche al rilascio del pulsante, il cambiamento di stato avviene nella successiva pressione del pulsante.
Il funzionamento degli sketch è spiegato mediante commenti all’interno del codice.
Parte 1
/*
Prof. Michele Maffucci
Accensione e spegnimento led con segnalazione su Display LCD I2C
30.09.19
Accensione e spegnimento di LED mediante pulsanti
con antirimbalzo e messaggio ripetuto dello stato del LED
sul Display
Pulsante Rosso: accensione e spegnimento LED Rosso
(prima pressione accende, seconda pressione spegne)
Pulsante Verde: accensione e spegnimento LED Verde
(prima pressione accende, seconda pressione spegne)
Pulsante Giallo: accensione e spegnimento LED Giallo
(prima pressione accende, seconda pressione spegne)
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ledRosso variabile di tipo intero a cui viene assegnato
// il valore intero 2 che sarà associato al pin digitale 2
int ledRosso = 2;
// ledVerde variabile di tipo intero a cui viene assegnato
// il valore intero 3 che sarà associato al pin digitale 3
int ledVerde = 3;
// ledGiallo variabile di tipo intero a cui viene assegnato
// il valore intero 4 che sarà associato al pin digitale 4
int ledGiallo = 4;
// pulsanteRosso variabile di tipo intero a cui viene assegnato
// il valore intero 10 che sarà associato al pin digitale 10
// a cui sarà collegato il pulsante che comanda il LED Rosso
int pulsanteRosso = 10;
// pulsanteVerde variabile di tipo intero a cui viene assegnato
// il valore intero 11 che sarà associato al pin digitale 11
// a cui sarà collegato il pulsante che comanda il LED Verde
int pulsanteVerde = 11;
// pulsanteGiallo variabile di tipo intero a cui viene assegnato
// il valore intero 12 che sarà associato al pin digitale 12
// a cui sarà collegato il pulsante che comanda il LED Giallo
int pulsanteGiallo = 12;
// inizializzazione della variabili in cui verrà memorizzato il valore della
// digitalRead: 0 non premuto, 1 premuto
int valRosso = 0;
int valVerde = 0;
int valGiallo = 0;
// inizializzazione della libreria in cui è descritta la modalità di utilizzo dei pin
LiquidCrystal_I2C lcd(0x27, 16, 2); // impostazione dell'indirizzo dell'LCD 0x27 di 16 caratteri e 2 linee
//-----------------------------
void setup()
{
lcd.begin(); // inizializzazione dell'LCD
lcd.backlight(); // attivazione della retroilluminazione
// imposta i pin digitali a cui sono collegati i LED ad OUTPUT
pinMode(ledRosso, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledGiallo, OUTPUT);
// imposta i pin digitali a cui sono collegati i pulsanti ad OUTPUT
pinMode(pulsanteRosso, INPUT);
pinMode(pulsanteVerde, INPUT);
pinMode(pulsanteGiallo, INPUT);
// messaggio di Avvio visualizzato una sola volta
lcd.setCursor(0, 0); // posiziona curasore in colonna 0 e riga 0
lcd.print("Ciao"); // stampa del testo su display
lcd.setCursor(0, 1); // posiziona curasore in colonna 0 e riga 1
lcd.print("Comando LED"); // stampa del testo su display
delay(2000); // pausa di 2 secondi
lcd.clear(); // cancella il contenuto del display
}
//-----------------------------
void loop()
{
valRosso = digitalRead(pulsanteRosso); // lettura dell'input (pulsante) e memorizzazione in valRosso
valVerde = digitalRead(pulsanteVerde); // lettura dell'input (pulsante) e memorizzazione in valVerde
valGiallo = digitalRead(pulsanteGiallo); // lettura dell'input (pulsante) e memorizzazione in valGiallo
// ---------- Controllo pulsante LED Rosso ----------
/* Se il pulsante viene premuto viene acceso il LED rosso
* posizionato il cursore in colonna 0 riga 0
* stampato il testo: R: ON
* avviata l'animazione
*/
if (valRosso == HIGH) {
digitalWrite(ledRosso, HIGH);
lcd.setCursor(0, 0);
lcd.print("R: ON ");
animazione(6,0);
}
/* Se il pulsante NON viene premuto viene spento il LED rosso
* posizionato il cursore in colonna 0 riga 0
* stampato il testo: R: OFF
* interrotta l'animazione
*/
else {
digitalWrite(ledRosso, LOW);
lcd.setCursor(0, 0);
lcd.print("R: OFF ");
}
// ---------- Controllo pulsante LED Verde ----------
/* Se il pulsante viene premuto viene acceso il LED verde
* posizionato il cursore in colonna 0 riga 1
* stampato il testo: V: ON
* avviata l'animazione
*/
if (valVerde == HIGH) {
digitalWrite(ledVerde, HIGH);
lcd.setCursor(9, 0);
lcd.print("V: ON ");
animazione(15,0);
}
/* Se il pulsante NON viene premuto viene spento il LED verde
* posizionato il cursore in colonna 0 riga 1
* stampato il testo: V: OFF
* interrotta l'animazione
*/
else {
digitalWrite(ledVerde, LOW);
lcd.setCursor(9, 0);
lcd.print("V: OFF ");
}
// ---------- Controllo pulsante LED Giallo ----------
/* Se il pulsante viene premuto viene acceso il LED giallo
* posizionato il cursore in colonna 0 riga 1
* stampato il testo: G: ON
* avviata l'animazione
*/
if (valGiallo == HIGH) {
digitalWrite(ledGiallo, HIGH);
lcd.setCursor(0, 1);
lcd.print("G: ON ");
animazione(6,1);
}
/* Se il pulsante NON viene premuto viene spento il LED giallo
* posizionato il cursore in colonna 9 riga 0
* stampato il testo: G: OFF
* interrotta l'animazione
*/
else {
digitalWrite(ledGiallo, LOW);
lcd.setCursor(0, 1);
lcd.print("G: OFF ");
}
}
// Funzione che stampa un cursore che ruota
void animazione(int colonna, int riga) {
lcd.setCursor(colonna, riga);
lcd.print("/");
delay(150);
lcd.setCursor(colonna, riga);
lcd.print("-");
delay(150);
lcd.setCursor(colonna, riga);
lcd.print("|");
delay(150);
lcd.setCursor(colonna, riga);
lcd.print("/");
delay(150);
lcd.setCursor(colonna, riga);
lcd.print("-");
delay(150);
lcd.setCursor(colonna, riga);
lcd.print("|");
delay(150);
}
Parte 2
/*
Prof. Michele Maffucci
Data: 30.09.19
Accensione e spegnimento di LED mediante pulsanti
con antirimbalzo e messaggio NON ripetuto dello stato del LED
sulla su Display LCD I2C
Stampa 1 sola volta il messaggio dello stato del LED Sul Display I2C
(non va in loop la stampa dello stato del LED)
Pulsante Rosso: accensione e spegnimento LED Rosso
(prima pressione accende, seconda pressione spegne)
Pulsante Verde: accensione e spegnimento LED Verde
(prima pressione accende, seconda pressione spegne)
Pulsante Giallo: accensione e spegnimento LED Giallo
(prima pressione accende, seconda pressione spegne)
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ledRosso variabile di tipo intero a cui viene assegnato
// il valore intero 2 che sarà associato al pin digitale 2
int ledRosso = 2;
// ledVerde variabile di tipo intero a cui viene assegnato
// il valore intero 3 che sarà associato al pin digitale 3
int ledVerde = 3;
// ledGiallo variabile di tipo intero a cui viene assegnato
// il valore intero 4 che sarà associato al pin digitale 4
int ledGiallo = 4;
// pulsanteRosso variabile di tipo intero a cui viene assegnato
// il valore intero 10 che sarà associato al pin digitale 10
// a cui sarà collegato il pulsante che comanda il LED Rosso
int pulsanteRosso = 10;
// pulsanteVerde variabile di tipo intero a cui viene assegnato
// il valore intero 11 che sarà associato al pin digitale 11
// a cui sarà collegato il pulsante che comanda il LED Verde
int pulsanteVerde = 11;
// pulsanteGiallo variabile di tipo intero a cui viene assegnato
// il valore intero 12 che sarà associato al pin digitale 12
// a cui sarà collegato il pulsante che comanda il LED Giallo
int pulsanteGiallo = 12;
// inizializzazione della variabili in cui verrà memorizzato il valore della
// digitalRead: 0 non premuto, 1 premuto
int valRosso = 0;
int valVerde = 0;
int valGiallo = 0;
// inizializzazione della variabili in cui verrà memorizzato lo stato del pulsante
// All'avvio dello sketch i pulsanti non sono premuti
int statoRosso = 0;
int statoVerde = 0;
int statoGiallo = 0;
// inizializzazione della variabili in cui verrà memorizzato lo stato precedente del pulsante
// All'avvio dello sketch i pulsanti non sono premuti
int valRossoOld = 0;
int valVerdeOld = 0;
int valGialloOld = 0;
// inizializzazione delle variabili che consentono la stampa dello stato del LED
int stampoRossoON = 0;
int stampoRossoOFF = 0;
int stampoVerdeON = 0;
int stampoVerdeOFF = 0;
int stampoGialloON = 0;
int stampoGialloOFF = 0;
// inizializzazione della libreria in cui è descritta la modalità di utilizzo dei pin
LiquidCrystal_I2C lcd(0x27, 16, 2); // impostazione dell'indirizzo dell'LCD 0x27 di 16 caratteri e 2 linee
//-----------------------------
void setup()
{
lcd.begin(); // inizializzazione dell'LCD
lcd.backlight(); // attivazione della retroilluminazione
// imposta i pin digitali a cui sono collegati i LED ad OUTPUT
pinMode(ledRosso, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledGiallo, OUTPUT);
// imposta i pin digitali a cui sono collegati i pulsanti ad OUTPUT
pinMode(pulsanteRosso, INPUT);
pinMode(pulsanteVerde, INPUT);
pinMode(pulsanteGiallo, INPUT);
// messaggio di Avvio visualizzato una sola volta
lcd.setCursor(0, 0); // posiziona curasore in colonna 0 e riga 0
lcd.print("Ciao"); // stampa del testo su display
lcd.setCursor(0, 1); // posiziona curasore in colonna 0 e riga 1
lcd.print("Comando LED"); // stampa del testo su display
delay(2000); // pausa di 2 secondi
lcd.clear(); // cancella il contenuto del display
}
//-----------------------------
void loop()
{
valRosso = digitalRead(pulsanteRosso); // lettura dell'input (pulsante) e memorizzazione in valRosso
valVerde = digitalRead(pulsanteVerde); // lettura dell'input (pulsante) e memorizzazione in valVerde
valGiallo = digitalRead(pulsanteGiallo); // lettura dell'input (pulsante) e memorizzazione in valGiallo
// ---------- Controllo pulsante LED Rosso ----------
// viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED
if ((valRosso == HIGH) && (valRossoOld == LOW)) {
statoRosso = 1 - statoRosso;
// antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi
delay(15);
// poichè il pulsante è stato premuto la variabile stampoRossoON viene posta a 0
// per consentire la stampa del messaggio "LED Rosso ON"
stampoRossoON = 0;
}
// memorizzazione del valore precedente restituito dalla digitalRead
valRossoOld = valRosso;
// ---------- Controllo pulsante LED Verde ----------
// viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED
if ((valVerde == HIGH) && (valVerdeOld == LOW)) {
statoVerde = 1 - statoVerde;
// antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi
delay(15);
// poichè il pulsante è stato premuto la variabile stampoVerdeON viene posta a 0
// per consentire la stampa del messaggio "LED Verde ON"
stampoVerdeON = 0;
}
// memorizzazione del valore precedente restituito dalla digitalRead
valVerdeOld = valVerde;
// ---------- Controllo pulsante LED Giallo ----------
// viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED
if ((valGiallo == HIGH) && (valGialloOld == LOW)) {
statoGiallo = 1 - statoGiallo;
// antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi
delay(15);
// poichè il pulsante è stato premuto la variabile stampoVerdeON viene posta a 0
// per consentire la stampa del messaggio "LED Verde ON"
stampoGialloON = 0;
}
// memorizzazione del valore precedente restituito dalla digitalRead
valGialloOld = valGiallo;
// ---------- Stampa sul display lo stato del LED Rosso ----------
// Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Rosso si accende
if (statoRosso == 1) {
digitalWrite(ledRosso, HIGH);
// Se la variabile stampoRossoON è 0 allora !stampoRossoON vale 1
// ciò consente la stampa del messaggio "LED Rosso ON"
if (!stampoRossoON) {
lcd.setCursor(0, 0);
lcd.print("R: ON ");
// Viene posto a 0 stampoRossoOFF per consentire la stampa "LED Rosso OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Rosso.
stampoRossoOFF = 0;
}
}
// nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
// allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Rosso OFF"
else {
digitalWrite(ledRosso, LOW);
if (!stampoRossoOFF) {
lcd.setCursor(0, 0);
lcd.print("R: OFF");
// Viene posto a 1 stampoRossoOFF per consentire la stampa "LED Rosso OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Rosso.
stampoRossoOFF = 1;
}
}
// ---------- Stampa sul disolay lo stato del LED Verde ----------
// Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende
if (statoVerde == 1) {
digitalWrite(ledVerde, HIGH);
// Se la variabile stampoVerdeON è 0 allora !stampoVerdeoON vale 1
// ciò consente la stampa del messaggio "LED verde ON"
if (!stampoVerdeON) {
lcd.setCursor(7, 0);
lcd.print("V: ON ");
// Viene posto a 0 stampoVerdeOFF per consentire la stampa "LED Verde OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Rosso.
stampoVerdeOFF = 0;
}
}
// nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
// allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Verde OFF"
else {
digitalWrite(ledVerde, LOW);
if (!stampoVerdeOFF) {
lcd.setCursor(7, 0);
lcd.print("V: OFF");
// Viene posto a 1 stampoVerdeOFF per consentire la stampa "LED Verde OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Verde.
stampoVerdeOFF = 1;
}
}
// ---------- Stampa sul disolay lo stato del LED Giallo ----------
// Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende
if (statoGiallo == 1) {
digitalWrite(ledGiallo, HIGH);
// Se la variabile stampoGialloON è 0 allora !stampoGialloON vale 1
// ciò consente la stampa del messaggio "LED giallo ON"
if (!stampoGialloON) {
lcd.setCursor(0, 1);
lcd.print("G: ON ");
// Viene posto a 0 stampoGialloOFF per consentire la stampa "LED Giallo OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Giallo.
stampoGialloOFF = 0;
}
}
// nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto
// allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Giallo OFF"
else {
digitalWrite(ledGiallo, LOW);
if (!stampoGialloOFF) {
lcd.setCursor(0, 1);
lcd.print("G: OFF");
// Viene posto a 1 stampoGialloOFF per consentire la stampa "LED Giallo OFF"
// nel caso si prema nuovamente il pulsante che controlla il LED Giallo.
//stampoGialloON = 0;
}
}
}
Esercizio: utilizzare gli esempi precedenti per realizzare un sistema che consente di avviare ed arrestare 2 ventole, ciascuna comandata da un pulsante. Un terzo pulsante dovrà essere utilizzato come consenso per permettere l’utilizzo del sistema, quindi:
Pulsante Marcia/Arresto ventola 1
Pulsante Marcia/Arresto ventola 2
Pulsante accensione spegnimento sistema
Gli stati dovranno essere indicati mediante LED e con messaggio sul display.
Durante le scorse settimane ho svolto una serie di esercitazioni di laboratorio che avevano l’obiettivo di insegnare l’uso dell’istruzione switch…case e la modalità di ricezione dati seriali in Arduino.
In cui viene mostrato come pilotare un display a 7 segmenti realizzando un contatore da 0 a 9, e cicli di visualizzazione di numeri pari e numeri dispari. Nella parte finale del tutorial viene mostrato come realizzare una libreria dedicata alla gestione del display a 7 segmenti.
La terza lezione mostra come ricevere dati dalla seriale in Arduino.
Per questa parte è indispensabile svolgere le esercitazioni che trovate nelle slide:
Successivamente aggiungo gli esercizi che di seguito condivido, in cui riprendendo la gestione del display a 7 segmenti, però questa volta inviamo dati dal computer mediante la tastiera al display comandato da Arduino.
Per lo svolgimento di questa parte è necessario effettuare una piccola variazione rispetto al circuito mostrato in: Arduino – lezione 08: display a 7 segmenti e creazione di librerie in questa lezione volutamente utilizzo tra tutti i pin il piedino 1 di Arduino che viene utilizzato normalmente come pin TX e ciò provoca un comportamento anomalo di accensione del LED e del display, ciò mi permette di spiegare l’utilizzo dei pin 0 e 1 di Arduino.
Il circuito da realizzare per la terza lezione è il seguente (i pin di controllo di Arduino sono presi in maniera sequenziale dal pin 6 al pin 12)
Esercitazione 1
Realizzare un contasecondi da 0 a 9 utilizzando un display 7 segmenti a catodo comune
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Conteggio 9 secondi con display 7 segmenti a catodo comune
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a=12;
const int b=11;
const int c=10;
const int d=9;
const int e=8;
const int f=7;
const int g=6;
// variabile che definisce la velocità con cui appaiono i numeri
const int pausa = 1000;
void setup()
{
// inizializzazione dei pin ad OUTPUT
for (int i=6; i<13; i++) {
pinMode(i, OUTPUT);
}
}
void loop ()
{
for (int i=0;i<10;i++)
{
LedAcceso(i);
delay (pausa);
}
}
void LedAcceso(int n)
{
switch(n)
{
case 0:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 1:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 2:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 3:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 4:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 5:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 6:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 7:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 8:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 9:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
}
}
Esercitazione 2
Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
La scrittura avviene quando viene premuto l’invio della tastiera.
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviene quando si preme invio.
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
}
void loop()
{
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
void LedAcceso(int n)
{
switch (n)
{
case '0':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
}
}
Esercitazione 3
Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
La scrittura avviene quando viene premuto l’invio della tastiera.
All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
roll();
}
void loop()
{
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
void roll() {
for (int i = 0; i < 6; i++) {
digitalWrite(a, HIGH);
delay(intervallo);
digitalWrite(a, LOW);
delay(intervallo);
digitalWrite(b, HIGH);
delay(intervallo);
digitalWrite(b, LOW);
delay(intervallo);
digitalWrite(c, HIGH);
delay(intervallo);
digitalWrite(c, LOW);
delay(intervallo);
digitalWrite(d, HIGH);
delay(intervallo);
digitalWrite(d, LOW);
delay(intervallo);
digitalWrite(e, HIGH);
delay(intervallo);
digitalWrite(e, LOW);
delay(intervallo);
digitalWrite(f, HIGH);
delay(intervallo);
digitalWrite(f, LOW);
delay(intervallo);
}
}
void LedAcceso(int n)
{
switch (n)
{
case '0':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
}
}
Esercitazione 4
Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
La scrittura avviene quando viene premuto l’invio della tastiera.
All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display
Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
roll();
}
void loop()
{
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
void roll() {
for (int i = 0; i < 6; i++) {
digitalWrite(a, HIGH);
delay(intervallo);
digitalWrite(a, LOW);
delay(intervallo);
digitalWrite(b, HIGH);
delay(intervallo);
digitalWrite(b, LOW);
delay(intervallo);
digitalWrite(c, HIGH);
delay(intervallo);
digitalWrite(c, LOW);
delay(intervallo);
digitalWrite(d, HIGH);
delay(intervallo);
digitalWrite(d, LOW);
delay(intervallo);
digitalWrite(e, HIGH);
delay(intervallo);
digitalWrite(e, LOW);
delay(intervallo);
digitalWrite(f, HIGH);
delay(intervallo);
digitalWrite(f, LOW);
delay(intervallo);
}
}
void LedAcceso(int n)
{
switch (n)
{
case '0':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
default:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
roll();
}
}
Esercitazione 5
Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
La scrittura avviene quando viene premuto l’invio della tastiera.
All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display.
Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci.
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci.
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
roll();
}
void loop()
{
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
void roll() {
// spegnimento di tutti i led del display
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
// ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
for (int i = 0; i < 6; i++) {
digitalWrite(a, HIGH);
delay(intervallo);
digitalWrite(a, LOW);
delay(intervallo);
digitalWrite(b, HIGH);
delay(intervallo);
digitalWrite(b, LOW);
delay(intervallo);
digitalWrite(c, HIGH);
delay(intervallo);
digitalWrite(c, LOW);
delay(intervallo);
digitalWrite(d, HIGH);
delay(intervallo);
digitalWrite(d, LOW);
delay(intervallo);
digitalWrite(e, HIGH);
delay(intervallo);
digitalWrite(e, LOW);
delay(intervallo);
digitalWrite(f, HIGH);
delay(intervallo);
digitalWrite(f, LOW);
delay(intervallo);
}
}
void LedAcceso(int n)
{
switch (n)
{
case '0':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
default:
roll();
}
}
Esercitazione 6
Realizzare le stesse funzionalità dell’esercizio 5 ma ottimizzare la funzione roll() in modo che lo spegnimento iniziale dei LED sia costituito da un ciclo for e l’accensione e lo spegnimento sequenziale sia realizzato da due cicli for annidati.
Soluzione
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci
// Versione in cui la funzione roll() è stata ottimizzata
// Lo spegnimento iniziale dei LED è costituito da un ciclo for e l'accensione e lo spegnimento sequenziale
// è realizzato da due cicli for annidati.
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
roll();
}
void loop()
{
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
// funzione per gioco di luci
void roll() {
// spegnimento di tutti i led del display
for (int i = 6; i < 13; i++) {
digitalWrite(i, LOW);
}
// ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
for (int m = 0; m < 6; m++) {
for (int p = 12; p > 6; p--) {
digitalWrite(p, HIGH);
delay(intervallo);
digitalWrite(p, LOW);
delay(intervallo);
}
}
}
// la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display
// prima che venga stampato il numero viene eseguita la funzione roll()
void LedAcceso(int n)
{
switch (n)
{
case '0':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
default:
roll();
}
}
Esercitazione 7
Realizzare le stesse funzionalità dell’esercizio 6 realizzando una libreria di gestione “LedAcceso.h” richiamata dallo sketch principale. Per l’esecuzione di questo esercizio seguire le indicazioni fornite al fondo del tutorial: Arduino – lezione 08: display a 7 segmenti e creazione di librerie
Soluzione
LedAcceso.cpp
/* display_sette_segmenti.cpp
libreria che consente il controllo di un display a 7 segmenti a catodo comune
del tipo HDSP 5503
*/
#include "Arduino.h"
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
// funzione per gioco di luci
void roll() {
// spegnimento di tutti i led del display
for (int i = 6; i < 13; i++) {
digitalWrite(i, LOW);
}
// ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f
for (int i = 0; i < 6; i++) {
for (int j = 12; j > 6; j--) {
digitalWrite(j, HIGH);
delay(intervallo);
digitalWrite(j, LOW);
delay(intervallo);
}
}
}
// la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display
// prima che venga stampato il numero viene eseguita la funzione roll()
void LedAcceso(int n)
{
switch (n)
{
case '0':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case '1':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '2':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '3':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case '4':
roll();
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '5':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '6':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '7':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case '8':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case '9':
roll();
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
default:
roll();
}
}
LedAcceso.h
/* LedAcceso.h
header file della libreria LedAcceso
*/
#include "Arduino.h"
void LedAcceso(int n); // prototipo della funzione
void roll(); // prototipo della funzione
sketch
// Prof. Michele Maffucci
// 14.04.2019
// Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9
// La scrittura avviena quando si preme invio.
// All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f
// Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
// Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci
// Versione con inclusione della libreria di gestione dell'accensione del display
// definizione delle variabili a cui collegare ogni segmento del display
// la lettera rappresenta il segmento del display il numero il pin
// digitale di Arduino a cui è collegato il corrispondente pin del display
#include "LedAcceso.h"
const int a = 12;
const int b = 11;
const int c = 10;
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int intervallo = 10;
void setup()
{
// inizializzazione della seriale
Serial.begin(9600);
// inizializzazione dei pin ad OUTPUT
for (int i = 6; i < 13; i++) {
pinMode(i, OUTPUT);
}
roll();
}
void loop()
{
// verifica se sulla serial monitor è presente un carattere,
// se la condizione è vera viene letto il carattere presente sulla serial monitor
if (Serial.available()) {
int selettore = Serial.read();
LedAcceso(selettore);
}
}
Pubblico alcuni problemi che ho riscontrato in questi giorni con il Raspberry Pi e che ho risolto. Spero che queste informazioni possano essere utili anche ad altri.
Problema 1: rotazione di 180° del display
La necessità deriva dal fatto che la posizione del connettore di alimentazione è collocato, come mostrato nell’immagine, nella posizione in cui viene appoggiata la base del display, ciò non permette una perfetta stabilità del monitor.
Per poter ruotare il monitor bisogna editare il file config.txt che risiede nella directory boot
sudo nano /boot/config.txt
e aggiungete la riga:
lcd_rotate=2
Al successivo reboot il display sarà ruotato di 180°
Problema 2: impossibile connettersi in WiFi mediante l’adattatore USB edmax EW-7811Un
Durante le mie sperimentazioni ho connesso il display touch ad un Raspberry Pi 2 a cui ho collegato una chiavetta USB edmax EW-7811Un.
Durante il primo avvio del Raspberry Pi 2 ho effettuato tutti gli aggiornamenti necessari mediante un update ed un upgrade di sistema e al successivo boot del Raspberry Pi non si riusciva in alcun modo ad attivare la connessione WiFi.
Ho trovato la soluzione seguendo il tutorial: tutorial: Raspberry Pi – Installing the Edimax EW-7811Un USB WiFi Adapter (WiFiPi)
Sto effettuando due sperimentazioni, la prima consiste in un sistema di controllo demotico indirizzato a persone diversamente abili, la seconda predisporre un sistema “semplice” per la creazione di applicativi e giochi didattici da far utilizzare ad allievi con necessità specifiche che possa essere utilizzato da qualsiasi docente con minime competenze informatiche, tra qualche giorno ne mostrerò l’idea. L’interfaccia di gestione in entrambi i casi è costituita da un display touch e a tal proposito ho indirizzato le mie sperimentazioni sul “neonato” Display Touch Raspberry Pi, sto effettuando altre sperimentazioni con altre tipologie di display, ma ve ne darò notizia più avanti.
Come sempre per avere uno storico di tutorial e renderla disponibile anche per i miei studenti, di seguito ne mostro i passi per assemblarlo e renderlo operativo.
Prerequisiti:
15 minuti di tempo per assemblare il displayIl display risulta compatibile con una delle le seguenti versioni di Raspberry Pi:
Raspberry Pi 2 Model B
Raspberry Pi Model B+
Raspberry PI Model A+io ho utilizzato la versione Raspberry Pi 2 Model B con 1GB.
Scaricare l’ultima versione di Raspbian scegliete voi se procedere con la NOOBS io ho optato per questa soluzione preparate una micro SD da 8G
Effettuare una prima installazione del sistema operativo utilizzando altro monitor, in fase successiva inserirete l’SD nel Raspberry Pi a cui sarà collegato il Display Touch.Al termine dell’installazione per far si che siano anche installati anche i driver e il software necessario per la gestione del Display Touch che andrete a collegare aprite una sessione terminala ed eseguite nell’ordine questi due comandi di aggiornamento:
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
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.
Partiamo con la sperimentazione
Schema di collegamento
la corrispondenza di collegamento display -> Arduino è la seguente:
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.
Spostiamo le librerie nella cartella “libraries” di Arduino e riavviamo l’IDE
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
Passo 4
Nella cartella Adafruit_SSD1306 trovate la cartella examples
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
Create la vostra immagine, che ovviamente deve essere di dimensione non superiore a 128×64
Dal programma Image2Code.jar click sul pulsante “Choose file”
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:
#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:
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:
#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();
}
}