4. 按键状态监控
任务目标
在ESP32上连接一个物理按键,通过Web页面实时显示按键的按下/释放状态。当按键状态变化时,页面无需手动刷新即可自动更新。
所需材料
- ESP32开发板(如ESP32-DevKitC)
- 按键模块(或轻触开关+10kΩ上拉电阻)
- 面包板与杜邦线
- Arduino IDE(安装esp32开发板支持包)
硬件连接
按键一端连接GPIO 4,另一端连接GND。GPIO 4配置为INPUT_PULLUP,利用ESP32内部上拉电阻,按键按下时读到低电平,释放时读到高电平。
完整代码
#include <WiFi.h>
#include <WebServer.h>
// WiFi配置
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 按键引脚
const int buttonPin = 4;
int lastButtonState = HIGH;
bool buttonChanged = false;
WebServer server(80);
// 生成HTML页面(内嵌JavaScript轮询)
String getHTML() {
String html = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ESP32按键监控</title>
<style>
body { font-family: Arial; text-align: center; padding: 40px; }
.status { font-size: 48px; font-weight: bold; padding: 20px; border-radius: 10px; }
.pressed { background: #ff4444; color: white; }
.released { background: #44aa44; color: white; }
</style>
</head>
<body>
<h3>按键状态监控</h3>
<div id="status" class="status released">释放</div>
<p>状态自动更新,无需刷新页面</p>
<script>
function fetchState() {
fetch('/state')
.then(response => response.json())
.then(data => {
const el = document.getElementById('status');
if (data.state === 0) {
el.textContent = '按下';
el.className = 'status pressed';
} else {
el.textContent = '释放';
el.className = 'status released';
}
});
}
setInterval(fetchState, 200); // 每200ms轮询一次
fetchState();
</script>
</body>
</html>
)rawliteral";
return html;
}
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
lastButtonState = digitalRead(buttonPin);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi连接成功");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
server.on("/", []() {
server.send(200, "text/html", getHTML());
});
server.on("/state", []() {
String json = "{\"state\":" + String(digitalRead(buttonPin)) + "}";
server.send(200, "application/json", json);
});
server.begin();
Serial.println("HTTP服务器已启动");
}
void loop() {
server.handleClient();
}
运行与验证
- 将代码中的
your_SSID和your_PASSWORD替换为实际WiFi信息。 - 按硬件连接图接线,选择正确的开发板型号和端口,编译上传。
- 打开串口监视器(波特率115200),记录ESP32获取的IP地址。
- 浏览器访问该IP地址,页面显示当前按键状态为“释放”(绿色背景)。
- 按下按键并保持,页面应在约200ms内变为“按下”(红色背景);释放按键后恢复为“释放”。
通过条件:页面状态能随按键物理操作实时切换,且无需手动刷新浏览器。
常见问题
- 页面无法访问:确认ESP32与电脑在同一局域网,检查串口输出的IP地址是否正确。
- 状态不变化:检查按键接线,确认GPIO 4在按下时读到低电平(可用串口打印
digitalRead(buttonPin)验证)。 - 状态抖动:本案例未做软件消抖,若需更精确可在代码中增加10~20ms延时确认。