搜尋程式碼

ESP32 教學 34/55 - 用 RGB LED 同旋鈕整顏色漸變 | SunFounder 嘅 ESP32 IoT 學習套件

ESP32 教學 34/55 - 用 RGB LED 同旋鈕整顏色漸變 | SunFounder 嘅 ESP32 IoT 學習套件

喺呢個教學入面,我哋會用一粒RGB LED整一個顏色漸變效果,效果會根據可變電阻(旋鈕)嘅位置而調整。呢個項目用咗ESP32微控制器,佢內置Wi-Fi同藍牙功能,令到佢成為物聯網項目嘅一個多用途選擇。透過轉動可變電阻,我哋可以平滑噉喺唔同顏色之間過渡,同時展示RGB LED嘅功能同埋讀取可變電阻模擬值嘅能力。

ESO32-34_-Color-Gradient-main

呢個項目好啱用嚟學習PWM(脈衝寬度調製)同埋點樣用微控制器控制模擬裝置。成個教學入面,我哋會討論需要嘅硬件零件、接線指示,同埋提供程式碼片段幫你實現呢個項目。如果想睇更視覺化嘅解釋,記得睇吓相關嘅影片(影片喺02:15嘅位置)。

硬件解釋

ESO32-34_-Color-Gradient-schematic

呢個項目用到嘅主要零件包括ESP32微控制器、一粒RGB LED同一個可變電阻。ESP32係一粒好強大嘅微控制器,可以處理各種任務,包括無線通訊,令到佢好適合用喺物聯網應用。RGB LED由三粒獨立嘅LED(紅、綠、藍)組成,可以混合出好多唔同顏色。可變電阻就係一個可調節嘅電阻,會根據佢嘅位置提供一個可變嘅電壓輸出。

ESP32_rgb_pin

RGB LED可以用兩種方式連接:共陽極或者共陰極。喺呢個項目入面,我哋會用共陽極配置,即係將所有陽極一齊連去正電壓,等我哋可以用PWM獨立控制每粒LED嘅亮度。可變電阻會連去ESP32嘅一個模擬輸入,用嚟讀取佢嘅位置,再相應噉調整RGB數值。

數據表詳細資料

製造商 SunFounder
零件編號 RGB LED
邏輯/IO電壓 3.3 V
供電電壓 5 V
輸出電流(每通道) 20 mA
峰值電流(每通道) 30 mA
PWM頻率指引 5 kHz
輸入邏輯閾值 0.3 V(低)/ 2.7 V(高)
電壓降 / RDS(on) / 飽和 1.8 V(典型值)
熱限制 工作溫度:-40°C 至 +85°C
封裝 通孔
備註 / 變體 共陽極配置

 

  • 每個LED通道用一個220歐姆電阻嚟限制電流。
  • 確保RGB LED嘅供電電壓正確(5V)。
  • 將共陽極連去正電壓供應。
  • 用PWM控制每粒LED顏色嘅亮度。
  • 小心可變電阻嘅連接,避免浮動輸入。
  • 上載程式碼之前,確認ESP32已經正確供電。

接線指示

要將RGB LED同可變電阻接去ESP32,首先將RGB LED嘅共陽極引腳連去ESP32嘅3.3V電源引腳。RGB LED嘅紅、綠、藍引腳會分別連去引腳272625。記得喺每粒LED顏色引腳度串聯一個220歐姆電阻嚟限制電流同保護LED。

跟住,將可變電阻接去ESP32,方法係將左邊引腳連去3.3V電源引腳,右邊引腳連去接地,中間引腳連去ESP32嘅14。呢個配置令到ESP32可以讀取可變電阻嘅模擬電壓,用嚟根據佢嘅位置調整RGB LED嘅顏色。

程式碼示例同講解

喺setup函數入面,我哋定義RGB LED同可變電阻嘅引腳,同時初始化PWM設定。以下程式碼片段顯示咗我哋點樣設定RGB LED引腳:

const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;

void setup() {
  ledcAttach(redPin, freq, resolution);
  ledcAttach(greenPin, freq, resolution);
  ledcAttach(bluePin, freq, resolution);
}

喺呢個片段入面,我哋定義紅、綠、藍LED嘅引腳,並將佢哋連去有指定頻率同解析度嘅PWM通道。

loop函數會讀取可變電阻嘅數值,然後將佢轉換成色相值,再用嚟決定RGB數值。以下摘錄展示咗呢個過程:

void loop() {
  int knobValue = analogRead(KNOB_PIN);
  float hueValue = (float)knobValue / 4095.0;
  int hue = (int)(hueValue * 360);
  
  int red, green, blue;
  HUEtoRGB(hue, &red, &green, &blue);
  setColor(red, green, blue);
}

呢段代碼讀取電位器嘅模擬值,將佢標準化,然後計算對應嘅色相。之後佢會呼叫HUEtoRGB函數將色相轉換成RGB值,再將呢啲值傳俾setColor函數去更新LED。

示範/預期效果

完成接線同埋上載代碼之後,你應該可以擰個電位器嚟平滑噉改變RGB LED嘅顏色。當你轉動個旋鈕,LED會根據由旋鈕位置計算出嚟嘅色相值,喺唔同顏色之間過渡。如果LED冇著或者行為異常,檢查吓接線,確保電位器正確連接(喺影片10:45位置)。

影片時間戳

  • 00:00 開始
  • 2:11 項目介紹
  • 4:31 RGB LED
  • 8:18 RGB顏色
  • 12:18 接線講解
  • 17:59 Arduino代碼講解
  • 24:12 喺Arduino IDE度選擇ESP32開發板同COM埠
  • 25:54 示範

圖片

ESP32_rgb_pin
ESP32_rgb_pin
ESP32_RGB_led_wires
ESP32_RGB_led_wires
potentiometer
potentiometer
ESO32-34_-Color-Gradient-wiring
ESO32-34_-Color-Gradient-wiring
ESO32-34_-Color-Gradient-schematic
ESO32-34_-Color-Gradient-schematic
ESO32-34_-Color-Gradient-main
ESO32-34_-Color-Gradient-main
835-ESP32 Tutorial 34/55- Arduino code for color gradient
語言: C++
// Define RGB LED pins
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;

// Define PWM frequency and resolution
const int freq = 5000;
const int resolution = 8;

// Define the pin for the knob
#define KNOB_PIN 14

void setup() {
  Serial.begin(115200);
  ledcAttach(redPin, freq, resolution);
  ledcAttach(greenPin, freq, resolution);
  ledcAttach(bluePin, freq, resolution);
}

void loop() {
  // Read the value of the knob
  int knobValue = analogRead(KNOB_PIN);
  Serial.println(knobValue);
  // Normalize the knob value to the range 0-1
  float hueValue = (float)knobValue / 4095.0;

  // Convert the normalized value to a HUE value (0-360)
  int hue = (int)(hueValue * 360);

  // Convert the HUE value to RGB values
  int red, green, blue;
  HUEtoRGB(hue, &red, &green, &blue);

  // Update the RGB LED with the new color values
  setColor(red, green, blue);
}

void setColor(int red, int green, int blue) {
  ledcWrite(redPin, red);
  ledcWrite(greenPin, green);
  ledcWrite(bluePin, blue);
}

// Convert a HUE value to RGB values
void HUEtoRGB(int hue, int* red, int* green, int* blue) {
  float h = (float)hue / 60.0;
  float c = 1.0;
  float x = c * (1.0 - fabs(fmod(h, 2.0) - 1.0));
  float r, g, b;
  if (h < 1.0) {
    r = c;
    g = x;
    b = 0;
  } else if (h < 2.0) {
    r = x;
    g = c;
    b = 0;
  } else if (h < 3.0) {
    r = 0;
    g = c;
    b = x;
  } else if (h < 4.0) {
    r = 0;
    g = x;
    b = c;
  } else if (h < 5.0) {
    r = x;
    g = 0;
    b = c;
  } else {
    r = c;
    g = 0;
    b = x;
  }
  float m = 1.0 - c;
  *red = (int)((r + m) * 255);
  *green = (int)((g + m) * 255);
  *blue = (int)((b + m) * 255);
}

資源與參考資料

文件📁

冇文件可用。