Esempio: memorizza il led da accendere allo start
Il seguente circuito consiste in 3 pulsanti, un led giallo ed uno rosso. Nel momento in cui si fornisce alimentazione al circuito si accende uno dei 2 led in base a quale è stato impostato per accendersi. Premendo il pulsante P1 si abilita il sistema alla memorizzazione, premendo P2 si imposta l’accensione del led giallo, mentre con P3 il led rosso. Dallo schema si nota che lo stato degli ingressi viene portato a livello basso (0V) in seguito alla pressione del pulsante corrispondente, mentre a riposo è mantenuto a livello alto (5V) grazie alle resistenze di pull-up interne al microcontrollore. Queste vengono attivate mediante l’istruzione pinMode(pin, INPUT_PULLUP);.
Il circuito è gestito da Arduino basandosi sul seguente listato. Premetto che questo (come dovrebbe essere per qualunque listato) impiega la funzione debounce (antirimbalzo) per riconoscere in modo affidabile la pressione dei pulsanti, per la quale ho dedicato l’apposito tutorial.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
//Esempio di impiego della memoria EEPROM. //Impostazione del led da accendere ad una successiva accensione della scheda. #include <EEPROM.h> //Definizione dei pin a cui sono collegati i vari dispositivi #define p1 4 #define p2 3 #define p3 2 #define led_y 6 #define led_r 5 #define mem_address 0 //indirizzo di memoria a cui memorizzare il led da accendere int mem_value; //Dichiarazione della funzione per il debouncing degli ingressi (vedi tutorial dedicato) int debounceDelay = 20; boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); for(int counter=0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if( state != previousState) { counter = 0; previousState = state; } } return state; } void setup() { pinMode(p1, INPUT_PULLUP); pinMode(p2, INPUT_PULLUP); pinMode(p3, INPUT_PULLUP); pinMode(led_y, OUTPUT); pinMode(led_r, OUTPUT); mem_value = EEPROM.read(mem_address); //La variabile mem_value assume il valore letto all'indirizzo 0 della EEPROM: if(mem_value==0) digitalWrite(led_y, HIGH); //se è 0 accendi il led giallo; if(mem_value==1) digitalWrite(led_r, HIGH); //se è 1 accendi il led rosso; if(mem_value != 0 && mem_value != 1) EEPROM.update(mem_address, 0); //se non è ne 0 nè 1 (primo utilizzo) imposta il valore a 0. } void loop() { if(debounce(p1)==LOW) { //Se il pulsante P1 è premuto, abilita alla memorizzazione if(debounce(p2)==LOW && debounce(p3)==HIGH) { //Se insieme è premuto P2, memorizza il valore 0 per il led giallo. digitalWrite(led_y, LOW); //Spegni i led e fai lampeggiare il giallo. digitalWrite(led_r, LOW); EEPROM.update(mem_address, 0); delay(500); digitalWrite(led_y, HIGH); delay(300); digitalWrite(led_y, LOW); delay(300); digitalWrite(led_y, HIGH); } if(debounce(p2)==HIGH && debounce(p3)==LOW) { //Se insieme è premuto P3, memorizza il valore 1 per il led rosso. digitalWrite(led_y, LOW); //Spegni i led e fai lampeggiare il rosso. digitalWrite(led_r, LOW); EEPROM.update(mem_address, 1); delay(500); digitalWrite(led_r, HIGH); delay(300); digitalWrite(led_r, LOW); delay(300); digitalWrite(led_r, HIGH); } } } |
Il funzionamento del circuito è illustrato nel seguente video: premendo il primo e secondo pulsante si imposta l’accensione del led giallo per una successiva alimentazione della scheda, mentre premendo il primo e terzo si imposta il led rosso.
25,669 total views, 4 views today