ESP32 教學 29/55 - 用 ESP32 讀取紅外線遙控器按鍵| SunFounder 嘅 ESP32 IoT 學習套件
喺呢個教學入面,我哋會學吓點樣用ESP32模組同一個兼容嘅紅外線接收器嚟偵測紅外線(IR)訊號。當我哋撳遙控器上面嘅掣嗰陣,ESP32會認到個訊號,然後執行特定動作,例如某啲掣撳落去嗰陣會響蜂鳴器。呢個項目好適合想將遙控功能整合入ESP32應用程式嘅人(影片喺02:15)。
ESP32係一個功能強大嘅微控制器,結合咗Wi-Fi同藍牙功能,好適合用喺各種物聯網應用。喺呢個項目入面,我哋會用一個紅外線接收器嚟解讀遙控器嘅訊號。掣嘅撳壓會喺程式碼入面處理,等我哋可以根據收到嘅指令嚟採取行動。
硬件解說
呢個項目嘅主要組件包括ESP32微控制器、一個紅外線接收器模組同一個蜂鳴器。ESP32係成個操作嘅大腦,負責處理由紅外線接收器收到嘅訊號。紅外線接收器偵測遙控器發出嘅紅外線訊號,然後將佢哋轉換成ESP32可以理解嘅電訊號。
紅外線接收器通常有三個腳位:VCC(電源)、GND(接地)同OUT(訊號)。VCC腳位連接去電源(3.3V或5V),而GND就連接去接地。OUT腳位會將解碼咗嘅訊號送去ESP32,然後可以用嚟觸發各種動作,例如當撳某個特定掣嗰陣啟動蜂鳴器。
數據手冊詳情
| 製造商 | Sharp |
|---|---|
| 零件編號 | GP1UXC41 |
| 邏輯/IO電壓 | 3.3 - 5.0 V |
| 供電電壓 | 3.3 V(典型值) |
| 輸出電流(每通道) | 20 mA(最大) |
| 峰值電流(每通道) | 50 mA(最大) |
| PWM頻率指引 | 38 kHz |
| 輸入邏輯閾值 | 0.3 Vcc(高),0.2 Vcc(低) |
| 電壓降 / RDS(on) / 飽和 | 0.5 V(最大) |
| 熱限制 | 85 °C(最大) |
| 封裝 | TO-92 |
| 備註 / 變體 | 有多種配置可供選擇 |
- 確保電源供應正確,以免損壞。
- 使用短電線以減少訊號干擾。
- 連接前檢查紅外線接收器嘅方向。
- 確認遙控器電池正常運作。
- 如有需要,使用上拉電阻以確保穩定。
接線說明

要將紅外線接收器接去ESP32,首先辨認紅外線接收器上面嘅三個腳位:VCC、GND同OUT。將VCC腳位連接去ESP32上面嘅3.3V電源。跟住,將GND腳位連接去ESP32上面其中一個接地(GND)腳位。最後,將OUT腳位連接去ESP32嘅GPIO 14腳位,呢個喺程式碼入面係指定畀紅外線接收器用嘅。
連接好之後,確保接線穩固。如果你用麵包板,插入紅外線接收器嗰陣要令平嗰邊面向你,而凸起嗰邊喺對面。呢個方向可以幫你正確辨認腳位。喺幫ESP32通電之前,一定要檢查清楚啲連接。
程式碼範例同講解
安裝由David Conran、Sebastien開發嘅IRremoteESP8266程式庫。
喺程式碼入面,我哋用常數IR_RECEIVE_PIN定義紅外線接收器腳位,設定為14。我哋亦都建立一個IRrecv實例嚟處理紅外線訊號。
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
呢個設定令我哋可以接收嚟自紅外線遙控器嘅訊號。喺setup()函數入面,我哋初始化序列通訊同啟用紅外線接收器。
void setup() {
Serial.begin(115200);
irrecv.enableIRIn();
}
喺loop()函數入面,我哋檢查係咪收到紅外線訊號。如果有嘅話,我哋解碼掣嘅數值,然後將佢打印去序列監視器。
if (irrecv.decode(&results)) {
String key = decodeKeyValue(results.value);
Serial.println(key);
irrecv.resume();
}
呢段程式碼示範咗我哋點樣解碼收到嘅訊號,然後將對應嘅掣值打印去序列監視器。decodeKeyValue()函數會將收到嘅訊號對應去特定嘅按鈕數值,例如「0」、「1」、「EQ」等等。你可以喺文章下面搵到完整嘅程式碼。
示範 / 預期效果
一旦接線完成並且程式碼上傳之後,撳遙控器上面嘅掣,應該會喺序列監視器度顯示對應嘅按鍵值。例如,撳「2」掣就會喺監視器度印出「2」。如果個掣唔係被識別嘅,就會返回「ERROR」。當撳到指定嘅掣(例如「EQ」)嗰陣,蜂鳴器就會響,提供即時反饋。
要小心常見嘅陷阱,例如接線嘅正負極調轉咗,或者用錯電壓等級。確保遙控器正常運作,而且電池有電,先至好測試你嘅設置(喺影片15:30度)。
影片時間戳
- 00:00 開始
- 2:05 紅外線接收器介紹
- 4:24 接線講解
- 6:08 紅外線接收器嘅Arduino程式碼講解
- 10:06 喺Arduino IDE度選擇ESP32板同COM埠
- 11:48 項目示範
- 13:09 有源蜂鳴器直接連接到ESP32
- 14:40 撳掣嗰陣採取行動
- 15:30 採取行動嘅Arduino程式碼
- 16:54 撳掣同蜂鳴器示範
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// Define the IR receiver pin
const uint16_t IR_RECEIVE_PIN = 14;
// Create an IRrecv object
IRrecv irrecv(IR_RECEIVE_PIN);
// Create a decode_results object
decode_results results;
void setup() {
// Start serial communication
Serial.begin(115200);
// Start the IR receiver
irrecv.enableIRIn();
}
void loop() {
// If an IR signal is received
if (irrecv.decode(&results)) {
String key = decodeKeyValue(results.value);
if (key != "ERROR") {
// Print the value of the signal to the serial monitor
Serial.println(key);
}
irrecv.resume(); // Continue to receive the next signal
}
}
// Function to decode the value of the IR signal
String decodeKeyValue(long result)
{
switch(result){
case 0xFF6897:
return "0";
case 0xFF30CF:
return "1";
case 0xFF18E7:
return "2";
case 0xFF7A85:
return "3";
case 0xFF10EF:
return "4";
case 0xFF38C7:
return "5";
case 0xFF5AA5:
return "6";
case 0xFF42BD:
return "7";
case 0xFF4AB5:
return "8";
case 0xFF52AD:
return "9";
case 0xFF906F:
return "+";
case 0xFFA857:
return "-";
case 0xFFE01F:
return "EQ";
case 0xFFB04F:
return "U/SD";
case 0xFF9867:
return "CYCLE";
case 0xFF22DD:
return "PLAY/PAUSE";
case 0xFF02FD:
return "BACKWARD";
case 0xFFC23D:
return "FORWARD";
case 0xFFA25D:
return "POWER";
case 0xFFE21D:
return "MUTE";
case 0xFF629D:
return "MODE";
case 0xFFFFFFFF:
return "ERROR";
default :
return "ERROR";
}
}
Common Course Links
Common Course Files
你可能需要嘅嘢
-
亞馬遜
-
易贝
資源與參考資料
-
文件记录ESP32 Tutorial 23/55 - SunFounder doc page for IR receiverdocs.sunfounder.com
文件📁
数据表 (pdf)
-
IR-remote_TL1838-Infrared-Receiver-datasheet
robojax-IR-remote_TL1838-Infrared-Receiver-datasheet.pdf0.46 MB