Forum: Mikrocontroller und Digitale Elektronik IR Receiver Module: Blink LED


von Chris (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche gerade mit einem Arduino Uno und
einem IR Receiver Modul eine LED blinken zu lassen.

Ich habe bereits den Code der Fernbedienung ausgelesen
und dokumentiert (siehe unten).
Das "LED-Blink_Programm" habe ich auch beigefügt (siehe unten).


Könnt ihr mir Bitte sagen was ich falsch mache?


Danke Euch!

Grüße
Chris
1
  Code
2
CH-  FFA25D
3
CH  FF629D
4
CH+  FFE21D
5
PREV  FF22DD
6
NEXT  FF02FD
7
PLAY  FFC23D
8
VOL-  FFE01F
9
VOL+  FFA857
10
EQ  FF906F
11
0  FF6897
12
100+  FF9867
13
200+  FFB04F
14
...
1
/////////////////////////////////////////////////////////
2
Code
3
/////////////////////////////////////////////////////////
4
5
#include <IRremote.h>
6
7
int RECV_PIN = 3;
8
int LED_Pin = 13;
9
10
IRrecv irrecv(RECV_PIN);
11
12
// unsigned long code = 'FFA25D';
13
unsigned long code = 0xFFA25D;
14
15
decode_results results;
16
17
void setup()
18
{
19
  Serial.begin(9600);
20
  irrecv.enableIRIn(); // Start the receiver
21
  pinMode(LED_Pin, INPUT);
22
}
23
24
void loop() {
25
  if (irrecv.decode(&results)) {
26
    Serial.print("Protokoll:");
27
    Serial.println(results.decode_type, DEC);
28
    Serial.println(results.value, HEX);
29
    Serial.println(results.value);
30
    Serial.println();
31
    irrecv.resume(); // Receive the next value
32
  }
33
  
34
  if ((results.value, HEX) == code) {
35
    digitalWrite(LED_Pin, HIGH);
36
    delay(500);
37
    digitalWrite(LED_Pin, LOW);
38
    delay(500);
39
    digitalWrite(LED_Pin, HIGH);
40
    delay(500);
41
    digitalWrite(LED_Pin, LOW);
42
    delay(500);
43
  }
44
  
45
  delay(100);
46
}

von pitschu (Gast)


Lesenswert?

Chris schrieb:
> pinMode(LED_Pin, INPUT);

Für eine Blink-LED sollte der Pin ein OUTPUT sein.

von Chris (Gast)


Lesenswert?

Hallo pitschu,

hab ich gerade geändert. Danke dir.
Leider tut es trotzdem nicht.

Noch jeman eine Idee?

von Karl H. (kbuchegg)


Lesenswert?

Hinweis.
Das hier
1
   if ((results.value, HEX) == code) {
macht NICHT das, was du denkst das es tut.

Dei Angabe HEX ist vollkommen überflüssig.
Im Computer sind alles Binärzahlen. Alles ist einfach nur ein Bitmuster. 
So etwas wie HEX oder Dezimal oder Binär existiert im Computer nicht. 
Alles sind einfach nur Bitmuster. Wenn du schreibst
1
  i = 49;
2
  i = 0x31;
3
  i = '1',
4
  i = 0b00111001;

dann läuft das im Rechner alles aufs selbe hinaus. Im Speicher wird an 
der Speicherstelle 'i' das Bitmuster 0011 1001 abgelegt. Denn das ist 
das einzige, mit dem der Computer umgehen kann. Das bei den Zuweisungen 
einmal eine Dezimalzahl steht und mal eine Binärzahl oder überhaupt 
gleich der ASCII Code eines Zeichens, das löst bereits der COmpiler 
entsprechend auf, so dass der Computer nur mehr die Operation: Lege das 
Bitmuster 0011 1001 in der Speicherzelle, die 'i' genannt wurde ab.

D.h. wenn die Zahlen im Programm verwendet wird, dann hast du dem 
Compiler durch die Schreibweise einen Hinweis hinterlassen, in welchem 
System du deine Angabe gemacht hast. Der Compiler nimmt diesen Hinweis 
und generiert mit deiner Angabe und diesem Hinweis das zugehörige 
Bitmuster.

Aber bei der Ausgabe kann der Compiler bzw. der Code den er generiert 
nicht wissen, wie du die Ausgabe gerne hättest, daher musst du das 
angeben
D.h.
1
    Serial.println(results.value, HEX);
bedeutet NICHT, dass es sich bei results.value um eine Hex-Zahl handeln 
würde. Denn die existiert im Computer nicht. Die Angabe HEX ist die 
Aufforderung an println eine Hexadezimale Ausgabe zu erzeugen! Aber das 
Bitmuster der Zahl ändert sich dadurch ja nicht, nur weil du dir das 
Bitmuster anders aufbereeitet ansehen willst.


Nach dem Vorgeplänkel. Das hier
1
   if ((results.value, HEX) == code) {
ist unsinnig. Denn du brauchst hier nicht sagen, ich will Hex-Zahlen 
vergleichen. Du vergleichst Zahlen (eigentlich Bitmuster). Wie du die 
Zahlen angibst ist dein Bier. Das interessiert aber den Computer nicht, 
denn der COmpiler wandelt das alles sowieso um auf einen Vergleich von 
Bitmustern.

Dein Pech ist nur, dass
1
    .... (results.value, HEX) ...
ein gültiger Ausdruck mit dem Kommaoperator ist. Nur macht der etwas 
ganz anderes als du erwartet hättest.

von Chris (Gast)


Lesenswert?

Hallo Karl Heinz,
Vielen Dank für deine ausführliche Antwort.
Ich verstehe jetzt, dass ich lediglich die Anzeigeform ändere. Die 
Information jedoch gleich bleibt. Bin gerade unterwegs u kann erst heute 
Abend weiter ausprobieren.

Ich melde mich dann wieder.

Aber vielen Dank schon mal :-).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.