WOKWI IR_紅外線收發模組
模擬圖中接線如下:
IR 接收器:
VCC 必須接到 ESP32 的 3.3V 或 5V。
GND 接到 GND。
DAT (或 OUT) 必須接到 GPIO 2 (對應程式中的
receiverPin)。
LCD 1602 (I2C):
SDA 接到 GPIO 21。
SCL 接到 GPIO 22。
VCC 接到 5V (ESP32 有些腳位是 3.3V,若 LCD 沒顯示請改接 5V)。
GND 接到 GND。
#include <Arduino.h>
#include <IRremote.hpp> // 注意:新版本建議使用 .hpp
#include <LiquidCrystal_I2C.h>
// 定義接腳 (對應您的接線圖)
#define IR_RECEIVE_PIN 2 // 紅外線訊號接到 GPIO 2
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// 建立 LCD 物件 (SDA 預設為 21, SCL 預設為 22)
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
Serial.begin(115200);
// 初始化 LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ESP32 IR System");
// 初始化紅外線接收
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println("IR Receiver Initialized");
}
void lcdPrint(const char* text, uint16_t cmd) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Button: ");
lcd.print(text);
lcd.setCursor(0, 1);
lcd.print("Code: ");
lcd.print(cmd);
}
void translateIR() {
// 取得收到的 Command (NEC 格式)
uint16_t cmd = IrReceiver.decodedIRData.command;
Serial.print("Received command: ");
Serial.println(cmd);
switch (cmd) {
case 162: lcdPrint("POWER", cmd); break;
case 226: lcdPrint("MENU", cmd); break;
case 34: lcdPrint("TEST", cmd); break;
case 2: lcdPrint("PLUS", cmd); break;
case 194: lcdPrint("BACK", cmd); break;
case 224: lcdPrint("PREV.", cmd); break;
case 168: lcdPrint("PLAY", cmd); break;
case 144: lcdPrint("NEXT", cmd); break;
case 104: lcdPrint("num: 0", cmd); break;
case 152: lcdPrint("MINUS", cmd); break;
case 176: lcdPrint("key: C", cmd); break;
case 48: lcdPrint("num: 1", cmd); break;
case 24: lcdPrint("num: 2", cmd); break;
case 122: lcdPrint("num: 3", cmd); break;
case 16: lcdPrint("num: 4", cmd); break;
case 56: lcdPrint("num: 5", cmd); break;
case 90: lcdPrint("num: 6", cmd); break;
case 66: lcdPrint("num: 7", cmd); break;
case 74: lcdPrint("num: 8", cmd); break;
case 82: lcdPrint("num: 9", cmd); break;
default:
lcd.clear();
lcd.print("Other: ");
lcd.print(cmd);
}
}
void loop() {
if (IrReceiver.decode()) {
translateIR();
IrReceiver.resume(); // 準備接收下一組訊號
}
}


沒有留言:
張貼留言