2016年3月1日 星期二

以 Arduino 製作 Samsung 紅外線遙控


早幾天買了紅外線 LED 回來,加上 Arduino Nano,足以製作 Samsung 紅外線遙控。線路非常簡單。只要一顆紅外線 LED 接 220 Ohm 電阻接三號腳,加 IRremote 程序庫,簡單的編程就可以。本來要逐個按鍵數值逐個找,卻發現網上已有有心人列出所有數值。編程用最簡單的讀取 UART 決定發射哪個訊號就行!
//----------------------------------------------------------------------------------------
//  Samsung IR Remote Version 1.00
//  Created by Pacess HO on 2016-Feb-29
//  Copyright Pacess HO, 2016.  All rights reserved.
//----------------------------------------------------------------------------------------

#include <IRremote.h>

//----------------------------------------------------------------------------------------
//  https://wiki.samygo.tv/index.php5/Infrared_receiver/transmitter_support
#define KEY_ARROW_DOWN    0xE0E08679
#define KEY_ARROW_LEFT    0xE0E0A659
#define KEY_ARROW_RIGHT   0xE0E046B9
#define KEY_ARROW_UP      0xE0E006F9
#define KEY_BLUE          0xE0E06897
#define KEY_CHANNEL_0     0xE0E08877
#define KEY_CHANNEL_1     0xE0E020DF
#define KEY_CHANNEL_2     0xE0E0A05F
#define KEY_CHANNEL_3     0xE0E0609F
#define KEY_CHANNEL_4     0xE0E010EF
#define KEY_CHANNEL_5     0xE0E0906F
#define KEY_CHANNEL_6     0xE0E050AF
#define KEY_CHANNEL_7     0xE0E030CF
#define KEY_CHANNEL_8     0xE0E0B04F
#define KEY_CHANNEL_9     0xE0E0708F
#define KEY_CHANNEL_DOWN  0xE0E008F7
#define KEY_CHANNEL_UP    0xE0E048B7
#define KEY_ENTER         0xE0E016E9
#define KEY_EXIT          0xE0E0B44B
#define KEY_FASTFORWARD   0xE0E012ED
#define KEY_GREEN         0xE0E028D7
#define KEY_INFO          0xE0E0F807
#define KEY_MENU          0xE0E058A7
#define KEY_MUTE          0xE0E0F00F
#define KEY_PAUSE         0xE0E052AD
#define KEY_PLAY          0xE0E0E21D
#define KEY_POWER         0xE0E040BF
#define KEY_RED           0xE0E036C9
#define KEY_RETURN        0xE0E01AE5
#define KEY_REWIND        0xE0E0A25D
#define KEY_SLEEP         0xE0E0C03F
#define KEY_SOURCE        0xE0E0807F
#define KEY_STOP          0xE0E0629D
#define KEY_VOLUME_DOWN   0xE0E0D02F
#define KEY_VOLUME_UP     0xE0E0E01F
#define KEY_YELLOW        0xE0E0A857

#define SAMSUNG_BITS      32

//----------------------------------------------------------------------------------------
IRsend irsend;

//----------------------------------------------------------------------------------------
void setup()  {
  pinMode(3, OUTPUT);

  Serial.begin(9600);
  Serial.println("--------------------------------------------------------");
  Serial.println("--  Samsung IR Remote v1.00                           --");
  Serial.println("--  Copyright Pacess HO, 2016.  All rights reserved.  --");
  Serial.println("--------------------------------------------------------");
}

//----------------------------------------------------------------------------------------
void loop()  {
  if (Serial.available() == 0)  {return;}

  int key = Serial.read();
  uint32_t keyCode = 0;
  switch (key)  {
    default:  return;

    case '*':  keyCode = KEY_POWER;  break;
    case '0':  keyCode = KEY_CHANNEL_0;  break;
    case '1':  keyCode = KEY_CHANNEL_1;  break;
    case '2':  keyCode = KEY_CHANNEL_2;  break;
    case '3':  keyCode = KEY_CHANNEL_3;  break;
    case '4':  keyCode = KEY_CHANNEL_4;  break;
    case '5':  keyCode = KEY_CHANNEL_5;  break;
    case '6':  keyCode = KEY_CHANNEL_6;  break;
    case '7':  keyCode = KEY_CHANNEL_7;  break;
    case '8':  keyCode = KEY_CHANNEL_8;  break;
    case '9':  keyCode = KEY_CHANNEL_9;  break;

    case 'w':  keyCode = KEY_ARROW_UP;  break;
    case 'x':  keyCode = KEY_ARROW_DOWN;  break;
    case 'a':  keyCode = KEY_ARROW_LEFT;  break;
    case 'd':  keyCode = KEY_ARROW_RIGHT;  break;
    case 's':  keyCode = KEY_ENTER;  break;

    case 'q':  keyCode = KEY_EXIT;  break;
    case 'e':  keyCode = KEY_MENU;  break;
    case 'z':  keyCode = KEY_SOURCE;  break;

    case '-':
    case '_':  keyCode = KEY_CHANNEL_DOWN;  break;
    case '=':
    case '+':  keyCode = KEY_CHANNEL_UP;  break;
    
    case '{':
    case '[':  keyCode = KEY_VOLUME_DOWN;  break;
    case '}':
    case ']':  keyCode = KEY_VOLUME_UP;  break;
    
    case 'r':  keyCode = KEY_RETURN;  break;
    case 't':  keyCode = KEY_STOP;  break;
    case 'y':  keyCode = KEY_PLAY;  break;
    case 'u':  keyCode = KEY_SLEEP;  break;
    case 'i':  keyCode = KEY_INFO;  break;
    case 'o':  keyCode = KEY_FASTFORWARD;  break;
    case 'p':  keyCode = KEY_MUTE;  break;
    case 'k':  keyCode = KEY_REWIND;  break;
    case 'l':  keyCode = KEY_PAUSE;  break;
    
    case 'f':  keyCode = KEY_RED;  break;
    case 'g':  keyCode = KEY_GREEN;  break;
    case 'h':  keyCode = KEY_YELLOW;  break;
    case 'j':  keyCode = KEY_BLUE;  break;
  }

  char buffer[64];
  sprintf(buffer, "Key [%d] pressed...", key);
  Serial.println(buffer);
  irsend.sendSAMSUNG(keyCode, SAMSUNG_BITS);
  delay(500);
}

沒有留言: