Translate

sabato 7 novembre 2020



Questa sera vi parleò dell' LCD KeyPad Shield per Arduino (uno R3) che mi ero procurato mesi e mesi addietro... O meglio, dopo aver testato tutti i vari esempi disponibili nell' IDE di arduino, ho notato la mancanza di, o non sono cmq riuscito a trovare, una funzione che mi permettesse di scorrere un testo dal basso verso l'alto e viceversa.

La scheda presenta, oltre all' LCD, anche 5 pulsanti da utilizzare come input e controllo.

I tasti sono serigrafati come UP, DOWN, LEFT, RIGHT, and SELECT, ma i comportamenti da adottare in caso di pressione sono scelti dal programmatore.

La cosa interessante è che tutti i pulsanti sono collegati ad un singolo ingresso analogico A0: tramite una catena di resistenze / partitore resistivo si genera una tensione diversa su A0 a seconda del tasto premuto


Questo schema mostra i pulsanti di input e le resistenze associate:

Se nessun pulsante viene premuto la tensione su A0 sarà portata a 5v dalla resistenza di 2K R6 infatti in tale situazione nessuna delle altre resistenze avrà alcun effetto. Se si esegue un analogRead (A0) verrà restituito un 1023 (o qualsiasi valore sopra 1000).

Consideriamo ora cosa succede se si preme il tasto "DOWN". 

nel punto A0 avremo il partitore resistivo R6 da 2k e R2+R3 330+620=950
La tensione presente al pin A0 in questo caso è di circa 1.61V (5V*950/(2k+950), il che significa che se si esegue un analogRead (A0) restituirà un valore di circa 329. Quindi, se si legge un valore di circa 329 da A0 si sa' che il pulsante "DOWN" è premuto.

Lo stesso vale per gli altri pulsanti, con i valori di tensione e analogRead() relativi ed indicati nello schema sopra.

Questo è un modo pulito per gestire una serie di tasti in ingresso, utilizzando uno solo dei pin di I / O dell'Arduino.


N.B. Premendo contermporaneamente piu tasti, verrà riconosciuto solo quello piu in alto dello schema (tra quelli effettivamente premuti).

La parte di codice usato per la gestione dei tasti è:


#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


...

int read_buttons()
{
    // i pulsanti sono collegati in serie a resistenze...
    // quindi basta un piedino Analogico per sapere cosa 

    // è stato premuto
    adc_key_in = analogRead(0);

    if (adc_key_in > 1000) return btnNONE; // la metto per prima

                                                      //in quanto condizione
                                                      // maggiormente verificata
    if (adc_key_in < 50)   return btnRIGHT;
    if (adc_key_in < 195)  return btnUP;
    if (adc_key_in < 380)  return btnDOWN;
    if (adc_key_in < 555)  return btnLEFT;
    if (adc_key_in < 790)  return btnSELECT;
}



Mediando gli esempi di tutilizzo trovati in giro, dopo l'inizializzazione del display

//creo istanza per come è collegato lo shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);



basato su questo collegamento


Pin Function
Analog 0 Button (select, up, right, down and left)
Digital 4 DB4
Digital 5 DB5
Digital 6 DB6
Digital 7 DB7
Digital 8 RS (Data or Signal Display Selection)
Digital 9 Enable
Digital 10 Backlit Control

sono passato a fare uno "splash screen" da 5 secondi usando anche dei caratteri grafici creati ad hoc.
La versione "cinese" da me acquistata al posto dei caratteri accentati presenta dei bellissini ideogrammi... di cui però non me ne sono fatto nulla e che mi hanno costretto a scrivere le lettere accentate con l'apice.






######

######

Nessun commento:

Posta un commento