当前位置: 首页 > news >正文

六、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色优化超时和线程

实现通过ESP32S3连接Wi-Fi并使用Web页面控制WS2812灯珠的颜色,可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面,可以动态地控制灯珠的显示效果。

针对 五、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色代码优化说明:

  1. Wi-Fi连接超时处理:添加了wifi_connect_timeout变量,用于设置Wi-Fi连接的最大等待时间。如果超过此时间还未连接成功,会引发RuntimeError,避免无限等待。
  2. 输入验证:在解析颜色参数时,增加了对十六进制字符串的验证,确保输入的颜色码为有效的6位十六进制数字。如果格式不正确,会打印错误信息而不会修改颜色。
  3. 线程同步处理:使用asyncio.Lock()确保在多个请求同时进行时,对current_color的修改是线程安全的,避免由于并发问题导致的颜色设置错误。

代码实现:

import network
import neopixel
from machine import Pin
import uasyncio as asyncio
import socket
import time# 设置Wi-Fi连接参数
ssid = 'XTY-2'
password = 'xty202102'
wifi_connect_timeout = 10  # Wi-Fi连接超时时间(秒)# 初始化并连接到Wi-Fi网络
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)# 等待Wi-Fi连接,添加超时处理
start_time = time.time()
while not station.isconnected():if time.time() - start_time > wifi_connect_timeout:raise RuntimeError('Wi-Fi连接超时,请检查网络设置')passprint('连接成功')
print(station.ifconfig())  # 打印Wi-Fi连接配置# 设置GPIO 2为输出引脚,并初始化一个有7个LED的NeoPixel对象
led_pin = Pin(2, Pin.OUT)
num_leds = 7  # 固定LED数量
np = neopixel.NeoPixel(led_pin, num_leds)# 初始化颜色,初始为红色
current_color = (255, 0, 0)
color_lock = asyncio.Lock()  # 用于颜色修改的锁,防止并发修改# 生成网页的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 and all(c in '0123456789abcdefABCDEF' for c in color_str):try:# 将颜色从十六进制字符串转换为RGB元组r = int(color_str[0:2], 16)g = int(color_str[2:4], 16)b = int(color_str[4:6], 16)# 使用锁来防止并发修改current_colorasync with color_lock:current_color = (r, g, b)except ValueError as e:print("颜色解析错误:", e)  # 捕捉解析错误current_color = (255, 0, 0)  # 设置默认颜色else:print("无效的颜色值长度或格式:", color_str)# 更新LED灯珠颜色async with color_lock:for i in range(num_leds):np[i] = current_colornp.write()  # 写入新的颜色到LEDprint(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_portwhile port <= max_port:try:server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('', port))server_socket.close()  # 立即关闭以释放端口return portexcept OSError:port += 1raise 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()

相关文章:

六、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色优化超时和线程

实现通过ESP32S3连接Wi-Fi并使用Web页面控制WS2812灯珠的颜色&#xff0c;可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面&#xff0c;可以动态地控制灯珠的显示效果。 针对 五、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色…...

(el-Time-Picker)操作(不使用 ts):Element-plus 中 TimePicker 组件的使用及输出想要时间格式需求的解决过程

Ⅰ、Element-plus 提供的 TimePicker 时间选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 TimePicker 组件情况&#xff1a; 其一、Element-ui 自提供的 TimePicker 代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template>…...

UIAbility组件基础(一)

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。 U…...

神经网络的数学原理

前言:Hello大家好,我是小哥谈。人工智能技术的发展与成功应用已经成为21世纪科技领域最大的新现象。然而,科学地理解人工智能原理已经超出了现有科学体系的范畴。显然,人工智能是人类科学技术发展的必然结果,人工智能科学也将是人类科学进步与发展必然实现的目标🌈 …...

Java设计模式-抽象工厂模式-一次性理解透

1. 抽象工厂模式简介 抽象工厂设计模式是创建型模式之一。抽象工厂模式与工厂模式几乎相似&#xff0c;只是它更像工厂中的工厂。 如果您熟悉Java 中的工厂设计模式&#xff0c;或看过上一篇我写的“java简单工厂模式”&#xff0c;您会注意到我们有一个工厂类。此工厂类根据…...

day16-测试自动化之selenium的PO模式

一、PO模式介绍 PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 一般分为六个版本&#xff0c;现在大部分企业都用的V4版本&#xff0c;三层结构…...

Springboot+freemarker大段文本内容动态修改输出,所见即所得

场景&#xff1a;给领导导出数据时&#xff0c;需要给出一个针对专业名词的解释说明&#xff0c;因此会存在有大批量的、大段的文本内容。如果直接写在代码里面&#xff0c;没啥大问题&#xff0c;但是大量的拼接替换、格式样式、后续修改维护等&#xff0c;都不是很方便。如果…...

Kali Linux网络问题解决与静态IP配置技巧

很多用户在使用 Kali Linux 时会遇到无法联网的问题&#xff0c;尤其是在 VMware 虚拟机中。这种情况相当常见&#xff0c;一般都是没有配置DNS服务器或者网卡配置文件的IP和虚拟网络编辑器的IP不一致所导致的&#xff0c;下面我们将探讨如何在 Kali Linux 中配置 DNS 服务和设…...

网络状态码-经验笔记

网络状态码-经验笔记 引言 在网络通信中&#xff0c;HTTP&#xff08;Hypertext Transfer Protocol&#xff09;状态码是服务器向客户端&#xff08;通常是Web浏览器&#xff09;发送响应时所包含的重要信息之一。 这些状态码指示了客户端请求的结果。 了解并正确使用这些状态…...

c++ 实现 actor 框架

服务端&#xff1a;https://github.com/xukeawsl/coro_actor 客户端&#xff1a;https://github.com/xukeawsl/coro_actor_client...

应对猫咪掉毛挑战,希喂、小米热门宠物空气净化器实测功效PK

随着养宠人群的增多&#xff0c;铲屎官们的需求日益增长&#xff0c;市场上出现了很多品牌的宠物空气净化器。然而&#xff0c;产品质量参差不齐&#xff0c;给消费者选择带来不少困难。劣质宠物空气净化器不仅无法有效去除宠物毛发、皮屑、异味及空气中的有害微粒&#xff0c;…...

0002 保险会计及其特殊性

保险会计是将会计理论专门应用于保险公司的专业会计领域&#xff0c;它是会计学的一个重要分支。作为一个分支&#xff0c;保险会计具有独特的特性&#xff0c;这些特性主要表现在以下几个方面&#xff1a; 产品的无形性&#xff1a;保险产品本质上是一种无形的商品&#xff0c…...

ChatTTS:终极文本转语音工具,支持API!

ChatTTS&#xff1a;终极文本转语音工具&#xff0c;支持API&#xff01; 文本转语音&#xff08;TTS&#xff09;系统的发展已经取得了长足的进步。从最初的机械化、平坦的声音&#xff0c;到如今听起来令人惊讶的人声&#xff0c;ChatTTS作为这一领域的新成员&#xff0c;旨…...

VUE和Element Plus

1.VUE 1.下载和配置环境 使用vue编程&#xff0c;我们需要使用到的编程软件是vs code&#xff0c;还需要使用node.js&#xff0c;这个的作用就类似于JDK&#xff0c;当我们都下载好之后&#xff0c;winR键打开命令提示符&#xff0c;我们在这里可以查看版本&#xff0c; npm…...

Python学习笔记(五)

""" 演示tuple元组的定义和操作 """# 元组一旦定义完成&#xff0c;就不可修改 # 定义元组 # t1 (1, "Hello", True) # t2 () # 定义空元组 # t3 tuple() #定义空元组 # print(f"t1的类型是&#xff1a;{type(t1)}, 内容是&…...

Linux企业级应用(一)构建企业级Linux应用平台:全面指南

文章目录 构建企业级Linux应用平台&#xff1a;全面指南前言1. Linux企业级应用简介2. 构建企业级网站应用平台使用LNMP架构构建Web服务器部署MySQL数据库主从复制与读写分离 3. 实施虚拟化技术部署KVM虚拟化平台使用LVS和Keepalived实现负载均衡与高可用性 4. 文件系统与分布式…...

LeetCode112 路径总和

前言 题目&#xff1a; 112. 路径总和 文档&#xff1a; 代码随想录——路径总和 编程语言&#xff1a; C 解题状态&#xff1a; 成功解答&#xff01; 思路 比较简单的一个思路是遍历所有的路径&#xff0c;求和后再查找目标值。但是&#xff0c;最好的方法是一边遍历&#x…...

TI AWR1843 毫米波雷达实物展示

引言 随着自动驾驶、工业自动化以及智能交通系统的快速发展&#xff0c;雷达传感器在现代科技中的重要性日益提升。毫米波雷达凭借其高精度测距、抗干扰能力强等特点&#xff0c;逐渐成为各类感知系统中的关键技术。德州仪器&#xff08;TI&#xff09;推出的 AWR1843 毫米波雷…...

前端JS总结(下)之事件操作

目录 前言 事件基础 事件的三部分&#xff1a; 常见的事件&#xff1a; 鼠标事件&#xff1a; 键盘事件&#xff1a; 表单事件&#xff1a; onfocus和onblur&#xff1a;获取焦点和失去焦点 onselect&#xff1a;选中单行文本框/多行文本框中的内容 onchange&#xff…...

如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现

先上题目 题目链接&#xff1a;题目链接 这题我最先想到的就是前缀和a&#xff0c;构造好了以后就遍历每一个[l,r]数组&#xff08;满足题目要求的连续区间数组&#xff09;&#xff0c;奈何倒数第二个样例时间超限 先给出原思路代码 class Solution { public:int subarray…...

编程统计产品售后处理时长,客户满意度数据,优化售后流程,降低客户投诉率,提升企业职场服务口碑。

一、实际应用场景描述在制造、家电、消费电子、SaaS 等行业中&#xff0c;售后服务是客户体验的关键环节&#xff0c;典型流程包括&#xff1a;- 客户提交售后申请&#xff08;报修、退换货、咨询&#xff09;- 客服受理 → 技术/维修派单 → 上门/处理 → 完成 → 客户评价- 系…...

14602开源|黄大年茶思屋第146期第二题:支持采集内容运动的静态3DGS重建

AI无偏差版脱敏题目标准化解题详解&#xff08;第二题&#xff1a;支持采集内容运动的静态3DGS重建&#xff09; 模块一&#xff1a;脱敏题目原文复刻 【脱敏题目原文】 支持采集内容运动的静态3DGS重建 基于3DGS及其扩展形式&#xff0c;支持动态建模和静态渲染&#xff0c;输…...

告别调参玄学:深入解读Frenet轨迹规划中评价函数权重(K_J, K_T, K_D)到底怎么设

Frenet轨迹规划中评价函数权重的科学调参方法论 在自动驾驶系统的开发过程中&#xff0c;轨迹规划算法的调参工作常常被工程师们戏称为"玄学实验"。这种现象在Frenet坐标系下的动态轨迹规划中尤为明显——当面对K_J、K_T、K_D等一系评价函数权重参数时&#xff0c;不…...

别再只会用ActivePart了!CATIA二次开发中,如何用C#递归遍历任意复杂结构树?

CATIA二次开发进阶&#xff1a;用C#递归算法征服任意复杂装配树 在CATIA二次开发领域&#xff0c;ActivePart就像新手司机的自动挡——简单易用却限制重重。当面对包含数百个零件的飞机发动机装配体&#xff0c;或是横跨多个产品的汽车底盘系统时&#xff0c;仅能操作当前激活零…...

Awesome-AITools:AI开发者必备的开源工具聚合地图

1. 项目概述&#xff1a;一份AI工具的“藏宝图”如果你是一名AI开发者、研究者&#xff0c;或者只是一个对AI工具充满好奇的探索者&#xff0c;那么你肯定经历过这样的时刻&#xff1a;面对网络上浩如烟海的AI工具&#xff0c;从聊天机器人、代码助手到图像生成、模型训练平台&…...

如何用ComfyUI MixLab插件重塑你的AI创作流程:5个颠覆性应用场景

如何用ComfyUI MixLab插件重塑你的AI创作流程&#xff1a;5个颠覆性应用场景 【免费下载链接】comfyui-mixlab-nodes Workflow-to-APP、ScreenShare&FloatingVideo、GPT & 3D、SpeechRecognition&TTS 项目地址: https://gitcode.com/gh_mirrors/co/comfyui-mixla…...

基于OpenClaw与Binance API的加密货币安全助手:四层架构与实战部署

1. 项目概述&#xff1a;一个为普通人打造的加密资产守护神在加密货币的世界里&#xff0c;技术壁垒和信息不对称就像一道无形的墙&#xff0c;将许多普通人挡在了安全投资的门外。我们见过太多这样的场景&#xff1a;一位想为子女攒点教育金的母亲&#xff0c;因为误点了钓鱼链…...

告别枯燥理论:用51单片机和DAC0832做个迷你音乐合成器,汇编语言实现《小星星》

用51单片机和DAC0832打造迷你音乐合成器&#xff1a;汇编语言实现《小星星》全解析 在嵌入式系统学习的道路上&#xff0c;很多初学者都会遇到一个共同的问题&#xff1a;如何将枯燥的理论知识转化为有趣的实际应用&#xff1f;今天&#xff0c;我们就来打破常规&#xff0c;用…...

【Claude Code 源码解析教程】第33章:性能调优实战

本章深入解析 Claude Code 的性能优化策略,包括内存优化、响应速度优化、缓存策略和并发处理。性能优化是提升用户体验的关键。 目录 33.1 内存优化策略 33.1.1 慢操作监控 33.1.2 慢操作检测使用示例 33.1.3 内存管理策略 33.1.4 内存泄漏检测与修复 33.2 响应速度优化…...

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

目录 一、问题与背景 二、本文将系统讲解 三、产品竞争的本质与底层逻辑 3.1 竞争的本质 3.2 竞争的三层结构(必须理解) 3.3 IoT竞争的特殊性 四、IoT产品竞争结构模型(核心框架) 4.1 五层竞争模型(核心体系) 4.2 竞争演进路径 五、五大竞争策略模型(核心方法…...