搜尋程式碼

ESP32 教學 29/55 - 用 ESP32 讀取紅外線遙控器按鍵| SunFounder 嘅 ESP32 IoT 學習套件

ESP32 教學 29/55 - 用 ESP32 讀取紅外線遙控器按鍵| SunFounder 嘅 ESP32 IoT 學習套件

喺呢個教學入面,我哋會學吓點樣用ESP32模組同一個兼容嘅紅外線接收器嚟偵測紅外線(IR)訊號。當我哋撳遙控器上面嘅掣嗰陣,ESP32會認到個訊號,然後執行特定動作,例如某啲掣撳落去嗰陣會響蜂鳴器。呢個項目好適合想將遙控功能整合入ESP32應用程式嘅人(影片喺02:15)。

遙控器

ESP32係一個功能強大嘅微控制器,結合咗Wi-Fi同藍牙功能,好適合用喺各種物聯網應用。喺呢個項目入面,我哋會用一個紅外線接收器嚟解讀遙控器嘅訊號。掣嘅撳壓會喺程式碼入面處理,等我哋可以根據收到嘅指令嚟採取行動。

硬件解說

呢個項目嘅主要組件包括ESP32微控制器、一個紅外線接收器模組同一個蜂鳴器。ESP32係成個操作嘅大腦,負責處理由紅外線接收器收到嘅訊號。紅外線接收器偵測遙控器發出嘅紅外線訊號,然後將佢哋轉換成ESP32可以理解嘅電訊號。

ir_receiver_sl838

紅外線接收器通常有三個腳位: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-29-IR-remote-wiring

要將紅外線接收器接去ESP32,首先辨認紅外線接收器上面嘅三個腳位:VCC、GND同OUT。將VCC腳位連接去ESP32上面嘅3.3V電源。跟住,將GND腳位連接去ESP32上面其中一個接地(GND)腳位。最後,將OUT腳位連接去ESP32嘅GPIO 14腳位,呢個喺程式碼入面係指定畀紅外線接收器用嘅。

ESP32-29-IR-remote-schematic

連接好之後,確保接線穩固。如果你用麵包板,插入紅外線接收器嗰陣要令平嗰邊面向你,而凸起嗰邊喺對面。呢個方向可以幫你正確辨認腳位。喺幫ESP32通電之前,一定要檢查清楚啲連接。

程式碼範例同講解

IR_receiver_lib

安裝由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 撳掣同蜂鳴器示範

圖片

IR_receiver_lib
IR_receiver_lib
ir_receiver_sl838
ir_receiver_sl838
remote
remote
ESP32-29-IR-remote-schematic
ESP32-29-IR-remote-schematic
ESP32-29-IR-remote-wiring
ESP32-29-IR-remote-wiring
830-ESP32 Tutorial 29/55- Arduino code for fading Infrared remote
語言: C++
#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";
  }
}

你可能需要嘅嘢

資源與參考資料

文件📁

数据表 (pdf)