Hallo,
bin neu hier und auch Anfänger was Arduino Programmierung angeht.
Ich möchte ein Motorpoti mit meiner Apple Unibody Fernbedienung steuern.
Zum auswerten der IR Signale habe ich diese Library verwendet: GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols
Funktioniert auch soweit ganz gut, hier aber mein Problem:
Die Ausgänge sollen nur bei gedrückter Taste aktiv sein, ich kann sie nur einschalten. Bzw. nach einer kurzen Zeit selbst ausschalten wie im Beispiel. Das Problem hierbei ist: die Apple Remote basiert auf dem NEC Protokoll, bei lange gedrückter Taste kommt ein Wiederholungscode, der bei jeder Taste gleich ist. Habe schon paar Sachen ausprobiert, aber alles ohne zufriedenstellendes Ergebnis. Kann mir jemand weiterhelfen, wie man das praktisch umsetzten könnte?
Vielen Dank schonmal im Vorraus.
Alex
Der Code:
#define DEBUG 1
#include <IRremote.h>
/* https://github.com/shirriff/Arduino-IRremote */
#define RECV_PIN 11
IRrecv irrecv(RECV_PIN);
decode_results results;
void PrintDecodeType(int type)
{
switch(type)
{
case NEC:Serial.println("NEC ");break;
case SONY:Serial.println("SONY ");break;
case RC5:Serial.println("RC5 ");break;
case RC6:Serial.println("RC6 ");break;
case DISH:Serial.println("DISH ");break;
case SHARP:Serial.println("SHARP ");break;
case PANASONIC:Serial.println("PANASONIC ");break;
case JVC:Serial.println("JVC ");break;
case SANYO:Serial.println("SANYO ");break;
case MITSUBISHI:Serial.println("MITSUBISHI ");break;
case UNKNOWN:Serial.println("UNKNOWN ");break;
}
}
void MotorOff()
{
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void MotorUp()
{
digitalWrite(A0,HIGH);
digitalWrite(A1,HIGH);
digitalWrite(A2,HIGH);
digitalWrite(A3,HIGH);
digitalWrite(A4,HIGH);
digitalWrite(A5,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void MotorDown()
{
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
}
void setup()
{
pinMode(13, OUTPUT); // PIN 13 wird auf dauer an geschaltet
digitalWrite(13, HIGH);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
MotorOff();
Serial.begin(9600);
Serial.println("Ready.");
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results))
{
PrintDecodeType(results.decode_type);
Serial.print(results.bits, DEC);
Serial.print(" ");
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
if (results.value==2011287729) Serial.println ("Up");
if (results.value==2011279537) Serial.println ("Down");
if (results.value==2011238577) Serial.println ("Left");
if (results.value==2011291825) Serial.println ("Right");
if (results.value==4294967295) Serial.println ("still pressed");
if (results.decode_type==NEC)
{
if (results.value==2011287729)
{
MotorUp();
delay(200);
MotorOff();
}
else if (results.value==2011279537)
{
MotorDown();
delay(200);
MotorOff();
}
}
}
}