Start Elkretssimulator


Fjärrkontroll

En random fjärrkontroll. Det står Car MP3 på den.



Uppkoppling

I en liten påse, som jag inte vet exakt varifrån den kommer, hittade jag en fjärrkontroll och ett litet kretskort med en IR -mottagare på. Jag vet inte riktigt vad kretskortet gjorde så jag slängde detta. Men IR -mottagaren kan man koppla in till en arduino eller annan mikrokontroller. Lite efterforskning visade att det troligtvis var en AX-1838HS IR -mottagaren.





Denna IR -mottagare är enkel koppla in.

5 volt till 5 volt på mikrokontrollern
GND till GND på mikrokontrollern
OUT, dvs signalen, kopplar jag in på pinne 11

IRremote.h

Det finns som vanligt ett bibliotek som gör livet enkelt. Detta hittar du här, ifall du är intresserad:

https://github.com/z3t0/Arduino-IRremote

Klicka på den gröna knappen där det står Clone or Download och ladda ner ZIP -filen och lägg filen någonstans på datorn (du behöver inte dekomprimera den).

Därefter öppnar du arduino IDE och väljer Skiss - Inkludera bibliotek - Lägg till ZIP -bibliotek och markerar helt sonika ZIP -filen du laddade ner ovan.



Om det lyckades står det kanske såhär längst ner.



Nu är det möjligt inkludera detta paket och vi kan därför skriva följande kod.

Kod till fjärrkontroll

Först ett litet testprogram för att se vad som kommer ut när vi klickar på fjärrkontrollen. Öppna den seriella monitorn för att se utdata.

#include <IRremote.h>

int receiver = 11;

// skapa instans
IRrecv irrecv(receiver); 
decode_results results;

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

void loop()
{
  if (irrecv.decode(&results)) // IR signal?
  {
    Serial.println(results.value, HEX);
    irrecv.resume(); // ta emot nästa värde
  }
}


Om vi nu kör ovan kod och tittar i vår seriella monitor vad resultatet blir när vi klickar på fjärrkontrollen så ser det ut såhär. De olika knapparna är associerade med diverse koder. Vad man kunde förvänta sig.



Man kan sedan ta dessa kryptiska värden från fjärrkontrollen och skriva en liten översättarfunktion. Den nya koden ser då ut såhär.

#include <IRremote.h>

int receiver = 11;

IRrecv irrecv(receiver); 
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
}

void translate(long val)
{
  switch(val)
  {
    case 0xFF6897: Serial.println("tangent: 0"); break;
    case 0xFF30CF: Serial.println("tangent: 1"); break;
    case 0xFF18E7: Serial.println("tangent: 2"); break;
    case 0xFF7A85: Serial.println("tangent: 3"); break;
    case 0xFF10EF: Serial.println("tangent: 4"); break;   
    case 0xFF38C7: Serial.println("tangent: 5"); break;   

    case 0xFF5AA5: Serial.println("tangent: 6"); break;
    case 0xFF42BD: Serial.println("tangent: 7"); break;
    case 0xFF4AB5: Serial.println("tangent: 8"); break;      
    case 0xFF52AD: Serial.println("tangent: 9"); break;   

    case 0xFFE01F: Serial.println("tangent: +"); break;           
    case 0xFFA857: Serial.println("tangent: -"); break;
    
    case 0xFF9867: Serial.println("tangent: 100+"); break;           
    case 0xFFB04F: Serial.println("tangent: 200+"); break;

    case 0xFF22DD: Serial.println("tangent: <<"); break;           
    case 0xFF02FD: Serial.println("tangent: >>"); break;
    case 0xFFC23D: Serial.println("tangent: >>|"); break;

    case 0xFFA25D: Serial.println("tangent: CH+"); break;           
    case 0xFF629D: Serial.println("tangent: CH"); break;
    case 0xFFE21D: Serial.println("tangent: CH-"); break;

    case 0xFF906F: Serial.println("tangent: EQ"); break;    
  }
}

void loop()
{
  if (irrecv.decode(&results)) // IR signal?
  {
    Serial.println(results.value, HEX);
    translate(results.value);
    irrecv.resume();
  }
}


Nu ser också utskrifter från programmet, när jag klickar på fjärrkontrollen, lite vettigare ut.



Okej, fine. Vart kan man ta detta exempel härifrån? Vi kan skippa vår debug -monitor och istället köra ut data på vår lilla söta seriella display. Lite ändringar i koden.

#include <IRremote.h>
#include <SoftwareSerial.h>

int receiver = 11;

// pinne 2 till display
SoftwareSerial lcd(3,2); 

IRrecv irrecv(receiver); 
decode_results results;

void gotoXY(int x, int y)
{
  lcd.print((char)(128 + y*20 + x));
}

void printLCD(char *s)
{
  while(*s)
  {
    lcd.write((char)*s++);
  }
}

void printLnLCD(char *s)
{
  while(*s)
 {
    lcd.write((char)*s++);
  }
  lcd.write((char)13);
}

void displayLight(bool on)
{
  lcd.write(on?(char)17:(char)18);
}

void cls()
{
  lcd.write((char)12);
  delay(10);
}

void setup()
{
  // samma hastighet som inställd på 
  // baksidan av displayen
  lcd.begin(9600); 
  // ge displayen tid boota upp
  delay(500); 
  
  irrecv.enableIRIn();

  cls();   
  displayLight(true);  
  printLnLCD("Varden fran fjarr:");  
}

void translate(long val)
{
  switch(val)
  {
    case 0xFF6897: printLCD("tangent: 0   "); break;
    case 0xFF30CF: printLCD("tangent: 1   "); break;
    case 0xFF18E7: printLCD("tangent: 2   "); break;
    case 0xFF7A85: printLCD("tangent: 3   "); break;
    case 0xFF10EF: printLCD("tangent: 4   "); break;   
    case 0xFF38C7: printLCD("tangent: 5   "); break;   
    case 0xFF5AA5: printLCD("tangent: 6   "); break;
    case 0xFF42BD: printLCD("tangent: 7   "); break;
    case 0xFF4AB5: printLCD("tangent: 8   "); break;      
    case 0xFF52AD: printLCD("tangent: 9   "); break;   

    case 0xFFE01F: printLCD("tangent: +   "); break;           
    case 0xFFA857: printLCD("tangent: -   "); break;
    
    case 0xFF9867: printLCD("tangent: 100+"); break;           
    case 0xFFB04F: printLCD("tangent: 200+"); break;

    case 0xFF22DD: printLCD("tangent: <<  "); break;           
    case 0xFF02FD: printLCD("tangent: >>  "); break;
    case 0xFFC23D: printLCD("tangent: >>| "); break;

    case 0xFFA25D: printLCD("tangent: CH+ "); break;           
    case 0xFF629D: printLCD("tangent: CH  "); break;
    case 0xFFE21D: printLCD("tangent: CH- "); break;

    case 0xFF906F: printLCD("tangent: EQ"); break;        
  }
}

void loop()
{
  if (irrecv.decode(&results)) // IR signal?
  {
    gotoXY(0,1);
    translate(results.value);
    irrecv.resume();
  }
}