Ciao a tutti
se carico sul mio arduino questo sketch preso da internet:
#define IRpin_PIN PIND
#define IRpin 2
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}
void loop(void) {
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length
// while (digitalRead(IRpin)) { // this is too slow!
while (IRpin_PIN & (1 << IRpin)) {
// pin is still HIGH
// count off another few microseconds
highpulse++;
delayMicroseconds(RESOLUTION);
// If the pulse is too long, we 'timed out' - either nothing
// was received or the code is finished, so print what
// we've grabbed so far, and then reset
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;
// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
// we read one high-low pulse successfully, continue!
currentpulse++;
}
void printpulses(void) {
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(" usec");
}
// print it in a 'array' format
Serial.println("int IRsignal[] = {");
Serial.println("// ON, OFF (in 10's of microseconds)");
for (uint8_t i = 0; i < currentpulse-1; i++) {
Serial.print("\t"); // tab
Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
Serial.print(", ");
Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
Serial.println(",");
}
Serial.print("\t"); // tab
Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
Serial.print(", 0};");
}
e ci collego ovviamente un sensore IR e premo un tasto del telecomando mi escono questi dati:
Received:
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
30, 92,
26, 110,
28, 66,
26, 270,
26, 122,
22, 126,
26, 108,
26, 82,
26, 1272,
26, 94,
26, 164,
24, 70,
28, 68,
22, 124,
26, 110,
26, 68,
26, 70,
24, 1498,
24, 96,
28, 108,
22, 72,
26, 270,
24, 124,
22, 126,
26, 108,
26, 82,
28, 1270,
26, 96,
24, 270,
28, 174,
28, 66,
26, 122,
24, 112,
22, 72,
26, 68,
26, 0};
Allora prendo uno sketch e lo adatto in modo che se legge quel treno di impulsi mi dice qualcosa:
#define IRpin_PIN PIND
#define IRpin 2
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20
// What percent we will allow in variation to match the same code
#define FUZZINESS 20
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
int ApplePlaySignal[] = {
30, 92,
26, 110,
28, 66,
26, 270,
26, 122,
22, 126,
26, 108,
26, 82,
26, 1272,
26, 94,
26, 164,
24, 70,
28, 68,
22, 124,
26, 110,
26, 68,
26, 70,
24, 1498,
24, 96,
28, 108,
22, 72,
26, 270,
24, 124,
22, 126,
26, 108,
26, 82,
28, 1270,
26, 96,
24, 270,
28, 174,
28, 66,
26, 122,
24, 112,
22, 72,
26, 68,
26, 0};
//int AppleForwardSignal[] = {};
//int AppleRewindSignal[] = {};
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}
void loop(void) {
int numberpulses;
numberpulses = listenForIR();
Serial.print("Heard ");
Serial.print(numberpulses);
Serial.println("-pulse long IR signal");
if (IRcompare(20, ApplePlaySignal)) {
Serial.println("PLAY");
}
}
boolean IRcompare(int numpulses, int Signal[]) {
for (int i=0; i< numpulses-1; i++) {
int oncode = pulses[i][1] * RESOLUTION / 10;
int offcode = pulses[i+1][0] * RESOLUTION / 10;
// check to make sure the error is less than FUZZINESS percent
if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100)) {
//Serial.print(" (ok)");
} else {
//Serial.print(" (x)");
// we didn't match perfectly, return a false match
return false;
}
/*
Serial.print(" \t"); // tab
Serial.print(offcode); // the OFF signal we heard
Serial.print(" - ");
Serial.print(Signal[i*2 + 1]); // the OFF signal we want
*/
if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100)) {
//Serial.print(" (ok)");
} else {
//Serial.print(" (x)");
// we didn't match perfectly, return a false match
return false;
}
//Serial.println();
}
// Everything matched!
return true;
}
int listenForIR(void) {
currentpulse = 0;
while (1) {
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length
// while (digitalRead(IRpin)) { // this is too slow!
while (IRpin_PIN & (1 << IRpin)) {
// pin is still HIGH
// count off another few microseconds
highpulse++;
delayMicroseconds(RESOLUTION);
// If the pulse is too long, we 'timed out' - either nothing
// was received or the code is finished, so print what
// we've grabbed so far, and then reset
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
return currentpulse;
}
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;
// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
return currentpulse;
}
}
pulses[currentpulse][1] = lowpulse;
// we read one high-low pulse successfully, continue!
currentpulse++;
}
}
void printpulses(void) {
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(" usec");
}
// print it in a 'array' format
Serial.println("int IRsignal[] = {");
Serial.println("// ON, OFF (in 10's of microseconds)");
for (uint8_t i = 0; i < currentpulse-1; i++) {
Serial.print("\t"); // tab
Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
Serial.print(", ");
Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
Serial.println(",");
}
Serial.print("\t"); // tab
Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
Serial.print(", 0};");
}
E sembra funzionare, se punto il telecomando a circa un metro di distanza. Il problema nasce quando allontano il telecomando di qualche metro, non legge piu niente e i dati in entrata sono questi:
Received:
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
28, 96,
22, 112,
22, 70,
24, 272,
28, 122,
24, 124,
24, 110,
24, 84,
24, 1272,
26, 98,
20, 166,
26, 68,
26, 70,
24, 124,
22, 114,
24, 68,
26, 72,
24, 1496,
24, 96,
26, 110,
26, 68,
26, 270,
24, 124,
26, 122,
26, 108,
26, 82,
26, 1272,
24, 98,
24, 270,
26, 176,
24, 70,
26, 122,
26, 110,
26, 68,
26, 68,
26, 0};
quindi si discostano di poco...mi aiutate a sistemare l'ultimo sketch per far si che anche se i dati si discostano di poco li legge lo stesso come quel determinato tasto? (nel mio caso si tratta di telecomando MYSKY, tasto BLU).
Grazie mille!!!