Pages: [1]   Go Down
Author Topic: Variabile non modificabile! help  (Read 690 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}

}
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Oppure inserisci
Code:
while(1);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Switzerland
Online Online
Faraday Member
**
Karma: 112
Posts: 5900
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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();
 }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

*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?
Logged

Pages: [1]   Go Up
Jump to: