当前位置: 首页 > 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…...

【设计模式】漫谈设计模式

这篇文章里说一下对设计模式的个人的理解。本篇文章更类似于随笔而非技术文档。 设计模式最早是在上个世纪就被人提出来了&#xff0c;如今被奉为圣经&#xff0c;也就是GOF等人写的《设计模式》&#xff0c;其中的设计模式&#xff0c;是指导开发者如何进行开发出高内聚、低耦…...

第N5周:Pytorch文本分类入门

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务&#xff1a; ●1. 了解文本分类的基本流程 ●2. 学习常用数据清洗方法 ●3. 学习如何使用jieba实现英文分词 ●4. 学习如何构建文本向量 一、前期准备 环境安装 这是一个使用PyTorch实现的简单文…...

SpringBoot 自定义 starter

1. 官方文档 SpringBoot 版本 2.6.13&#xff0c;相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…...

TDengine Invalid data format 问题定位

Invalid data format 看语义是数据类型不符&#xff0c;通常这个报错出现在使用行协议写入时。 如果是批量数据写入&#xff0c;想定位是哪条语句的问题&#xff0c;需要查看客户端日志。 如何确定使用的是哪个日志 lsof -p pidof taosadapter | grep taoslog如果没有安装lso…...

Spring Boot 使用 MongoDB 教程

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …...

Python办公自动化:使用openpyxl 创建与保存 Excel 工作簿

1 创建新的工作簿 在开始任何 Excel 操作之前&#xff0c;首先需要创建一个工作簿。openpyxl 提供了简单的接口来创建新的工作簿。 创建一个空白的工作簿 我们可以使用 openpyxl.Workbook() 来创建一个新的空白工作簿。以下是一个简单的示例&#xff1a; import openpyxl# …...

【张】#11 Union 共用体

Union 共用体可以存储不同的数据类型&#xff0c;但只能同时存储其中的一种类型。 #include <iostream> using namespace std;struct Product {char productName[20];int type;//1 int ,else charunion{int id_int;char id_chars[20];}; };int main(){Product product; …...

Xcode 在原生集成flutter项目

笔者公司有一个从2017年就开始开发的iOS和安卓原生项目&#xff0c;现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码&#xff1b;&#xff08;Android报错Exception: Podfile missing&#xff09; 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…...

ES6的promise

Promise是什么 1、Promise是js中的一个原生对象&#xff0c;是一种异步编程的解决方案。可以替换掉传统的回调函数解决方案&#xff0c;将异步操作以同步的流程表达出来。 2、Promise有三种状态&#xff1a;pending(初始化)、fulfilled(成功)、rejected(失败) 可以通过resolve(…...

轻松找回:如何在PostgreSQL 16中重置忘记的数据库密码

目录 1. 引言2. PostgreSQL 16的新特性简介3. 解决方法概述4. 方法一&#xff1a;通过修改pg_hba.conf文件重置密码5. 方法二&#xff1a;通过命令行进入单用户模式6. 方法三&#xff1a;使用pgAdmin工具重置密码7. 总结与最佳实践写在以后 1. 引言 你有没有过这样的经历&…...

外网设计素材网站/制造企业网站建设

根据前面的文章&#xff0c;我们会发现我们会在很多类前面加很多XLua的标签&#xff0c;有LuaCallCSharp&#xff0c;CSharpCallLua&#xff0c;Hotfix 等等。关于这些配置的作用官方文档也有相应的说明&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/D…...

信息技术用C 做登录界面网站 csdn/建网站建设

影调&#xff1a; 对摄影作品而言&#xff0c;“影调”&#xff0c;又称为照片的基调或调子。指画面的明暗层次、虚实对比和色彩的色相明暗等之间的关系。通过这些关系&#xff0c;使欣赏者感到光的流动与变化。摄影画面中的线条、形状、色彩等元素是由影调来体现的&#xff0…...

wordpress安装创建数据库文件/小程序开发工具

大家好呀&#xff0c;打算写一个 Go 语言组件源码分析系列&#xff0c;一是为了能学习下 Go 语言&#xff0c;看下别人是怎么写 Go 的&#xff0c;二是也掌握一个组件。 本次选择了 Sentinel-Go&#xff0c;一是对 Java 版本的 Sentinel 算是有一些了解&#xff0c;也在生产上…...

不懂代码做网站/深圳防疫措施优化

在 版本回填退里&#xff0c;你已经知道&#xff0c;每次提交&#xff0c;Git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。截止到目前&#xff0c;只有一条时间线&#xff0c;在Git里&#xff0c;这个分支叫主 分支&#xff0c;即master分支。HEAD严格来说不是…...

推广方法视频/百度快照优化培训班

Nginx1.课程目标2.Nginx的安装与启动3.Nginx静态网站部署4.Nginx反向代理与负载均衡1.课程目标 目标1&#xff1a;掌握Nginx的安装 目标2&#xff1a;掌握Nginx的静态网站部署 目标3&#xff1a;理解Nginx的反向代理与负载均衡&#xff0c;能够配置反向代理与负载均衡 2.Ngin…...

缝纫网站做洗衣机罩/新站如何让百度快速收录

最近在将数据从Oracle迁移到MySQL的过程中&#xff0c;遇到一些问题&#xff0c;其中就包括中文字符显示乱码。数据导入成功之后&#xff0c;中文字段内容无法正常显示。后来才发现客户端的字符集设置是对的&#xff0c;服务器端的字符集设置不支持中文字符。后来经过测试发现&…...