////////////////////////////////////////////////////////////////////////////////////////////////////
/*
電子元件:IR紅外線收發模組
功能:使用LCD顯示 NEC 格式編碼的紅外線訊息
接線:
      GND - GND
      VCC - 3.3V
      SDA - 21
      SCL - 22
*/
#include <IRremote.h>           // 使用 IRremote 函式庫
#include <LiquidCrystal_I2C.h>  // 使用 LiquidCrystal I2C函式庫
#define I2C_ADDR    0x27        // LCD1602模組的預設I2C位址是0x27
#define LCD_COLUMNS 16          // 16行
#define LCD_LINES   2           // 2列
// 建立 LiquidCrystal_I2C 物件,名稱 lcd
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

#define receiverPin 2           // 紅外線接收模組接腳
IRrecv receiver(receiverPin);   // 宣告一個紅外線接收物件

void setup() {
  // 初始化 LCD
  lcd.init();
  lcd.backlight();
  // 啟動紅外線接收功能
  receiver.enableIRIn();   
}
void loop() {
  // 檢查是否收到紅外線訊號
  if (receiver.decode()) {
    translateIR();          // 自訂紅外線訊號處理函式
    receiver.resume();      // 準備接收下一個值
  }
}

void lcdPrint(char* text)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("button pressed:");
  lcd.setCursor(0, 1);
  lcd.print(text);
  lcd.print(" code: ");
  lcd.print(receiver.decodedIRData.command);
}

// 自訂紅外線訊號處理函式
void translateIR()
{
  // 依收到的紅外線代碼進行程式分支
  switch (receiver.decodedIRData.command) {
    case 162:
      lcdPrint("POWER");
      break;
    case 226:
      lcdPrint("MENU");
      break;
    case 34:
      lcdPrint("TEST");
      break;
    case 2:
      lcdPrint("PLUS");
      break;
    case 194:
      lcdPrint("BACK");
      break;
    case 224:
      lcdPrint("PREV.");
      break;
    case 168:
      lcdPrint("PLAY");
      break;
    case 144:
      lcdPrint("NEXT");
      break;
    case 104:
      lcdPrint("num: 0");
      break;
    case 152:
      lcdPrint("MINUS");
      break;
    case 176:
      lcdPrint("key: C");
      break;
    case 48:
      lcdPrint("num: 1");
      break;
    case 24:
      lcdPrint("num: 2");
      break;
    case 122:
      lcdPrint("num: 3");
      break;
    case 16:
      lcdPrint("num: 4");
      break;
    case 56:
      lcdPrint("num: 5");
      break;
    case 90:
      lcdPrint("num: 6");
      break;
    case 66:
      lcdPrint("num: 7");
      break;
    case 74:
      lcdPrint("num: 8");
      break;
    case 82:
      lcdPrint("num: 9");
      break;
    default:
      lcd.clear();
      lcd.print(receiver.decodedIRData.command);
      lcd.print(" other button");
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////////






// 使用 IRremoteESP8266 函式庫
////////////////////////////////////////////////////////////////////////////////////////////////////
// /*
// 電子元件:IR紅外線收發模組
// 功能:使用LCD顯示 NEC 格式編碼的紅外線訊息
// 接線:
//       GND - GND
//       VCC - 3.3V
//       SDA - 21
//       SCL - 22
// */
// #include <IRremoteESP8266.h>    // 使用 IRremoteESP8266 函式庫
// #include <IRrecv.h>
// #include <IRutils.h>
// #include <LiquidCrystal_I2C.h>  // 使用 LiquidCrystal I2C函式庫
// #define I2C_ADDR    0x27        // LCD1602模組的預設I2C位址是0x27
// #define LCD_COLUMNS 16          // 16行
// #define LCD_LINES   2           // 2列
// // 建立 LiquidCrystal_I2C 物件,名稱 lcd
// LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

// #define receiverPin 2           // 紅外線接收模組接腳
// IRrecv receiver(receiverPin);   // 宣告一個紅外線接收物件
// decode_results results;

// void setup() {
//   // 初始化 LCD
//   lcd.init();
//   lcd.backlight();
//   // 啟動紅外線接收功能
//   receiver.enableIRIn(); 
// }
// void loop() {
//   // 檢查是否收到紅外線訊號  
//   if (receiver.decode(&results)) {
//     // 輸出訊號
//     serialPrintUint64(results.value, HEX);    // print() & println() can't handle printing long longs. (uint64_t)
//     translateIR();          // 自訂紅外線訊號處理函式
//     receiver.resume();      // 準備接收下一個值    
//   }
// }

// void lcdPrint(char* text)
// {
//   lcd.clear();
//   lcd.setCursor(0, 0);
//   lcd.print("button pressed:");
//   lcd.setCursor(0, 1);
//   lcd.print(text);
//   lcd.print(" code: ");
//   lcd.print(results);
// }

// // 自訂紅外線訊號處理函式
// void translateIR()
// {
//   // 依收到的紅外線代碼進行程式分支
//   switch (results) {
//     case 162:
//       lcdPrint("POWER");
//       break;
//     case 226:
//       lcdPrint("MENU");
//       break;
//     case 34:
//       lcdPrint("TEST");
//       break;
//     case 2:
//       lcdPrint("PLUS");
//       break;
//     case 194:
//       lcdPrint("BACK");
//       break;
//     case 224:
//       lcdPrint("PREV.");
//       break;
//     case 168:
//       lcdPrint("PLAY");
//       break;
//     case 144:
//       lcdPrint("NEXT");
//       break;
//     case 104:
//       lcdPrint("num: 0");
//       break;
//     case 152:
//       lcdPrint("MINUS");
//       break;
//     case 176:
//       lcdPrint("key: C");
//       break;
//     case 48:
//       lcdPrint("num: 1");
//       break;
//     case 24:
//       lcdPrint("num: 2");
//       break;
//     case 122:
//       lcdPrint("num: 3");
//       break;
//     case 16:
//       lcdPrint("num: 4");
//       break;
//     case 56:
//       lcdPrint("num: 5");
//       break;
//     case 90:
//       lcdPrint("num: 6");
//       break;
//     case 66:
//       lcdPrint("num: 7");
//       break;
//     case 74:
//       lcdPrint("num: 8");
//       break;
//     case 82:
//       lcdPrint("num: 9");
//       break;
//     default:
//       lcd.clear();
//       lcd.print(receiver.decodedIRData.command);
//       lcd.print(" other button");
//   }
// }


////////////////////////////////////////////////////////////////////////////////////////////////////
// /*
//  * 電子元件:紅外線接收模組
//  * 功能:收訊輸出紅外線訊號的16進位值 * 
//  */

// //#include <Arduino.h>
// #include <IRremoteESP8266.h>
// #include <IRrecv.h>
// #include <IRutils.h>

// #define receiverPin 2           // 紅外線接收模組接腳
// IRrecv receiver(receiverPin);   // 宣告一個紅外線接收物件
// decode_results results;

// void setup() {
//   Serial.begin(115200);
//   receiver.enableIRIn();        // 啟動紅外線接收功能
// }

// void loop() {
//   if (receiver.decode(&results)) {
//     serialPrintUint64(results.value, HEX);      // 輸出紅外線訊號的值   // print() & println() can't handle printing long longs. (uint64_t)
//     Serial.println("");
//     receiver.resume();                          // 準備接收下一個值
//   }
//   delay(100);
// }
////////////////////////////////////////////////////////////////////////////////////////////////////