Universal Fernbedienung gefällig?

Universal Fernbedienung gefällig?

Hallo Community,

ich bin einer der Autoren bei MetaUnion. Ich heiße Jani bin 17 Jahre alt und besuche zurzeit ein Berufskolleg. Aber genug zu mir, worum geht es in diesem Post? Wie die meisten von euch habe ich einen Fernseher in meinem 12qm großen Zimmer. Mein Problem ist simpel ich schaffe es jeden Tag aufs neue die Fernbedienungen zu verlieren. ^^ Und ich bin keiner von denen, die den leichten Weg gehen. Also was tun?

Aufgabenstellung: Eine an der Wand befestigte Universal Fernbedienung entwickeln.

Jeder normale Mensch würde sich spätestens jetzt eine derartige Universal Fernbedienung kaufen! Aber gut weiter gehts:

Bauteile:

  • ein Arduino (Atmega 328P-PU reicht auch)
    • ohne Arduino:
    • 16kHz Crystal
    • 2 x 22pF Kondensatoren
    • 1kOhm Widersatnd
  • 8 Buttons (momentary)
  • IR-Sender LED
  • IR-Empfänger LED
  • 4 x 220Ohm Widerstand
  • 2 x 1kOhm Widerstand
  • 2 x 10kOhm Widerstand
  • zwei farbige LED (oder zwei einfarbige LEDs)

Beschaffung:

Ich besorge mir die Bauteile grundsätzlich über eBay und bestelle sie dann in großen Mengen in Hongkong. Bei diesem Projekt konnte ich alles bis auf das Arduino aus einem alten LG Fernsehr raus holen. Ihr solltet für dieses Projekt ohnehin löten können!!!

Aufbau:

Als erstes braucht ihr die Codes eurer Fernbedienung für die einzelnen Tasten. Die könnt ihr euch aus dem Internet ziehen oder ihr findet es selbst heraus, damit erspart ihr euch die IR-Empfänger LED. Ich habe sie selbst herausgefunden (recommended).

Hier ist der Code dazu:

#include <IRremote.h>

int RECV_PIN = 11;  
IRrecv irrecv(RECV_PIN);  
decode_results results;

void setup(){  
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {  
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Und hier ist die Schematic zum anschließen:

IR

Nun müsst ihr den Serial Monitor öffnen und euch die Hexadezimal Codes der einzelnen Tasten aufschreiben. Im Normalfall sind das 8 Stellen also 32 Binär stellen. Jetzt gehts weiter mit den Tastern. Wer sich ein wenig mit der Elektro-Prozesstechnik auskennt fragt sich jetzt sicherlich was für values er bei den buttons braucht. Das ist ebenfalls simpel zu beantworten, denn ich habe nicht vor die 8 Buttons über 8 Digital Pins anzuschließen. Im Gegenteil, ich will jeweils vier an einen Analog Pin anschließen.

Hier ist der Code dazu:

const int buttonPinA = 0;  
const int buttonPinB = 1;  

void setup() {  
   pinMode(buttonPinA, INPUT);
   pinMode(buttonPinB, INPUT);
   Serial.begin(9600);
}

void loop() {  
   int readingA = analogRead(buttonPinA);
   int readingB = analogRead(buttonPinB);
   Serial.println("A: " + readingA + "   B: "+ readingB);
}

Und hier ist die Schematic zum anschließen:

Button

Wenn ihr alles wie gezeigt angeschlossen habt öffnet ihr wieder den Serial Monitor und drückt dann nacheinander die values für jeden einzelenen Button auf. Widerstände reagieren leider auf Temperatur weswegen ihr etwas größer denken müsst. Die values können zwischen 0 - 1023 liegen wenn ihr also z.B. eine 1006 raus bekommt ist euer maximal Wert für diesen Button 1011 und eure minimal Wert 1001. Das sollte genug spanne sein damit das Arduino erkennt ob und welcher Button gedrückt ist. Wenn es bei euch immer noch nicht funktioniert müsst ihr mit euren Bereichen noch etwas herum experimentieren. Die Abfragen um herauszufinden welcher Button gedrückt wurde sehen dann in etwa so aus:

if(readA > btn1Min && readA < btn1Max){  
   // do some thing
}

Um jetzt zwischen TV und Receiver zu wechseln brauchen wir noch eine Variable wie: int mode = 0. Über diese Variable regeln wir auch den wechsel der LED. Das ist dann mein endgültiger Code (Über welchen Pin die IR-LED sendet könnt ihr hier sehen. Außerdem gibt es dort die Library zur Ansteuerung der IR-LED):

#include <IRremote.h>
IRsend irsend;

 const int buttonPinA = 0;
 const int buttonPinB = 1;
 const int LEDTV = 4;
 const int RECTV = 5;
 int mode = 1; // 1 = TV    0 = REC

 int btn1High = 1023;
 int btn1Low = 1010;

 int btn2High = 415;
 int btn2Low = 400;

 int btn3High = 180;
 int btn3Low = 170;

 int btn4High = 80;
 int btn4Low = 60;


 int btn5High = 1023;
 int btn5Low = 1010;

 int btn6High = 415;
 int btn6Low = 400;

 int btn7High = 180;
 int btn7Low = 170;

 int btn8High = 80;
 int btn8Low = 60;

 void setup() {
   pinMode(buttonPinA, INPUT);
   pinMode(buttonPinB, INPUT);
   pinMode(LEDTV, OUTPUT);
   pinMode(RECTV, OUTPUT);
   Serial.begin(9600);
 }

 void loop() {
   if(mode == 1){
      digitalWrite(LEDTV, HIGH);
      digitalWrite(RECTV, LOW);
   } else {
      digitalWrite(RECTV, HIGH);
      digitalWrite(LEDTV, LOW);
   }

   int readingA = analogRead(buttonPinA);
   int readingB = analogRead(buttonPinB);

   if(readingA < btn1High && readingA > btn1Low){ //Power
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E040BF, 32);
        } else {
          irsend.sendNEC(0x80BF3BC4, 32);
        }
   }
   if(readingA < btn2High && readingA > btn2Low){ //Mode
       if(mode == 1){
          mode = 0; //Rec
       } else {
          mode = 1; //TV
       }
   }
   if(readingA < btn3High && readingA > btn3Low){ //Pro 7 / Source
       if(mode == 1){
          irsend.sendSAMSUNG(0xE0E0807F, 32);
       } else {
          irsend.sendNEC(0x80BF51AE, 32);
       }
   }
   if(readingA < btn4High && readingA > btn4Low){ //Mute(OK)
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E0F00F, 32);
        } else {
          irsend.sendNEC(0x80BF39C6, 32);
        }
   }
   if(readingB < btn5High && readingB > btn5Low){ //Vol +
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E0E01F, 32);
        } else {
          irsend.sendNEC(0x80BF837C, 32);
        }
   }
   if(readingB < btn6High && readingB > btn6Low){ //Vol -
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E0D02F, 32);
        } else {
          irsend.sendNEC(0x80BF9966, 32);
        }
   }
   if(readingB < btn7High && readingB > btn7Low){ //Ch +
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E048B7, 32);
        } else {
          irsend.sendNEC(0x80BF53AC, 32);
        }
   }
   if(readingB < btn8High && readingB > btn8Low){ //Ch -
        if(mode == 1){
          irsend.sendSAMSUNG(0xE0E008F7, 32);
        } else {
          irsend.sendNEC(0x80BF4BB4, 32);
        }
   }
   delay(150);
 }

Fertig

Wenn ihr noch Fragen zu diesem Thema habt dann schreibt mir doch einfach (Klick):