Matrice di led con HT1632C (7)

luca 23 febbraio 2013 17

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:

17 Comments »

  1. Andrea F. 6 marzo 2013 at 15:04 - Reply

    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

    • luca 6 marzo 2013 at 17:11 - Reply

      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

  2. Andrea F. 7 marzo 2013 at 10:59 - Reply

    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

    • luca 7 marzo 2013 at 16:40 - Reply

      ciao

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

  3. Andrea F. 8 marzo 2013 at 10:36 - Reply

    Ok, grazie mille.

  4. Francesco 21 marzo 2013 at 11:05 - Reply

    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

  5. Francesco 21 maggio 2013 at 18:28 - Reply

    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.

    • luca 22 maggio 2013 at 09:39 - Reply

      Ciao Francesco

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

  6. Francesco 23 maggio 2013 at 18:35 - Reply

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

    • luca 23 maggio 2013 at 19:15 - Reply

      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…

  7. Francesco 29 maggio 2013 at 17:57 - Reply

    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.

    • luca 30 maggio 2013 at 10:13 - Reply

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

  8. Jeremy 6 luglio 2013 at 06:56 - Reply

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

    • luca 8 luglio 2013 at 08:37 - Reply

      Hi Jeremy,

      sorry, no…

  9. giulio 3 dicembre 2013 at 21:59 - Reply

    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?

    • luca 4 dicembre 2013 at 08:52 - Reply

      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.

  10. Francesco 26 febbraio 2014 at 11:00 - Reply

    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

Leave A Response »