errori

salve, ho un problema con un errore che mi visualizza e avrei bisogno del vostro aiuto, questo è il codice:

#include <IRremote.h>

const int RECV_PIN = 12;
int redpin = 13;
IRrecv irrecv(RECV_PIN);

decode_results results;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(redpin, OUTPUT); 
}


void loop() {
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX); 

    if (results.value == 0xE0E036C9) {      

      digitalWrite(redpin, HIGH); 

    }
    } 
    if (delay (1000)) {
      digitalWrite(redpin, LOW); 
    }
   
    irrecv.resume(); 
  }

e questo invece è l’errore:

 error: could not convert 'delay(1000ul)' from 'void' to 'bool'

come posso risolvere? grazie in anticipo.

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (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 tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

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 farla al più presto. :wink:

La delay() non ritorna nessun valore, quindi non puoi metterla in un if
La delay attende e ferma Arduino per il tempo che indichi in parentesi. Non fa altro

Come ti è stato detto, in questo caso delay non va bene, devi
lavorare con millis...

cioè?

davidemusco02:
cioè?

cioè… intanto quando si chiede aiuto bisognerebbe almeno dire cosa si vuole ottenere!

Dal reference di if else (leggilo)

The if statement checks for a condition and executes the proceeding statement or set of statements if the condition is ‘true’.

Dal reference di delay (leggilo)

Pauses the program for the amount of time (in milliseconds) specified as parameter.

Returns Nothing

Quindi se ritorna niente, non la puoi usare come condizione per qualcosa che si aspetta true o false, che è quello che ti sta dicendo l’errore, “non posso convertire niente in true/false”, come ti ha già spiegato @nid69ita

Se come sospetto, vuoi spegnere il led dopo un secondo che l’hai accesso, allora ti basta

if (results.value == 0xE0E036C9) { //se il valore è uguale a ...
  digitalWrite(redpin, HIGH); //accende il led
  delay (1000); //aspetta un secondo
  digitalWrite(redpin, LOW); // spegne il led
}

@Stilita, si riferisce al fatto che solitamente si sconsiglia l’uso di delay proprio perchè blocca l’esecuzione del loop, ma onestamente credo che per l’uso di millis per te sia un po’ presto!
Comunque se al contrario vuoi portarti avanti, puoi cominciare da qui e poi qui e naturalmente chiedere al forum in caso di dubbi.

Federico

facendo così però dopo il risultato si accende il led ma non si spegne dopo un secondo devo ripremere per spegnere il led.
ecco cosa non capisco, perché non mi si spegne nonostante ci sia il delay

Posta il codice che hai corretto.

Ciao,
P.

davidemusco02:
... devo ripremere per spegnere il led...

premere cosa?

Come dice @pgiagno, posta tutto il tuo programma.

Federico

#include <IRremote.h>
IRrecv telecomando(12);
int led = 8;
decode_results risultato;

void setup() {
  Serial.begin(9600);
  telecomando.enableIRIn();
  pinMode(led, OUTPUT);
}

void loop(){
  if (telecomando.decode(&risultato))
  {
    Serial.println(risultato.value, HEX);
    telecomando.resume();
  }
 if (risultato.value == 0xE0E036C9) { 
  digitalWrite(led, HIGH); 
  delay (1000); 
  digitalWrite(led, LOW); 
}
}

In realtà si spegne, ma si ri-accende immediatamente al giro successivo del loop, in quanto risultato.value continua ad avere lo stesso valore!

La verifica del valore ricevuto, la devi far all'interno della if, cioè solo se è stato ricevuto un nuovo segnale; prova cosi:

void loop() {
  //verifico se ho ricevto un segnale
  if (telecomando.decode(&risultato))
  {
    //ho ricevuto un segnale
    Serial.println(risultato.value, HEX);
    if (risultato.value == 0xE0E036C9) {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
    }
    //resetto il ricevitore e lo preparo al prossimo segnale
    telecomando.resume();
  }
}

inoltre, cosi potresti avere problemi in quanto le letture vendono eseguite troppo velocemente rispetto alla pressione del tasto del telecomando.
Solitamente si usa leggere (controllare) il valore ogni quarto di secondo.

Sai come si usa millis() per gestire il tempo, per ritardare le verifica del pulsante premuto rispetto alla frequenza del loop?

Se si, prova a farlo, altrimenti inizia a leggere qui e qui.

Federico

PS
Abituati a formattare correttamente il codice! Dall'IDE, Ctrl+T o Strumenti->Formattazione automatica.
Questo aiuta te a controllare il codice, e a chi legge qui (se posti il codice) a verificarlo velocemente.

Solo come suggerimento ... studia anche l'uso e l'utilita' delle "flag" (dove per "flag" non si intende un comando o un'istruzione, ma usare una variabile, quella che preferisci, come "bandierina segnaposto", per dire al programma, ad esempio, che deve fare qualcosa solo un certo numero di volte, non ad ogni giro del loop) ...

Sempre rimanendo nel tuo caso, dove quello che ti serve e' che il led si accenda UNA SOLA VOLTA per un secondo ogni volta che la condizione e' vera ... puoi usare una struttura del genere ...

tutti i tuoi define e setup
dichiara una variabile byte, con un nome a tua scelta (esempio, "pippo" ) ed impostala a 0
void loop()
...
programma nel loop
...

IF la tua condizione e' TRUE "E" pippo vale 0 (studiare l'uso di & e compagni ;) )
   pippo = 1
   il tuo delay per il led
fine del ciclo IF 
IF la tua condizione e' FALSE pippo=0
...
eccetera

in questo modo, quando accendi il led la prima volta, metti anche la flag "pippo" ad 1, per cui non si riaccendera' piu a meno che la condizione non diventi falsa (dove rimetti pippo a 0 con il secondo if) e poi torni vera ... :wink: