Ricevitore infrarossi con autoapprendimento

Voglio fare un programma che premendo un pulsante memorizza il codice del telecomando a infrarossi nella EEPROM di Arduino.
Ma come posso fare per far accendere e spegnere un led quando premo un tasto sul telecomando?
Nel mio sketch, premo il tasto che ho programmato e il led si accende, premo un altro tasto e il led si spegne.
Poi come posso ottimizzare il programma diminuendo gli accessi alla EEPROM?
Ecco lo sketch:

#include <EEPROM.h>
#include <IRremote.h>
int led=13;
int ledM=9;
int stato=0;
byte codice;
boolean memorizzare=false;
int buttonState;  
int ledState=0;

int RECV_PIN = 11;
const int buttonPin = 2; 
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(led,OUTPUT);
pinMode(ledM,OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
   int reading = digitalRead(buttonPin);
   if (reading==HIGH)
    {
      digitalWrite(ledM,HIGH);
      //memorizza(codice);
      memorizzare=true;
    }
  if (irrecv.decode(&results)) {
    codice= byte(results.value);
    Serial.println(codice);
    memorizza();
    if (codice==EEPROM.read(0))
    {
      if (stato==0)
      {
        stato=1;
      
   
      digitalWrite(led,HIGH);
      }
    }
    else {
    stato=0;
       digitalWrite(led,LOW);
  }
   
   
    irrecv.resume(); // Receive the next value
  }
}

void memorizza()
{
  if (memorizzare==true)
  {
      EEPROM.write(0,codice);
      memorizzare=false;
      digitalWrite(ledM,LOW);
  }
}

Per preservare la EEPROM basta che tu legga prima la cella che vuoi andare a scrivere e controllare se contiene già il valore che vuoi salvarci dentro. In caso affermativo, non fai nulla.

leo72:
Per preservare la EEPROM basta che tu legga prima la cella che vuoi andare a scrivere e controllare se contiene già il valore che vuoi salvarci dentro. In caso affermativo, non fai nulla.

Ok, questo lo so fare.
Ma per fare in modo che quando premo il tasto sul telecomando il led si accende, premo una altra volta e si spegne, come posso fare?

Con quella che viene chiamata variabile di stato.
Usi una variabile per memorizzare lo stato del led, quando arriva il comando dal telecomando iR non devi fare altro che vedere che stato ha quella variabile ed agire di conseguenza.

Una cosa del genere:

  1. arriva un segnale?
  2. sì, controllo se è giusto;
  3. se non è giusto, torno al punto 1)
  4. la variabile è a 1?
  5. sì, la pongo a 0;
  6. no, la pongo a 1;
  7. imposto il led di conseguenza (0=off, 1=on)
  8. torno a 1).

leo72:
Con quella che viene chiamata variabile di stato.
Usi una variabile per memorizzare lo stato del led, quando arriva il comando dal telecomando iR non devi fare altro che vedere che stato ha quella variabile ed agire di conseguenza.

Una cosa del genere:

  1. arriva un segnale?
  2. sì, controllo se è giusto;
  3. se non è giusto, torno al punto 1)
  4. la variabile è a 1?
  5. sì, la pongo a 0;
  6. no, la pongo a 1;
  7. imposto il led di conseguenza (0=off, 1=on)
  8. torno a 1).

si, ho fatto anche in questo modo, ma se tengo premuto il tasto sul telecomando il led lampeggia molto rapidamente.

Penso che lo faccia perchè non hai inserito nessun tipo di delay... e il telecomando invia semplicemente ON OFF ON OFF ON OFF ...
Credo che inserendo un delay adeguato nel loop, dopo che gli hai fatto cambiare lo stato, dovresti risolvere..
E' logico poi che se premi il tasto per più tempo del delay che hai inserito ti ritrovi nella stessa situazione.

Quindi per integrare quello che ti ha detto leo...
Una cosa del genere:

  1. arriva un segnale?
  2. sì, controllo se è giusto;
  3. se non è giusto, torno al punto 1)
  4. la variabile è a 1?
  5. sì, la pongo a 0;
  6. no, la pongo a 1;
  7. imposto il led di conseguenza (0=off, 1=on)
    8 ) inserisco un delay adeguato
  8. Torno a 1

alex27riva:
si, ho fatto anche in questo modo, ma se tengo premuto il tasto sul telecomando il led lampeggia molto rapidamente.

Scusa, alex27riva:
non possiamo sapere cosa vuoi fare nel dettaglio... né farti il programma ad hoc.
Ti do/diamo delle linee guida, poi sta a te ampliare la cosa e sistemarla secondo le esigenze ed i problemi che riscontri.
Se il problema è appunto il passaggio rapido fra un caso ed un altro, l'aggiunta di un delay per evitare pressioni a distanza ravvicinate può essere d'aiuto, ma può essere anche un altro sistema, ossia quello di usare un while ed uscire dal ciclo solo nel momento in cui non arriva più un segnale per un certo lasso di tempo.

leo72:

alex27riva:
si, ho fatto anche in questo modo, ma se tengo premuto il tasto sul telecomando il led lampeggia molto rapidamente.

Scusa, alex27riva:
non possiamo sapere cosa vuoi fare nel dettaglio... né farti il programma ad hoc.
Ti do/diamo delle linee guida, poi sta a te ampliare la cosa e sistemarla secondo le esigenze ed i problemi che riscontri.
Se il problema è appunto il passaggio rapido fra un caso ed un altro, l'aggiunta di un delay per evitare pressioni a distanza ravvicinate può essere d'aiuto, ma può essere anche un altro sistema, ossia quello di usare un while ed uscire dal ciclo solo nel momento in cui non arriva più un segnale per un certo lasso di tempo.

Sisi, ok.
Grazie, con il delay funziona bene.