associare dato EEPROM a pulsante

Salve, mi rivolgo al forum per un consiglio su come impostare una funzione..

Ho dei dati salvati sulla memoria EEPROM di arduino, tramite un'applicazione android apposita che scrive e salva i dati. Avrei bisogno che alla pressione di un pulsante venga letto quel dato particolare su quella cella EEPROM.

Ad esempio, se sulla cella 106 ho il numero 010 vorrei che quando premo il pulsante venga letta questa variabile e si accenda un led ad esempio.

Le variabili da leggere alla pressione del pulsante in realtà non è una sola ma sarebbero almeno tre..

Io avevo impostato il codice così

void loop()

{

if (digitalRead(p1)==HIGH)

{
 EEPROM.read(106)==010 && EEPROM.read(146) == 002 && EEPROM.read(001) == 011

delay(10)

{ digitalWrite(led1, HIGH);

}
}
}

Ma non funziona, il led si accende senza tener conto della lettura. Cambiando variabili il led si accende lo stesso.

Pensavo allora di impostarlo così

void loop()

{
if ( EEPROM.read(106)==010 && EEPROM.read(146) == 002 && EEPROM.read(001) == 011)

{
 
if (digitalRead(p1)==HIGH)
{
digitalWrite(led1, HIGH);
}
}
}

Le variabili possono essere modificate dall'utente con un' applicazione che comunica con Arduino per cui possono cambiare quindi quel pulsante deve leggere anche i cambiamenti e far accendere altri led.

Vi ringrazio per la disponibilità

Il primo approccio è quello più corrtto, ovvero se il pulsante è premuto vai a leggere la EEPROM e decidi di conseguenza se accendre il led in base ai valori letti. Il problema è che manca l'if così come lo hai fatto nel secondo approccio ovvero:
SE il valore letto nella cella 106 è uguale a N E il valore letto nella cella 146 è ugual a M ALLORA
a accendi il led
ALTIMENTI
spengi il led

Detto che si potrebbe fare anche senza l'if a scopo di comprensione usa l'if seguendo il primo approccio che hai avuto.
Venendo ai valori di confronto nelle celle vi è memorizzato un byte quindi il conrollo lo puoi tranquillamente fare così:

EEPROM.read(106)==10

Se vuoi invece confrontare il valore esadecimale o ottale, ecc. la forma per indicare tali valori è diffrente (Sintassi C) ma anche questo non credo sia il tuo caso quindi per il momento non vdo oltre per noncreare ulteriore confusione

Ti ringrazio davvero per la risposta..

Ho seguito il tuo consiglio e ho messo if prima delle letture EEPROM nel primo approccio ma purtroppo ancora niente, il pulsante se ne sbatte di leggere lo stato della EEPROM. Allego anche il secondo caso così da capire meglio..

 if(digitalRead(P1) == HIGH)
   {  if (EEPROM.read(001) == 001 && EEPROM.read(106)==001 && EEPROM.read(146)==002)

  
  delay(10); // software de-bounce
     {

      digitalWrite(led1, HIGH);
      delay(250);
       } 


 if(digitalRead(P1) == HIGH)

   {  if (EEPROM.read(001) == 002 && EEPROM.read(106)==002 && EEPROM.read(146)==002) //cambio le variabili

  
  delay(10); // software de-bounce
     {
  
     digitalWrite(led2, HIGH);
      delay(250);
       } 
 
  }
    }

ho provato a cambiare anche i valore della EEPROM, praticamente lo stesso pulsante P1 quando legge i valori deve accendere led diversi, nel secondo caso la EEPROM manda numeri diversi nelle celle e il p1 di fatto deve accendere il led2. Ma con questo codice, qualsiasi valore in EEPROM io salvi il pulsante fa accendere prima led1 e poi alla seconda pressione il led2. :disappointed_relieved:

Sicuramente colpa mia ma non capisco dove
grazie.

Il problema è nlla sintassi dell'if, tu hai msso un dlay prima dell'apertura delle graffe, il compilatore interpreta il codice in modo che l'if di fatto non esegue nulla, la sintassi corretta è:

if(condizione)
{
   cosa da fare se la condizione è vera
}
else
{
  cosa da fare se la condizione è falsa
}

Anche perché il delay da solo non serve a fare il debounce, per ora eliminalo e passa al debounce hardware che con un condensatore ed una resistenza ti elimina ogni problema e orpello software.
Poi confrontare 001 o 1, 002 o 2 non cambia assolutamente nulla, anzi può peggiorare la lettura del codice da parte degli umani e far credere che tu stia cercando di confrontare con una notazione differente rispetto a quella decimale

Ancora grazie

Ho modificato secondo le tue indicazioni ma purtroppo devo avere un problema a monte a questo punto, proprio con la codifica delle EEPROM. In questo caso il pulsante mi esegue la funzione dell'else ovvero fa ciò che deve fare se non si crea l'if. Quindi se l'if non si crea ho un problema con la lettura delle variabili.

Allego come immagine il risultato che ottengo da serial monitor quando scrivo e salvo nella EEPROM

I valori che interessano in questo il pulsante 1 sono quelli delle celle
001 con valore 001
106 con valore 001
146 con valore 002

in questo caso io ho richiamato questo if ed else

if(digitalRead(p1) == HIGH)
   {  if (EEPROM.read(1) == 1 && EEPROM.read(106)== 1 && EEPROM.read(146)== 2)  //midi, note, CC,PC
 
  
  
     {
 
     digitalWrite(led1, HIGH);
      delay(250);
       } 
else 
{   
  digitalWrite(led1, LOW); 
      delay(250);
}

Mi esegue direttamente l'else.

Grazie

Allora adsso la porzione di codice sembra corretta, ma non vedendo come scrivi la EEPROM, ma anche parlando più in generale, quando si hanno problemi ch non si riescono a capire solo guardando il codice l'unico valido aiuto che ti può venire ad aiutare è il monitor seriale. Metti messaggi di debug per aiutarti a capire come mai l'if si comporta in tal modo, un possibile metodo potrebbe essere:

byte valoreUno = EEPROM.read(1);
byte valoreDue = EEPROM.read(106);
byte valoreTre = EEPROM.read(146);
Serial.println(F("Valori letti da eepprom"));
Serial.print(valoreUno);
Serial.print(valoreDue);
Serial.print(valoreTre);
if(valoreUno  == 1 && valoreDue == 1 && valoreTre == 2)
{
...

In base a ciò che leggi sul monitor seriale puoi dedurre cosa non permatta l'ingresso nel ramo then dell'if

Ok grazie, provo appena possibile. Ma la lettura del pulsante la inserisco prima o dopo l'if delle eeprom?

grazie

Prima leggi il pulsante e poi eventualmente la EEPROM