Led matrix with HT1632C controller (7)

by luca
21 comments

Today’s example is about a request I received from Francesco: how to choose the text to be shown on the display using a couple of buttons.

PROGMEM

If you need to store static content (= the strings to display) you can use Arduino’s program memory, through the PROGMEM keyword:

PROGMEM char btn1_text[] = {"BTN-1"};
PROGMEM char btn2_text[] = {"BTN-2"};

With the use of the program memory, you can save precious RAM cells; be careful however to access those variables in the right way: for example if you need to copy their values into RAM variables, you need to use the strcpy_P function:

strcpy_P(display_string, btn1_text);

BUTTONS

It’s very easy to connect buttons to Arduino: just remember to set mode of the PINs you chosed as INPUT:

#define BTN1_PIN      10
#define BTN2_PIN      11
[...]
pinMode(BTN1_PIN, INPUT);
pinMode(BTN2_PIN, INPUT);

I wrote a short function to read the button’s state, with a small delay to debounce:

boolean check_button(int button) {
 
  if(digitalRead(button) == HIGH) return false;
  delay(50);
  if(digitalRead(button) == HIGH) return false;
  delay(200);
  return true;
}

The circuit was wired on a breadboard:

SKETCH

The sketch is available Github, here’s a video about it:

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

Related Posts

21 comments

Andrea F. Wednesday March 6th, 2013 - 03:04 PM

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 Wednesday March 6th, 2013 - 05:11 PM

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. Thursday March 7th, 2013 - 10:59 AM

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 Thursday March 7th, 2013 - 04:40 PM

ciao

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

Reply
Andrea F. Friday March 8th, 2013 - 10:36 AM

Ok, grazie mille.

Reply
Francesco Thursday March 21st, 2013 - 11:05 AM

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 Tuesday May 21st, 2013 - 06:28 PM

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 Wednesday May 22nd, 2013 - 09:39 AM

Ciao Francesco

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

Reply
Francesco Thursday May 23rd, 2013 - 06:35 PM

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

Reply
luca Thursday May 23rd, 2013 - 07:15 PM

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 Wednesday May 29th, 2013 - 05:57 PM

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 Thursday May 30th, 2013 - 10:13 AM

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 Saturday July 6th, 2013 - 06:56 AM

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

Reply
luca Monday July 8th, 2013 - 08:37 AM

Hi Jeremy,

sorry, no…

Reply
giulio Tuesday December 3rd, 2013 - 09:59 PM

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 Wednesday December 4th, 2013 - 08:52 AM

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 Wednesday February 26th, 2014 - 11:00 AM

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 Tuesday June 2nd, 2015 - 09:46 PM

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 Wednesday June 3rd, 2015 - 08:15 AM

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 Tuesday April 18th, 2017 - 09:24 PM

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 Wednesday April 19th, 2017 - 09:19 AM

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

Leave a Comment

sixteen − five =