搜尋程式碼

ESP32 教學 31/55 - 專案 LED 燈帶配合避障功能 | SunFounder 嘅 ESP32 IoT 學習套件

ESP32 教學 31/55 - 專案 LED 燈帶配合避障功能 | SunFounder 嘅 ESP32 IoT 學習套件

喺呢個教學入面,我哋會用一粒ESP32微控制器同一條WS2812 LED燈帶嚟整一個項目,佢可以根據障礙物偵測嚟改變方向。當條燈帶向前移動嗰陣,佢會顯示隨機顏色,而偵測到障礙物嘅時候,佢就會轉做預設顏色同埋掉轉方向。呢個項目展示咗ESP32配合紅外線避障感應器嘅能力。

ESP32-31-flowing-light-main2

成個教學入面,我哋會涵蓋所需嘅硬件零件、接線指示,同埋令呢個項目運作嘅程式碼。想睇更視覺化嘅解釋,記得睇下面連結嘅影片(影片喺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-31-flowing-light-wiring

要接駁零件,首先由紅外線避障感應器開始。將感應器嘅輸出腳位連接到ESP32嘅25腳。中間嘅腳位應該連接到地線,而最後嘅腳位(VCC)就應該連接到3.3 V電源。

ESP32-31-flowing-light-schematic

跟住,對於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 改變返回顏色

圖片

ESP32-31-flowing-light-main2
ESP32-31-flowing-light-main2
ESP32-31-flowing-light-main
ESP32-31-flowing-light-main
ESP32-31-flowing-light-schematic
ESP32-31-flowing-light-schematic
ESP32-31-flowing-light-wiring
ESP32-31-flowing-light-wiring
832-ESP32 Tutorial 31/55- Arduino code flowing light
語言: C++
#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);
    }
  }
}

資源與參考資料

文件📁

冇文件可用。