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…
Buona sera Luca, ho capito allora devo provare a collegare display 5+ e gnd con schematura fino 30 mt arduino 5+ e gnd con schematura giusto o no? scusami non ho esperto l’elettronica. Grazie Luca.
ciao
sì, puoi provare ad utilizzare cavi schermati ma potrebbe non essere sufficiente se il problema non sono i disturbi ma l’attenuazione del segnale… purtroppo in quel caso dovresti usare cavi più corti o mettere “qualcosa” in mezzo (es. un integrato che faccia da buffer e rigeneri il segnale digitale).
Luca, do you happen to have the eagle cad library for the HT1632C?
Hi Jeremy,
sorry, no…
posso chiedere un consiglio? sto costruendo un analizzatore di spettro. Il campionamento e il filtraggio sono hardware l’interfacciamento grafico lo volevo fare con 4 matrici 8×8 e solo che non mi e chiaro il pilotaggio della matrice, avviene tramite un integrato? la programmazione la volevo ridurre al minimo nell’ arduino, oppure la matrice va per forza gestita da un integrato che fa da solo?
Ciao Giulio,
normalmente le matrici sono pilotate da un integrato esterno, che “traduce” i comandi che gli arrivano da Arduino in accensione/spegnimento dei leds ad esso collegati. Tutta la logica (e quindi la tua programmazione) risiede cmq in Arduino, l’uso di un integrato esterno è comodo anche perché Arduino non avrebbe sufficienti pin di I/O per pilotare così tanti led.
Buongiorno Luca. Sono Francesco. input di buttons sulla scheda arduino UNO e output dispaly matrix sulla arduino NANO ma non riesco di programma e se potrei fare? Grazie Luca
Ciao Luca.
Il tuo progetto segue una mia idea che sto seguendo da alcuni anni e per la quale ti chiesi consiglio in passato e che qui mi ritrovo soddisfatta. Ma veniamo alla domanda che vorrei porti: se le scritte fossero di più basterebbe aggiungerle nello sketch nella parte dove viene definito il PROGMEM (con conseguente inserimento di altri tasti adeguatamente configurati) o si renderebbe necessario modificare in maniera sostanziale lo Sketch stesso? Inoltre mi sembra che quel modello di display si possa collegare in serie fino ad un massimo di 4. È necessario anche in questo caso modificare lo sketch oppure il collegamento fisico è sufficiente perché la scritta scorra da un display all’altro? Spero di essere stato chiaro e ti ringrazio anticipatamente per l’attenzione e la risposta.
Ciao Paolo! Finché hai memoria disponibile sì, puoi aggiungerle con PROGMEM e attivarle in base ai tasti. Per invece lo scorrimento su più display, va modificato lo sketch per aggiungere la “logica” di attivazione del singolo display che in quel momento vuoi comandare.
Ciao Luca. Ho fatto download arduino 1.8.2 anno 2017. Apre sketch e ho scaricato “led matrix text demo” poi ho premuto verifica ma mi ha risposto: fatal error: aiponte.h: no such file or directory. Forse è cambiato sketch 1.8.2?Spero di essere stato chiaro e ti ringrazio anticipatamente per l’attenzione e la risposta.
Ciao Francesco, verifica che nella cartella dello sketch sia presente anche il file aiponte.h, devi scaricare tutto quello che è presente nel repository su Github.