problema nel caricamento da EEPROM oppure nel salvataggio

Ciao a tutti, scusate se vi chiedo assistenza, ma ho provato in mille modi e non sono riuscito ad avere il caricamento di un parametro.
Ho fatti un codice di un timer pausa / lavoro con tempi individuali regolati tramite un' encoder e tutto funziona. basta premere il tasto sul' encoder per selezionare il tempo da impostare, ma non riesco a salvare e a caricare. Premetto che ho gia fatto progetti simili ma i parametri vengono salvati in modo corretto, io credo che ci sia un problema da qualche parte nello Sketch che mi impedisce di avere il dato salvato.

Il caricamento del dato avviene al' inizio nel setup, mentro il salvataggio avviene tramite pressione del tasto sul' encoder.

Non so se il problema dipende dal salvataggio oppure dal caricamento. Potete dare un' occhio veloce al codice?
Grazie, solo voi potete risolvere il mio problema, intanto vedo se riesco da solo. :slight_smile:

#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


const int relayPin = 9;          //the relay module S pin connected to digital pin 8
int ledState = 0; // ledState used to set the LED
unsigned long previousMillis = 0; //will store last time LED was updated


int encoderPin1 = 6;
int encoderPin2 = 7;
int SECONDI;
int SECONDI2;

volatile int lastEncoded = 0;
volatile long encoderValue;
volatile long encoderValue2;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;
int PinSwitch = 8;
int pippo = 0;


void setup() {
  encoderValue = EEPROM.read(1)*1000;  //---------------------------------- LETTURA VALORE ENCODER
  Serial.print(encoderValue);
  delay(1500);
  pinMode(PinSwitch, INPUT_PULLUP);

  //  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);   
  lcd.begin(16, 2);
  Serial.begin(9600);

  pinMode(encoderPin1, INPUT_PULLUP);
  pinMode(encoderPin2, INPUT_PULLUP);






  delay(20);
  attachInterrupt(0, updateEncoder, CHANGE);




}



void loop() {




  if (ledState == 0) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis > encoderValue) {
      previousMillis = currentMillis;
      ledState = 1;
      digitalWrite(relayPin, ledState);
    }

  }


  if (ledState == 1) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis > encoderValue2) {
      previousMillis = currentMillis;
      ledState = 0;
      digitalWrite(relayPin, ledState);
    }

  }



  if (pippo == 0) {

    lcd.setCursor(7, 0);
    lcd.print("<");
    lcd.setCursor(7, 1);
    lcd.print(" ");
  }

  if (pippo == 1) {

    lcd.setCursor(7, 1);
    lcd.print("<");
    lcd.setCursor(7, 0);
    lcd.print(" ");

  }



  // SCEGLI QUALE TEMPO IMPOSTARE
  
  int lettura_Switch = digitalRead(8);

  if (lettura_Switch == LOW) {
    pippo++;
    Serial.print(pippo);
    EEPROM.write(1, encoderValue);  // //---------------------------------- SALVATAGGIO VALORE ENCODER

    delay (500);
  }
  if ( pippo > 1) pippo = 0;

  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



  SECONDI = encoderValue / 1000;
  SECONDI2 = encoderValue2 / 1000;
  lcd.setCursor(0, 0);
  lcd.print("Tf=");
  lcd.print(SECONDI);
  lcd.print("       ");


  lcd.setCursor(0, 1);
  lcd.print("Tr=");
  lcd.print(SECONDI2);
  lcd.print("       ");


}


// PARAMETRI RELATIVI AL' ENCODER  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


void updateEncoder() {

  if (encoderValue < 2000) encoderValue = 2000;
  if (encoderValue2 < 2000) encoderValue2 = 2000;


  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value



  if (pippo == 0) {

    if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue = encoderValue + 1000;
    if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue = encoderValue - 1000;
  }

  if (pippo == 1) {

    if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue2 = encoderValue2 + 1000;
    if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue2 = encoderValue2 - 1000;
  }
  lastEncoded = encoded; //store this value for next time

}

/code]

Non puoi usare la write per scrivere un long nella eeprom, la write scrive un byte, usa invece la update()
Per leggere non usare la read ma usa la get() e non moltipicare il valore letto per 1000 che non serve.
In qualche post dei giorni addietro qualcuno ha postato un pdf con l'utilizzo della EEPROm in modo superfetticiente made by ATMEL ma non ricordo chi

fabpolli:
Non puoi usare la write per scrivere un long nella eeprom, la write scrive un byte, usa invece la update()
Per leggere non usare la read ma usa la get() e non moltipicare il valore letto per 1000 che non serve.
In qualche post dei giorni addietro qualcuno ha postato un pdf con l'utilizzo della EEPROm in modo superfetticiente made by ATMEL ma non ricordo chi

Sei stato veramente di grande aiuto, ti ringrazio moltissimo :slight_smile:
Ho cambiato il tipo di variabile mettendola come intera e adesso il salvataggio funziona, ma memorizza solo valori fino a 256 e non oltre. Se immetto per esempio 300, mi salva come numero 122
Potrebbe andare bene se utilizzo al posto dei secondi, i minuti, ma sarei comunque limitato al numero massimo memorizzabile.
Che differenza c'è tra la Write e la Get?

Non ti salva il valore perché se continui a usare la write che salva un dato di tipo byte non funzionerà mai.
In effetti ho fatto un errore a segnalarti la funzione update perché anch'essa scrive un byte e non un long, usa la
put() che si preoccupa di scrivere un dato di qualunque tipo.
Per venire alla tua domanda la write scrive un valore (byte) e la get legge un valore (qualunque tipo).
quindi
write, update --> scrivoun un byte
put --> scrive un dato di qualunque tipo
read --> legge un byte
putget --> legge un dato di qualunque tipo

Attenzione sche se scrivi in eeprom alla posizione 1 un dato con tipo più grande del byte non puoi scrivere un altro data alla posizione 2 poiché sovrascriveresti i dati

fabpolli:
write, update --> scrivoun un byte
put --> scrive un dato di qualunque tipo
read --> legge un byte
put --> legge un dato di qualunque tipo

Ultimamente ti vedo distratto, hai sbagliato pure qui... :wink:
L'ultima riga è la "get" non "put".. :smiley: :smiley: :smiley:

docdoc:
Ultimamente ti vedo distratto, hai sbagliato pure qui... :wink:
L'ultima riga è la "get" non "put".. :smiley: :smiley: :smiley:

:sleeping:

Corretto grazie