【ESP32+MicroPython】热点模式及网页控制
在物联网项目中,ESP32作为接入点(AP)可以生成热点网络,设备连接到ESP32后,可以通过Web页面进行交互,例如控制LED的亮灭。本文将讲解如何在MicroPython下实现:
- ESP32作为Wi-Fi热点;
- 创建简单的Web服务器;
- 控制LED的亮灭。
通过学习本教程,你将能够使用ESP32在局域网中创建网页控制器,实现LED灯的远程控制。
搭建ESP32热点
ESP32作为Wi-Fi接入点,可以创建热点,供其他设备连接。热点模式适用于无需外部网络的本地控制场景。
代码实现
我们首先定义一个函数,使ESP32创建一个热点并显示其IP地址。
import networkdef create_ap(ssid, password):ap = network.WLAN(network.AP_IF) # 配置为AP模式ap.active(True) # 激活AP模式ap.config(essid=ssid, password=password) # 设置热点SSID和密码print("热点已启动,IP地址为:", ap.ifconfig()[0])# 启动热点
create_ap("ESP32_Hotspot", "12345678")
network.WLAN(network.AP_IF)
:配置Wi-Fi为AP模式。ap.config(essid=ssid, password=password)
:设定热点的名称和密码。ap.ifconfig()
:获取网络配置,ap.ifconfig()[0]
返回IP地址。
现在,ESP32将创建一个名为
ESP32_Hotspot
的Wi-Fi热点,密码为12345678
。设备可以连接此热点进行通信。
创建Web服务器
ESP32作为HTTP服务器,可以在用户访问其IP地址时返回网页并接受用户的请求,接下来我们将搭建简单的服务器,实现网页控制LED。
代码实现
我们创建一个简单的Web服务器,允许用户通过点击网页上的按钮来控制LED的开关。
import socket
from machine import Pin# LED连接的GPIO引脚
led = Pin(2, Pin.OUT)def web_page():"""生成网页内容"""# HTML代码,包含按钮用以控制LED状态html = """<html><head><title>ESP32 LED控制</title></head><body><h2>ESP32 LED 控制器</h2><p>点击按钮来切换LED状态。</p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>"""return html# 创建并启动服务器
def start_server():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('', 80))s.listen(5)print("服务器启动,监听端口80")while True:conn, addr = s.accept()print("客户端连接自", addr)request = conn.recv(1024).decode()print("请求内容:", request)# 检测请求中的LED控制指令if '/?led=on' in request:led.value(1) # 点亮LEDelif '/?led=off' in request:led.value(0) # 熄灭LED# 返回HTML页面response = web_page()conn.send("HTTP/1.1 200 OK\n")conn.send("Content-Type: text/html\n")conn.send("Connection: close\n\n")conn.sendall(response)conn.close()# 运行服务器
start_server()
- LED控制:在
web_page()
中生成一个简单的HTML页面,包含两个按钮:LED ON
和LED OFF
。这些按钮指向带有不同参数的URL,用于控制LED。 - 请求解析:
if '/?led=on' in request
检测GET请求中的参数来判断是否需要点亮或熄灭LED。 - HTTP响应:
conn.send()
用于将网页内容返回给客户端。
运行效果
- 将ESP32连接至电源,其他设备连接至
ESP32_Hotspot
热点。 - 打开浏览器访问ESP32的IP地址(如
192.168.4.1
)。 - 点击按钮即可控制LED的亮灭状态。
状态反馈
在实际应用中,通常需要在页面上实时显示LED的状态。我们可以对网页进行扩展,使页面根据LED状态动态显示。
def web_page():"""生成带状态反馈的网页内容"""# 检查LED当前状态if led.value() == 1:led_state = "ON"else:led_state = "OFF"html = """<html><head><title>ESP32 LED控制</title></head><body><h2>ESP32 LED 控制器</h2><p>LED 当前状态: <strong>{}</strong></p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>""".format(led_state)return html
刷新页面时会动态显示LED状态(ON或OFF),更便于用户了解设备当前状态。
完整代码
以下是实现上述功能的完整代码,将ESP32设为热点,启动Web服务器,并通过网页控制LED。
import network
import socket
from machine import Pin# 创建热点
def create_ap(ssid, password):ap = network.WLAN(network.AP_IF)ap.active(True)ap.config(essid=ssid, password=password)print("热点已启动,IP地址为:", ap.ifconfig()[0])# LED控制代码
led = Pin(2, Pin.OUT)def web_page():"""生成网页内容并包含LED状态"""led_state = "ON" if led.value() == 1 else "OFF"html = """<html><head><title>ESP32 LED控制</title><meta charset="UTF-8"></head><body><h2>ESP32 LED 控制器</h2><p>LED 当前状态: <strong>{}</strong></p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>""".format(led_state)return htmldef start_server():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('', 80))s.listen(5)print("服务器启动,监听端口80")while True:conn, addr = s.accept()print("客户端连接自", addr)request = conn.recv(1024).decode()print("请求内容:", request)if '/?led=on' in request:led.value(1) # 点亮LEDelif '/?led=off' in request:led.value(0) # 熄灭LEDresponse = web_page()conn.send("HTTP/1.1 200 OK\n")conn.send("Content-Type: text/html\n")conn.send("Connection: close\n\n")conn.sendall(response)conn.close()# 启动程序
create_ap("ESP32_Hotspot", "12345678")
start_server()
总结
本文介绍了ESP32在MicroPython环境下的Wi-Fi热点模式、简单Web服务器搭建及GPIO控制方法。通过将这些功能组合,你可以构建基于ESP32的局域网控制系统,实现对LED等外设的网页控制。这种方法非常适合本地物联网项目,如家居自动化、传感器数据展示等。