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();
}
运行与验证
- 将代码中的
YOUR_SSID和YOUR_PASSWORD替换为实际WiFi凭据。 - 在Arduino IDE中选择正确的开发板(Tools → Board → ESP32 Dev Module)和端口,编译上传。
- 打开串口监视器(波特率115200),记录ESP32分配到的IP地址(如192.168.1.100)。
- 手机或电脑连接同一WiFi,浏览器访问
http://<ESP32_IP>。 - 拖动滑块,观察LED亮度应随滑块位置平滑变化。
通过条件:滑块拖至最左(值0)时LED熄灭,拖至最右(值255)时LED最亮,中间位置亮度呈连续变化。串口监视器无错误输出,页面滑块响应无延迟。
常见问题
- 无法连接WiFi:确认SSID/密码正确,ESP32仅支持2.4GHz频段。
- LED不亮:检查GPIO2引脚连接是否正确,部分开发板GPIO2为板载LED,可改用GPIO4或GPIO16。
- 亮度跳变:确保使用
ledcWrite而非digitalWrite,后者只能输出高低电平。