Pages: [1]   Go Down
Author Topic: Problema EEPROM.write  (Read 320 times)
0 Members and 1 Guest are viewing this topic.
La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho quasi finito il codice di una semplice scheda, che tramite 7 piccoli pulsanti controlla 7 carichi da 10Ampere ciascuno.
Come base sono partito dalla modifica di un semplice sketch per far accendere un led tramite pulsante con debouncing.
Con l'aiuto del forum ho risolto diversi problemi riguardo vari aspetti http://arduino.cc/forum/index.php/topic,93482.0.html e poi ho aggiunto un buzzer che, solo al variare dello stato, mi avvisa tramite 2 suoni distinti, uno per l'ON e l'altro per l'OFF.
Per brevità vi riporto uno stralcio della parte riguardante il primo pulsante (in realtà è tutto moltiplicato per 7) e senza la parte "void buzz":
Code:
#define LED1 2
#define BUTTON1 14

int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;

void setup() {  
  pinMode(LED1, OUTPUT);  
  pinMode(BUTTON1, INPUT);
  pinMode(9, OUTPUT);
}  
  
void loop() {  
  val1 = digitalRead(BUTTON1);
    if ((val1 == HIGH) && (vecchio_val1 == LOW)){  
    stato1 = 1 - stato1;
     if (stato1 == 1) {
      buzz(9, 3000, 20);
      buzz(9, 3500, 25);
      buzz(9, 4000, 5);
     }
     else {
      buzz(9, 3000, 5);
      buzz(9, 2500, 25);
      buzz(9, 2000, 20);
     }
    delay(20);
  }  
  
  vecchio_val1 = val1;  
    if (stato1 == 1) {  
    digitalWrite(LED1, HIGH);
    delay(20);
  }  
  else {  
    digitalWrite(LED1, LOW);
    delay(20);
  }
delay(100);
}

Adesso per evitare che ad ogni spegnimento debba reimpostare ogni pulsante, vorrei aggiungere la funzione EEPROM.write per memorizzare sulla eeprom interna l'ultimo stato di ogni pulsante.
Ho modificato lo sketch così:
Code:
#define LED1 2
#define BUTTON1 14
#include <EEPROM.h>

int val1 = 0;
int vecchio_val1 = 0;
int stato1;        // ho eliminato lo stato1=1
int addr1 = 1;   // ho definito l'indirizzo dell'eeprom

void setup() {  
  pinMode(LED1, OUTPUT);  
  pinMode(BUTTON1, INPUT);
  pinMode(9, OUTPUT);
}  
  
void loop() {
  stato1 = EEPROM.read(addr1);   //vorrei che leggesse l'ultimo stato memorizzato
  val1 = digitalRead(BUTTON1);
    if ((val1 == HIGH) && (vecchio_val1 == LOW)){
      stato1 = 1 - stato1;
     if (stato1 == 1) {
      buzz(9, 3000, 20);
      buzz(9, 3500, 25);
      buzz(9, 4000, 5);
      EEPROM.write(addr1, stato1);   // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
     }
     else {
      buzz(9, 3000, 5);
      buzz(9, 2500, 25);
      buzz(9, 2000, 20);
      EEPROM.write(addr1, stato1);   // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
     }
    delay(20);
  }  
  
  vecchio_val1 = val1;  
    if (stato1 == 1) {  
    digitalWrite(LED1, HIGH);
    delay(20);
  }  
  else {  
    digitalWrite(LED1, LOW);
    delay(20);
  }
delay(100);
}

Purtroppo mi funziona esattamente al contrario, ad ogni riaccensione mi ritrovo nello stato inverso a quello lasciato.
Ho provato a modificare diverse volte il codice ma senza risultato...
« Last Edit: March 01, 2012, 06:22:29 pm by Muccio » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23133
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho dato una scorsa veloce e non ho capito la logica di funzionamento del tuo codice, sarà l'ora tarda...  smiley-confuse
Cmq per invertire lo stato di una variabile usa l'operatore XOR cioè "^"
stato=1
stato^=1
stato->0

stato=0
stato^=1
stato->1

Ho paura che col tuo codice stato1 assuma valori negativi, può farlo dato che la dichiari di tipo int, quindi un signed. Però ricordati che EEPROM.write/read lavorano su singoli byte, memorizzando un int non so se viene scritto solo il byte alto oppure i byte basso.

Insomma, intanto dichiara le variabili di stato di tipo byte, poi usa lo xor come ti ho detto e dopo riprova
Logged


La Spezia
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho dato una scorsa veloce e non ho capito la logica di funzionamento del tuo codice, sarà l'ora tarda...  smiley-confuse
Cmq per invertire lo stato di una variabile usa l'operatore XOR cioè "^"
stato=1
stato^=1
stato->0

stato=0
stato^=1
stato->1

Ho paura che col tuo codice stato1 assuma valori negativi, può farlo dato che la dichiari di tipo int, quindi un signed. Però ricordati che EEPROM.write/read lavorano su singoli byte, memorizzando un int non so se viene scritto solo il byte alto oppure i byte basso.

Insomma, intanto dichiara le variabili di stato di tipo byte, poi usa lo xor come ti ho detto e dopo riprova

Stasera mi ci rimetto sotto e provo a venirne a capo... Grazie!
Logged

Pages: [1]   Go Up
Jump to: