ESP32 教學 31/55 - 專案 LED 燈帶配合避障功能 | SunFounder 嘅 ESP32 IoT 學習套件
喺呢個教學入面,我哋會用一粒ESP32微控制器同一條WS2812 LED燈帶嚟整一個項目,佢可以根據障礙物偵測嚟改變方向。當條燈帶向前移動嗰陣,佢會顯示隨機顏色,而偵測到障礙物嘅時候,佢就會轉做預設顏色同埋掉轉方向。呢個項目展示咗ESP32配合紅外線避障感應器嘅能力。
成個教學入面,我哋會涵蓋所需嘅硬件零件、接線指示,同埋令呢個項目運作嘅程式碼。想睇更視覺化嘅解釋,記得睇下面連結嘅影片(影片喺00:00)。
硬件解說
呢個項目需要幾個零件,包括ESP32微控制器、一條WS2812 LED燈帶,同一個紅外線避障感應器。ESP32係一粒好強大嘅微控制器,內置Wi-Fi同藍牙,好啱用喺IoT應用。WS2812 LED燈帶係一條可編程RGB LED燈帶,可以獨立控制每粒LED,等我哋可以做到動態燈光效果。
紅外線避障感應器嘅運作原理係發射紅外線光,然後偵測附近物件嘅反射。當偵測到障礙物嘅時候,感應器會改變輸出狀態,令ESP32可以相應咁回應,改變LED燈帶嘅行為。
數據表詳情
| 製造商 | WS2812B |
|---|---|
| 零件編號 | WS2812B |
| 邏輯/IO電壓 | 3.3 V(典型值) |
| 供電電壓 | 5 V(典型值) |
| 輸出電流(每通道) | 20 mA(最大) |
| 峰值電流(每通道) | 60 mA(最大) |
| PWM頻率指引 | 400 Hz(典型值) |
| 輸入邏輯閾值 | 0.3 Vcc(高),0.1 Vcc(低) |
| 電壓降 / RDS(on) / 飽和 | 1.2 V(最大) |
| 熱限制 | 85 °C(最大) |
| 封裝 | 表面貼裝 |
| 備註 / 變體 | 有多種長度同密度可供選擇 |
- 確保LED燈帶用5 V供電,以達到最佳效能。
- 喺數據腳位用合適嘅電阻,防止訊號完整性問題。
- 留意輸出電流限制,避免過熱。
- 適當咁為電源做去耦,防止電壓尖峰。
- 小心調整紅外線感應器,以達到想要嘅偵測範圍。
接線指示

要接駁零件,首先由紅外線避障感應器開始。將感應器嘅輸出腳位連接到ESP32嘅25腳。中間嘅腳位應該連接到地線,而最後嘅腳位(VCC)就應該連接到3.3 V電源。
跟住,對於WS2812 LED燈帶,將數據腳位(通常係黃色線)連接到ESP32嘅14腳。紅色線應該連接到5 V電源,而黑色線就應該連接到地線。確保所有連接都穩固,防止有鬆脫嘅接線。
程式碼示例同講解
以下係運行呢個項目嘅程式碼簡介。首先,我哋定義LED燈帶入面嘅像素數量,同埋用嚟通訊嘅數據腳位:
#define NUM_PIXELS 8
#define DATA_PIN 14
喺setup()函數入面,我哋初始化LED燈帶同紅外線感應器:
void setup() {
pixels.begin();
pinMode(AVOID_PIN, INPUT_PULLUP);
uint32_t color = pixels.Color(random(256), random(256), random(256));
pixels.fill(color);
pixels.show();
}
喺loop()函數入面,我哋檢查係咪偵測到障礙物,然後相應咁控制LED燈帶:
if (avoid_value) {
for (int i = 0; i < NUM_PIXELS; i++) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
} else {
for (int i = NUM_PIXELS - 1; i >= 0; i--) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
}
呢段程式碼令LED燈帶向前移動嗰陣顯示隨機顏色,偵測到障礙物嗰陣就改變方向。完整程式碼會喺文章下面載入,記得睇吓攞晒所有細節。
示範 / 預期效果
當接線完成同程式碼上載之後,LED燈帶應該會開始向前移動,同時顯示隨機顏色。當偵測到障礙物嘅時候,燈帶會轉做預設顏色(例如綠色)同掉轉方向。如果障礙物移開咗,燈帶就會恢復向前移動,繼續顯示隨機顏色。要注意紅外線感應器嘅偵測範圍可能會因為所用嘅電源而有差異(影片喺10:30)。
影片時間戳
- 00:00 開始
- 2:14 項目介紹
- 4:58 接線講解
- 7:41 調整避障感應器
- 10:03 Arduino 代碼講解
- 15:40 喺 Arduino IDE 度選擇 ESP32 板同 COM 埠
- 17:22 項目 1:示範
- 18:17 改變返回顏色
#include <Adafruit_NeoPixel.h>
// Set the number of pixels for the running light
#define NUM_PIXELS 8
// Set the data pin for the RGB LED strip
#define DATA_PIN 14
// Initialize the RGB LED strip object
Adafruit_NeoPixel pixels(NUM_PIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
// Initialize the avoid sensor
#define AVOID_PIN 25
void setup() {
// Initialize the RGB LED strip
pixels.begin();
// Initialize the avoid sensor
pinMode(AVOID_PIN, INPUT_PULLUP);
// Set the initial LED color
uint32_t color = pixels.Color(random(256), random(256), random(256));
pixels.fill(color);
pixels.show();
}
void loop() {
// Read the input from the infrared sensor
bool avoid_value = digitalRead(AVOID_PIN);
// Generate a random color for the current pixel
uint32_t color = pixels.Color(random(256), random(256), random(256));
// If no obstacle is detected
if (avoid_value) {
for (int i = 0; i < NUM_PIXELS; i++) {
// Turn on the current pixel with the random color
pixels.setPixelColor(i, color);
// Update the RGB LED strip display
pixels.show();
// Turn off the current pixel
pixels.setPixelColor(i, 0);
delay(100);
}
}
// If detects an obstacle, change the direction of the LED strip
else {
for (int i = NUM_PIXELS - 1; i >= 0; i--) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
}
}
Common Course Links
Common Course Files
資源與參考資料
-
文件记录ESP32 Tutorial 31/55 - SunFounder doc page for flowing lightdocs.sunfounder.com
文件📁
冇文件可用。