Problema con EEPROM e ATTINY45

Sto impazzendo con questo semplicissimo sketch che faccio girare su un ATTINY45. Appena do alimentazione funziona tutto correttamente in modo ciclico; io vorrei memorizzare in EEPROM l'ultimo stato per quando lo spengo, in modo che riaccendendo la sequenza parta esattamente da quel punto. Se spengo quando status e movim sono entrambi a 0 (spia LAMP spenta), alla riaccensione funziona tutto correttamente.
Se invece spengo quando stato e movim sono entrambi a 1 (spia LAMP accesa), alla riaccensione la spia si riaccende normalmente (vedi controllo nel setup) però il ciclo riparte dall'inizio.
Ho la sensazione che sia un problema di utilizzo della EEPROM, possibile che non vada bene sull'ATTINY45? O mi sta banalmente sfuggendo qualcosa?

#include <EEPROM.h>
#define puls 3 //pin 2
#define sens 4 //pin 3
#define RL1 1 //pin 6 movimento orario
#define RL2 0 //pin 5 movimento antiorario
#define LAMP 2 //pin 7
int stato = 0;
int movim = 0;

void setup() {
pinMode(puls, INPUT_PULLUP);
pinMode(sens, INPUT);
pinMode(RL1, OUTPUT);
pinMode(RL2, OUTPUT);
pinMode(LAMP, OUTPUT);
int stato = EEPROM.read(0); // legge l'ultimo valore dalla EEPROM
int movim = EEPROM.read(1); // legge l'ultimo valore dalla EEPROM

if (stato == 1 && movim ==1)
{
  digitalWrite(LAMP, HIGH);
}

}

void loop() {

// premo il pulsante e si accende RL1
if ((digitalRead(puls)==LOW) && stato==0 && movim==0)
  {
    digitalWrite(RL1,HIGH);
    digitalWrite(RL2,LOW);
    stato=0;
    movim=1;
    EEPROM.write(0,0);//memorizza stato
    EEPROM.write(1,1);//memorizza movim
    delay(2000);
  }

// attivo il sensore - relè spenti - spia accesa
if ((digitalRead(sens)==LOW) && stato==0 && movim==1)
  {
    digitalWrite(RL1,LOW);
    digitalWrite(RL2,LOW);
    stato=1;
    movim=1;
    EEPROM.write(0,1);//memorizza stato
    EEPROM.write(1,1);//memorizza movim
    digitalWrite(LAMP, HIGH);
  }

// ripremo il pulsante - si accende RL2 - la spia si spegne
if ((digitalRead(puls)==LOW) && stato==1 && movim==1)
  {
    digitalWrite(LAMP,LOW);
    digitalWrite(RL1,LOW);
    digitalWrite(RL2,HIGH);
    stato=1;
    movim=0;
    EEPROM.write(0,1);//memorizza stato
    EEPROM.write(1,0);//memorizza movim
    delay(2000);
  }  

// attivo il sensore - relè spenti - spia spenta
if ((digitalRead(sens)==LOW) && stato==1 && movim==0)
  {
    digitalWrite(RL1,LOW);
    digitalWrite(RL2,LOW);
    stato=0; 
    movim=0;
    EEPROM.write(0,0);//memorizza stato
    EEPROM.write(1,0);//memorizza movim
  }
}

Posso vedere il codice?

Certo, scusami, l'ho appena aggiunto, mi sono rimbambito :tired_face:

Non capisco come sei messo come debounce

Se non metti almeno un delay forse ti scappa uno stato

Il delay c'è alla fine del controllo della pressione del pulsante ed è anche consistente, durante il funzionamento normale non perde un colpo. Il problema si verifica quando spengo il sistema e lo riaccendo, apparentemente memorizza l'ultimo stato ma di fatto non si comporta correttamente, ecco perché credo che il problema sia nella gestione dell'EEPROM.

Trovato

Stato e movimento sono locali alla setup

Grazie per il suggerimento, se ho ben capito non deve stare nel setup, ho aggiunto un flag nelle dichiarazioni e ho messo questo gruppo all'inizio del loop:

if(inizio==0)
  {
    int stato = EEPROM.read(0); // legge l'ultimo valore dalla EEPROM
    int movim = EEPROM.read(1); // legge l'ultimo valore dalla EEPROM
    if (stato == 1 && movim ==1)
      {
        digitalWrite(LAMP, HIGH);
      }
    inizio = 1;
  }

in questo modo questo controllo viene eseguito una sola volta all'accensione, ma la cosa non cambia. Se io spengo il circuito nella condizione stato =1 e movim =1, quando lo riaccendo, la spia si accende nel controllo iniziale (e quindi sembra memorizzata la condizione allo spegnimento) ma premendo il pulsante dovrebbe eseguire il terzo gruppo, cioè: spegnere la spia e accendere RL2, invece la spia resta accesa e si accende di nuovo RL1. In pratica sembra memorizzare le due variabili ma è come se le riuscisse ad usare solo nel controllo iniziale per poi andare entrambe a 0.

No

Devi togliere solo la dichiarazione
Invece di
Int stato =
Solo
Stato=

E la dichiarazione int stato la metyi nel preambolo

1 Like

Ok pomeriggio provo e ti faccio sapere. Grazie mille.

Funziona! Era come dicevi tu, dichiarandole in pratica assegnavo il valore temporaneamente. Grazie mille per l'aiuto.

Figurati

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.