Sensore Ir

Ciao a tutti, ho dei problemi con lo sketch in quanto non riesco, con lo stesso pulsante del telecomando, a spegnere il led dopo averlo acceso…
Ho provato con degli if ma il risultato è sempre lo stesso… riesco ad accenderlo ma non a spegnerlo…
Vi posto lo sketch che sto provando a scrivere (forse sbaglio nel dare le int)…

#include <IRremote.h> // Includo la libreria.

#define LED1 0x1D  //rinomina codice per led rosso
#define LED2 0x81D //rinomina codice per led verde
#define OFF 0xA9D  //rinomina codice per led spenti

int RECV_PIN = 11; // Pin ricevitore IR

int led1State = 0; // Stato del led rosso: spento 
int led2State = 0; // Stato del led verde: spento

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(13, OUTPUT);   // Led rosso
  pinMode(4, OUTPUT);    // Led verde
  irrecv.enableIRIn();   // Inizializza ricevitore IR
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); //Risultato in esadecimale
    irrecv.resume();
    }

   if  (results.value == LED1){ // accensione led rosso
     if(led1State == LOW){      // se il led rosso è spento:
     digitalWrite(13, HIGH);    // accendo il led rosso;
     }
     else                       // altrimenti:
     digitalWrite(13, LOW);     // spengo il led rosso.
   }
  
   if (results.value == LED2){  // accensione led verde
     if(led2State == LOW){      // se il led verde è spento:
     digitalWrite(4, HIGH);     // accendo il led verde;
     }
     else                       // altrimenti:
     digitalWrite(4, LOW);      // spengo il led verde.
   }
   
   if(results.value == OFF){    //spegne tutti i led
     digitalWrite(13, LOW);
     digitalWrite(4, LOW);
   }
 }

In questi giorni ho lavorato con IRremote.h

il problema è che result.value è un int non un hex.

Io sto usando come paragone lo stato del led, e non so come identificarlo all'inizio dello sketch.. result.value funziona correttamente per accendere i led e spegnerli (con due tasti differenti), ma utilizzare lo stesso tasto usando una variabile che mi dia l'opposto dello stato del led non funziona..

Prova così

#define LED1 29  //rinomina codice per led rosso
#define LED2 2077 //rinomina codice per led verde
#define OFF 2717  //rinomina codice per led spenti

e poi... se definisci ledstate come int e lo metti a 0, perchè poi fai il paragaone se è "LOW"? dichiaralo, boolean e non int...

Trisonic: Prova così

#define LED1 29  //rinomina codice per led rosso
#define LED2 2077 //rinomina codice per led verde
#define OFF 2717  //rinomina codice per led spenti

Uguale.. il problema non erano i #define perché me li definisce correttamente all'interno del loop allo stesso modo :)

Trisonic: e poi... se definisci ledstate come int e lo metti a 0, perchè poi fai il paragaone se è "LOW"? dichiaralo, boolean e non int...

Ho provato anche così, ma niente... Il led si accende ma non si spegne con lo stesso pulsante.. Che metodo dovrei usare per fare un if..else decente? Devo utilizzare come paragone lo stato del led?

metti il resume dopo ogni ricevuta (magari nel loop, ma non è corretto metterlo nel loop), metti ledstate come boolean, metti i define come ti ho scritto io. se non va, fai un pò di debug con delle serial.println strategiche

Non funziona proprio niente col resume..

Prendi spunto dal mio progetto:

/*
Interactive digital frame game
 By Andrea Esposito
 Site: blackstufflabs.com
 
 For: The Fritzmas challenge - http://fritzing.org
 
 9/12/2011
 
 
 NN = FFFFFFFF = 4294967295
 
 Remote control A: 
 KEY - HEX    - INT
 1 - FF32CD - 16724685
 2 - FF708F - 16740495
 3 - FFB24D - 16757325
 4 - FFF20D - 16773645
 5 - FF728D - 16741005
 6 - FFD02F - 16764975
 7 - FF52AD - 16732845
 8 - FF12ED - 16716525
 9 - FF50AF - 16732335
 0 - FFB04F - 16756815
 
 Remote control B
 KEY   - HEX      - INT 
 next  - 80579867 - 2153224295
 power - 805728D7 - 2153195735 
 
 Answers:
 Level    - Key
 
 Level 0  - 111
 Level 1  - 666
 Level 2  - 011
 Level 3  - 945
 Level 4  - 314
 Level 5  - 975
 Level 6  - 328
 Level 7  - 101
 Level 8  - 161
 Level 9  - 100
 Level 10 - 210
 
 */


#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;

short level=0;
short count=0;

#define isdigit(n) (n >= '0' && n <= '9')

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(12, OUTPUT); // IR GREEN
  pinMode(7, OUTPUT); // IR RED 
  pinMode(4, OUTPUT);  // 1 red
  pinMode(5, OUTPUT);  // 2 red 
  pinMode(6, OUTPUT);  // 3 red
  tone1.begin(8);  
  irrecv.enableIRIn();
  Serial.println ("blackstufflabs.com");
}


void loop() {
  digitalWrite(12, HIGH);
  if (irrecv.decode(&results))  {
    if (results.value != 4294967295){
      Serial.print("Level: ");
      Serial.println(level);
      Serial.print("Code: ");
      Serial.println(results.value);      
      digitalWrite(12, LOW);
      digitalWrite(7, HIGH);   // set the LED on
      delay(100);              // wait for a second
      digitalWrite(7, LOW);    // set the LED off
      delay(100);  
      digitalWrite(12, HIGH);
      game(results.value);

    }
    if (level != 0 ) irrecv.enableIRIn();
    irrecv.resume(); // Receive the next value
  }
  delay (200);
}




void game (unsigned long int code)
{
  switch (level)
  {
  case 0:
    if ((code == 16724685) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }  
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }  
    break; 

  case 1:
    if ((code == 16764975) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16764975) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16764975) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);

    }  
    break; 

  case 2:
    if ((code == 16724685) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16756815) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);

    }  

    break; 

  case 3:
    if ((code == 16741005) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16773645) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16732335) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }  
    break; 

  case 4:
    if ((code == 16773645) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16757325) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 5:
    if ((code == 16741005) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16732845) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16732335) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 6:
    if ((code == 16716525) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16740495) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16757325) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 7:
    if ((code == 16724685) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16756815) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 8:
    if ((code == 16724685) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16764975) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 9:
    if ((code == 16756815) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16756815) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("Level done!");
      count=0;
      level++;
      blinky();
      play_rtttl(next);
      irsend.sendNEC(0x80579867, 32);
    }
    break; 

  case 10:
    if ((code == 16756815) && (count == 2)) {
      digitalWrite(4, HIGH);
      count++;
    }
    if ((code == 16724685) && (count == 1)) {
      digitalWrite(5, HIGH);
      count++;
    }
    if ((code == 16740495) && (count == 0)) {
      digitalWrite(6, HIGH);
      count++;
    }
    if (count == 3)
    {
      Serial.println("THE END");
      count=0;
      level=0;
      irsend.sendNEC(0x80579867, 32);
      blinky();
      play_rtttl(ending);
      Serial.println("Done.");
      blinky();      
      //song
      Serial.println("Closing digital frame...");
      irsend.sendNEC(0x805728D7, 32);
      Serial.println("Bye bye!!!");
      Serial.println ("blackstufflabs.com");
    }
    break; 

  default:
    break;
  } 
}

void blinky()
{
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(300);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(300);

  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(300);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(300);

  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(300);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(300);

  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(300);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(300);  
}

Ho provato con il comando count (togliendo momentaneamente il secondo led per lavorare più semplicemente) in questo modo:

#include <IRremote.h> // Includo la libreria.

#define P1 29  //rinomina codice per led rosso
#define P2 2077 //rinomina codice per led verde
#define POFF 2717  //rinomina codice per led spenti

int RECV_PIN = 11; // Pin ricevitore IR

short count = 0;   // contatore = 0

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(13, OUTPUT);   // Led rosso
  irrecv.enableIRIn();   // Inizializza ricevitore IR
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); //Risultato in esadecimale
    irrecv.resume();
    }

   if  ((results.value == P1) && (count == 0)){   // se premo il pulsante 1 e il contatore è a 0:
     digitalWrite(13, HIGH);                        // accendo il led rosso.
     count = count +1;                              // il contatore va a 1
     }
   if  ((results.value == P1) && (count == 1)){   // se premo il pulsante 1 e il contatore è a 1:
     digitalWrite(13, LOW);                         // spengo il led rosso.
     count = count -1;                              // il contatore torna a 0
   }
 }

Ma niente…so di essere alle prime armi con la programmazione ma mi sembra strano che non funzioni… ho commentato per bene lo sketch così da farvi capire come ho ragionato…

prova così

#include <IRremote.h> // Includo la libreria.

#define P1 29  //rinomina codice per led rosso
#define P2 2077 //rinomina codice per led verde
#define POFF 2717  //rinomina codice per led spenti

int RECV_PIN = 11; // Pin ricevitore IR

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(13, OUTPUT);   // Led rosso
  irrecv.enableIRIn();   // Inizializza ricevitore IR
digitalWrite(13, LOW);
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value);     //Controlla se i codici corrispondono
    Serial.println(P1);
    Serial.println(P2);
    
   if  (results.value == P1{   
     digitalWrite(13, HIGH);                        //accendi
                              }
    if  (results.value == P2{   
     digitalWrite(13, LOW);                       //spegni
                              }

irrecv.resume();
    }


 }

Il codice che mi hai passato tu funziona perfettamente, il problema è che se il led si accende con il pulsante 1, deve spegnersi con lo stesso pulsante.. invece così si spegne col pulsante 2..

Ho pensato che se voglio usare lo stesso pulsante devo aggiungere un contatore; Se premo P1 e il contatore è a 0, il led si accende e nello stesso tempo il contatore va a 1.

Se premo P1 e il contatore è a 1, il led si spegne e nello stesso tempo il contatore torna a 0.

Cosa sbaglio nella logica mentale? Oppure, cosa sbaglio nel tradurre la logica mentale nello sketch?

P.s.: nel tuo sketch, quando premo il pulsante 1 nel seriale mi viene fuori

29
29
2077

Se premo il pulsante 2 invece mi viene:

2077
29
2077

Ti passo il codice che uso io, ricordati di cambiare i valori, dato che ho usato un telecomando diverso …

Grazie al byte flag accendi e spegni una uscita a tuo piacimento …

Archivio.zip (11.9 KB)

Ottimo… i miei codici funzionano sempre! ahhahahha

A parte gli scherzi, si tratta di un pò di programmazione.
Il più è stato fatto… giocaci vicino.

Per accendere e spegnere con lo stesso pulsante ci vuole un flag.

Esempio:

#include <IRremote.h> // Includo la libreria.

#define P1 29  //rinomina codice per led rosso
#define P2 2077 //rinomina codice per led verde
#define POFF 2717  //rinomina codice per led spenti

int RECV_PIN = 11; // Pin ricevitore IR

IRrecv irrecv(RECV_PIN);

decode_results results;

boolean flag=false;

void setup()
{
  pinMode(13, OUTPUT);   // Led rosso
  irrecv.enableIRIn();   // Inizializza ricevitore IR
digitalWrite(13, LOW);
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value);     //Controlla se i codici corrispondono
    Serial.println(P1);
    Serial.println(P2);
    
   if  ((results.value == P1) && !flag){   
     digitalWrite(13, HIGH);  
flag=true;                      //accendi
                              }
    if  ((results.value == P1) && flag){   
     digitalWrite(13, LOW);   
flag=false;                    //spegni
                              }

irrecv.resume();
    }


 }

buona programmazione e buona domenica

Così?

#include <IRremote.h>

int led1 = 13;
int led2 = 4;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
byte flag=0;

void setup() {  
 Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
   if (irrecv.decode(&results)) {
     Serial.println(results.value, HEX);
      irrecv.resume();
      
       if (results.value == 0x1D) {
         digitalWrite(led1, flag);
         flag^=1;
       }
       
       if (results.value == 0x81D) {
         digitalWrite(led2, flag);
         flag^=1;
       }
    }
}

Non ci siamo… il led lampeggia e si spegne solo se riesco a beccare il punto in cui è a 0…

Ho provato anche a riformattare i codici del telecomando da hex a dec come mi aveva consigliato Trisonic ma niente…

Trisonic:
Ottimo… i miei codici funzionano sempre! ahhahahha

A parte gli scherzi, si tratta di un pò di programmazione.
Il più è stato fatto… giocaci vicino.

Per accendere e spegnere con lo stesso pulsante ci vuole un flag.

Esempio:

[cut]

buona programmazione e buona domenica

Idem, il led lampeggia e stavolta sembra quasi che gli arrivino 0,5 volt da quanto poco lampeggia, e io non voglio che lampeggi, ma che si accenda e si spenga…

Dai perdici un pò di tempo con un pò di serial.println, non è che ti posso fare il codice io. Ti ho scritto come si dovrebbe fare, ti ho messo un pò di codice di esempio, ti ho dato consigli.... ora tocca a te. Su su... apri il serial monitor e smanetta.

E se non ci riesci, usa il metodo "Troisi".

Ho talmente tanti tasti su questo telecomando che non capisco il motivo perché io debba accendere e spegnere i led con lo stesso pulsante.. Sarà la voglia di imparare :grin:

Grazie mille per gli aiuti, ora provo un po' da solo e vedo cosa riesco a fare

marco_182: Sarà la voglia di imparare :grin:

Bravo, questo è lo spirito.

E questo è il metodo "Troisi" che TUTTI dovrebbero usare: http://youtu.be/1OtK7uKKYrs?t=2m46s