实现通过ESP32S3连接Wi-Fi并使用Web页面控制WS2812灯珠的颜色,可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面,你可以动态地控制灯珠的显示效果。
主要步骤:
- 设置Wi-Fi连接: 让ESP32S3连接到你的Wi-Fi网络。
- 创建Web服务器: 在ESP32上运行一个简单的Web服务器,用于接受来自客户端的控制请求。
- 动态控制灯珠: 根据用户通过Web界面提交的控制指令,动态调整灯珠的颜色。
代码实现:
下面是一个基本的代码框架,有一些参数需要自行修改如WIFI帐号密码、灯珠数量,可以根据需要进一步调整和扩展。
python
import network
import neopixel
from machine import Pin
import uasyncio as asyncio
import socket
# 设置Wi-Fi连接参数
ssid = '您的WIFI帐号'
password = '您的WIFI密码'
# 初始化并连接到Wi-Fi网络
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
# 等待Wi-Fi连接
while not station.isconnected():
pass
print('连接成功')
print(station.ifconfig()) # 打印Wi-Fi连接配置
# 设置GPIO 2为输出引脚,并初始化一个有7个LED的NeoPixel对象
led_pin = Pin(2, Pin.OUT)
# 固定LED数量
num_leds = 7
np = neopixel.NeoPixel(led_pin, num_leds)
# 初始化颜色,初始为红色
current_color = (255, 0, 0)
# 生成网页的HTML内容
def generate_web_page():
html = """<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LED控制</title>
</head>
<body>
<h1>LED 控制面板</h1>
<form action="/" method="GET">
<label for="color">灯珠颜色 (十六进制):</label>
<input type="text" id="color" name="color" value="#{0:02x}{1:02x}{2:02x}">
<br><br>
<input type="submit" value="提交">
</form>
</body>
</html>""".format(current_color[0], current_color[1], current_color[2])
return html
# 处理客户端请求的异步函数
async def handle_client(client):
try:
request = client.recv(1024) # 接收客户端请求
request = str(request)
# 解析请求并获取颜色参数
if "GET /?" in request:
try:
params = request.split("GET /?")[1].split(" HTTP/")[0]
param_dict = {}
for param in params.split('&'):
key, value = param.split('=')
param_dict[key] = value.replace("%23", "#") # 处理颜色代码中的"#"符号
print(param_dict)
global current_color
# 解析颜色参数
if 'color' in param_dict:
color_str = param_dict['color'].lstrip('#') # 去掉颜色码前的"#"
if len(color_str) == 6:
try:
# 将颜色从十六进制字符串转换为RGB元组
r = int(color_str[0:2], 16)
g = int(color_str[2:4], 16)
b = int(color_str[4:6], 16)
current_color = (r, g, b)
except ValueError as e:
print("颜色解析错误:", e) # 捕捉解析错误
current_color = (255, 0, 0) # 设置默认颜色
else:
print("无效的颜色值长度:", color_str)
# 更新LED灯珠颜色
for i in range(num_leds):
np[i] = current_color
np.write() # 写入新的颜色到LED
print(f"LED颜色更新为: {current_color}")
except Exception as e:
print("参数处理错误:", e)
# 生成网页并发送响应
response = generate_web_page()
client.send('HTTP/1.1 200 OK\n')
client.send('Content-Type: text/html\n')
client.send('Connection: close\n\n')
client.sendall(response)
finally:
client.close() # 关闭客户端连接
# 查找可用端口的函数
def find_available_port(start_port=80, max_port=65535):
port = start_port
while port <= max_port:
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', port))
server_socket.close() # 立即关闭以释放端口
return port
except OSError:
port += 1
raise RuntimeError('没有可用端口')
# 启动Web服务器的异步函数
async def web_server():
port = find_available_port()
print(f"Web服务器使用端口 {port}")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', port))
server_socket.listen(5)
print("Web服务器启动,等待连接...")
while True:
client, addr = server_socket.accept() # 接受客户端连接
print('客户端连接自', addr)
await handle_client(client) # 处理客户端请求
# 创建并运行任务
loop = asyncio.get_event_loop()
loop.create_task(web_server())
loop.run_forever()