In riferimento a quanto esposto a lezione questa mattina durante la lezione a distanza, aggiungo alcune indicazioni per disegnare icone personalizzate sul display: pacman, alieno, fantasmi, ecc… La modalità di realizzazione icone è la medesima di quella spiegata nella lezione svolta alcuni mesi fa: Disegnare caratteri personalizzati con Arduino per un LCD 16×2 in cui veniva utilizzato un display I2C.
Le modifiche per l’utilizzo dell’LCD1602 Keypad Shield della Keyestudio sono minime e di seguito indico alcuni esempi.
E’ importante, per inserire nuove icone sul display, studiare la lezione precedente in cui descrivo come realizzare le icone.
Di seguito tre esempi utili per sviluppare il vostro progetto di PCTO.
Esempio 1
In questo esempio mostro come visualizzare sulla prima riga del display una stringa di presentazione e sulla seconda riga 8 icone
/*
* Prof. Michele Maffucci
* Crezione di caratteri personali
* Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
* Data: 19.03.2021
*/
// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>
// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// caratteri personalizzati
byte lucchettoChiuso[8] = {
0b01110,
0b10001,
0b10001,
0b10001,
0b11111,
0b11011,
0b11011,
0b11111
};
byte lucchettoAperto[8] = {
0b01110,
0b10000,
0b10000,
0b10000,
0b11111,
0b11011,
0b11011,
0b11111
};
byte Altoparlante[8] = {
0b00001,
0b00011,
0b01111,
0b01111,
0b01111,
0b00011,
0b00001,
0b00000
};
byte batteriaMezza[8] = {
0b01110,
0b11011,
0b10001,
0b10001,
0b10001,
0b11111,
0b11111,
0b11111
};
byte alieno[8] = {
0b10001,
0b01010,
0b11111,
0b10101,
0b11111,
0b11111,
0b01010,
0b11011
};
byte pacmanBoccaChiusa[8] = {
0b01110,
0b11101,
0b11111,
0b11111,
0b11000,
0b11111,
0b11111,
0b01110
};
byte pacmanBoccaAperta[8] = {
0b01110,
0b11101,
0b11111,
0b11100,
0b11000,
0b11000,
0b11111,
0b01110
};
byte fantasmino[8] = {
0b01110,
0b11111,
0b10101,
0b11111,
0b11111,
0b11111,
0b11111,
0b10101
};
void setup()
{
// impostazione del numero di colonne e righe del display
lcd.begin(16, 2);
// creazione nuovi caratteri
lcd.createChar(0, lucchettoChiuso);
lcd.createChar(1, lucchettoAperto);
lcd.createChar(2, Altoparlante);
lcd.createChar(3, batteriaMezza);
lcd.createChar(4, alieno);
lcd.createChar(5, pacmanBoccaChiusa);
lcd.createChar(6, pacmanBoccaAperta);
lcd.createChar(7, fantasmino);
// Cancella il display
lcd.clear();
// Stampa la stringa
lcd.print("PCTO a.s. 20/21");
}
void loop()
{
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(2, 1);
lcd.write(byte(1));
lcd.setCursor(4, 1);
lcd.write(byte(2));
lcd.setCursor(6, 1);
lcd.write(byte(3));
lcd.setCursor(8, 1);
lcd.write(byte(4));
lcd.setCursor(10, 1);
lcd.write(byte(5));
lcd.setCursor(12, 1);
lcd.write(byte(6));
lcd.setCursor(14, 1);
lcd.write(byte(7));
}
Esempio 2
In questo secondo esempio mostriamo come visualizzare l’icona del Pacman che va avanti e indietro sulla prima riga del display
/*
* Prof. Michele Maffucci
* Crezione di caratteri personali
* Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
* Data: 19.03.2021
*
* Movimento verso destra e sinistra di una icona (alieno)
*/
// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>
// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Velocità con cui viene stampato il l'icona
int velocita = 300;
// caratteri personalizzati
byte alieno[8] = {
0b10001,
0b01010,
0b11111,
0b10101,
0b11111,
0b11111,
0b01010,
0b11011
};
void setup()
{
// impostazione del numero di colonne e righe del display
lcd.begin(16, 2);
// creazione nuovi caratteri
lcd.createChar(4, alieno);
// visualizzazione sul display del nome
// dell'attività
// Cancella il display
lcd.clear();
// Stampa la stringa
lcd.print("PCTO a.s. 20/21");
delay(1000);
// Cancella il display
lcd.clear();
}
void loop()
{
// Movimento verso destra del carattere
for (int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) {
// Cancella il display
lcd.clear();
// Spostamento di una posizione verso destra del cursore
lcd.setCursor(contatorePosizioneColonna, 0);
// Stampa del icona: alieno
lcd.write(byte(4));
// Attesa di un'istante per percepire il movimento del carattere
delay(velocita);
}
// Movimento verso sinistra del carattere
for (int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) {
// Cancella il display
lcd.clear();
// Spostamento di una posizione verso sinistra del cursore
lcd.setCursor(contatorePosizioneColonna, 0);
// Stampa del icona: alieno
lcd.write(byte(4));
// Attesa di un'istante per percepire il movimento del carattere
delay(velocita);
}
}
Esempio 3
Realizzare le medesime funzionalità dell’esercizio precedente in cui l’icona del Pacman nell’avanzamento apre e chiude la bocca.
In questo esempio il Pacman quando torna indietro non si gira.
/*
Prof. Michele Maffucci
Crezione di caratteri personali
Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
Data: 19.03.2021
Movimento verso destra e sinistra di una icona (Pacman)
Durante il movimento il Pacman apre e chiude la bocca
*/
// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>
// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Velocità con cui viene stampato il l'icona
int velocita = 300;
// caratteri personalizzati
byte pacmanBoccaChiusa[8] = {
0b01110,
0b11101,
0b11111,
0b11111,
0b11000,
0b11111,
0b11111,
0b01110
};
byte pacmanBoccaAperta[8] = {
0b01110,
0b11101,
0b11111,
0b11100,
0b11000,
0b11000,
0b11111,
0b01110
};
void setup()
{
// impostazione del numero di colonne e righe del display
lcd.begin(16, 2);
// creazione nuovi caratteri
lcd.createChar(0, pacmanBoccaChiusa);
lcd.createChar(1, pacmanBoccaAperta);
// Cancella il display
lcd.clear();
// Stampa la stringa
lcd.print("PCTO a.s. 20/21");
}
void loop()
{
// Movimento verso destra del carattere
for (int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) {
// Cancella il display
lcd.clear();
// Spostamento di una posizione verso destra del cursore
lcd.setCursor(contatorePosizioneColonna, 0);
if (contatorePosizioneColonna % 2 == 0) {
// Stampa del icona: Pacman bocca chiusa
lcd.write(byte(0));
}
else
{
// Stampa del icona: Pacman bocca aperta
lcd.write(byte(1));
}
// Attesa di un'istante per percepire il movimento del carattere
delay(velocita);
}
// Movimento verso sinistra del carattere
for (int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) {
// Cancella il display
lcd.clear();
// Spostamento di una posizione verso sinistra del cursore
lcd.setCursor(contatorePosizioneColonna, 0);
if (contatorePosizioneColonna % 2 == 0) {
// Stampa del icona: Pacman bocca chiusa
lcd.write(byte(0));
}
else
{
// Stampa del icona: Pacman bocca aperta
lcd.write(byte(1));
}
// Attesa di un'istante per percepire il movimento del carattere
delay(velocita);
}
}
Esercizio 1
Eseguire le stesse funzionalità dell’esempio 3 in cui però il Pacman rivolga il viso nella stessa direzione del movimento.
Esercizio 2
Movimentare il Pacman con i pulsanti RIGHT e LEFT, rivolgendo sempre il viso nella giusta posizione di movimento.
Buon Coding a tutti 🙂