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
1 | /* |
2 | * Prof. Michele Maffucci |
3 | * Crezione di caratteri personali |
4 | * Utilizzo di un display LCD1602 Keypad Shield della Keyestudio |
5 | * Data: 19.03.2021 |
6 | */ |
7 |
8 | // inclusione della libreria LiquidCrystal.h |
9 | #include <LiquidCrystal.h> |
10 |
11 | // inizializza la libreria con i numeri dei pin dell'interfaccia |
12 | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); |
13 |
14 | // caratteri personalizzati |
15 |
16 | byte lucchettoChiuso[8] = { |
17 | 0b01110, |
18 | 0b10001, |
19 | 0b10001, |
20 | 0b10001, |
21 | 0b11111, |
22 | 0b11011, |
23 | 0b11011, |
24 | 0b11111 |
25 | }; |
26 |
27 | byte lucchettoAperto[8] = { |
28 | 0b01110, |
29 | 0b10000, |
30 | 0b10000, |
31 | 0b10000, |
32 | 0b11111, |
33 | 0b11011, |
34 | 0b11011, |
35 | 0b11111 |
36 | }; |
37 |
38 | byte Altoparlante[8] = { |
39 | 0b00001, |
40 | 0b00011, |
41 | 0b01111, |
42 | 0b01111, |
43 | 0b01111, |
44 | 0b00011, |
45 | 0b00001, |
46 | 0b00000 |
47 | }; |
48 |
49 | byte batteriaMezza[8] = { |
50 | 0b01110, |
51 | 0b11011, |
52 | 0b10001, |
53 | 0b10001, |
54 | 0b10001, |
55 | 0b11111, |
56 | 0b11111, |
57 | 0b11111 |
58 | }; |
59 |
60 | byte alieno[8] = { |
61 | 0b10001, |
62 | 0b01010, |
63 | 0b11111, |
64 | 0b10101, |
65 | 0b11111, |
66 | 0b11111, |
67 | 0b01010, |
68 | 0b11011 |
69 | }; |
70 |
71 |
72 | byte pacmanBoccaChiusa[8] = { |
73 | 0b01110, |
74 | 0b11101, |
75 | 0b11111, |
76 | 0b11111, |
77 | 0b11000, |
78 | 0b11111, |
79 | 0b11111, |
80 | 0b01110 |
81 | }; |
82 |
83 | byte pacmanBoccaAperta[8] = { |
84 | 0b01110, |
85 | 0b11101, |
86 | 0b11111, |
87 | 0b11100, |
88 | 0b11000, |
89 | 0b11000, |
90 | 0b11111, |
91 | 0b01110 |
92 | }; |
93 |
94 | byte fantasmino[8] = { |
95 | 0b01110, |
96 | 0b11111, |
97 | 0b10101, |
98 | 0b11111, |
99 | 0b11111, |
100 | 0b11111, |
101 | 0b11111, |
102 | 0b10101 |
103 | }; |
104 |
105 | void setup() |
106 | { |
107 | // impostazione del numero di colonne e righe del display |
108 | lcd.begin(16, 2); |
109 |
110 | // creazione nuovi caratteri |
111 | lcd.createChar(0, lucchettoChiuso); |
112 | lcd.createChar(1, lucchettoAperto); |
113 | lcd.createChar(2, Altoparlante); |
114 | lcd.createChar(3, batteriaMezza); |
115 | lcd.createChar(4, alieno); |
116 | lcd.createChar(5, pacmanBoccaChiusa); |
117 | lcd.createChar(6, pacmanBoccaAperta); |
118 | lcd.createChar(7, fantasmino); |
119 | |
120 | // Cancella il display |
121 | lcd.clear(); |
122 |
123 | // Stampa la stringa |
124 | lcd.print( "PCTO a.s. 20/21" ); |
125 |
126 | } |
127 |
128 | void loop() |
129 | { |
130 | lcd.setCursor(0, 1); |
131 | lcd.write(byte(0)); |
132 |
133 | lcd.setCursor(2, 1); |
134 | lcd.write(byte(1)); |
135 |
136 | lcd.setCursor(4, 1); |
137 | lcd.write(byte(2)); |
138 |
139 | lcd.setCursor(6, 1); |
140 | lcd.write(byte(3)); |
141 |
142 | lcd.setCursor(8, 1); |
143 | lcd.write(byte(4)); |
144 |
145 | lcd.setCursor(10, 1); |
146 | lcd.write(byte(5)); |
147 |
148 | lcd.setCursor(12, 1); |
149 | lcd.write(byte(6)); |
150 |
151 | lcd.setCursor(14, 1); |
152 | lcd.write(byte(7)); |
153 | } |
Esempio 2
In questo secondo esempio mostriamo come visualizzare l’icona del Pacman che va avanti e indietro sulla prima riga del display
1 | /* |
2 | * Prof. Michele Maffucci |
3 | * Crezione di caratteri personali |
4 | * Utilizzo di un display LCD1602 Keypad Shield della Keyestudio |
5 | * Data: 19.03.2021 |
6 | * |
7 | * Movimento verso destra e sinistra di una icona (alieno) |
8 | */ |
9 |
10 | // inclusione della libreria LiquidCrystal.h |
11 | #include <LiquidCrystal.h> |
12 |
13 | // inizializza la libreria con i numeri dei pin dell'interfaccia |
14 | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); |
15 |
16 | // Velocità con cui viene stampato il l'icona |
17 | int velocita = 300; |
18 |
19 | // caratteri personalizzati |
20 |
21 | byte alieno[8] = { |
22 | 0b10001, |
23 | 0b01010, |
24 | 0b11111, |
25 | 0b10101, |
26 | 0b11111, |
27 | 0b11111, |
28 | 0b01010, |
29 | 0b11011 |
30 | }; |
31 |
32 | void setup() |
33 | { |
34 | // impostazione del numero di colonne e righe del display |
35 | lcd.begin(16, 2); |
36 |
37 | // creazione nuovi caratteri |
38 | lcd.createChar(4, alieno); |
39 |
40 | // visualizzazione sul display del nome |
41 | // dell'attività |
42 | |
43 | // Cancella il display |
44 | lcd.clear(); |
45 |
46 | // Stampa la stringa |
47 | lcd.print( "PCTO a.s. 20/21" ); |
48 | delay(1000); |
49 |
50 | // Cancella il display |
51 | lcd.clear(); |
52 | } |
53 |
54 | void loop() |
55 | { |
56 | // Movimento verso destra del carattere |
57 | for ( int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) { |
58 | // Cancella il display |
59 | lcd.clear(); |
60 | // Spostamento di una posizione verso destra del cursore |
61 | lcd.setCursor(contatorePosizioneColonna, 0); |
62 | // Stampa del icona: alieno |
63 | lcd.write(byte(4)); |
64 | // Attesa di un'istante per percepire il movimento del carattere |
65 | delay(velocita); |
66 | } |
67 |
68 | // Movimento verso sinistra del carattere |
69 | for ( int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) { |
70 | // Cancella il display |
71 | lcd.clear(); |
72 | // Spostamento di una posizione verso sinistra del cursore |
73 | lcd.setCursor(contatorePosizioneColonna, 0); |
74 | // Stampa del icona: alieno |
75 | lcd.write(byte(4)); |
76 | // Attesa di un'istante per percepire il movimento del carattere |
77 | delay(velocita); |
78 | } |
79 | } |
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.
1 | /* |
2 | Prof. Michele Maffucci |
3 | Crezione di caratteri personali |
4 | Utilizzo di un display LCD1602 Keypad Shield della Keyestudio |
5 | Data: 19.03.2021 |
6 |
7 | Movimento verso destra e sinistra di una icona (Pacman) |
8 | Durante il movimento il Pacman apre e chiude la bocca |
9 | */ |
10 |
11 | // inclusione della libreria LiquidCrystal.h |
12 | #include <LiquidCrystal.h> |
13 |
14 | // inizializza la libreria con i numeri dei pin dell'interfaccia |
15 | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); |
16 |
17 | // Velocità con cui viene stampato il l'icona |
18 | int velocita = 300; |
19 |
20 | // caratteri personalizzati |
21 |
22 | byte pacmanBoccaChiusa[8] = { |
23 | 0b01110, |
24 | 0b11101, |
25 | 0b11111, |
26 | 0b11111, |
27 | 0b11000, |
28 | 0b11111, |
29 | 0b11111, |
30 | 0b01110 |
31 | }; |
32 |
33 | byte pacmanBoccaAperta[8] = { |
34 | 0b01110, |
35 | 0b11101, |
36 | 0b11111, |
37 | 0b11100, |
38 | 0b11000, |
39 | 0b11000, |
40 | 0b11111, |
41 | 0b01110 |
42 | }; |
43 |
44 | void setup() |
45 | { |
46 | // impostazione del numero di colonne e righe del display |
47 | lcd.begin(16, 2); |
48 |
49 | // creazione nuovi caratteri |
50 | lcd.createChar(0, pacmanBoccaChiusa); |
51 | lcd.createChar(1, pacmanBoccaAperta); |
52 |
53 | // Cancella il display |
54 | lcd.clear(); |
55 |
56 | // Stampa la stringa |
57 | lcd.print( "PCTO a.s. 20/21" ); |
58 | } |
59 |
60 | void loop() |
61 | { |
62 |
63 | // Movimento verso destra del carattere |
64 | for ( int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) { |
65 | // Cancella il display |
66 | lcd.clear(); |
67 | // Spostamento di una posizione verso destra del cursore |
68 | lcd.setCursor(contatorePosizioneColonna, 0); |
69 | if (contatorePosizioneColonna % 2 == 0) { |
70 | // Stampa del icona: Pacman bocca chiusa |
71 | lcd.write(byte(0)); |
72 | } |
73 | else |
74 | { |
75 | // Stampa del icona: Pacman bocca aperta |
76 | lcd.write(byte(1)); |
77 | } |
78 | // Attesa di un'istante per percepire il movimento del carattere |
79 | delay(velocita); |
80 | } |
81 |
82 | // Movimento verso sinistra del carattere |
83 | for ( int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) { |
84 | // Cancella il display |
85 | lcd.clear(); |
86 | // Spostamento di una posizione verso sinistra del cursore |
87 | lcd.setCursor(contatorePosizioneColonna, 0); |
88 | if (contatorePosizioneColonna % 2 == 0) { |
89 | // Stampa del icona: Pacman bocca chiusa |
90 | lcd.write(byte(0)); |
91 | } |
92 | else |
93 | { |
94 | // Stampa del icona: Pacman bocca aperta |
95 | lcd.write(byte(1)); |
96 | } |
97 | // Attesa di un'istante per percepire il movimento del carattere |
98 | delay(velocita); |
99 | } |
100 | } |
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