在物联网项目中,ESP32作为接入点(AP)可以生成热点网络,设备连接到ESP32后,可以通过Web页面进行交互,例如控制LED的亮灭。本文将讲解如何在MicroPython下实现:
- ESP32作为Wi-Fi热点;
- 创建简单的Web服务器;
- 控制LED的亮灭。
通过学习本教程,你将能够使用ESP32在局域网中创建网页控制器,实现LED灯的远程控制。
搭建ESP32热点
ESP32作为Wi-Fi接入点,可以创建热点,供其他设备连接。热点模式适用于无需外部网络的本地控制场景。
代码实现
我们首先定义一个函数,使ESP32创建一个热点并显示其IP地址。
import network
def 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) # 点亮LED
elif '/?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 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)
if '/?led=on' in request:
led.value(1) # 点亮LED
elif '/?led=off' in request:
led.value(0) # 熄灭LED
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()
# 启动程序
create_ap("ESP32_Hotspot", "12345678")
start_server()
总结
本文介绍了ESP32在MicroPython环境下的Wi-Fi热点模式、简单Web服务器搭建及GPIO控制方法。通过将这些功能组合,你可以构建基于ESP32的局域网控制系统,实现对LED等外设的网页控制。这种方法非常适合本地物联网项目,如家居自动化、传感器数据展示等。