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

ESP32-S3物联网开发实战:从ADC采样到MQTT云端通信

1. 项目概述从传感器到云端的数据之旅在物联网项目的开发中我们常常需要解决一个核心问题如何让物理世界的信息被数字系统感知、处理并最终在云端呈现或接受远程控制这背后涉及三个关键环节感知、处理和通信。今天我们就以一块功能强大的ESP32-S3开发板为核心亲手搭建一个完整的物联网原型系统。这个系统将模拟一个智能环境监测节点的核心功能通过电位器模拟传感器感知环境变化如光照、湿度调节旋钮的模拟将采集到的数据通过Wi-Fi上传至云端平台同时接收来自云端的指令控制板载的RGB LEDNeoPixel显示不同的状态颜色。选择ESP32-S3和CircuitPython作为开发组合是快速原型开发的黄金搭档。ESP32-S3提供了双核处理器、丰富的GPIO、ADC以及最重要的集成Wi-Fi/蓝牙模块。而CircuitPython作为MicroPython的一个分支以其极简的语法、丰富的硬件抽象库和“即插即用”的文件系统管理极大地降低了嵌入式开发的门槛。你不需要复杂的编译工具链只需一个文本编辑器和一个USB数据线就能像编写Python脚本一样操控硬件。本次实践将串联起ADC采样、NeoPixel控制和MQTT通信这三个物联网开发的经典模块为你呈现从硬件连接到云端交互的完整链路。2. 硬件准备与核心原理拆解2.1 核心硬件选型与作用本次项目需要以下硬件它们各自扮演着不可或缺的角色ESP32-S3开发板如Adafruit Feather ESP32-S3 TFT项目的“大脑”。它负责运行我们的CircuitPython程序内置的ADC模块用于读取模拟电压通用IO口用于控制NeoPixel集成的Wi-Fi射频电路则负责网络通信。选择带有STEMMA QT/Qwiic连接器的版本可以免焊接连接各种传感器非常方便。10K线性电位器项目的“感官”。它是一个经典的模拟输入器件通过旋转旋钮改变电阻值。我们将把它连接成一个电压分压电路这样旋钮的角度变化就会转化为一个可被ADC读取的、连续变化的电压信号。它模拟了现实中如光照传感器、可调电阻等模拟量输入。USB数据线用于为开发板供电和上传代码。连接线可选如果电位器不是直接插在板子上则需要杜邦线进行连接。2.2 核心工作原理深度解析要让代码正确工作理解其背后的物理和协议原理至关重要。2.2.1 ADC与电压分压原理微控制器如ESP32-S3是数字世界的居民它只能理解“0”和“1”。而电位器输出的电阻变化是模拟世界的连续量。ADC模数转换器就是连接这两个世界的桥梁。ESP32-S3内置的ADC可以将一个特定电压范围内的模拟电压例如0V至3.3V转换成一个数字值。但是电位器本身输出的是电阻值。如何将电阻变化变成电压变化这就需要电压分压电路。我们将电位器的两端分别接到电源3.3V和地GND中间的可变抽头Wiper接到ADC输入引脚。根据欧姆定律抽头处的电压V_out V_in * (R2 / (R1 R2))其中R1和R2是电位器被旋钮分割的两部分电阻。旋转旋钮改变了R1和R2的比例从而V_out在0V到3.3V之间线性变化。ADC读取的就是这个V_out电压。2.2.2 NeoPixelWS2812B通信协议板载的RGB LED通常是一个WS2812B智能LEDAdafruit称其为NeoPixel。它的神奇之处在于只需要一根数据线DATA就能控制无限多个LED并且每个LED的颜色可以单独设置。这得益于其内部的单线归零码通信协议。微控制器通过精确控制高低电平的持续时间如发送“0”码和“1”码来向LED芯片传送24位数据8位绿色 8位红色 8位蓝色。第一个LED接收完24位数据后会将后续数据流整形后转发给下一个LED从而实现串联控制。neopixel库帮我们封装了所有这些底层时序操作我们只需关心RGB颜色值。2.2.3 MQTT与Adafruit IOMQTT是一种轻量级的发布/订阅模式消息传输协议非常适合物联网设备在低带宽、不稳定网络环境下进行通信。设备可以发布消息到一个主题Topic也可以订阅一个主题来接收消息。Adafruit IO是一个基于MQTT的物联网平台。在这个项目中我们创建了两个“数据流”randomFeed数据源我们的ESP32-S3设备扮演“发布者”定期生成一个随机数并发布到这个Feed。neopixelFeed数据源我们在Adafruit IO的网页Dashboard上创建一个颜色选择器当我们选择颜色时平台会向这个Feed发布一个代表颜色的十六进制字符串如#FF00FF。ESP32-S3设备订阅这个Feed一旦收到新消息就解析颜色并设置NeoPixel。这样我们就实现了双向通信设备上报数据云端下发控制指令。3. 开发环境搭建与基础代码实现3.1 CircuitPython固件烧录与库管理首先确保你的ESP32-S3板子运行的是CircuitPython。访问CircuitPython官网找到对应你板型的.uf2固件文件。将板子通过USB连接电脑并进入下载模式通常需要按某个复位按钮此时电脑会出现一个名为UF2BOOT的U盘。将下载的.uf2文件拖入该U盘板子会自动重启。重启后会出现一个名为CIRCUITPY的U盘这就是我们的代码和文件存储盘。接下来是库文件管理。CircuitPython的核心库已内置但像neopixel、adafruit_minimqtt、adafruit_io这些用于特定硬件的库需要手动放置。前往Adafruit的CircuitPython库包页面下载最新的库包。解压后找到以下文件或文件夹将它们复制到CIRCUITPY盘下的lib文件夹中neopixel.mpyadafruit_minimqtt/文件夹adafruit_io/文件夹注意lib文件夹必须位于CIRCUITPY盘的根目录下。如果不存在请手动创建一个。确保库的版本与你的CircuitPython版本大致兼容通常最新的稳定版库即可。3.2 硬件连接与电路分析将电位器与ESP32-S3连接起来。请根据你的电位器引脚定义通常中间是抽头两边是固定端进行连接电位器引脚连接到 ESP32-S3作用左引脚或引脚1GPIO A0(或其他ADC引脚如A1, A2等)这是电压分压的输出点ADC将在此读取电压。中间引脚抽头3.3V提供参考电压。右引脚或引脚3GND提供参考地。这种接法构成了一个经典的分压器。当旋钮转向3.3V一端时A0引脚电压接近3.3V转向GND一端时电压接近0V。3.3 基础功能代码实现ADC与NeoPixel在开始联网项目前我们先编写两个基础测试脚本确保ADC和NeoPixel工作正常。3.3.1 读取ADC原始值与电压值在CIRCUITPY盘根目录下创建或覆盖code.py文件输入以下代码# SPDX-FileCopyrightText: 2022 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT ESP32-S3 ADC基础读取示例 读取电位器原始值并转换为电压 import time import board import analogio # 初始化A0引脚为模拟输入 analog_pin analogio.AnalogIn(board.A0) # 电压转换函数 def get_voltage(pin): # ESP32-S3的ADC参考电压约为3.1V最大读数约为61000 # 这个值因芯片批次和具体型号略有差异可通过校准获得更精确值 return (pin.value * 3.1) / 61000 while True: raw_value analog_pin.value voltage get_voltage(analog_pin) print(fADC原始值: {raw_value:6d} | 电压: {voltage:.2f} V) time.sleep(0.5) # 降低打印频率便于观察保存后板子会自动运行。打开串行终端工具如Mu编辑器、Thonny或screen/putty选择正确的串口波特率设置为115200。旋转电位器你应该能看到终端里打印的数值在0~61000和0~3.1V之间变化。实操心得pin.value返回的是16位无符号整数0-65535但ESP32-S3的ADC在3.3V供电时最大值通常达不到65535大约在61000左右对应3.1V。这就是为什么转换公式中分母是61000。如果你需要更高的精度可以考虑使用外部基准电压源或对ADC进行两点校准。3.3.2 控制NeoPixel颜色与彩虹效果接下来测试板载LED。创建一个新的code.py# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT ESP32-S3 NeoPixel控制示例 循环显示红、绿、蓝三色并实现彩虹渐变效果 import time import board import neopixel from rainbowio import colorwheel # 初始化板载NeoPixel。参数控制引脚LED数量 pixel neopixel.NeoPixel(board.NEOPIXEL, 1) # 设置亮度范围0.0-1.0。默认亮度很高建议调低保护眼睛和LED。 pixel.brightness 0.3 print(开始三色循环...) for _ in range(3): # 循环3次 pixel.fill((255, 0, 0)) # 红色 print(红色) time.sleep(1) pixel.fill((0, 255, 0)) # 绿色 print(绿色) time.sleep(1) pixel.fill((0, 0, 255)) # 蓝色 print(蓝色) time.sleep(1) pixel.fill((0, 0, 0)) # 熄灭LED time.sleep(1) print(开始彩虹渐变...) # 彩虹渐变函数 def rainbow_cycle(delay): for j in range(255): # colorwheel函数将0-255的值映射为一个彩虹色 pixel[0] colorwheel(j) time.sleep(delay) while True: rainbow_cycle(0.02) # 数字越小彩虹变化越快保存后观察板载LED它会先进行红、绿、蓝三色切换然后开始平滑的彩虹色渐变。colorwheel是一个非常有用的函数它通过一个单一整数参数生成连续的彩虹色系。4. 物联网集成连接Wi-Fi与Adafruit IO基础功能测试无误后我们将进入核心环节让设备联网并与云平台交互。4.1 配置网络凭证与Adafruit IO密钥出于安全考虑我们绝不将密码和密钥直接写在代码里。CircuitPython使用settings.toml文件来管理这些敏感信息。在CIRCUITPY盘根目录下用文本编辑器创建或编辑settings.toml文件内容如下# 你的Wi-Fi网络名称和密码 CIRCUITPY_WIFI_SSID 你的Wi-Fi名称 CIRCUITPY_WIFI_PASSWORD 你的Wi-Fi密码 # 你的Adafruit IO账户信息 ADAFRUIT_AIO_USERNAME 你的Adafruit IO用户名 ADAFRUIT_AIO_KEY 你的Adafruit IO Active Key重要警告settings.toml文件包含了你的所有敏感信息。务必将它添加到你的.gitignore文件中如果使用Git切勿上传到任何公开的代码仓库、论坛或聊天群。如何获取ADAFRUIT_AIO_KEY登录Adafruit IO网站点击右上角的“My Key”页面中显示的“Active Key”就是你的密钥。4.2 完整的物联网数据收发代码实现以下是完整的项目代码它实现了连接本地Wi-Fi。连接Adafruit IO的MQTT代理。每10秒发布一个随机数到randomfeed。订阅neopixelfeed并根据收到的颜色值改变LED颜色。将以下代码保存为CIRCUITPY盘根目录下的code.py。# SPDX-FileCopyrightText: 2021 Ladyada for Adafruit Industries # SPDX-License-Identifier: MIT ESP32-S3 Adafruit IO MQTT综合示例 读取ADC电压发送随机数并接收云端指令控制NeoPixel import time import ssl import os from random import randint import microcontroller import socketpool import wifi import board import neopixel import adafruit_minimqtt.adafruit_minimqtt as MQTT from adafruit_io.adafruit_io import IO_MQTT # --- 第1部分Wi-Fi连接带错误处理和复位--- try: print(f正在连接Wi-Fi: {os.getenv(CIRCUITPY_WIFI_SSID)}) wifi.radio.connect(os.getenv(CIRCUITPY_WIFI_SSID), os.getenv(CIRCUITPY_WIFI_PASSWORD)) print(f连接成功! IP地址: {wifi.radio.ipv4_address}) except Exception as e: # 捕获任何连接异常 print(fWi-Fi连接失败: {e}) print(系统将在30秒后硬复位重试...) time.sleep(30) microcontroller.reset() # 复位整个单片机从头开始运行 # --- 第2部分初始化硬件与全局变量 --- # 初始化ADC用于读取电位器电压 analog_pin analogio.AnalogIn(board.A0) def get_voltage(pin): # 电压转换函数 return (pin.value * 3.1) / 61000 # 初始化NeoPixel pixel neopixel.NeoPixel(board.NEOPIXEL, 1, brightness0.3) pixel.fill((0, 0, 0)) # 启动时先熄灭 # --- 第3部分MQTT回调函数定义 --- def connected(client): 成功连接到Adafruit IO时被调用 print( 已连接到Adafruit IO! ) # 订阅我们关心的feed client.subscribe(neopixel) print(正在监听neopixel数据源的颜色更改...) def message(client, feed_id, payload): 当订阅的feed收到新消息时被调用 print(f收到新数据! 数据源: {feed_id}, 内容: {payload}) if feed_id neopixel: # payload格式如 #FF00FF需要去掉#并转换为16进制整数 # int(payload[1:], 16) 将字符串FF00FF解析为16进制整数 try: color_value int(payload[1:], 16) pixel.fill(color_value) print(fNeoPixel颜色已更新为: {payload}) except ValueError: print(f无法解析的颜色值: {payload}) # --- 第4部分MQTT客户端设置与连接 --- # 创建Socket池管理网络连接 pool socketpool.SocketPool(wifi.radio) # 创建MQTT客户端对象配置Adafruit IO的代理和认证信息 mqtt_client MQTT.MQTT( brokerio.adafruit.com, # Adafruit IO的MQTT服务器地址 port8883, # 使用加密端口 usernameos.getenv(ADAFRUIT_AIO_USERNAME), passwordos.getenv(ADAFRUIT_AIO_KEY), socket_poolpool, ssl_contextssl.create_default_context(), # 启用SSL加密 ) # 将MQTT客户端包装成Adafruit IO辅助对象 io IO_MQTT(mqtt_client) # 绑定我们定义的回调函数 io.on_connect connected io.on_message message # 尝试连接MQTT代理 try: print(正在连接Adafruit IO MQTT代理...) io.connect() except Exception as e: print(fMQTT连接失败: {e}) print(系统将在30秒后硬复位重试...) time.sleep(30) microcontroller.reset() # --- 第5部分主循环 --- last_publish_time 0 # 上次发布数据的时间戳 publish_interval 10 # 发布间隔秒 print(\n 系统启动完成开始主循环 \n) while True: try: # 必须定期调用loop()来处理网络消息和保持连接 io.loop() # 每间隔一段时间发布数据 current_time time.monotonic() # 获取当前时间单调递增不受系统时间影响 if current_time - last_publish_time publish_interval: # 1. 读取并发布ADC电压 voltage get_voltage(analog_pin) # Adafruit IO feed的值需要是字符串类型 io.publish(voltage, f{voltage:.2f}) print(f[上报] ADC电压: {voltage:.2f} V) # 2. 生成并发布一个随机数模拟传感器数据 random_val randint(0, 100) io.publish(random, str(random_val)) print(f[上报] 随机数: {random_val}) last_publish_time current_time # 更新发布时间戳 # 可以添加一个短暂延时减少CPU占用 time.sleep(0.1) except Exception as e: # 主循环中的全局异常捕获防止任何未预料的错误导致程序停止 print(f\n!!! 主循环发生错误: {e}) print(尝试重新连接...) time.sleep(5) # 这里可以尝试更精细的重连逻辑例如先检查Wi-Fi再重连MQTT # 为简单起见我们选择硬复位。对于长期运行的项目建议实现软重连。 microcontroller.reset()4.3 在Adafruit IO上创建数据源与仪表盘代码准备好了我们还需要在云端配置接收和发送数据的界面。登录Adafruit IO访问 io.adafruit.com 并使用你的账户登录。创建Feeds数据源点击左侧菜单的Feeds。点击New Feed。创建三个Feed名称严格区分大小写voltage用于接收我们上报的电压值。random用于接收我们上报的随机数。neopixel用于向我们发送颜色指令。创建Dashboard仪表盘点击左侧菜单的Dashboards。点击New Dashboard取名如“ESP32-S3 Monitor”。进入新建的Dashboard点击Create New Block。对于voltage和random选择Gauge仪表或Line Chart折线图块。创建时在“Connect a Feed”步骤中选择对应的Feed。对于neopixel选择Color Picker颜色选择器块。创建时务必选择neopixel这个Feed。5. 系统联调、问题排查与优化5.1 完整工作流程验证硬件连接确保电位器已按前述方式正确连接到ESP32-S3。文件部署确认CIRCUITPY盘上有正确的settings.toml、code.py以及lib文件夹内含所需库。上电与观察通过USB给板子上电。打开串行监视器115200波特率。你应该依次看到Wi-Fi连接过程提示。“正在连接Adafruit IO MQTT代理...”。“ 已连接到Adafruit IO! ”。随后每10秒会打印一次[上报] ADC电压: x.xx V和[上报] 随机数: xx。云端数据验证刷新你的Adafruit IO Dashboard。在voltage和random对应的图表块上你应该能看到数据点在实时更新。旋转电位器voltage的数值应随之变化。云端控制验证在Dashboard上点击你为neopixel创建的颜色选择器块。在弹出的调色板中选择一个颜色点击“SAVE”。稍等片刻通常1-2秒内你板载的RGB LED颜色应该会变成你刚刚选择的颜色同时串口监视器会打印出类似收到新数据! 数据源: neopixel, 内容: #FF8800的消息。5.2 常见问题与排查技巧实录即使按照步骤操作也可能会遇到问题。以下是我在实际开发中总结的排查清单现象可能原因排查步骤与解决方案串口无输出或输出乱码1. 串口选择错误。2. 波特率设置错误。3. 板子未正确进入CircuitPython模式。1. 检查设备管理器Windows或ls /dev/tty*Mac/Linux确认正确串口。2. 确保波特率为115200。3. 尝试双击板子复位按钮确认出现CIRCUITPY盘符。Wi-Fi连接失败1.settings.toml中SSID或密码错误。2. 网络需要网页认证如酒店、公司网络。3. Wi-Fi信号太弱。4. 板载天线接触不良某些型号。1. 仔细核对settings.toml注意大小写和特殊字符。2. CircuitPython的wifi库不支持Portal认证。需使用支持的网络。3. 将设备靠近路由器。4. 检查板子是否有外接天线接口确保连接牢固。连接Adafruit IO失败1.ADAFRUIT_AIO_USERNAME或ADAFRUIT_AIO_KEY错误。2. 网络防火墙阻止了8883端口MQTT over SSL。3. Adafruit IO服务临时故障。1. 登录Adafruit IO网站确认用户名和Active Key无误。2. 尝试切换到非加密端口1883不推荐需修改代码中port和移除ssl_context。3. 访问 status.adafruit.com 查看服务状态。NeoPixel不亮或颜色不对1. 亮度(brightness)设置为0。2. 颜色值格式错误。3. 代码中NeoPixel对象初始化引脚错误。1. 检查代码中pixel.brightness是否大于0如0.3。2. 确保从Adafruit IO发送的是如#FF0000的格式。代码中payload[1:]是为了去掉#。3. 对于板载LED引脚通常是board.NEOPIXEL。ADC读数不变化或范围不对1. 电位器接线错误。2. ADC引脚配置错误。3. 电压转换公式中的参考值不准。1. 用万用表测量中间引脚对GND的电压旋转时应在0-3.3V间变化。若无变化检查接线。2. 确认代码中board.A0对应你实际连接的物理引脚。3. 将电位器旋到一端接3.3V那端读取analog_pin.value最大值替换公式中的61000进行校准。数据上报或指令接收有延迟1. 网络延迟。2. MQTTloop()调用频率不够。3. 代码中有长时间的阻塞操作如time.sleep(10)。1. 属于正常现象公网通信通常有几百毫秒到几秒延迟。2. 确保主循环中io.loop()被频繁调用我们放在循环开头。3. 避免使用长延时用time.monotonic()做非阻塞定时如我们上报数据的方式。程序运行一段时间后断开连接1. Wi-Fi路由器策略性踢除空闲设备。2. MQTT KeepAlive机制问题。3. 内存泄漏在长时间运行中罕见。1. 在路由器设置中为设备设置静态IP或取消节能设置。2. MQTT客户端有自动保活机制确保网络稳定。可以在代码中添加更积极的心跳或断线重连逻辑而不是直接复位。5.3 项目优化与扩展思路这个基础项目可以作为一个起点进行多方面的扩展多传感器集成ESP32-S3有多个ADC通道。你可以同时连接光敏电阻、温湿度传感器如DHT11需数字接口、土壤湿度传感器等创建真正的环境监测站。在Adafruit IO上为每个传感器创建对应的Feed和图表。数据持久化与离线缓存当前代码在网络断开时数据会丢失。可以集成adafruit_sdcard库将数据临时存储到SD卡等网络恢复后再批量上传。低功耗优化如果使用电池供电功耗是关键。可以使用ESP32的深度睡眠模式每隔一段时间如5分钟唤醒一次采集数据并上传然后继续睡眠。在代码中采集完数据后调用wifi.radio.enabled False关闭Wi-Fi射频。降低CPU频率通过microcontroller.cpu.frequency。本地交互与显示为项目增加一个OLED屏幕如SSD1306实时显示本地传感器读数、网络状态和来自云端的指令摘要。协议与平台扩展除了Adafruit IO你还可以让ESP32-S3连接其他MQTT代理如自建的Mosquitto、EMQX或云服务商的物联网平台只需修改代码中的broker、username、password等参数即可。也可以尝试HTTP REST API与其他Web服务交互。通过这个项目你不仅学会了如何让ESP32-S3读取模拟信号、控制RGB LED和连接云端更重要的是掌握了物联网设备开发的基本框架感知-处理-通信-反馈。当你理解了每个环节的原理并能熟练排查问题后就能将这些模块像乐高一样组合去构建更复杂、更有创意的物联网应用了。

相关文章:

ESP32-S3物联网开发实战:从ADC采样到MQTT云端通信

1. 项目概述:从传感器到云端的数据之旅在物联网项目的开发中,我们常常需要解决一个核心问题:如何让物理世界的信息被数字系统感知、处理,并最终在云端呈现或接受远程控制?这背后涉及三个关键环节:感知、处理…...

柔性构建板原理与实战:从材料科学到3D打印取模难题的工程解法

1. 项目概述:为什么你需要一块柔性构建板?如果你玩3D打印有一段时间了,大概率经历过这样的抓狂时刻:打印完成,模型牢牢地“焊”在玻璃板或者美纹纸胶带上,你用铲刀、刮片又撬又掰,结果要么是模型…...

2230固态硬盘延长安装技巧指南!

2230规格的M.2固态硬盘因体积小巧,广泛应用于掌机、轻薄笔记本和微型PC,但许多主板的M.2插槽默认为2280规格,导致2230硬盘“装不稳”。本文详细讲解2230与2280的尺寸差异、延长安装的核心方法(转接支架、螺丝柱调整、散热适配&…...

【ITIL4】32服务实践 - 问题管理(Problem Management)

【ITIL4】32服务实践 - 问题管理(Problem Management) 文章目录【ITIL4】32服务实践 - 问题管理(Problem Management)一、核心定义1. 问题(Problem)2. 已知错误(Known Error)3. 变通…...

别再死记硬背MPNN公式了!用“邻居传纸条”的比喻彻底搞懂消息传递神经网络

用"班级传纸条"游戏理解消息传递神经网络 想象一下,你正坐在教室里,老师突然宣布要进行一个特殊的游戏——每个同学可以给任意一位朋友传递一张写有秘密信息的纸条。这个看似简单的游戏,恰恰揭示了人工智能领域最前沿的图神经网络(…...

深度学习优化算法(二)—— SGD + Momentum + Nesterov(三十四)

1. 定位导航 第 33 篇讲了为什么训练困难(病态、鞍点、梯度爆炸)。本篇正式介绍解决方案的第一波——三个经典优化算法: 算法 关键思想 年代 SGD 随机梯度估计 + 学习率衰减 1951(Robbins-Monro) Momentum 累积梯度方向加速 1964(Polyak) Nesterov 先"前瞻"再…...

深度学习优化算法(一)—— 学习 vs 纯优化 + 优化挑战(三十三)

1. 定位导航 第 7 章我们解决了"怎么防过拟合"。第 8 章正式进入深度学习的另一个核心——怎么训练得快、稳、好。 第 8 章规划(5 篇): 篇号 主题 33(本篇) 学习 vs 纯优化 + 优化挑战 34 基本优化算法(SGD + Momentum + Nesterov) 35 自适应学习率(AdaGra…...

新手入门,用外卖系统吃透Tomcat与Java Web全流程

对于刚接触Java Web的小伙伴来说,Tomcat、Servlet、端口号、网络请求这些概念,很容易越学越懵。今天全程用外卖系统做统一比喻,把复杂技术名词全部转化为生活场景,从零梳理Java Web核心流程,看完彻底理清浏览器、服务器…...

【CLIP论文阅读】:基于自然语言监督的通用视觉预训练范式

论文信息 标题:Learning Transferable Visual Models From Natural Language Supervision会议:ICML 2021单位:OpenAI代码:https://github.com/OpenAI/CLIP论文:https://arxiv.org/pdf/2103.00020.pdf 一、引言&#x…...

Python Django REST Framework实战:构建RESTful API

Python Django REST Framework实战:构建RESTful API 引言 在Python Web开发中,Django REST Framework(DRF)是构建RESTful API的首选框架。作为一名从Rust转向Python的后端开发者,我深刻体会到DRF在快速构建高质量API方…...

上位机知识篇---提高Linux下载速度

提升 wget、pip 和 conda 的下载速度,核心方法可以归结为两类:一是使用更快的下载工具,二是连接到更近的镜像站点。下面的表格总结了几种主流的加速方案,方便你快速查阅:提速方法wgetpipconda🚀 换用更快的…...

观察使用Taotoken Token Plan后月度API成本的变化趋势

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用Taotoken Token Plan后月度API成本的变化趋势 对于依赖大模型API进行开发的中小型团队而言,月度API成本的可预…...

供水泵恒压变频控制系统:备用泵自动投切,保障供水不间断

供水泵恒压变频控制系统是一套融合变频调速、PID闭环控制与智能多泵管理的自动化节能供水解决方案,核心是按需供水、稳压节能、无人值守。 一、核心原理压力采集:管网压力传感器实时采集水压(0~1.6MPa)。偏差计算:PLC/专用控制器将实测值与设…...

终极窗口尺寸调整工具:WindowResizer完整使用指南

终极窗口尺寸调整工具:WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽大小的顽固应用程序窗口而烦恼吗?Wind…...

Nrfr终极指南:5步轻松修改SIM卡国家码,免Root突破区域限制

Nrfr终极指南:5步轻松修改SIM卡国家码,免Root突破区域限制 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制&#x…...

为什么需要图像篡改检测?5个简单步骤守护数字世界的真实性

为什么需要图像篡改检测?5个简单步骤守护数字世界的真实性 【免费下载链接】image_tampering_detection_references A list of papers, codes and other interesting collections pertaining to image tampering detection and localization. 项目地址: https://g…...

别再只会轮询了!STM32CubeMX配置USART中断,从原理到调试一条龙指南

STM32串口中断实战:从轮询到事件驱动的效率跃迁 在嵌入式开发中,串口通信就像系统的神经末梢,负责与外界交换关键信息。传统轮询方式如同不断拨打电话确认消息,而中断机制则像设置来电提醒——只有当数据真正到达时才会唤醒CPU。这…...

ETS2LA:让《欧洲卡车模拟2》自动驾驶的终极解决方案

ETS2LA:让《欧洲卡车模拟2》自动驾驶的终极解决方案 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist 你是否曾梦想在…...

Photoshop图层批量导出效率革命:10倍速免费脚本完全指南

Photoshop图层批量导出效率革命:10倍速免费脚本完全指南 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址: h…...

用STM32F103和RC522模块DIY一个智能门禁,附完整代码和PCB文件

用STM32F103和RC522模块打造高性价比智能门禁系统 在创客圈子里,智能门禁系统一直是极受欢迎的DIY项目。它不仅融合了嵌入式开发、射频识别和物联网技术,还能解决生活中的实际问题。相比动辄上千元的商业门禁设备,用STM32F103C8T6&#xff0…...

OpenCV颜色操作避坑指南:cv::Scalar里BGR和RGB顺序别再搞混了

OpenCV颜色操作避坑指南:cv::Scalar里BGR和RGB顺序别再搞混了 第一次用OpenCV画红色矩形时,我信心满满地写下cv::Scalar(255, 0, 0),结果屏幕上却出现了一个蓝色方块——这个场景恐怕每个OpenCV初学者都遇到过。颜色通道顺序这个看似简单的细…...

Acepe:下一代AI驱动的开发者环境,实现多代理协同与可控编程

1. 项目概述:下一代AI驱动的开发者环境如果你和我一样,在过去一年里尝试过各种AI编程助手,从Copilot的代码补全到Cursor的聊天式编程,再到Claude Code的深度分析,你可能会发现一个共同的痛点:这些工具虽然强…...

从‘ylim auto’到‘ylim manual’:深入理解Matlab坐标轴范围管理机制与性能优化

从‘ylim auto’到‘ylim manual’:深入理解Matlab坐标轴范围管理机制与性能优化 在数据可视化领域,Matlab作为一款强大的科学计算工具,其图形系统的精细控制能力常常被低估。当我们处理静态数据时,坐标轴范围的自动调整&#xff…...

从零搭建ROS机器人视觉定位系统:AprilTag二维码实战指南

1. 为什么选择AprilTag做机器人视觉定位? 刚接触机器人视觉定位时,你可能听说过二维码、ArUco标记、AprilTag等各种方案。我最初用普通二维码做过实验,发现识别距离超过1米就经常丢帧,后来换成ArUco标记稳定性有所提升&#xff0c…...

基于AI与向量数据库构建个人智能知识库:Braindb项目全解析

1. 项目概述:从“脑数据库”到个人知识管理的革命最近在折腾个人知识管理工具的朋友,应该都听过一个词叫“第二大脑”。市面上从Notion、Obsidian到各种双链笔记,大家都在试图解决同一个问题:如何把散落在各处、不成体系的信息&am…...

技能设计指南:用产品思维构建个人可衡量技能体系

1. 项目概述与核心价值最近在和一些做产品、运营的朋友聊天,发现一个挺有意思的现象:大家手上都有一堆“技能”,比如会写文案、会做数据分析、会用某个设计软件,但真到了要系统性地提升自己,或者向别人清晰展示自己能力…...

如何用waifu2x-caffe轻松实现4倍无损放大?一个免费AI图像增强的完整方案

如何用waifu2x-caffe轻松实现4倍无损放大?一个免费AI图像增强的完整方案 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 你是否曾经遇到过这样的困扰:收藏多年的老照片模糊不清&am…...

地缘政治市场模拟器:ABM与NLP技术如何量化黑天鹅事件风险

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“hermes-geopolitical-market-sim”。光看名字,你可能会觉得这又是一个复杂到让人望而却步的宏观模型。但作为一个在量化分析和策略模拟领域摸爬滚打了十多年的从业者,我第一眼…...

别再手动敲命令了!用Ansible Playbook一键搞定Debian 12.9的桌面、网络和DNS配置

Ansible Playbook全自动部署Debian 12.9:从裸机到生产级桌面的终极实践 当面对数十台需要统一配置的Debian服务器时,手动敲命令不仅效率低下,更可能因人为失误导致环境差异。本文将展示如何用Ansible Playbook实现从最小化安装到完整生产环境…...

如何在Blender中实现CAD级精确建模:CAD_Sketcher完整指南

如何在Blender中实现CAD级精确建模:CAD_Sketcher完整指南 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾经在Blender中尝试创建精确的机械零件或建筑设…...