Matrice di led con HT1632C (7)

luca 23 febbraio 2013 10

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:

10 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…

Leave A Response »