Go Down

Topic: Variabile non modificabile! help (Read 816 times) previous topic - next topic

mommi94

non riesco a modificare una variabile.. sarebbe questa qui "results.value".
Questa variabile viene utilizzata per leggere i codici da un telecomando, quando schiaccio un tasto del telecomando il ciclo if richiesto esegue il suo ciclo all' infinito!! come un loop!. io vorrei che la eseguisse una sola volta, cosi ho pensato di azzerare la variabile una volta finito il programma, ma non si può in quanto result.value non è un int e il punto lo vede come errore.
C'è una soluzione per azzerare la variabile? oppure per eseguire una sola volta il ciclo if?
Quote

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX);
   irrecv.resume(); // Receive the next value
 }
if (results.value == 0x21){
digitalwrite (variabile, HIGH);
delay (300);
digitalwrite (variabile, LOW);
}

}

tuxduino

Se vuoi eseguire del codice una sola volta, mettilo in setup().

Oppure inserisci
Code: [Select]
while(1);

mommi94

Cosi funziona una sola volta, poi non posso più richiamare la funzione con il telecomando

gpb01

Scusa, premesso che NON conosco la libreria che stai usando (IRremote), ma comunque ... se sposti l'if in modo che venga eseguito SOLO se c'è qualche cosa di disponibile ?

Code: [Select]

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX);
   if (results.value == 0x21){
      digitalwrite (variabile, HIGH);
      delay (300);
      digitalwrite (variabile, LOW);
   }
   irrecv.resume(); // Receive the next value
 }
}


... potrebbe andare ?

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed


non riesco a modificare una variabile.. sarebbe questa qui "results.value".


Perché non è una variabile, è una proprietà di un oggetto.
Devi eseguire l'azione abbinata al tasto del telecomando all'interno della if che verifica l'avvenuta ricezione di un nuovo codice, puoi farlo con una serie di if in cascata oppure con una switch.

Code: [Select]

if (irrecv.decode(&results))
{
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
   
    if (results.value == 0x21) quellochedevofare1();
    if (results.value == 0x22) quellochedevofare2();
    if (results.value == 0x23) quellochedevofare3();
}

mommi94

cosi ho fatto anche io, se premo un'altro tasto esco dall'if, ma io vorrei uscire dall'if quando una variabile è minore di 20 (questa variabile è il sensore ad ultrasuoni) quando si avvicina ad un ostacolo si deve fermare! ma questo non lo fa perchè ci sono 2 if che lavorano insieme.
una è quella del sensore che gli dice di fermarsi e l'altra del IR che è fissa e quindi rimane quella di prima che fa andare i motori.

mommi94

funziona!! come avete detto voi, però ho trovato un'altro problema, quando schiaccio il tasto del telecomando il ciclo viene eseguito 2 volte perchè è troppo veloce. Quindi ho messo un delay dopo il volpiu = 0;  ma appena volpiu diventa 0 esce dal ciclo senza leggere il delay  :smiley-eek:  se metto il delay prima di  volpiu = 0; la variabile viene incrementata dopo il delay e questo rallenta l'incremento, però viene eseguita una sola volta.
c'è un modo di mettere un delay prima che esca dal ciclo?

Quote

   if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX);
   
if (results.value == 0x828 )  { volpiu=1;  } 

   irrecv.resume(); // Receive the next value
   
    }
   
if( volpiu == 1 && m<256)  //vol+
{
m=m+10;
volmeno = 0;
delay (500);
}


leo72

Metti il delay dopo la lettura del tasto premuto, così sei sicuro che ti farà il ritardo sia se il volume viene incrementato sia che non lo sia.

mommi94

*nel programma postato ho sbagliato a riscrivere il programma, non centra niente volmeno, ma è piu volpiu.

non deve aspettare. Dopo che io premo il tasto, lo deve incrementare subito e si deve fermare
altre idee?

Go Up