2. LED亮度调节

任务目标

本案例使用ESP32的PWM(脉冲宽度调制)功能,通过Web页面上的滑块实时调节LED亮度。滑块值(0-255)经WiFi传输至ESP32,ESP32将其映射为PWM占空比,实现模拟输出控制。

所需硬件与依赖

  • ESP32开发板(如ESP32-DevKitC)
  • LED(任意颜色)及220Ω限流电阻
  • Arduino IDE(需安装ESP32开发板支持包,版本≥2.0)
  • WiFi网络(手机热点亦可)

电路连接

将LED阳极(长脚)通过220Ω电阻连接至ESP32的GPIO2引脚,阴极(短脚)连接GND。

完整代码

#include <WiFi.h>
#include <WebServer.h>

// WiFi配置
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

// LED引脚与PWM配置
const int ledPin = 2;
const int pwmChannel = 0;
const int pwmFreq = 5000;
const int pwmResolution = 8;  // 0-255

WebServer server(80);

// PWM初始化
void setupPWM() {
  ledcSetup(pwmChannel, pwmFreq, pwmResolution);
  ledcAttachPin(ledPin, pwmChannel);
  ledcWrite(pwmChannel, 0);
}

// 生成控制页面
String generateHTML() {
  String html = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>LED亮度控制</title>
</head>
<body>
  <h3>LED亮度调节</h3>
  <input type="range" id="slider" min="0" max="255" value="0">
  <p>当前亮度: <span id="value">0</span></p>
  <script>
    const slider = document.getElementById('slider');
    const valueDisplay = document.getElementById('value');
    slider.oninput = function() {
      valueDisplay.textContent = this.value;
      fetch('/set?level=' + this.value);
    };
  </script>
</body>
</html>
)rawliteral";
  return html;
}

// HTTP请求处理
void handleRoot() {
  server.send(200, "text/html", generateHTML());
}

void handleSet() {
  if (server.hasArg("level")) {
    int level = server.arg("level").toInt();
    level = constrain(level, 0, 255);
    ledcWrite(pwmChannel, level);
    server.send(200, "text/plain", "OK");
  } else {
    server.send(400, "text/plain", "Missing parameter");
  }
}

void setup() {
  Serial.begin(115200);
  setupPWM();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.on("/set", handleSet);
  server.begin();
}

void loop() {
  server.handleClient();
}

运行与验证

  1. 将代码中的YOUR_SSID和YOUR_PASSWORD替换为实际WiFi凭据。
  2. 在Arduino IDE中选择正确的开发板(Tools → Board → ESP32 Dev Module)和端口,编译上传。
  3. 打开串口监视器(波特率115200),记录ESP32分配到的IP地址(如192.168.1.100)。
  4. 手机或电脑连接同一WiFi,浏览器访问http://<ESP32_IP>。
  5. 拖动滑块,观察LED亮度应随滑块位置平滑变化。

通过条件:滑块拖至最左(值0)时LED熄灭,拖至最右(值255)时LED最亮,中间位置亮度呈连续变化。串口监视器无错误输出,页面滑块响应无延迟。

常见问题

  • 无法连接WiFi:确认SSID/密码正确,ESP32仅支持2.4GHz频段。
  • LED不亮:检查GPIO2引脚连接是否正确,部分开发板GPIO2为板载LED,可改用GPIO4或GPIO16。
  • 亮度跳变:确保使用ledcWrite而非digitalWrite,后者只能输出高低电平。