problema con ir receiver module

Ciao ragazzi avrei bisogno di una mano, non sono tanto esperto con arduino, ma stavo provando a collegare un telecomando ad arduino per ricevere impulsi e farmi avviare un motore 3-6V(sto facendo le prove con un led), dovrei fare che quando premo un bottone mi si avvia il motore e quando lo rilascio si spegne, sto utilizzando la libreria IRremote ed attualmente quando premo il bottone mi si accende e quando lo rilascio continua a stare acceso, mi si spegne solo se premo un qualsiasi altro bottone, vi allego codice e una foto dei collegamenti, spero possiate aiutarmi grazie.

Foto:

#include <IRremote.h>
IRrecv irrecv(11);                  //pin sensore IR infrarossi
decode_results res;                 //salva i bottoni premuti qui dentro




void setup() {
  Serial.begin(9600);               //inizializzo monitor seriale
  irrecv.enableIRIn();              //inizializzo il sensore IR
  pinMode(4, OUTPUT);               //pin motore ruote
}



void loop() {
 
  if (irrecv.decode(&res)) { // se riceve impulsi
   if (res.value == 0xFD8877) {        // se corrisponde al tast FD8877                
      digitalWrite(4, HIGH); //accendi led
   
    }else{digitalWrite(4, LOW);} //altrimenti spegnilo
     
 irrecv.resume(); //pronto a ricevere nuovi impulsi
                            
  }else {res.value = 0; } //se non riceve nuovi impulsi porta value a 0
   Serial.println(res.value, HEX); //stampami lo stato value


}

Buonasera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

fabpolli:
Buonasera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Il regolamento lo avevo letto, la presentazione l'ho appena fatta, grazie per la dritta :slight_smile:

Non credo puoi sapere se il tasto viene rilasciato.
eventualmente puoi vedere se per un certo tempo non arriva più lo stesso tasto, usando la millis() ma non è molto semplice

Inoltre, quando tieni premuto lo stesso tasto, i telecomandi si comportano in 2 maniere diverse.

  1. alcuni telecomandi inviano sempre lo stesso codice
  2. altri invece inviano appena premi il codice del tasto e poi inviano 0xFFFFFF finchè tieni premuto lo stesso tasto

nid69ita:
Non credo puoi sapere se il tasto viene rilasciato.
eventualmente puoi vedere se per un certo tempo non arriva più lo stesso tasto, usando la millis() ma non è molto semplice

Inoltre, quando tieni premuto lo stesso tasto, i telecomandi si comportano in 2 maniere diverse.

  1. alcuni telecomandi inviano sempre lo stesso codice
  2. altri invece inviano appena premi il codice del tasto e poi inviano 0xFFFFFF finchè tieni premuto lo stesso tasto

Il mio manda sempre lo stesso codice, il punto è che quando premo il tasto uno lui in value salva il codice 10 fino a quando non premo un altro tasto e cosi lo cambia, si dovrebbe azzerare ogni volta che rilascio

così mi funziona solo che va a scatti perché c'e il delay, ma senza delay non va

void loop() {

  if (irrecv.decode(&res)) {
         irrecv.resume();
        
    
    if (res.value == 0x10) {
      digitalWrite(4, HIGH) ;

    }
    
  } else {
    res.value = 0;

  }
  if (res.value != 0x10) {
    digitalWrite(4, LOW) ;

  }
 
  delay(100);
  Serial.println(res.value, HEX);


}

Non devi usare il delay() ma imparare a usare la millis()
Devi imparare a fare le temporizzazioni usando la millis() ma non è semplice

Quoto l'admin Guglielmo:

... per capire bene come usare la funzione millis(), che ti è stata da più persone suggerita, prova a leggere prima QUI, poi QUI ed infine leggi anche QUI e QUI ... doversi avere una visione migliore di come utilizzarla e quindi di come applicarla al tuo programma.

nid69ita:
Non devi usare il delay() ma imparare a usare la millis()
Devi imparare a fare le temporizzazioni usando la millis() ma non è semplice

Quoto l'admin Guglielmo:

... per capire bene come usare la funzione millis(), che ti è stata da più persone suggerita, prova a leggere prima QUI, poi QUI ed infine leggi anche QUI e QUI ... doversi avere una visione migliore di come utilizzarla e quindi di come applicarla al tuo programma.

Grazie mi farò una bella lettura allora