Matrice di led con HT1632C (7)

by luca
21 comments

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:

[youtube id=”2C04XzL3auE” width=”600″ height=”350″]

Related Posts

21 comments

Andrea F. 6 marzo 2013 - 15:04

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

Reply
luca 6 marzo 2013 - 17:11

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

Reply
Andrea F. 7 marzo 2013 - 10:59

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

Reply
luca 7 marzo 2013 - 16:40

ciao

dipende da come colleghi il pulsante (guarda la posizione della resistenza di pullup rispetto al pin di Arduino)

Reply
Andrea F. 8 marzo 2013 - 10:36

Ok, grazie mille.

Reply
Francesco 21 marzo 2013 - 11:05

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

Reply
Francesco 21 maggio 2013 - 18:28

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.

Reply
luca 22 maggio 2013 - 09:39

Ciao Francesco

sicuramente 30m di cavo (soprattutto se non schermato) attenuano troppo i segnali perché arrivino “leggibili” al display.

Reply
Francesco 23 maggio 2013 - 18:35

Ciao Luca. scusami, non riesco di capire “leggibili”…. e puoi spiegami piu chiaro. Grazie

Reply
luca 23 maggio 2013 - 19:15

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…

Reply
Francesco 29 maggio 2013 - 17:57

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.

Reply
luca 30 maggio 2013 - 10:13

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).

Reply
Jeremy 6 luglio 2013 - 06:56

Luca, do you happen to have the eagle cad library for the HT1632C?

Reply
luca 8 luglio 2013 - 08:37

Hi Jeremy,

sorry, no…

Reply
giulio 3 dicembre 2013 - 21:59

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?

Reply
luca 4 dicembre 2013 - 08:52

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.

Reply
Francesco 26 febbraio 2014 - 11:00

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

Reply
Paolo 2 giugno 2015 - 21:46

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.

Reply
luca 3 giugno 2015 - 08:15

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.

Reply
francesco 18 aprile 2017 - 21:24

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.

Reply
luca 19 aprile 2017 - 09:19

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.

Reply

Rispondi a giulio Cancel Reply

diciotto − tredici =