news 2026/5/30 18:41:01

基于ESP-NOW与WS2812b的无线温湿度显示系统设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ESP-NOW与WS2812b的无线温湿度显示系统设计与实现

1. 项目概述

最近在折腾一个智能家居的小项目,想把我阳台花房里的温湿度数据,实时显示在客厅的一个显眼位置。市面上现成的智能显示屏要么功能太臃肿,要么定制性太差,而且很多都需要依赖家里的Wi-Fi路由器,一旦网络波动或者路由器重启,显示就断了,体验很不好。于是,我把目光投向了ESP-NOW这个协议。它本质上是乐鑫(Espressif)微控制器(比如我们熟悉的ESP8266、ESP32系列)内置的一种低功耗、点对点的无线通信技术。最大的好处就是,两个ESP设备之间可以直接“对话”,完全绕开路由器,通信延迟极低,而且配对一次后,哪怕路由器关机了,它们俩照样能传数据,稳定性非常高。

这个项目的核心,就是利用ESP-NOW,将一个ESP8266(作为发送端,连接传感器)采集到的数据,无线发送给另一个ESP8266(作为接收端),并由这个接收端驱动一串WS2812b可编程LED灯带来进行可视化显示。WS2812b灯带大家应该不陌生,每个LED都能独立控制RGB颜色,是制作个性化灯光效果的绝佳选择。我选择用MicroPython来开发,因为它语法简单,交互性强,特别适合快速原型验证和STEM教育场景。最终实现的效果是,一个火柴盒大小的控制器,加上一条灯带,就能变成一个可以放在家里任何角落的无线信息显示屏,不仅限于显示温湿度,理论上任何你能用ESP8266采集到的数据(比如空气质量、门磁状态、甚至股票价格)都能推送到这个屏幕上。

2. 核心方案设计与硬件选型解析

2.1 为什么选择ESP-NOW而非传统Wi-Fi?

在物联网项目中,设备间通信通常有几种选择:通过路由器中转(MQTT/HTTP)、蓝牙(BLE)、或者像ESP-NOW这样的专有协议。我选择ESP-NOW主要基于以下几点考量:

  1. 低延迟与高实时性:ESP-NOW工作在2.4GHz频段,使用物理层(PHY)和媒体访问控制层(MAC)的底层协议进行数据帧交换。它跳过了TCP/IP协议栈的繁琐握手和路由过程,数据包是直接、快速地在对端设备间传递。实测下来,在无障碍物的室内环境下,点对点通信延迟可以稳定在10毫秒以内,这对于需要快速反馈的显示应用(比如实时数值跳动)至关重要。
  2. 不依赖网络基础设施:这是最关键的优势。传统的Wi-Fi客户端模式需要连接到一个中心接入点(AP,即路由器)。如果路由器故障、配置更改或信号不佳,整个系统就瘫痪了。ESP-NOW建立的是设备间的直接链路,只要两个设备在彼此的射频范围内,通信就能维持。我的花房和客厅正好隔了两堵墙,传统Wi-Fi信号已经很不稳定,但ESP-NOW依然能稳定工作。
  3. 配置简单,配对持久:ESP-NOW采用对等(Peer-to-Peer)通信模型。一旦在代码中将接收端的MAC地址添加到发送端的对等设备列表中,这个配对关系就会保存在设备的非易失性存储中。即使设备断电重启,也无需重新配网,上电后自动尝试重连,极大地简化了部署和维护。
  4. 较低的功耗:虽然ESP8266本身不是超低功耗芯片,但ESP-NOW协议在通信间歇期可以允许设备进入轻睡眠模式,相比始终保持全功能Wi-Fi连接,能节省一些电能。对于由电池供电的便携式传感器节点来说,这个特性更有价值。

当然,ESP-NOW也有其局限性,比如默认的有效载荷较小(最多250字节),且是单向或简单双向通信,不适合复杂的、需要确认和重传机制的大流量应用。但对于本项目这种周期性的、小数据量(如温度、湿度几个字节)的传感器数据推送,它是完美匹配的。

2.2 主控与显示单元硬件详解

整个系统分为发送端(Sensor Node)和接收显示端(Display Node)。

发送端(Sensor Node)

  • 核心MCU:ESP-01S模块。它本质上是一个精简封装的ESP8266,拥有GPIO0, GPIO2, TX, RX, CH_PD, VCC, GND等引脚。选择它是因为其体积小巧,成本低廉,足以胜任连接传感器和运行ESP-NOW发送程序的任务。
  • 传感器:DHT11温湿度传感器。这是一个经典的数字式传感器,使用单总线协议通信。虽然精度一般(温度±2°C,湿度±5%),但胜在价格便宜、使用简单,非常适合家居环境监测的演示。它的数据引脚连接到ESP-01S的GPIO2(根据具体代码定义可调整)。
  • 供电:通过USB转TTL编程器的3.3V输出或一个独立的3.3V稳压模块供电。

接收显示端(Display Node): 这是本项目的重点,硬件上需要仔细设计,特别是电源部分。

  • 核心MCU:同样使用ESP-01S模块,负责接收ESP-NOW数据并解析,然后控制LED灯带。
  • LED灯带:WS2812b(也称NeoPixel)。每颗LED内部集成了驱动IC和RGB芯片,只需要一根数据线(Din)进行控制。其工作电压为5V,注意逻辑电平也是5V,而ESP-01S的GPIO输出是3.3V。这是一个关键点,虽然很多情况下3.3V信号也能勉强驱动5V的WS2812b,但在长线传输或LED数量较多时可能导致信号不稳定,产生乱码。稳妥的做法是增加一个简单的电平转换电路,例如使用一片74HCT125这样的3.3V转5V电平转换芯片。
  • 电源设计(重中之重)
    • 输入:采用USB-C接口供电,通用性强。输入为标准的5V/1A或更高。
    • MCU供电:ESP-01S需要稳定的3.3V电源。这里使用了AMS1117-3.3或类似的低压差线性稳压器(LDO)。特别注意:AMS1117的输入电压需要高于输出电压约1V(压差),5V输入是合适的。在Vin和GND之间,务必紧贴稳压器引脚焊接一个10μF以上的电解电容或钽电容,用于滤除低频噪声;在Vout(3.3V)和GND之间,同样需要焊接一个10μF电容和一个0.1μF的陶瓷电容,分别负责低频和高频去耦,这是确保ESP8266稳定运行、防止意外复位的关键。
    • LED供电:WS2812b灯带直接由输入的5V供电。必须警惕:LED全亮白色时功耗最大,每颗LED可能高达60mA。12颗LED就是720mA,加上MCU的消耗,总电流可能接近800mA。因此,USB电源的带载能力必须足够(建议1A或以上),并且供电线路(PCB走线或导线)要足够粗,以减少压降。压降过大会导致末端的LED颜色失真(偏红)甚至无法点亮。
  • 使能电路:ESP-01S的CH_PD(或EN)引脚是高电平使能。通过一个10kΩ电阻将其上拉到3.3V,确保模块一上电就能启动。

注意:在焊接电源部分时,极性千万不能搞错。电解电容有正负极,AMS1117的输入输出也不能接反。建议焊接完成后,先不要插LED灯带,用万用表测量3.3V输出是否正常,再给系统上电。

2.3 结构设计与扩展性思考

原项目提供了一个3D打印的外壳设计,主要目的是两个:一是将LED灯条固定并遮蔽起来,形成一条规整的光带,避免直视LED灯珠造成刺眼;二是为整个控制器电路板提供保护和支持。

在扩展性方面,这个设计给出了一个非常巧妙的思路:使用USB-C接口进行级联。这意味着你可以制作多个独立的显示单元(每个单元包含外壳、灯条和控制器),然后用USB-C线缆将它们串联起来。后一个单元的5V电源和数据输入(Din)都来自前一个单元的USB-C输出口。这样,只需要一个主控制器(第一个单元),就能驱动一连串的显示单元,实现更长或分布更广的显示效果。在软件上,你需要将每个显示单元的LED数量进行正确的偏移量计算。

3. 软件实现与MicroPython代码深度解析

3.1 开发环境搭建与固件烧录

  1. 安装Thonny IDE:从官网下载Thonny,这是一个对MicroPython非常友好的集成开发环境,内置了REPL(交互式解释器)和文件管理功能。
  2. 烧录MicroPython固件
    • 将ESP-01S通过USB转TTL工具连接到电脑,确保驱动已安装。
    • 在Thonny中,点击右下角选择解释器,选择“MicroPython (ESP8266)”。
    • 确保ESP-01S进入下载模式(通常需要将GPIO0拉低接地后上电)。
    • 在Thonny的解释器设置里,选择正确的串口,然后点击“安装或更新MicroPython”。Thonny会自动下载最新的稳定版固件并烧录。你也可以从MicroPython官网手动下载esp8266-xxx.bin文件,使用esptool.py命令行工具进行烧录。
  3. 连接与测试:烧录完成后,断开GPIO0与GND的连接,重新上电。在Thonny的Shell(REPL)窗口里,如果出现>>>提示符,并可以执行print(“Hello”),说明固件烧录成功。

3.2 接收端(显示屏)代码剖析

接收端代码的核心任务是:初始化ESP-NOW、绑定为接收站、定义回调函数处理收到的数据、并驱动WS2812b显示。

# display_node.py import network import espnow import machine from neopixel import NeoPixel import time # 1. 初始化Wi-Fi为STA模式,并禁用AP模式以节省资源 sta = network.WLAN(network.STA_IF) sta.active(True) sta.disconnect() # 重要:断开任何已有连接,避免干扰ESP-NOW # 2. 初始化ESP-NOW e = espnow.ESPNow() e.active(True) # 3. 定义WS2812b控制引脚和LED数量 LED_PIN = 2 # 假设使用GPIO2控制数据线 LED_NUM = 12 # 单条灯带的LED数量 np = NeoPixel(machine.Pin(LED_PIN), LED_NUM) # 4. 定义一个简单的显示函数(示例:根据温度值改变颜色) def display_temperature(temp): np.fill((0,0,0)) # 先清屏 # 将温度映射到颜色。例如:20°C以下蓝色,20-25°C绿色,25°C以上红色 if temp < 20: color = (0, 0, 50) # 蓝色 elif temp < 25: color = (0, 50, 0) # 绿色 else: color = (50, 0, 0) # 红色 # 这里可以用更复杂的效果,比如用多个LED表示温度计刻度 for i in range(LED_NUM): np[i] = color np.write() # 5. ESP-NOW接收回调函数(在MicroPython中,通常通过轮询e.irecv()实现) def recv_callback(): while True: mac, msg = e.irecv() # 非阻塞接收,如果没有数据立即返回None if msg: try: # 假设发送端发送的数据是如 b"23.5,65" 格式的字符串(温度,湿度) data_str = msg.decode('utf-8') temp_str, hum_str = data_str.split(',') temperature = float(temp_str) humidity = float(hum_str) print(f"Received: Temp={temperature}C, Hum={humidity}%") # 调用显示函数 display_temperature(temperature) # 可以进一步处理湿度,例如用LED亮度或另一段灯带表示 except Exception as err: print("Data parse error:", err) time.sleep(0.1) # 短暂休眠,防止过度占用CPU # 6. 主循环 print("Display Node Ready. Waiting for data...") while True: recv_callback()

关键点解析

  • sta.disconnect():这一行至关重要。ESP8266在启动STA模式后,可能会尝试连接之前记忆的Wi-Fi网络,这个过程会干扰ESP-NOW的初始化。主动断开连接能确保ESP-NOW独占无线资源。
  • e.irecv():这是一个非阻塞接收方法。如果使用阻塞的recv(),程序会一直停在那里等待数据,无法执行其他任务(如动画效果)。irecv()则立即返回,允许我们在循环中同时处理接收和显示刷新。
  • 数据协议:这里定义了一个简单的文本协议,用逗号分隔温度和湿度。在实际项目中,为了节省带宽和解析效率,可以考虑使用二进制协议,例如用两个字节分别表示温度(放大10倍)和湿度。

3.3 发送端(传感器)代码剖析

发送端代码周期性地读取传感器数据,并通过ESP-NOW发送给指定的接收端。

# sensor_node.py import network import espnow import dht import machine import time # 1. 初始化Wi-Fi和ESP-NOW(同接收端) sta = network.WLAN(network.STA_IF) sta.active(True) sta.disconnect() e = espnow.ESPNow() e.active(True) # 2. 添加对等设备(接收端的MAC地址) # 你需要将下面的 'xx:xx:xx:xx:xx:xx' 替换成你接收端ESP-01S的实际MAC地址 peer_mac = b'\\xXX\\xXX\\xXX\\xXX\\xXX\\xXX' # 二进制格式的MAC地址 e.add_peer(peer_mac) # 3. 初始化DHT11传感器(假设连接在GPIO2) dht_pin = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) sensor = dht.DHT11(dht_pin) # 4. 主循环:读取并发送数据 while True: try: sensor.measure() temp = sensor.temperature() hum = sensor.humidity() # 构建发送数据字符串 data = f"{temp},{hum}" # 通过ESP-NOW发送 if e.send(peer_mac, data, True): # True 表示等待发送完成 print(f"Sent: {data}") else: print("Send failed") except OSError as o_err: print("Sensor read error:", o_err) # DHT11两次测量之间需要至少2秒间隔 time.sleep(5) # 每5秒发送一次数据

关键点解析

  • 获取MAC地址:在烧录好MicroPython固件后,可以先在接收端的REPL中执行import ubinascii; import network; wlan = network.WLAN(network.STA_IF); wlan.active(True); print(ubinascii.hexlify(wlan.config('mac'),':').decode())来获取其MAC地址。
  • e.add_peer(peer_mac):这是建立ESP-NOW连接的关键一步。发送端必须知道接收端的MAC地址并将其添加为对等体。
  • 错误处理:DHT11传感器读取容易失败,特别是上电初期或响应超时。用try-except包裹读取逻辑是必要的。
  • 发送间隔time.sleep(5)设置了5秒的发送间隔。这个值需要权衡:太频繁会增加功耗和空中信道占用;太慢则显示更新不及时。对于温湿度显示,5-10秒是一个合理的范围。

4. 电路焊接、组装与调试全流程

4.1 PCB或万用板焊接要点

我选择使用一小块万用板(洞洞板)来搭建接收端控制器,这样比直接飞线更规整可靠。

  1. 布局规划:先不要着急焊接,用元器件在板子上大致摆一下位置。遵循“电源流从左到右或从上到下,信号流清晰”的原则。将USB-C插座放在板子边缘方便插拔,AMS1117稳压芯片放在中间,ESP-01S插座和LED输出接口放在另一侧。
  2. 电源先行
    • 首先焊接USB-C插座。找到其5V(VBus)和GND引脚,用较粗的导线引出。
    • 焊接AMS1117。将USB的5V连接到AMS1117的Vin,GND连通。在Vin和GND、Vout和GND之间,分别焊接好对应的滤波电容(如10μF电解电容和0.1μF陶瓷电容)。务必注意电解电容的极性,长脚为正,短脚为负,板子上或电容身上有白色标记的一侧通常是负极。
    • 用万用表测试:通电后,测量AMS1117的Vout引脚,确认输出为稳定的3.3V(±0.1V)。这是后续所有步骤的基础。
  3. MCU及外围电路
    • 焊接一个8Pin的IC座(用于插ESP-01S),或者直接焊接一个排母。将AMS1117输出的3.3V连接到IC座的VCC引脚,GND连接到GND引脚。
    • 焊接10kΩ上拉电阻,一端接3.3V,另一端接CH_PD(EN)引脚。
    • 电平转换电路(可选但推荐):如果你使用74HCT125,需要为其提供5V(Vcc)和3.3V(输入逻辑电平)供电。将ESP-01S的GPIO2(数据输出)连接到74HCT125的某个输入A,将该通道的输出Y连接到LED灯带的数据输入(Din)。74HCT125的/OE引脚接地使其始终使能。
  4. 输出接口:焊接一个3Pin的排针(或接线端子),分别对应5V(接USB 5V)、GND、以及来自74HCT125输出(或直接来自GPIO2)的数据信号(DATA)。这个接口用于连接WS2812b灯带。

4.2 系统组装与上电测试

  1. 分步上电测试
    • 第一步:只焊接完电源部分(USB-C, AMS1117,电容)。通电,测3.3V输出正常。断电。
    • 第二步:焊接完MCU插座和上拉电阻。先不要插入ESP-01S模块。通电,测量插座上的VCC和GND之间电压是否为3.3V,CH_PD引脚电压是否为3.3V(高电平)。确认无误后断电。
    • 第三步:插入ESP-01S模块。通过USB转TTL工具连接其TX/RX到电脑,在Thonny中观察是否能正常进入REPL。如果可以,说明MCU供电和启动电路正常。
  2. 加载程序:在Thonny中,将编写好的display_node.py代码通过“文件”->“保存到MicroPython设备”功能,保存为main.py。这样设备上电后会自动运行此脚本。务必先单独测试接收端程序,让其运行并打印等待数据的提示。
  3. 连接灯带:将WS2812b灯带的5V、GND、Din分别接到控制板的输出接口上。注意灯带的数据方向,输入(Din)端通常有箭头标记。
  4. 发送端组装与测试:发送端电路相对简单,一个DHT11模块直接与ESP-01S连接(VCC-3.3V, GND-GND, DATA-GPIO2)。同样烧录sensor_node.py代码,并修改其中的接收端MAC地址。
  5. 联调:分别给发送端和接收端上电。观察接收端的Shell输出,应该能周期性地打印出接收到的温湿度数据,同时LED灯带的颜色应根据温度发生变化。

4.3 外壳安装与光效优化

如果使用了3D打印外壳,将焊接好的控制板用螺丝或胶固定在内壳中。将WS2812b灯带卡入导光槽。盖上扩散板或面盖,可以有效柔化LED的点状光源,形成均匀的光带。

在软件上,可以进一步优化显示效果:

  • 颜色过渡:不要让颜色在阈值处突变。可以使用线性插值算法,让颜色在20°C到25°C之间从蓝色平滑过渡到绿色。
  • 动画效果:数据更新时,可以加入淡入淡出、流水灯等动画,提升视觉体验。注意在neopixel.write()之前计算好所有LED的颜色值,一次性写入,避免闪烁。
  • 亮度调节:WS2812b在全亮度下非常刺眼,尤其晚上。可以在代码中全局缩放RGB值(如(r*0.2, g*0.2, b*0.2))来降低亮度,或者根据环境光传感器动态调整。

5. 常见问题排查与进阶优化

5.1 问题排查速查表

问题现象可能原因排查步骤与解决方案
接收端上电后无任何反应,REPL无输出1. 电源问题(3.3V未正常输出)
2. ESP-01S未正确启动(CH_PD未拉高)
3. 固件未烧录或损坏
1. 用万用表测量ESP-01S VCC引脚对GND电压,是否为3.3V左右。
2. 测量CH_PD引脚电压,是否为3.3V(高电平)。
3. 尝试重新烧录MicroPython固件。
REPL有输出,但程序不运行(不打印提示信息)1.main.py文件不存在或有语法错误
2. 程序因异常而崩溃
1. 在Thonny中查看设备文件系统,确认main.py存在。
2. 在REPL中手动执行import main,查看具体的错误信息。通常可能是模块导入失败(如espnow)或硬件初始化错误。
发送端和接收端无法通信1. MAC地址错误
2. 设备距离过远或有严重遮挡
3. 一方ESP-NOW未正确初始化
4. 代码逻辑错误(如发送前未add_peer)
1.双盲检查MAC地址:确保发送端代码中的peer_mac是接收端的地址,且格式正确(二进制bytes)。
2. 将两台设备靠近(1米内)测试,排除信号问题。
3. 在双方代码开头增加print(‘ESP-NOW init OK’)等调试信息,确认初始化流程无误。
4. 确保发送端在e.send()之前成功执行了e.add_peer()
LED灯带不亮或显示乱码1. 电源功率不足或压降大
2. 数据信号电平问题(3.3V驱动5V)
3. 数据线连接错误或接触不良
4. NeoPixel库初始化错误(引脚、数量不对)
1. 测量灯带首端的5V电压,在全白亮起时是否跌落到4.5V以下。如果是,更换更大电流的电源或加粗供电线。
2.最可能的原因:尝试在数据线(Din)上串联一个100-500Ω的电阻,靠近ESP端放置,可以改善信号质量。强烈建议增加3.3V转5V电平转换电路。
3. 检查Din是否接到了灯带的数据输入端,而非数据输出(Dout)端。
4. 确认NeoPixel()初始化时指定的引脚号和LED数量与实际硬件一致。
LED灯带部分LED颜色异常(如偏红)电源压降导致末端LED供电不足这是长灯带的典型问题。解决方法:
1.双端供电:在灯带的末端也接入5V和GND。
2.使用更粗的导线或更高电压(如6V)输入,并在灯带旁并行铺设电源线,每隔一段距离并联补电。
DHT11读取经常失败1. 传感器本身不稳定或损坏
2. 上拉电阻问题
3. 读取间隔太短
1. 尝试更换一个DHT11。
2. DHT11数据线需要约5kΩ上拉电阻到3.3V,检查硬件连接。
3. 确保两次sensor.measure()调用之间至少有2秒的间隔。

5.2 进阶优化与扩展思路

  1. 低功耗优化:如果发送端由电池供电,可以大幅优化功耗。
    • 深度睡眠:让ESP8266在每次发送数据后,进入深度睡眠模式(machine.deepsleep())。设置一个定时器(通过RTC或外部引脚唤醒),比如睡眠5分钟,唤醒后读取传感器、发送数据、再睡眠。这样平均电流可以从几十mA降到几百μA。
    • 关闭Wi-Fi射频:在深度睡眠期间,Wi-Fi会自动关闭。在代码中,发送完成后可以主动调用sta.active(False)来关闭Wi-Fi接口(但注意ESP-NOW依赖Wi-Fi底层,通常一起管理)。
  2. 多发送端与数据融合:ESP-NOW支持一对多通信。接收端可以添加多个发送端的MAC地址。你可以让花房、卧室、书房的传感器同时向一个显示屏发送数据。在接收端代码中,通过判断接收到的mac地址,就知道数据来自哪个房间,从而在灯带的不同区段显示不同数据。
  3. 更复杂的数据协议与显示
    • 协议:定义结构化的数据帧。例如,第一个字节为“数据包类型”(0x01温度,0x02湿度,0x03开关状态),后续字节为数据载荷。这样接收端可以灵活处理多种信息。
    • 显示:利用整条灯带做更丰富的UI。例如,用前6个LED显示温度(类似温度计刻度),用后6个LED显示湿度。或者用跑马灯动画表示网络正在连接,用呼吸灯效果表示数据正在更新。
  4. 使用ESP32提升性能:如果项目需要驱动更长的LED灯带(如上百颗),或者需要更复杂的图形效果(如图案、文字滚动),ESP8266的计算能力和内存可能吃紧。可以将其升级为ESP32。ESP32拥有更快的双核处理器、更多的内存和GPIO,并且同样支持ESP-NOW和MicroPython,代码移植成本很低。ESP32还能轻松驱动SPI接口的LED驱动芯片(如APA102),实现更高刷新率的显示。
  5. 增加本地用户交互:在接收端增加一个按钮,通过短按、长按来切换显示模式(如温度/湿度轮显、亮度调节、开关显示等)。这需要处理中断(machine.Pin.IRQ)和状态机,能让设备更加易用。

这个项目从构思到实现,最深的体会就是“简单协议的大能量”。ESP-NOW看似不起眼,但它提供的这种直接、可靠的设备间通信能力,恰恰是很多轻量级物联网场景中最需要的。它避免了配置路由器的麻烦,也绕开了云服务可能带来的延迟和隐私问题。当你看到自己制作的这个小显示屏,隔着墙壁稳定地显示着另一个房间的数据时,那种“一切尽在掌握”的成就感,是使用现成产品无法比拟的。如果第一次尝试遇到通信问题,请务必沉住气,九成以上的问题都出在MAC地址错误或电源/信号电平上,按照排查表一步步来,一定能点亮属于你的那串智能之光。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 18:32:08

如何构建知乎内容备份系统:完整的数据导出与知识管理指南

如何构建知乎内容备份系统&#xff1a;完整的数据导出与知识管理指南 【免费下载链接】zhihu_spider_selenium 爬取知乎个人主页的想法、文篇和回答 项目地址: https://gitcode.com/gh_mirrors/zh/zhihu_spider_selenium 知乎内容备份工具是一个基于Python和Selenium的自…

作者头像 李华
网站建设 2026/5/30 18:29:21

WeMod Wand-Enhancer:让你的游戏修改器体验升级三倍

WeMod Wand-Enhancer&#xff1a;让你的游戏修改器体验升级三倍 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否曾经在使用游戏修改器时感到功能受…

作者头像 李华
网站建设 2026/5/30 18:24:33

告别eMMC卡顿:手把手教你理解手机里的UFS 4.0闪存到底快在哪

告别eMMC卡顿&#xff1a;手把手教你理解手机里的UFS 4.0闪存到底快在哪每次打开手机相册都要转圈三秒&#xff1f;游戏加载时队友已经开局而你还在读条&#xff1f;这些恼人的卡顿很可能源于手机里那颗不起眼的闪存芯片。今天我们就来揭开UFS 4.0的神秘面纱&#xff0c;用最直…

作者头像 李华
网站建设 2026/5/30 18:22:13

基于Arduino与Visuino的非阻塞式PWM占空比测量仪实现

1. 项目概述与核心思路在嵌入式开发和电子制作中&#xff0c;脉冲宽度调制&#xff08;PWM&#xff09;信号几乎无处不在。无论是调节电机的转速、控制LED的亮度&#xff0c;还是生成模拟电压&#xff0c;PWM都扮演着核心角色。然而&#xff0c;很多时候我们面对的是一个“黑盒…

作者头像 李华