L’esempio di oggi arriva da una richiesta di Francesco: poter scegliere la scritta visualizzata sul display tramite la pressione di pulsanti.
PROGMEM
Per memorizzare del contenuto statico (= le diverse scritte da visualizzare) possiamo sfruttare la memoria programma di Arduino, utilizzando la direttiva PROGMEM:
PROGMEM char btn1_text[] = {"BTN-1"}; PROGMEM char btn2_text[] = {"BTN-2"}; |
Salvare i dati in tale memoria ci consente di risparmiare memoria RAM; dobbiamo però fare attenzione a come accediamo a tali variabili: per copiarne il contenuto in una variabile in RAM dobbiamo usare la funzione strcpy_P:
strcpy_P(display_string, btn1_text); |
PULSANTI
Collegare uno o più pulsanti ad Arduino è molto semplice, ricordiamoci sempre di configurare i PIN a cui sono collegati come INPUT:
#define BTN1_PIN 10 #define BTN2_PIN 11 [...] pinMode(BTN1_PIN, INPUT); pinMode(BTN2_PIN, INPUT); |
Ho scritto una function per leggere lo stato di un bottone, inserendo un piccolo ritardo per debounce:
boolean check_button(int button) { if(digitalRead(button) == HIGH) return false; delay(50); if(digitalRead(button) == HIGH) return false; delay(200); return true; } |
Il tutto realizzato su una piccola breadboard:

SKETCH
Lo sketch è disponibile su Github, ecco un video che ne mostra il funzionamento:






Ciao Luca,
sto seguendo con interesse i tuoi articoli su Arduino & co. In merito alla funzione check_button, mi spieghi meglio il motivo di quella serie di if sul valore high? Intuisco sia per il debounce ma leggendo il codice non capisco come faccia a funzionare.
Grazie
Ciao Andrea,
presupposto: se il pulsante è premuto, la funzione digitalRead() restituisce LOW.
Il primo if quindi verifica se il pulsante è premuto: se non lo è (HIGH) ritorna subito false
Se invece il pulsante è premuto, il ciclo attende 50ms e poi esegue una nuova verifica (questo è il debounce, per evitare che la prima lettura LOW fosse causata da qualche “ritorno”): se questa volta il pulsante non è premuto, ritorna false
Se il pulsante è premuto anche questa volta, attende 200ms per evitare che se l’utente tiene premuto il pulsante Arduino legga questo come tanti click
Ciao Luca,
anzitutto grazie della risposta e per la chiarezza. Il mio problema era nel capire che digitalRead() restituisse LOW quando il pulsante è premuto. In base ai tutorial di Arduino mi risultava il contrario. Dipende dal tipo di pulsante o dalla sua connessione?
Grazie ancora
ciao
dipende da come colleghi il pulsante (guarda la posizione della resistenza di pullup rispetto al pin di Arduino)
Ok, grazie mille.
Ciao Luca. Sono Francesco, abbiamo contatto il display è tutto funzione, grazie di tutto.
Volevo aggiungere il tempo x spegnere quando ho premuto via il nome poi da solo di spegnere.
Altri 2 potenziometri: -1 potenziometro collega “SCROLLING SPEED” da 0 fino 200.
- 2 potenziometro collega “SCROLLING SPEED” in tempo x spegnere, esempio da 0 fino 3 minuti.
Grazie per il collaborazione. Distinti saluti
Gentile Luca, ho il problema la distanza di 30 metri dall’arduino a ht1632c non funzione invece più corto è funzione. come mai? In attesa la tua risposta. Grazie e saluti.
Ciao Francesco
sicuramente 30m di cavo (soprattutto se non schermato) attenuano troppo i segnali perché arrivino “leggibili” al display.
Ciao Luca. scusami, non riesco di capire “leggibili”…. e puoi spiegami piu chiaro. Grazie
ciao, significa che i segnali digitali arrivano talmente attenuati che il display non riesce più a interpretare correttamente la sequenza di zeri e uni che costituiscono i comandi che invii…