Re: come tornare al void loop interrompendo una funzione in corso?

buonasera ragazzi sono nuovo nel forum chiedo scusa se faccio errori, volevo chiedervi se mi potete aiutare a fermare un loop, ho praticamente un cancello automatico che si deve aprire e dopo 9 sec avviene a chiusura, e dopo 9 sec dovrebbe staccare tutti e due pin che si dovrebbero tornare a zero. tutto questo viene gestito da un sensore ir.

#include <IRremote.h> // use the library
int receiver = 2; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

void setup()
{
 Serial.begin(9600); // for serial monitor output
 irrecv.enableIRIn(); // Start the receiver
 pinMode(13, OUTPUT); // Pin 13 output
 pinMode(12, OUTPUT); // Pin 13 output 
}
void loop()
{

 if (irrecv.decode(&results)) // have we received an IR signal?
 {
   Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
   irrecv.resume();// receive the next value
 }

 if ( results.value == 0x5DD231CE||  results.value == 0x5DD231CE)
 {   
 digitalWrite(13, HIGH);
delay(9000);
digitalWrite(13, LOW);
digitalWrite(12,HIGH);
delay(9000);
digitalWrite(12,LOW);
irrecv.resume();}  
}

Dovresti mettere il codice con l’apposito comando, il simbolo </> che trovi sopra, a sinistra.
Avresti fatto meglio ad aprire una nuova domanda invece di scrivere qui, dove si discute di altra cosa.
Però la sezione software è giusta. :smiley:

Basta azzerare il valore di result.value e il programma non eseguirà più quello che c’è nel blocco dell’if, in quando le condizioni non saranno verificate.

premesso che non sono pratico di trasmettitori/ricevitori ir, secondo me ci sono 2 cose che non vanno…

  1. c’è un irrecv.resume() di troppo. io toglierei il primo

  2. sposterei il secondo if dentro al primo

in pratica proverei così:

#include <IRremote.h> // use the library
int receiver = 2; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

void setup()
{
 Serial.begin(9600); // for serial monitor output
 irrecv.enableIRIn(); // Start the receiver
 pinMode(13, OUTPUT); // Pin 13 output
 pinMode(12, OUTPUT); // Pin 13 output 
}

void loop()
{

 if (irrecv.decode(&results)) // have we received an IR signal?
 {
   Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal

   if ( results.value == 0x5DD231CE||  results.value == 0x5DD231CE)
   {  
     digitalWrite(13, HIGH);
     delay(9000);
     digitalWrite(13, LOW);
     digitalWrite(12,HIGH);
     delay(9000);
     digitalWrite(12,LOW);
     // irrecv.resume(); secondo me questo va eliminato
   }
   irrecv.resume();// receive the next value
 } 
}

tieni poi presente che i delay() sono bloccanti, quindi se succede qualcosa in quei 9 + 9 secondi arduino non se ne accorge.

paulus1969:
Dovresti mettere il codice con l’apposito comando, il simbolo </> che trovi sopra, a sinistra.
Avresti fatto meglio ad aprire una nuova domanda invece di scrivere qui, dove si discute di altra cosa.
Però la sezione software è giusta. :smiley:

Basta azzerare il valore di result.value e il programma non eseguirà più quello che c’è nel blocco dell’if, in quando le condizioni non saranno verificate.

buongiorno, non so manco come ho fatto a scrivere la domanda. è il mio primo forum in tutta la mia vita, non so come fare per aprire la nuova domanda, chiudo scusa. comunque ho provato a togliere ir che ce sta in piu, niente stesso risultato. e mi hanno detto anche che delay non vanno usati in questi programma. in poche parole sto facendo la casa domotica.

fratt ti ringrazie di cuore, mamma mia ora funziona alla grande, grazie ancora. ora devo collegare i sensori fotocellule.