EEPROM Led arduino

Nel corso avanzato che è in corso di svolgimento i partecipanti hanno realizzato il progetto EEPROM led che condividiamo in pieno spirito open source.

EEPROM led

Il progetto è stato realizzato dai partecipanti nel corso della lezione in cui ho affrontato il discorso EEPROM ed SD Card.

Il primo step è stato individuare un’idea di progetto a cui tutti hanno contribuito con la propria idea fino a raggiungere un esempio pratico:

una serie di led si accendono a rotazione alla pressione di un unico pulsante. In pratica ogni volta che premi il pulsante il led acceso viene spento ed il successivo si accende, fino a questo punto tutto semplice, e la EEPROM? La EEPROM farà in modo di “salvare” la posizione della luce, ossia quale led è acceso, quando si preme il reset Arduino in modo da riaccendere esattamente il led acceso prima del reset.

Ragionando su come scrivere lo sketch sono arrivati anche due interessanti suggerimenti:

  1. usiamo pin successivi in modo che la variabile indicante il led acceso corrisponda come valore al pin;
  2. facciamo in modo che sia la funzione setup() a recuperare il valore salvato nella EEPROM ed informare la loop() su quale led accendere.

Collegamenti EEPROM Led

Ogni buon progetto arduino parte con i collegamenti elettrici, nel caso del progetto EEPROM Led abbiamo 6 led ed un pulsante da collegare quindi il materiale per riprodurre il progetto sarà:

  • n.1 arduino uno o equivalente
  • n.1 breadboard
  • n.3 led da 5mm bianchi
  • n.3 led da 5mm blu
  • n.1 pulsante NA
  • n.1 resistenza da 330ohm
  • n.1 resistenza da 10Kohm
  • qualche cavetto per breadboard

Lo schema che puoi seguire è il seguente:

EEPROM led schema

ho anche realizzato alcune foto per chiarire come collegare il pulsante:

EEPROM led pulsane

e come collegare i led sia alla resistenza:

EEPROM led collegamenti

sia ad arduino:

EEPROM led alto

Lo sketch

Lo sketch scritto per il progetto EEPROM led è il seguente:

/*
 * Esempio di uso della EEPROM - Corso Avanzato 27 febbraio 2014
 *
 * @autor: Mauro Alfieri 
 *         Lucia Alpago
 *         Angelo Cucinotta
 *         Gabriele Damaschi
 *         Fabrizio Degaetano
 *         Manuel Gatti
 *         Aris Ioannidis
 *         Michele Righini
 *         Michele Segoloni
 *         Aldo Toto
 */

#include <EEPROM.h>

#define cella 0
#define butt 13

#define led1 3
#define led2 4
#define led3 5
#define led4 6
#define led5 7
#define led6 8

int led=2;

void setup() {
   led = EEPROM.read( cella );

   pinMode( butt,INPUT );

   pinMode( led1,OUTPUT );
   pinMode( led2,OUTPUT );
   pinMode( led3,OUTPUT );
   pinMode( led4,OUTPUT );
   pinMode( led5,OUTPUT );
   pinMode( led6,OUTPUT );

   if (led > led6 || led < led1) led = 2;

   digitalWrite( led1,LOW );
   digitalWrite( led2,LOW );
   digitalWrite( led3,LOW );
   digitalWrite( led4,LOW );
   digitalWrite( led5,LOW );
   digitalWrite( led6,LOW );
}

void loop() {
  if ( digitalRead(butt) == HIGH ) {
    digitalWrite( led,LOW );
    led++;
    if ( led > led6 ) led = led1;
    EEPROM.write( cella,led );
    delay( 200 );
  }

  digitalWrite( led,HIGH );

  delay( 20 );
}

se hai chiari i suggerimenti riportati sopra sarà un gioco da ragazzi comprendere il codice, infatti la parte EEPROM è molto semplice usa solo sue metodi read() e write().

Iniziamo dalla linea 16: includi la libreria EEPROM.h che userai per leggere e scrivere sulla memoria EEPROM;

linee 18-19: definisci la cella in cui vorrai memorizzare il dato e il pin digitale a cui è connesso il pulsante;

linee 21-26: definisci i pin a cui sono collegati i led, nota che i pin sono consecutivi, in questo modo quando incrementerai il valore del led da accendere avrai già il pin corrispondente;

linea 28: imposta una variabile di tipo  integer che chiamo led il cui scopo è fare da indice del led acceso, la imposti a 2, pin a cui non è collegato alcun led, in modo che all’accensione di arduino non sia acceso alcun led;

linea 31: leggi dalla EEPROM il valore della cella definita alla linea 18, ed assegna il valore alla variabile led in questo modo ad ogni reset di arduino il vlore di led viene riletto;

linee 33-40: imposta la modalità di funzionamento di tutti i pin definiti alle linee 19-26;

linea 42: verifica che il valore di led, appena letto dalla cella 0 della EEPROM, contenga un valore compreso tra led1 e led6 in caso contrario assegna a led il valore 2, come se lo inizializzassimo nuovamente, questo perchè tutte le celle EEPROM di arduino escono valorizzate con 255 dalla fabbrica;

linee 44-49: imposta a LOW tutti i pin dei led;

linea 53: esegui una semplice verifica sul valore letto sul pin butt se il suo valore è HIGH esegui le linee successive altrimenti vai direttamente alla linea 61.

linea 54: spegni il led corrente, serve ad ottenere la prima parte dell’effetto scorrimento del led;

linea 55: incrementa di uno il valore di led il puntatore o pin da accendere;

linea 56: controlla che il valore assunto da led non superi il pin massimo, ossia il led6, in tal caso lo reimposta a led1, serve ad avere la continuità nell’accensione dei led, dopo l’ultimo si riaccende il primo;

linea 57: scrivi il valore raggiunto dalla variabile led nella cella EEPROM designata;

linea 58: imposta un delay di 200 millisecondi che chiamiamo antirimbalzo ossia attendi un tempo utile a darti il tempo di togliere il dito dal pulsante;

linea 61: accendi il led posizionato sul pin corrispondente da accendere;

linea 63: attendi 20 millisecondi tra un ciclo di loop() ed il successivo.

Il video del progetto in funzione

Dopo aver riprodotto il progetto EEPROM led in laboratorio ho realizzato un video che mostra il suo funzionamento.

Buon divertimento !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/eeprom-led-arduino.html

9 commenti

Vai al modulo dei commenti

    • Giovanni il 5 Marzo 2014 alle 12:41
    • Rispondi

    Mi da video privato e non me lo visualizza.

    1. Corretto, errore mio 🙂

    • Giovanni il 6 Marzo 2014 alle 08:53
    • Rispondi

    Adesso funziona. Carino.

    1. Bene Giovanni, grazie della segnalazione

    • Shahen il 23 Aprile 2014 alle 07:59
    • Rispondi

    Hello,
    I’m very excited to have found this project and I tried to duplicate the code to work with my Arduino Duemilanova where I changed some of your “#define” to “int” and added “=” for each led pin. Unfortunately the code did not work at all. I’m working on a school project and this feature would make it so much better.
    You can email me directly if possible please.
    I hope to hear from you soon.

    Shahen

    1. Hello Shahen,
      whitout error I can’t help.
      because you have replaced #define with int ?

        • Shahen il 23 Aprile 2014 alle 18:36
        • Rispondi

        Hi Mauro,
        I was not getting any errors, just the code wasn’t doing anything when the button was pressed. I did find where the problem was. At first, I used Google Translate to read your page and the description and that is where I copied the code to use. When I looked at your code again in Italian without Google translate, I realized that through the translation, the ++ after led in your void loop was missing for some reason. The English translated code only showed “led ;” without the “++”.
        I corrected my code to match yours 100% and it is working great!
        Thank you so much for your time and for sharing the code.

        Shahen

        1. Good work Shahen,
          Google Translator should not even translate the code.

            • Shahen il 24 Aprile 2014 alle 20:43

            Mauro,
            Somehow Google translate did :-/
            What I forgot to mention is that I changed the button input and used the “PULLUP” configuration. This made my wiring much simpler. Other than this one modification, your code is fantastic and I’m enjoying it very much. Thanks again.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.