[RISOLTO]EEPROM CONTATORE.

Salve,a tutti sono sempre quello nuovo,.

1)Se salvo solo uno funziona se voglio salvare entrabbi i due contatori mi danno sempre 0

#include <EEPROM.h>

#include <Bridge.h>


int buttonPin = 7;   
char buttonState = 0; 
int contatore =0;
int addr_a = 0;
int buttonPin6 = 6;   
char buttonState6 = 0; 
int contatore6 = 0;
int addr_ b = 0;>>>>>>>>>era qui dove sbagliavo   (addr_b = 1;

void setup()
{
   Bridge.begin();   
    delay(1000);
    Bridge.put("CONTATORE", String(addr_a));  
    Bridge.put("CONTATORE6", String(add_b));
    contatore = EEPROM.read (addr_a);
    contatore6 = EEPROM.read(addr_b);
}

void loop() {
    buttonState = digitalRead(buttonPin);
    /* Every 200ms: */
  if (buttonState == LOW) {  
     contatore = contatore +1; EEPROM.write(addr_a,contatore); 
     delay(500);
     Bridge.put("CONTATORE", String(contatore));
      
     
  }
   Bridge.put("CONTATORE",String(contatore));
   
       buttonState6 = digitalRead(buttonPin6);
    /* Every 200ms: */
  if (buttonState6  == LOW) {  
     contatore6 = contatore6 +1; EEPROM.write(addr_b,contatore6);
      delay(500);  
     Bridge.put("CONTATORE6", String(contatore6));
  }
  
     Bridge.put("CONTATORE6", String(contatore6)); 
}

La prima cosa da fare è salvare i due contatori a indirizzi diversi della EEPROM, al momento li salvi entrambi a 0, per cui l'ultimo che vai a scrivere sovrascriverà il precedente.

Oltre a questo, se il tuo contatore è un int, devi usare EEPROM.put() invece di EEPROM.write(), visto che un int occupa più di un byte. Di conseguenza, anche gli indirizzi dovranno essere sufficientemente distanti per permettere la scrittura del dato intero.

Grazie , provo subito.

SukkoPera Un piccolo esempio di codice nooo.

Grazie anticipatamente.

Ciao,

considera che nel tempo in cui il pulsante rimane premuto, arduino fa in tempo e ciclare molte volte. Questo vuol dire che per ogni pressione probabilmente il contatore in EEPROM verrà incrementato più di una volta e non varrà, come immagino desideri, il numero di volte che il pulsante è stato premuto.

Per ottenere quello che vuoi, penso tu debba mantenere lo stato precedente del pulsante ed aggiornare il contatore soltanto quando lo stato cambia.

Una cosa tipo (per un solo pulsante):

int buttonPin = 7;   
int buttonState = HIGH; 
int oldButtonState = HIGH; 
int contatore =0;

void setup()
{
...
}

void loop() 
{
    buttonState = digitalRead(buttonPin);
    
    if (buttonState == LOW && buttonState != oldButtonState) 
    {  
       contatore = contatore +1;
    }

    oldButtonState = buttonState;
}
    







void setup()
{
   Bridge.begin();   
    delay(1000);
    Bridge.put("CONTATORE", String(addr_a));  
    Bridge.put("CONTATORE6", String(add_b));
    contatore = EEPROM.read (addr_a);
    contatore6 = EEPROM.read(addr_b);
}

void loop() {
    buttonState = digitalRead(buttonPin);
    /* Every 200ms: */
  if (buttonState == LOW) {  
     contatore = contatore +1; EEPROM.write(addr_a,contatore); 
     delay(500);
     Bridge.put("CONTATORE", String(contatore));
      
     
  }
   Bridge.put("CONTATORE",String(contatore));
   
       buttonState6 = digitalRead(buttonPin6);
    /* Every 200ms: */
  if (buttonState6  == LOW) {  
     contatore6 = contatore6 +1; EEPROM.write(addr_b,contatore6);
      delay(500);  
     Bridge.put("CONTATORE6", String(contatore6));
  }
  
     Bridge.put("CONTATORE6", String(contatore6)); 
}

a Vittorio68.
Grazie mille funziona bene il pulsante,

ma avrei un’altro problemino con l’EEPROM mi parte sempre il contatore a 255 e non riesco a dare due indirizzi diversi .

Grazie anticipatamente.

Ciao,

il contatore parte da 255 perché le locazioni di memoria della EEPROM non inizializzate valgono 255.

Potresti inserire nel setup un if che controlla il valore di contatore dopo aver fatto la EEPROM.read; se è 255 lo poni a zero e lo aggiorni in EEPROM con una write. Ovviamente questo vuol dire che se hai premuto il pulsante 255 volte al prossimo riavvio il valore si azzererebbe. Qui devi valutare tu come gestire l'overflow del contatore.

Nel tuo sketch per usare due locazioni diverse è sufficiente usare valori diversi per addr_a e addr_b; addr_a = 0 e addr_b = 1 ti farebbe utilizzare la prima locazione per la variabile contatore e la seconda per la variabile contatore6.

Ciao,Vittorio69.
Con un pulsante funziona tutto e bene ,il mio progetto è quello di funzionare quattro bottoni piu’ un reset

due bottoni devono conteggiare i parziali e due i totali cioè non devono essere resettati.

#include <Bridge.h>

#include <EEPROM.h>

const int buttonreset = 4;
int buttonStater = HIGH;
int oldButtonStater = HIGH;

const int buttonPin = 7;   
int buttonState = HIGH;
int oldButtonState = HIGH;
int contatoretot1 =0;
int addr_a = 0;

const int buttonPin6 = 6;   
int buttonState6 = HIGH;
int oldButtonState6 = HIGH;
int contatore6 =0;
int addr_i = 0;



void setup()
{
   Bridge.begin();   
    delay(1000);
    Bridge.put("CONTATORE-TOT-1", String(addr_a));
    contatoretot1 = EEPROM.read (addr_a);
    Bridge.put("CONTATORE-TOT-2", String(addr_i));  
    contatore6 = EEPROM.read (addr_i);
    pinMode(buttonreset,INPUT);
}

void loop() {
    buttonState = digitalRead(buttonPin);
    /* Every 200ms: */
  if (buttonState == LOW && buttonState !=oldButtonState) {  
 contatoretot1 = contatoretot1 +1; EEPROM.write(addr_a,contatoretot1);
     }
      oldButtonState = buttonState;
     Bridge.put("CONTATORE-TOT-1", String(contatoretot1));

     
 buttonState6 = digitalRead(buttonPin6);
    /* Every 200ms: */
  if (buttonState6 == LOW && buttonState6 != oldButtonState6) {  
  contatore6 = contatore6 +1; EEPROM.write(addr_i,contatore6);
     }
      oldButtonState6 = buttonState6;
     Bridge.put("CONTATORE-TOT-2", String(contatore6));

     buttonStater = digitalRead (buttonreset);
    if (buttonStater == LOW) {contatore6=0;EEPROM.write(addr_i,contatore6);}

 

   
     }