news 2026/5/21 15:08:55

基于PyPortal与Adafruit IO的智能温度监测系统开发指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于PyPortal与Adafruit IO的智能温度监测系统开发指南

1. 项目概述与核心价值

如果你手头有一块Adafruit的PyPortal,除了用它显示漂亮的图片和文字,有没有想过把它变成一个能联网、能思考的智能设备?我最近就用它配合板载的ADT7410温度传感器,折腾出了一个可以远程监控、自动告警的智能温度计。整个过程下来,感觉PyPortal加上CircuitPython和Adafruit IO这套组合拳,对于物联网原型开发来说,效率高得惊人。

这个项目的核心很简单:让PyPortal读取它自带的ADT7410温度传感器数据,然后通过Wi-Fi把数据发送到Adafruit IO云端。在云端,你可以实时看到温度曲线,设置仪表盘,甚至能让它在温度过高或过低时自动给你发邮件提醒。听起来像是需要一堆服务器和复杂代码的活儿,但实际上,大部分繁重的工作都被Adafruit的生态给包揽了。我们只需要关注最核心的逻辑——如何读取传感器和如何发送数据。

为什么选择这套方案?首先,CircuitPython极大地降低了嵌入式开发的门槛。你不需要复杂的交叉编译环境,代码文件就像普通文档一样直接拖拽到设备里,修改后立刻生效,这种即时反馈对调试和迭代太友好了。其次,Adafruit IO作为数据中枢,省去了自建后端服务的麻烦。它提供了现成的数据接收、存储、可视化和触发动作(Action)功能,让我们能把精力完全集中在设备端和应用逻辑上。最后,PyPortal本身是一个高度集成的平台,它包含了显示屏、触摸、Wi-Fi模块、多个传感器(光感、温度)和丰富的扩展接口,几乎是为物联网显示终端量身定做的。

无论你是想监控房间温度、鱼缸水温,还是某个设备机箱的内部环境,这个项目都能提供一个快速、可靠且可高度定制的解决方案。接下来,我会带你从硬件准备、环境配置、代码编写到云端设置,完整地走一遍这个流程,并分享我在实操中踩过的坑和总结的技巧。

2. 硬件与环境准备

2.1 核心硬件解析:PyPortal与ADT7410

这个项目的硬件核心是Adafruit PyPortal。它不是一块简单的单片机开发板,而是一个开箱即用的物联网应用终端。我们主要用到它的以下几个部分:

  1. 微控制器:基于Atmel(现Microchip)的ATSAMD51系列,性能足够运行CircuitPython并处理网络通信。
  2. Wi-Fi协处理器:板载ESP32模块,专门负责Wi-Fi连接和TCP/IP协议栈,通过SPI与主控通信。这种设计让主控MCU从繁重的网络任务中解脱出来。
  3. 显示与触摸:一块3.2英寸的TFT触摸屏,分辨率320x240,这是项目人机交互的基础。
  4. 传感器
    • ADT7410:这是一颗16位高精度数字温度传感器,通过I2C总线与主控连接。它的精度可达±0.5°C(在-10°C到+85°C范围内),分辨率0.0078°C,完全满足绝大多数环境监测需求。它被集成在PyPortal主板背面。
    • 环境光传感器:一个模拟光敏电阻,用于检测环境光照强度。在本项目中,我们用它来实现一个实用功能:当环境光较暗(比如夜晚或用手遮挡)时,自动关闭屏幕背光以省电;当检测到光线(比如你挥手唤醒它)时,再点亮屏幕显示信息。
  5. 其他:板载NeoPixel LED(用于状态指示)、MicroSD卡槽、丰富的Grove/Qwiic/STEMMA QT连接器,为未来扩展留足了空间。

ADT7410的I2C通信要点:这颗传感器的默认I2C地址是0x48。在CircuitPython中,我们使用busio.I2C库来初始化I2C总线,然后用adafruit_adt7410这个专用库来驱动它。设置adt.high_resolution = True可以开启其高精度模式(16位),虽然转换时间会稍长一点(约240ms),但对于温度监测这种低频应用来说,这个延迟完全可以接受,换取的是更精确的数据。

2.2 软件栈与依赖库

软件层面,我们构建在CircuitPython之上。你需要准备以下环境:

  1. CircuitPython固件:前往 CircuitPython官网 下载适用于PyPortal的最新版本.uf2文件。
  2. 代码编辑器:任何纯文本编辑器都可以,如VS Code、Thonny、甚至系统自带的记事本。我个人推荐Mu Editor或VS Code with CircuitPython插件,它们对CircuitPython有更好的支持,比如串口监视器。
  3. 必要的CircuitPython库:这是项目能跑起来的关键。你需要将以下库文件(.mpy.py)放入PyPortal的CIRCUITPY磁盘下的/lib文件夹中。最省事的方法是下载项目捆绑包(Project Bundle),里面通常包含了所有依赖。
    • adafruit_adt7410.mpy:ADT7410传感器的驱动库。
    • adafruit_esp32spiadafruit_esp32spi_wifimanager.mpy:用于管理ESP32 Wi-Fi连接,后者提供了更稳健的连接管理(自动重连等)。
    • adafruit_io:与Adafruit IO服务通信的核心库。
    • adafruit_requests.mpy:一个类似于Pythonrequests的库,用于处理HTTP/HTTPS请求。
    • adafruit_connection_manager.mpy:管理网络连接池和SSL上下文。
    • neopixel.mpy:控制板载NeoPixel LED。
    • adafruit_bus_device:一些总线设备的通用支持。

注意:库的版本兼容性非常重要。务必从Adafruit的官方GitHub仓库或通过CircuitPython库捆绑包获取与你的CircuitPython固件版本匹配的库文件。混合使用不同大版本的库可能会导致难以排查的错误。

3. 核心流程实现与代码拆解

3.1 第一步:烧录CircuitPython与基础文件部署

拿到PyPortal后,第一步是让它运行CircuitPython。操作非常直观:

  1. 用一条数据线(注意,必须是能传输数据而不仅仅是充电的USB线)将PyPortal连接到电脑。
  2. 快速双击PyPortal板上的Reset按钮。你会看到板载的NeoPixel LED闪烁绿色,电脑上会出现一个名为PORTALBOOT的U盘。
  3. 将之前下载的adafruit-circuitpython-pyportal-*.uf2文件拖入PORTALBOOT盘符。设备会自动重启,之后PORTALBOOT盘符消失,出现一个新的名为CIRCUITPY的盘符。这说明CircuitPython已经成功运行。

此时,CIRCUITPY驱动器里可能只有一个boot_out.txt文件。我们需要把项目文件放进去。从项目捆绑包中,你会得到以下关键文件:

  • code.py:主程序文件。CircuitPython启动后会自动执行这个文件。
  • settings.toml:配置文件,用于存放Wi-Fi密码和Adafruit IO密钥等敏感信息。
  • /fonts目录:存放显示用的字体文件(如Ninito-Black-17.bdf)。
  • /icons目录:存放显示用的图片文件(如pyportal_splash.bmp开机图)。
  • /lib目录:存放所有依赖的库文件(如果捆绑包里没有,需要手动从库捆绑包中复制过来)。

请确保将这些文件和文件夹完整地复制到CIRCUITPY驱动器的根目录下,保持目录结构。

3.2 第二步:配置网络与云端服务(Adafruit IO)

这是连接物理世界和数字世界的桥梁,分为设备端配置和云端配置两部分。

设备端配置:settings.toml文件详解

settings.toml是CircuitPython 8及以上版本推荐使用的配置文件,用于替代旧的secrets.py。它的好处是格式更标准,且与代码分离,方便分享代码时不泄露密码。

在你的CIRCUITPY根目录下,创建或编辑settings.toml,内容如下:

CIRCUITPY_WIFI_SSID = "你的Wi-Fi名称" CIRCUITPY_WIFI_PASSWORD = "你的Wi-Fi密码" ADAFRUIT_AIO_USERNAME = "你的Adafruit IO用户名" ADAFRUIT_AIO_KEY = "你的Adafruit IO Active Key"

重要提示ADAFRUIT_AIO_KEY不是你的账户密码,而是需要在Adafruit IO网站上专门获取的Active Key。登录Adafruit IO后,点击右上角头像 ->View AIO Key即可看到。这个Key具有完全访问权限,请像保管密码一样保管它。

云端配置:Adafruit IO设置三部曲

  1. 创建数据源(Feed):Feed是IO中存储数据流的基本单元。登录Adafruit IO,进入Feeds页面,点击Create New Feed,命名为temperature。这个Feed将专门用来接收来自PyPortal的温度数据。

  2. 构建监控仪表盘(Dashboard):Dashboard是用来可视化数据的面板。创建一个新的Dashboard,然后添加控件。

    • 仪表盘(Gauge):添加一个Gauge块,关联到temperaturefeed。你可以设置最小值、最大值(例如0°C和50°C),以及警告阈值颜色(比如超过30°C变红色)。
    • 折线图(Line Chart):再添加一个Line Chart块,同样关联到temperaturefeed。这可以显示历史温度趋势,时间范围可以设置为最近1小时、24小时甚至30天。 这样,你就能同时看到当前数值和历史曲线,监控体验大大提升。
  3. 设置智能告警(Action,可选但推荐):这是体现“智能”的关键。Adafruit IO的Action功能(旧称Triggers)可以监控Feed数据,并在满足条件时执行操作,比如发送邮件。

    • 进入Actions页面,创建新Action。
    • 条件(Condition):选择temperaturefeed,设置条件,例如“当数据大于30” (假设单位是摄氏度)。
    • 动作(Action):选择Email me。你可以自定义邮件标题和内容,比如“警告:温度过高!”。
    • 你可以创建多个Action,比如再设置一个“当数据小于10”时发送“温度过低”的警告。

    注意:邮件Action功能是Adafruit IO Plus(付费订阅)的特性。免费账户可以正常使用Feed和Dashboard,但无法使用邮件等外部通知Action。不过,你仍然可以在Dashboard上设置颜色告警,作为视觉提示。

3.3 第三步:核心代码逻辑深度解析

让我们打开code.py,逐段理解其工作原理。代码的核心逻辑是一个无限循环,主要做四件事:读光感、读温度、更新屏幕、发数据。

初始化与连接建立

from os import getenv import time import board import busio from digitalio import DigitalInOut from analogio import AnalogIn import adafruit_adt7410 from adafruit_esp32spi import adafruit_esp32spi, adafruit_esp32spi_wifimanager from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError # 1. 从settings.toml加载配置 ssid = getenv("CIRCUITPY_WIFI_SSID") password = getenv("CIRCUITPY_WIFI_PASSWORD") aio_username = getenv("ADAFRUIT_AIO_USERNAME") aio_key = getenv("ADAFRUIT_AIO_KEY") # ... 检查配置是否完整的代码 ... # 2. 初始化Wi-Fi管理器 esp32_cs = DigitalInOut(board.ESP_CS) esp32_ready = DigitalInOut(board.ESP_BUSY) esp32_reset = DigitalInOut(board.ESP_RESET) spi = busio.SPI(board.SCK, board.MOSI, board.MISO) esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) wifi = adafruit_esp32spi_wifimanager.WiFiManager(esp, ssid, password, status_pixel=status_pixel) # 3. 连接到Adafruit IO io = IO_HTTP(aio_username, aio_key, wifi) temperature_feed = io.get_feed('temperature') # 4. 初始化传感器 i2c_bus = busio.I2C(board.SCL, board.SDA) adt = adafruit_adt7410.ADT7410(i2c_bus, address=0x48) adt.high_resolution = True light_sensor = AnalogIn(board.LIGHT)
  • WiFiManager:这是代码稳定性的关键。它不仅仅负责连接,还内置了错误处理和重试机制。如果网络断开,它会尝试自动重连。status_pixel参数让它可以通过NeoPixel LED的颜色变化来指示网络状态(如连接中、已连接、错误等),非常直观。
  • IO_HTTP客户端:这是与Adafruit IO API交互的接口。我们传入了用户名、密钥和Wi-Fi管理器实例。io.get_feed('temperature')会获取或创建我们在云端设置的那个Feed的元数据,后续发送数据时需要用到Feed的密钥(feed['key'])。

主循环:感知、决策、执行

while True: # 读取环境光强度 light_value = light_sensor.value # 值范围约0-65535 temperature = adt.temperature # 读取温度值,单位摄氏度 try: if light_value < 1000: # 环境较暗,点亮屏幕 set_backlight(1) # 在屏幕上显示温度和从IO获取的网络时间 gfx.display_temp(temperature) datetime = io.receive_time() gfx.display_date_time(datetime) else: # 环境明亮,熄灭屏幕省电 set_backlight(0) # 发送温度数据到Adafruit IO io.send_data(temperature_feed['key'], temperature) except (ValueError, RuntimeError, ConnectionError, OSError) as e: print("Failed, retrying\n", e) wifi.reset() # 遇到网络错误,重置Wi-Fi连接 continue time.sleep(PYPORTAL_REFRESH) # 等待2秒后继续循环
  • 光控逻辑light_sensor.value读取的是模拟电压值经过16位ADC转换后的数字量。1000这个阈值是我根据经验设定的,你可以根据实际环境调整。这个功能让设备在无人观看时自动息屏,非常实用。
  • 错误处理try...except块包裹了网络操作。一旦发生超时、断线等错误,代码会捕获异常,打印错误信息,并调用wifi.reset()尝试重新初始化网络连接。这是保证设备长期稳定运行的必要措施。
  • 时间同步io.receive_time()从Adafruit IO服务器获取当前网络时间。Adafruit IO会根据你的IP地址推断大致时区。这省去了在设备上配置RTC(实时时钟)模块或手动设置时区的麻烦,对于需要显示时间的应用来说极其方便。
  • 发送数据io.send_data(feed_key, data)是上传数据的核心。它会将数据(这里是浮点数温度值)以HTTP POST请求发送到对应的Feed。数据在IO上会被自动加上时间戳存储。

图形显示辅助模块

项目中的thermometer_helper.py(或类似名称的模块)封装了在PyPortal屏幕上绘制温度计图形、数字和时间的细节。它使用了adafruit_display_textadafruit_bitmap_font等库。虽然代码较长,但其原理是:在内存中创建一块画布,将温度数值转换为字符串,使用指定的字体渲染到画布的特定位置,最后刷新显示。如果你想自定义UI,比如改变颜色、布局或添加更多信息,修改这个辅助模块是最直接的途径。

4. 高级技巧与深度优化

4.1 功耗优化策略

PyPortal作为常电设备,功耗是需要考虑的一点。除了代码中利用光传感器控制背光,还有更多优化空间:

  • 调整采样与发送频率:主循环中的PYPORTAL_REFRESH(默认为2秒)决定了数据读取和发送的频率。对于温度监测,通常不需要秒级更新。将其改为10(10秒)或60(1分钟)可以大幅减少Wi-Fi通信次数,显著降低平均功耗。你可以在settings.toml里定义一个变量如UPDATE_INTERVAL = 60,然后在代码中用getenv读取,这样调整起来更方便。
  • 深度睡眠(Deep Sleep):对于电池供电的场景,可以使用PyPortal的深度睡眠功能。这需要连接一个外部引脚来唤醒设备。思路是:设备睡眠一段时间(如5分钟)-> 被唤醒 -> 连接Wi-Fi -> 读取传感器 -> 发送数据 -> 再次进入睡眠。这能极大延长电池寿命。CircuitPython的alarm模块支持深度睡眠,但需要注意,深度睡眠时RAM内容会丢失,程序会从头开始执行。
  • 关闭未使用的外设:如果你不需要声音,可以在代码初始化时关闭音频放大器。如果暂时不用SD卡,也可以将其置于非活动状态。

4.2 数据预处理与本地告警

虽然云端Action很强大,但有时我们可能需要设备本地的即时响应,或者想在数据上传前做一些处理。

  • 本地阈值判断:在code.py的主循环中,读取temperature后立即进行判断。

    current_temp = adt.temperature if current_temp > 30.0: # 本地触发动作:点亮红色LED,播放警告音,屏幕显示警告 status_pixel.fill((255, 0, 0)) # NeoPixel变红 # 可以添加蜂鸣器代码或屏幕闪烁提示 io.send_data(...) # 仍然上传数据

    这样即使网络暂时中断,设备本身也能做出反应。

  • 数据平滑与过滤:传感器读数可能会有微小跳动。可以实施一个简单的移动平均滤波:

    temp_readings = [] MAX_READINGS = 5 while True: raw_temp = adt.temperature temp_readings.append(raw_temp) if len(temp_readings) > MAX_READINGS: temp_readings.pop(0) # 移除最旧的读数 smoothed_temp = sum(temp_readings) / len(temp_readings) # 使用 smoothed_temp 进行显示和上传

    这能有效消除毛刺,使曲线更平滑。

  • 单位转换与数据格式化:ADT7410库默认返回摄氏度。如果你需要在IO上显示华氏度,可以在上传前转换:

    temp_c = adt.temperature temp_f = temp_c * 9.0/5.0 + 32.0 io.send_data(temperature_feed['key'], temp_f)

    然后在Adafruit IO的Dashboard中,将Gauge的标签改为“°F”。你甚至可以创建两个Feed,分别发送摄氏度和华氏度值。

4.3 扩展硬件与功能

PyPortal的扩展接口让你可以轻松添加更多传感器,构建更复杂的监测站。

  • 添加湿度传感器:通过I2C或STEMMA QT接口连接一个SHT31-D或AHT20温湿度传感器。在代码中初始化第二个传感器,读取湿度数据,然后创建第二个Feed(例如humidity),并同时发送温度和湿度数据。
  • 添加空气质量传感器:连接PMS5003或SGP30来监测PM2.5、CO2或TVOC。
  • 使用多个Feed与Dashboard组合:在同一个Dashboard上,你可以并排显示温度仪表盘、湿度仪表盘、空气质量折线图,形成一个综合环境监测中心。Adafruit IO的Dashboard编辑器支持灵活的拖拽布局。
  • 离线数据记录:虽然Adafruit IO是云端记录,但有时也需要本地备份。你可以插入MicroSD卡,在每次发送数据到云端的同时,将带时间戳的数据以CSV格式写入SD卡。这样即使网络故障,数据也不会丢失。

5. 故障排除与常见问题

在实际部署中,你可能会遇到一些问题。这里是我总结的一些常见情况及解决方法。

5.1 连接类问题

问题现象可能原因排查步骤与解决方案
无法连接到Wi-Fi1.settings.toml中SSID或密码错误。
2. Wi-Fi网络需要网页认证(如酒店、机场网络)。
3. 路由器设置了MAC地址过滤。
4. ESP32固件问题。
1. 仔细检查settings.toml文件,确保没有多余空格,使用正确的引号。
2. PyPortal目前不支持Captive Portal认证。需要连接开放或WPA/WPA2个人网络。
3. 在路由器设置中将PyPortal的ESP32 MAC地址加入白名单。
4. 尝试重新烧录PyPortal的CircuitPython固件,或更新ESP32协处理器的固件(通过esptool)。
能连Wi-Fi但无法连接Adafruit IO1.ADAFRUIT_AIO_KEY错误或已失效。
2. 账户名(用户名)错误。
3. 网络防火墙或代理阻止访问io.adafruit.com
1. 登录Adafruit IO网站,重新生成一个新的AIO Key并更新到settings.toml
2. 确认用户名是Adafruit IO的登录名,而非邮箱。
3. 尝试在电脑浏览器访问io.adafruit.com,确认网络可达。检查路由器是否设置了访问限制。
连接不稳定,经常断线重连1. Wi-Fi信号弱。
2. 路由器或网络环境不稳定。
3.WiFiManager配置问题。
1. 将PyPortal移近路由器,或考虑使用Wi-Fi中继器。
2. 在代码中增加time.sleep()延迟,减少请求频率,减轻网络压力。
3. 检查WiFiManager初始化参数,确保status_pixel设置正确,便于观察连接状态(蓝色闪烁=连接中,绿色=成功,红色=失败)。

5.2 数据与传感器类问题

问题现象可能原因排查步骤与解决方案
温度读数不准或为None1. I2C通信失败,未找到ADT7410设备。
2. 传感器初始化失败。
3. 物理连接问题(但PyPortal是板载的,此问题较少)。
1. 在代码中添加I2C扫描:print(i2c_bus.scan()),查看是否能看到地址0x48
2. 确保adafruit_adt7410库已正确安装在/lib目录。检查adt.high_resolution = True这行是否执行成功。
3. 尝试读取原始寄存器值进行诊断(需查阅ADT7410数据手册)。
数据成功发送但Adafruit IO不显示1. 发送到了错误的Feed。
2. Feed名称拼写错误或大小写不一致。
3. 数据格式问题。
1. 在代码中打印temperature_feed['key'],确认与IO网站上创建的Feed密钥一致。
2. Adafruit IO的Feed名称是大小写敏感的,确保完全一致。
3. 确保发送的数据是整数或浮点数,而不是字符串。可以用float(temperature)确保类型。
屏幕不显示或显示乱码1. 字体文件未正确放置。
2. 图形库依赖缺失。
3. 内存不足。
1. 确认/fonts目录下的.bdf字体文件已存在,且代码中加载字体的路径正确。
2. 检查/lib目录下是否有adafruit_display_text,adafruit_bitmap_font等显示相关库。
3. CircuitPython内存有限。如果UI太复杂,尝试简化图形元素,或使用gc.collect()手动进行垃圾回收。

5.3 代码与运行类问题

  • ImportErrorModuleNotFoundError:这是最常见的问题,几乎总是因为缺少对应的库文件。请确保/lib文件夹内包含了所有import语句中提到的库。使用项目捆绑包是最可靠的方法。
  • 代码修改后不生效:CircuitPython会在保存code.py后自动软重启。但有时因为文件系统缓存,更改可能未立即生效。尝试安全弹出CIRCUITPY驱动器再重新连接,或者按一下PyPortal的复位键。
  • 设备运行一段时间后死机:可能是内存泄漏或网络异常导致。确保在主循环中妥善处理了所有异常,并使用wifi.reset()进行恢复。此外,检查是否有递归调用或创建了大量永不释放的对象。

调试利器:串口输出:在代码中使用print()语句输出关键变量(如光感值、温度值、网络状态)是调试的最佳方式。使用Mu Editor、VS Code的串口监视器或screen/putty等工具连接到PyPortal的串口(通常波特率为115200),你就能看到实时的打印信息,这对定位问题至关重要。

6. 项目演进与更多可能性

这个智能温度计项目是一个完美的起点。当你成功运行它之后,可以考虑沿着以下几个方向进行扩展,让它变得更加强大和个性化。

方向一:多节点与数据聚合单个传感器只能监测一个点。你可以复制这个项目,制作多个PyPortal节点,部署在不同的房间或位置。每个节点都向Adafruit IO发送数据,但使用不同的Feed名称,例如living_room_temperaturebedroom_temperature。然后,你可以在一个Dashboard上创建多个图表,同时监控整个空间的温度分布。更进一步,你可以在Adafruit IO上使用“聚合Feed”(Group),将多个Feed的数据合并计算,例如显示整个房子的平均温度。

方向二:交互与控制PyPortal有触摸屏!你可以改造UI,增加按钮。例如,在屏幕上画一个“+”和“-”按钮,触摸后可以调整一个目标温度值。当实际温度超过目标值时,除了发送邮件,还可以通过Adafruit IO的Webhook Action触发IFTTT或Make(原Integromat)服务,去控制智能插座开关电暖气或空调,形成一个闭环的温控系统。

方向三:离线与边缘计算虽然依赖云端很方便,但有时也需要设备具备一定的离线智能。你可以利用PyPortal的MicroSD卡存储能力,实现一个简单的数据记录仪。当网络断开时,将数据和时间戳写入SD卡的CSV文件;当网络恢复后,再读取文件中的历史数据,批量上传到Adafruit IO。这需要更复杂的代码逻辑来处理状态切换和数据去重。

方向四:美化与外壳设计项目的实用性之外,外观也很重要。你可以使用Fusion 360或Tinkercad等工具为PyPortal设计一个精美的壁挂式外壳,并将其3D打印出来。在外壳上为光传感器和温度传感器开孔,确保其与环境空气良好接触,避免被设备自身发热影响。一个漂亮的外壳能让你的作品从“开发板原型”升级为“可用的产品”。

从我个人的经验来看,物联网项目的乐趣在于从“它工作了”到“它完美地工作了”之间的打磨过程。每一次调试、每一次功能增加,都让你对硬件、网络和软件之间的交互理解更深。PyPortal、CircuitPython和Adafruit IO这个铁三角,极大地压缩了从想法到实现的距离。希望这个详细的指南和其中分享的经验,能帮你顺利搭建起自己的智能监测系统,并激发你更多的创作灵感。如果在实际操作中遇到任何新的问题,不妨回到串口输出和Adafruit IO的数据流页面,那里通常藏着答案。

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

从零到一:在定制化Linux环境中为DPDK 16.04适配Mellanox MLX5网卡

1. 环境准备与依赖分析 在开始适配之前&#xff0c;我们需要先搞清楚几个关键问题。首先&#xff0c;DPDK 16.04是个相对较老的版本&#xff0c;而Mellanox MLX5网卡又是高性能网卡&#xff0c;这两者的结合会遇到不少挑战。我去年在一个工业控制项目中就遇到过类似情况&#x…

作者头像 李华
网站建设 2026/5/18 10:55:05

TVA在证券K线形态分析中的创新应用(5)

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…

作者头像 李华
网站建设 2026/5/18 10:53:02

AdaBins深度估计新范式:自适应分仓与Transformer的协同进化

1. 深度估计的挑战与AdaBins的突破 深度估计是计算机视觉中的经典问题&#xff0c;简单来说就是从一张2D图片推测出每个像素点到相机的距离。想象一下&#xff0c;当你看到一张街景照片时&#xff0c;大脑能自动判断出远处的建筑比近处的行人要远——这就是人类天然的深度估计能…

作者头像 李华
网站建设 2026/5/18 10:53:02

ImageJ灰度图像处理:从基础操作到实战分析

1. ImageJ灰度图像处理基础入门 第一次接触ImageJ时&#xff0c;我被它强大的图像处理能力震撼到了。作为一个开源的图像处理软件&#xff0c;它在科研和工业领域都有着广泛的应用。灰度图像处理是ImageJ最基础也是最重要的功能之一&#xff0c;今天我就来分享下这些年积累的实…

作者头像 李华
网站建设 2026/5/21 6:12:48

如何在arm7架构设备上使用Python调用Taotoken大模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何在arm7架构设备上使用Python调用Taotoken大模型API 对于在树莓派等arm7架构设备上进行开发的工程师而言&#xff0c;直接调用各…

作者头像 李华