Pages: [1]   Go Down
Author Topic: Risolto: Utilizzo ricevitore IR  (Read 496 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve Amici,
sto provando ad utilizzare un ricevitore IR, sono riuscito a recuperare uno sketch in rete (dal sito di Mauro Alfieri), solo che non riesco a capire il funzionamento, mi spiego meglio, ho capito come identificare i vari codici inviati dal telecomando, e come utilizzare un comando che alla pressione di un tasto accende un led e lo spegne alla pressione di un altro tasto, ma nello sketch ci sono una serie di comandi che non ho capito. Non posso utilizzare normalmente il comando digitalRead per dire ad Arduini di eseguire un comando quando riceve un codice preciso dal ricevitore?
considerando che voglio che un solo comando effettui una solo azione, come posso eliminare gli "if"?

spero di essere stato chiaro.

grazie

Code:
#include <IRremote.h> // use the library
int receiver = 11; // 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(9, OUTPUT); // Pin 9 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 == 0x406 ||  results.value == 0x10406 ){ //tasto 6 sul telecomando
    digitalWrite(9, HIGH);   // set the LED on
  }
 if ( results.value == 0x404 ||  results.value == 0x10404 ){ //tasto 4 sul telecomando
    digitalWrite(9, LOW);   // set the LED 0ff
  }
}



« Last Edit: July 07, 2013, 04:19:57 am by ferdard » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non ho capito. Non posso utilizzare normalmente il comando digitalRead per dire ad Arduini di eseguire un comando quando riceve un codice preciso dal ricevitore?
Ciao
Purtroppo ti serve una libreria che sia capace di "leggere" il codice che il tuo trasmettirore Ir emette
libreria da me usata è appunto:
#include <IRremote.h>
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3524
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma il problema qual'è, mica ho capito. Quei due if non li hai messi tu?
Se si, vanno messi dentro l'if della decode
Code:
#include <IRremote.h> // use the library

const byte receiverPin = 11; // pin 1 of IR receiver to Arduino digital pin 11
const byte ledPin = 9;
IRrecv irrecv(receiverPin); // create instance of 'irrecv'
decode_results results;

void setup()
{ delay(1000);
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(ledPin, OUTPUT); // Pin 9 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 == 0x406 ||  results.value == 0x10406 ) { //tasto 6 sul telecomando
      digitalWrite(ledPin, HIGH);   // set the LED on
    }
    if ( results.value == 0x404 ||  results.value == 0x10404 ) { //tasto 4 sul telecomando
      digitalWrite(ledPin, LOW);   // set the LED 0ff
    }
    irrecv.resume();// receive the next value
  }  //endif decode
}  // endloop
Logged

my name is IGOR, not AIGOR

Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao nid,
lo sketch che ho postato è preso da internet, con questo sketch, un led si accede quando riceve un codice e si spegne quando ne riceve un altro.
Io vorrei adeguare lo sketch in modo che con un solo codice ricevuto accenda un led e poi con un delay lo spegne.

ho provato ad eliminare la parte "if" ma così non mi funziona più lo sketch.
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3524
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah, okay.
Due modi.
1. ti crei una variabile di stato vero/falso che si ricorda se il led lo avevi acceso o spento
oppure
2. più semplice, puoi anche leggere lo stato del led (in realtà puoi sapere se c'e' high/low sul pin) e con ! lo inverti ( ! => not )
Tieni solo uno degli if e poi:
Code:
  if ( results.value == 0x406 ||  results.value == 0x10406 ) { //tasto 6 sul telecomando
      digitalWrite(ledPin, ! digitalRead(ledPin)); 
    }
Logged

my name is IGOR, not AIGOR

Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato ad inserire la stringa che hai postato ma non cambia nulla.
Potresti darmi qualche indicazione in più...

grazie
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 0
Posts: 500
Electronics & Web Dev, Unix User, Ω LEO, Rock/Deep Music, Tech/Science/Finance addicted, Ski/Snowboard and much more …
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non capisco perché non dovresti usare il ciclo if. Usa lo switch case allora.
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato anche con switch...
ma niente!

Non riesco a capire perchè non segue il comando di aspettare e poi spegnere il led

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

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(7, OUTPUT);
}
void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
    irrecv.resume();
  }

  if ( results.value == 0x800F040D )
  {
    
    digitalWrite(7, HIGH);
    delay (1000);
    digitalWrite(7, LOW);
}
  

 }

edit by mod: per favore includere il codice usando gli appositi tag
« Last Edit: July 07, 2013, 03:44:02 am by leo72 » Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3524
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il codice va nei tag (usa tasto con #)

A me così funziona:
Code:
#include <IRremote.h>

const byte receiverPin = 11;
const byte ledPin=7;
IRrecv irrecv(receiverPin);
decode_results results;

void setup()
{ delay(1000);
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(ledPin, OUTPUT);
}

void loop()
{ if (irrecv.decode(&results))
  { if ( results.value == 0xFFC837 ) // 0x800F040D )
    {  digitalWrite(ledPin, ! digitalRead(ledPin) );
    }
    //Serial.println(results.value, HEX);
    irrecv.resume();
  }
}
Logged

my name is IGOR, not AIGOR

Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao nid, ho risolto, grazie.

il codice che hai postato, comunque non mi funzionava, ho dovuto modificare in questo modo:

Code:
digitalWrite(ledPin, HIGH);
    delay (1000);
    digitalWrite(ledPin, LOW);

credo che quello che ha fatto funzionare il codice sia questo:

Code:
const byte receiverPin = 11;
const byte ledPin=7;

il precedente sketch era impostato in questo modo:


Code:
int receiver = 11;


Grazie
« Last Edit: July 07, 2013, 04:19:27 am by ferdard » Logged

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

E' una finezza logica usare const byte al posto di int per dichiarare un pin: si risparmia un byte di SRAM (byte = 1 byte // int = 2 byte) e si evita che per sbaglio nel codice quella variabile possa venir cambiata (const). Ma ai fini del funzionamento del programma non cambia nulla. L'errore era da qualche altra parte.
Logged


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3524
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io vorrei adeguare lo sketch in modo che con un solo codice ricevuto accenda un led e poi con un delay lo spegne.

Pardon, mi ero perso. Il mio accende/spegne con lo stesso tasto, non spegneva dopo un tempo di delay.
L'errore secondo me era che i vari if li facevi fuori dalla if (irrecv.decode(&results)) (come ti avevo già segnalato)  smiley-mr-green
Logged

my name is IGOR, not AIGOR

Pages: [1]   Go Up
Jump to: