1. 项目概述:ESP32与Python的物联网联动
在智能家居和工业自动化领域,设备联网控制是最基础也最核心的需求。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯片,配合Python强大的生态,可以快速构建物联网原型系统。本文将手把手带你完成一个经典案例:通过HTTP API远程控制LED灯状态。
这个项目看似简单,却涵盖了物联网开发的完整链路:
- 硬件端:ESP32作为终端设备,负责GPIO控制和网络通信
- 服务端:Python搭建的HTTP服务,提供RESTful API
- 控制端:任何能发送HTTP请求的设备(手机/电脑/其他IoT设备)
我曾在一个智能农业项目中采用类似方案,用ESP32控制大棚补光灯,实测在200台设备规模下依然稳定运行。下面分享的代码和配置都经过实际验证,特别适合刚接触物联网开发的工程师快速上手。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与环境搭建
2.1 ESP32开发板选型建议
市面上常见的ESP32开发板主要有:
- ESP32-DevKitC(性价比首选)
- NodeMCU-32S(带USB转串口)
- Wemos D1 R32(Arduino外形兼容)
我推荐使用ESP32-DevKitC-V4,它的GPIO引脚布局清晰,且价格通常在30元以内。注意要选择带有CP2102或CH340串口芯片的版本,否则需要额外安装驱动。
2.2 电路连接示意图
LED连接非常简单:
code复制ESP32 GPIO2 —— 220Ω电阻 —— LED正极
LED负极 —— GND
重要提示:ESP32的工作电压是3.3V,直接连接5V电源可能烧毁芯片。所有外设必须兼容3.3V电平。
2.3 Python环境配置
服务端需要安装以下Python库:
bash复制pip install flask flask-cors
建议使用Python 3.8+版本,我在Python 3.10.6上测试通过。如果遇到SSL相关错误,可以尝试:
bash复制pip install --upgrade certifi
3. ESP32固件开发
3.1 Arduino IDE基础配置
- 安装Arduino IDE(1.8.x或2.0.x均可)
- 添加ESP32开发板支持:
- 文件→首选项→附加开发板管理器网址填入:
code复制https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- 文件→首选项→附加开发板管理器网址填入:
- 工具→开发板→开发板管理器→搜索安装"esp32"
3.2 核心代码实现
cpp复制#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";
WebServer server(80); // HTTP端口80
int ledPin = 2; // 对应GPIO2
void handleRoot() {
String html = "<html><body>";
html += "<h1>ESP32 LED Control</h1>";
html += "<p><a href=\"/on\">Turn ON</a></p>";
html += "<p><a href=\"/off\">Turn OFF</a></p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void handleOn() {
digitalWrite(ledPin, HIGH);
server.send(200, "text/plain", "LED is ON");
}
void handleOff() {
digitalWrite(ledPin, LOW);
server.send(200, "text/plain", "LED is OFF");
}
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/on", handleOn);
server.on("/off"
