基于Raspberry Pi Pico W与AHT20的I2C气象站:从硬件连接到MicroPython编程
1. 项目概述与核心价值
想自己动手做一个能实时显示温湿度、成本低廉且完全由自己掌控的无线气象站吗?如果你对物联网、智能家居或者嵌入式开发感兴趣,那么这个基于Raspberry Pi Pico W的项目就是为你量身打造的绝佳入门实践。它不仅仅是一个简单的数据采集器,更是一个融合了硬件连接、传感器通信、微控制器编程和数据显示的完整微型系统。我之所以选择Pico W和AHT20这套组合,是因为它们在性价比、易用性和社区支持上达到了一个完美的平衡点,非常适合初学者上手,同时也为有经验的开发者提供了足够的扩展空间。
这个项目的核心,是利用I2C这种简洁高效的通信协议,让一块小小的微控制器板(Raspberry Pi Pico W)同时“指挥”一个高精度的环境传感器(AHT20)和一块字符液晶屏(16x2 LCD),实现从数据采集、处理到本地显示的全流程。整个过程你会接触到物理电路搭建、Python固件烧录、第三方库的集成与应用,最终收获一个可以独立运行、通过USB供电或移动电源驱动的桌面气象站。无论是放在书房监测室内环境,还是作为智能花盆的湿度监控模块,其应用场景非常灵活。接下来,我将带你从零开始,一步步拆解硬件连接、软件配置和代码编写的每一个细节,并分享我在实际制作中踩过的坑和总结出的实用技巧。
2. 硬件选型与核心组件解析
在动手焊接或插线之前,充分理解你手中的每一个元件是成功的关键。盲目连接不仅可能导致设备损坏,更会让你在调试阶段陷入困境。下面我们来详细剖析这个气象站用到的核心硬件,以及为什么它们是这个项目的最佳选择。
2.1 大脑:Raspberry Pi Pico W
Raspberry Pi Pico W是我们整个项目的控制核心。相较于标准的Pico,Pico W最大的优势在于集成了2.4GHz无线模块(CYW43439),支持Wi-Fi和蓝牙。虽然在本基础教程中我们暂未用到无线功能(显示在本地LCD上),但“W”版本为我们留下了巨大的升级空间,比如未来将数据上传到云端服务器或通过手机APP查看。即便只使用其基础功能,Pico W也完全够用。
它搭载了RP2040双核ARM Cortex-M0+处理器,运行频率最高133MHz,性能对于读取传感器和刷新屏幕绰绰有余。更重要的是,它支持MicroPython和CircuitPython,这意味着我们可以用熟悉的Python语言进行编程,极大降低了嵌入式开发的门槛。板载的264KB SRAM和2MB的Flash存储,也足够存放我们的程序代码和必要的库文件。
注意:在购买时请认准“Pico W”型号。如果手头只有不带无线功能的普通Pico,本项目也完全兼容,所有接线和代码均一致,只是少了未来的无线扩展可能性。
2.2 感官:AHT20温湿度传感器
环境监测的核心是传感器。我选择了AHT20,而不是更常见的DHT11或DHT22,主要基于以下几点考量:
- 精度与稳定性:AHT20采用全新的MEMS电容式湿度传感和能隙温度传感元件,其温度测量典型精度为±0.3°C,湿度精度为±2%RH,且具有优异的长期稳定性。相比之下,DHT系列受环境影响较大,尤其在极端湿度下容易漂移。
- 数字接口与校准:AHT20出厂时已经过校准,并将校准系数存储在芯片内部。它通过标准的I2C接口通信,直接输出经过温度补偿的校准后数字信号,省去了我们在代码中进行复杂补偿计算的麻烦。
- 低功耗:在高速模式下测量一次仅需约80ms,平均功耗极低,非常适合由电池或移动电源供电的长期监测设备。
AHT20的引脚非常简单:VCC(供电)、GND(地)、SDA(数据线)、SCL(时钟线)。有些模块还会引出一个额外的引脚,但本项目用不到。它的I2C地址默认为0x38,这是一个需要记住的关键信息,虽然后续的库文件会帮我们处理。
2.3 窗口:16x2 I2C LCD屏幕
显示部分我们选择了带有I2C接口的16列2行字符液晶屏。传统的1602 LCD需要连接多达7个数据和控制引脚,接线复杂且占用大量GPIO资源。而I2C版本的核心在于一块“转接板”,它通常使用PCF8574或类似的I/O扩展芯片,将并行通信转换为I2C串行通信,最终只需要连接4根线(VCC, GND, SDA, SCL)就能实现全部控制功能。
选择这种屏幕的好处显而易见:
- 节省引脚:仅占用一组I2C总线,为Pico W的其他功能(如未来的无线模块、其他传感器)预留了充足的GPIO口。
- 简化接线:4线制连接大大降低了硬件连接的复杂度和出错概率。
- 即插即用:市面上常见的I2C LCD模块兼容性很好,且有成熟的MicroPython库支持。
你需要留意屏幕背面I2C转接板上可能有一个可调电阻,用于调节屏幕对比度。如果上电后屏幕有背光但无字符显示,第一个要检查的就是这个电位器,稍微旋转它直到字符清晰出现。
2.4 连接与供电系统
- 面包板:对于原型验证阶段,一块半尺寸或全尺寸的面包板是无价之宝。它允许你无需焊接即可快速、安全地搭建和修改电路。请确保你的面包板质量可靠,避免因接触不良导致诡异的问题。
- 杜邦线:建议使用公对公的杜邦线进行连接。为了便于调试,最好选择不同颜色的线缆,例如红色接VCC/VBUS,黑色或棕色接GND,黄色和绿色分别接SDA和SCL。颜色管理能在排查问题时帮你快速理清线路。
- 供电方案:在开发阶段,通过Micro USB线连接电脑供电是最方便的方式,电脑同时还能作为串口终端用于调试。项目完成后,你可以使用任何输出为5V/1A或以上的USB电源适配器,或者一个普通的移动电源为其供电,实现完全脱机运行。
3. 硬件电路搭建与连接实战
理论清晰后,我们进入动手环节。硬件连接是项目的物理基础,务必耐心、仔细。遵循“断电操作”的铁律,在连接或调整任何线路前,确保Pico W没有接通电源。
3.1 连接前的准备与布局规划
首先,将你的面包板横放在面前。我建议采用以下布局,以便线路清晰、易于排查:
- 将Raspberry Pi Pico W纵向插入面包板,即USB接口朝外,板子跨坐在面包板的中沟上。确保引脚均匀分布在两侧,不要将整个板子压在某一排电源轨上。
- 在Pico W的一侧(例如右侧),预留出空间给AHT20传感器和LCD屏幕。一个好的习惯是将电源正极(VBUS/3V3)和地线(GND)的排孔用跳线连接到面包板两侧的电源轨上,这样所有元件可以方便地从电源轨取电,避免飞线杂乱。
3.2 分步接线详解
下面我们按照信号流和数据流的方向,系统地连接各个部件。
3.2.1 为系统建立公共电源与地
所有电子元件要协同工作,必须共享相同的“零电位”参考点,这就是地(GND);同时需要稳定的工作电压,这就是电源。我们先建立这两个公共总线。
- 连接地线(GND):用一根黑色杜邦线,将Pico W上任意一个GND引脚(例如物理引脚3、8、13、18、23、28、33、38等)连接到面包板一侧的蓝色“-”电源轨上。这条蓝色轨道现在就是整个系统的公共地。
- 连接电源线:AHT20传感器和LCD屏幕的I2C转接板通常工作电压是3.3V。虽然Pico W的VBUS(物理引脚40)提供5V电压,但直接给3.3V器件供5V可能烧毁它们。因此,我们使用Pico W的3V3(OUT)引脚(物理引脚36)作为供电源。用一根红色杜邦线,从Pico W的3V3(OUT)引脚连接到面包板另一侧的红色“+”电源轨上。
3.2.2 连接AHT20环境传感器
AHT20传感器通常是一个小巧的4针模块。将其插入面包板,确保与Pico W间隔几排空位,引脚不要短路。
- VCC -> 3.3V:将传感器的VCC引脚用跳线连接到红色“+”电源轨(即3.3V)。
- GND -> GND:将传感器的GND引脚用跳线连接到蓝色“-”电源轨。
- SDA -> GP20:将传感器的SDA(数据线)引脚连接到Pico W的GP20(物理引脚26)。这是Pico W上I2C0接口的SDA引脚。
- SCL -> GP21:将传感器的SCL(时钟线)引脚连接到Pico W的GP21(物理引脚27)。这是Pico W上I2C0接口的SCL引脚。
重要提示:RP2040芯片有多个I2C控制器,每个控制器可以映射到不同的GPIO引脚。我们这里使用I2C0控制器,并按照其默认的“备用功能”映射,选择GP20和GP21。这套组合是经过验证稳定可靠的。
3.2.3 连接I2C LCD屏幕
找到LCD屏幕背面的I2C转接板,上面通常会有4个或5个引脚(VCC, GND, SDA, SCL)。
- VCC -> 3.3V:将转接板的VCC引脚连接到红色“+”电源轨(3.3V)。
- GND -> GND:将转接板的GND引脚连接到蓝色“-”电源轨。
- SDA -> GP0:这里是个关键点!LCD屏幕也需要连接I2C总线。Pico W支持多个I2C设备挂在同一条总线上(通过共享SDA和SCL),但为了教学清晰和避免地址冲突,我们为LCD单独使用一组I2C引脚。将转接板的SDA引脚连接到Pico W的GP0(物理引脚1)。
- SCL -> GP1:将转接板的SCL引脚连接到Pico W的GP1(物理引脚2)。这样,我们就用GP0和GP1组成了第二个I2C总线(在软件中可以初始化为I2C1或SoftI2C)来专用于LCD。
为什么分开连接?理论上,AHT20和LCD可以共享GP20/GP21这组I2C引脚,只要它们的I2C地址不同。但实际操作中,一些LCD的I2C转接板地址可能不标准或冲突,分开连接可以彻底避免地址冲突问题,也让代码逻辑更清晰:一组I2C读传感器,另一组I2C写屏幕。这是从实践中学到的简化问题的好方法。
3.3 连接完成检查清单
在通电前,请务必对照此清单进行双重检查:
- [ ] Pico W未连接USB线。
- [ ] AHT20 VCC -> 红色电源轨 (3.3V)。
- [ ] AHT20 GND -> 蓝色电源轨。
- [ ] AHT20 SDA -> Pico W GP20 (Pin 26)。
- [ ] AHT20 SCL -> Pico W GP21 (Pin 27)。
- [ ] LCD VCC -> 红色电源轨 (3.3V)。
- [ ] LCD GND -> 蓝色电源轨。
- [ ] LCD SDA -> Pico W GP0 (Pin 1)。
- [ ] LCD SCL -> Pico W GP1 (Pin 2)。
- [ ] 红色电源轨连接至 Pico W 3V3(OUT) (Pin 36)。
- [ ] 蓝色电源轨连接至 Pico W 任意GND (如 Pin 38)。
4. 软件开发环境配置与库文件部署
硬件准备就绪后,我们需要为Pico W注入“灵魂”——程序。我们将使用Thonny这款对MicroPython支持极佳的IDE,它集成了代码编辑、固件烧录和串口交互功能,非常适合初学者。
4.1 初始化Raspberry Pi Pico W
- 安装Thonny:访问Thonny官网,下载并安装对应你操作系统(Windows, macOS, Linux)的版本。
- 连接Pico W并进入固件烧录模式:按住Pico W板上的白色“BOOTSEL”按钮不放,然后将Micro USB线连接到电脑。此时松开按钮。电脑会识别到一个名为“RPI-RP2”的可移动磁盘。
- 烧录MicroPython固件:
- 在Thonny中,点击右下角的状态栏,那里可能显示“Python”版本。点击它,选择“Configure interpreter...”。
- 在解释器对话框的第一个下拉菜单中,选择“MicroPython (Raspberry Pi Pico)”。
- 在“Port”下拉菜单中,如果系统自动识别了Pico W的串口,则选择它(如
COM3或/dev/ttyACM0)。如果未识别,可以尝试点击“Install or update MicroPython”按钮。 - 在弹出的固件安装窗口中,确保设备类型是“Raspberry Pi Pico / Pico H”,然后点击“Install”按钮。Thonny会自动下载并烧录最新的MicroPython固件到Pico W。
- 烧录完成后,Pico W会自动重启。此时,Thonny底部Shell窗口应该显示MicroPython的版本信息和
>>>提示符,这表明你的Pico W已经准备好运行Python代码了。
4.2 获取并部署必要的库文件
MicroPython本身不包含驱动特定传感器或LCD屏的代码,我们需要第三方库。根据原始教程,我们需要四个文件。这些文件通常由硬件制造商或社区开发者编写。
库文件清单与作用:
ahtx0.py: 这是驱动AHT10/AHT20/AHT21系列传感器的核心库。它包含了与传感器通过I2C通信、读取原始数据并进行换算的所有函数。lcd_api.py: 这是一个抽象的LCD驱动API,定义了控制LCD的基本操作(如清屏、移动光标、写入字符等),但不涉及具体的硬件接口。pico_i2c_lcd.py: 这是针对Raspberry Pi Pico(以及兼容RP2040的板子)的I2C LCD具体实现。它继承自lcd_api.py,并实现了通过Pico的I2C硬件与PCF8574转接板通信的细节。1602_LCD.py: 这个文件可能是一个更上层的封装或示例文件,有时并非必需。在本项目中,pico_i2c_lcd.py是核心。
如何获取这些文件:
- 推荐方法:使用Thonny的包管理工具(适用于已知的、发布在PyPI上的库)。点击顶部菜单“Tools” -> “Manage packages...”。在搜索框中输入“micropython-ahtx0”,找到后点击“Install”。同样方法搜索安装“micropython-pico_i2c_lcd”。这种方法会自动处理依赖,并将库安装到Pico W的
/lib目录下,是最规范的方式。 - 备用方法(手动):如果包管理器找不到,你需要从GitHub等开源仓库手动下载这些
.py文件。例如,ahtx0库通常来自https://github.com/targetblank/micropython_ahtx0,而I2C LCD库可能来自https://github.com/dhylands/python_lcd。下载后,在Thonny的文件浏览器侧边栏(通常显示“此电脑”和“MicroPython设备”),将下载的.py文件直接拖拽或保存到Pico W的根目录或/lib目录下。
- 推荐方法:使用Thonny的包管理工具(适用于已知的、发布在PyPI上的库)。点击顶部菜单“Tools” -> “Manage packages...”。在搜索框中输入“micropython-ahtx0”,找到后点击“Install”。同样方法搜索安装“micropython-pico_i2c_lcd”。这种方法会自动处理依赖,并将库安装到Pico W的
实操心得:我强烈推荐使用Thonny的包管理器安装
micropython-ahtx0。对于LCD库,包管理器里的micropython-pico_i2c_lcd可能不包含lcd_api.py,你需要从GitHub仓库手动下载lcd_api.py和pico_i2c_lcd.py两个文件,并一起上传到Pico W。一个常见的坑就是只上传了pico_i2c_lcd.py而遗漏了它依赖的lcd_api.py,导致程序运行时报“ModuleNotFoundError”。
- 验证库是否就位:在Thonny的Shell窗口中(
>>>提示符后),尝试导入这些库来检查。
如果没有报错,说明库文件已成功部署。如果报错,请根据错误信息检查文件是否在正确的路径(Pico W的根目录或import ahtx0 import pico_i2c_lcd/lib下),以及文件名是否拼写完全正确(包括大小写)。原教程作者就曾因拼错库文件名而调试了很久。
5. 代码编写、解析与深度调试
一切准备就绪,现在我们来编写让气象站“活”起来的Python代码。我将逐段解析提供的代码,并补充关键细节和优化建议。
5.1 代码全貌与逐行解析
我们将代码保存为一个名为main.py的文件。在MicroPython设备上,main.py是设备上电后自动运行的文件。
import utime from machine import Pin, I2C import lcd_api import pico_i2c_lcd import ahtx0 from machine import Pin, SoftI2C from pico_i2c_lcd import I2cLcd from time import sleep # I2C for the AHT20 Sensor (Using hardware I2C0 on GP20 & GP21) i2c_sensor = I2C(0, scl=Pin(21), sda=Pin(20), freq=400000) # Create the sensor object using I2C sensor = ahtx0.AHT10(i2c_sensor) # I2C for the LCD (Using GP0 & GP1, can be hardware I2C1 or SoftI2C) I2C_ADDR = 0x27 # Default address of many I2C LCD modules I2C_NUM_ROWS = 2 I2C_NUM_COLS = 16 i2c_lcd = SoftI2C(sda=Pin(0), scl=Pin(1), freq=400000) lcd = I2cLcd(i2c_lcd, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS) # Display a startup message lcd.putstr("Weather Station") sleep(2) lcd.clear() lcd.putstr("Initializing...") sleep(1) lcd.clear() try: while True: # Read sensor data temperature_c = sensor.temperature humidity_rh = sensor.relative_humidity # Format strings for display temp_str = "T:{:5.2f}C".format(temperature_c) # 5 chars width, 2 decimals hum_str = "H:{:5.2f}%".format(humidity_rh) # Clear and display on LCD lcd.clear() lcd.move_to(0, 0) # Column 0, Row 0 (first line) lcd.putstr(temp_str) lcd.move_to(0, 1) # Column 0, Row 1 (second line) lcd.putstr(hum_str) # Optional: Print to Thonny Shell for debugging print("Temperature: {:.2f} C, Humidity: {:.2f} %".format(temperature_c, humidity_rh)) # Wait before next reading sleep(5) # Update every 5 seconds except KeyboardInterrupt: # Graceful shutdown on Ctrl+C in Thonny print("\nProgram stopped by user.") lcd.clear() lcd.putstr("Goodbye!") sleep(1) lcd.backlight_off() lcd.display_off()代码解析与优化说明:
- 导入模块:代码开头导入了必要的模块。
utime和time(这里用sleep)用于时间控制。machine模块是MicroPython操作硬件的核心,Pin控制引脚,I2C和SoftI2C控制I2C通信。注意,我们为传感器和LCD分别创建了I2C对象,避免了潜在的冲突。 - 传感器初始化:
i2c_sensor = I2C(0, scl=Pin(21), sda=Pin(20), freq=400000):这行代码初始化了Pico W的硬件I2C0控制器,并指定SCL引脚为GP21,SDA引脚为GP20,通信频率为400kHz(标准快速模式)。硬件I2C效率高、稳定。sensor = ahtx0.AHT10(i2c_sensor):创建AHT20传感器对象。注意库中类名是AHT10,但它兼容AHT20/AHT21。将初始化好的I2C对象i2c_sensor传递给传感器。
- LCD初始化:
I2C_ADDR = 0x27:这是大多数PCF8574转接板的默认I2C地址。如果你的屏幕不亮,可能需要尝试另一个常见地址0x3F。可以使用一个简单的I2C扫描程序来查找地址(后文会介绍)。i2c_lcd = SoftI2C(sda=Pin(0), scl=Pin(1), freq=400000):这里使用了SoftI2C,即软件模拟I2C。为什么不用硬件I2C1?因为GP0和GP1默认可能不是硬件I2C1的引脚,使用SoftI2C可以灵活指定任意引脚,兼容性更好。lcd = I2cLcd(i2c_lcd, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS):创建LCD对象,传入I2C对象、设备地址、行数和列数。
- 主循环:
sensor.temperature和sensor.relative_humidity直接返回已经过校准的摄氏温度值和相对湿度百分比,单位分别是°C和%RH。- 使用
format方法进行字符串格式化,{:5.2f}表示总宽度5个字符,其中小数点后保留2位。这能确保显示对齐美观。 lcd.move_to(col, row)用于精确定位光标位置,然后lcd.putstr()在该位置写入字符串。print语句将数据输出到Thonny的Shell窗口,这是极其重要的调试手段。sleep(5)将每次更新的间隔设置为5秒。AHT20传感器连续读取的最小间隔建议大于1秒,5秒是一个兼顾实时性和功耗的合理值。你可以根据需求调整。
- 异常处理:
try...except KeyboardInterrupt结构用于捕获在Thonny中按Ctrl+C的中断信号。当你想停止程序时,这可以让你优雅地关闭LCD背光和显示,而不是直接断电,是一个好习惯。
5.2 关键调试技巧与工具
即使代码看起来正确,硬件项目也常常会遇到问题。以下是几个必备的调试工具和方法:
I2C地址扫描:如果你不确定LCD的I2C地址,或者怀疑传感器连接有问题,运行一个地址扫描程序。
from machine import Pin, SoftI2C i2c = SoftI2C(scl=Pin(1), sda=Pin(0)) # 或者用你连接的引脚 devices = i2c.scan() if len(devices) == 0: print("No I2C devices found!") else: for d in devices: print("Found device at address: 0x{:02X}".format(d))在Shell中运行这段代码,它会列出总线上所有设备的地址。记下找到的地址,并替换代码中的
I2C_ADDR。分步测试:不要一次性写完所有代码。先写一段只初始化传感器并打印数据的代码,在Shell里看能否正确读取。再写一段只初始化LCD并显示固定文字的代码,看屏幕是否工作。最后再将两者结合。这种“分而治之”的策略能快速定位问题模块。
利用Thonny Shell:Shell是你的最佳朋友。所有
print()输出、运行时错误信息都会在这里显示。仔细阅读错误提示,它们通常直接指明了问题所在,例如“I2C address not acknowledged”表示I2C通信失败(检查接线和地址),“ModuleNotFoundError”表示库文件缺失。
6. 系统集成、优化与项目扩展
当基础功能运行稳定后,我们可以考虑优化用户体验,并为项目添加更多可能性。
6.1 从开发模式到独立运行
在Thonny中点击运行按钮,代码是在“实时解释”模式下执行的。一旦你关闭Thonny或拔掉USB,程序就停止了。要让气象站脱机运行:
- 在Thonny中,确保你的代码文件是打开的。
- 点击菜单“File” -> “Save as...”。
- 在弹出的对话框中,选择保存到“Raspberry Pi Pico”。
- 将文件名设置为
main.py,然后保存。 - 现在,当你给Pico W重新上电(通过电脑USB或移动电源),它会自动执行
main.py文件中的代码,气象站就开始独立工作了。
6.2 显示优化与功能增强
基础的温湿度显示有些单调,我们可以做一些优化:
添加单位符号和图标:16x2 LCD支持自定义字符。你可以创建摄氏度符号“°C”的小图标,或者温湿度的小图案,让显示更专业。
# 示例:创建一个摄氏度符号(简化版,需要查LCD字库手册精确设计) degree_symbol = bytearray([0x0E, 0x0A, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00]) lcd.custom_char(0, degree_symbol) # 注册为0号自定义字符 # 显示时使用 lcd.putstr(“T:{:.1f}”.format(temp) + “\x00C”) # \x00 代表0号自定义字符轮播显示与状态指示:可以让屏幕轮流显示温度、湿度,甚至加上简单的状态(如“OK”、“Hi”、“Lo”)或采集时间。
display_mode = 0 while True: lcd.clear() if display_mode == 0: lcd.putstr(“Temp: {:.1f}C”.format(temp)) else: lcd.putstr(“Hum : {:.1f}%”.format(hum)) display_mode = 1 - display_mode # 切换模式 sleep(3)数据记录与简单统计:利用Pico W的有限存储,可以记录一段时间内的最大值、最小值。
temp_history = [] max_temp = -100 min_temp = 100 while True: t = sensor.temperature temp_history.append(t) if len(temp_history) > 1440: # 假设5秒一次,保存2小时数据 temp_history.pop(0) max_temp = max(max_temp, t) min_temp = min(min_temp, t) # 每隔一段时间显示一次统计信息 lcd.clear() lcd.putstr(“Now:{:.1f}C”.format(t)) lcd.move_to(0,1) lcd.putstr(“Max:{:.1f} Min:{:.1f}”.format(max_temp, min_temp)) sleep(5)
6.3 利用Pico W的无线功能进行扩展
这是Pico W相比Pico的杀手锏功能。你可以轻松地将数据上传到互联网。
连接到Wi-Fi:MicroPython提供了
network模块。import network wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(“你的Wi-Fi名称”, “你的Wi-Fi密码”) while not wlan.isconnected(): sleep(1) print(“Connected to WiFi:”, wlan.ifconfig())上传数据到物联网平台:连接网络后,你可以使用
urequests库将数据以HTTP POST请求的形式发送到诸如ThingSpeak、Blynk、或者自建的服务器。import urequests import json api_url = “https://api.thingspeak.com/update” api_key = “YOUR_API_KEY” while True: temp, hum = read_sensor() payload = {‘api_key’: api_key, ‘field1’: temp, ‘field2’: hum} response = urequests.post(api_url, json=payload) print(“Upload status:”, response.status_code) response.close() sleep(300) # 每5分钟上传一次创建简单的Web服务器:你甚至可以让Pico W本身成为一个微型Web服务器,在同一个局域网内的手机或电脑浏览器上输入Pico W的IP地址,就能看到一个简单的网页显示当前温湿度。
import socket # ... Wi-Fi连接代码 ... addr = socket.getaddrinfo(‘0.0.0.0’, 80)[0][-1] s = socket.socket() s.bind(addr) s.listen(1) while True: cl, addr = s.accept() request = cl.recv(1024) response = “””HTTP/1.1 200 OK Content-Type: text/html <html><body><h1>Weather Station</h1><p>Temperature: {:.1f} C</p><p>Humidity: {:.1f} %</p></body></html>”””.format(temp, hum) cl.send(response) cl.close()
7. 常见问题排查与维护指南
即使按照教程操作,你也可能会遇到一些问题。下面是我在多次制作和教学中总结的常见问题及其解决方法。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| LCD屏幕有背光但无字符显示 | 1. 对比度设置不当。 2. I2C地址错误。 3. 接线错误或接触不良。 4. 代码中行列数设置错误。 | 1.首要操作:调整LCD背面蓝色电位器,缓慢旋转直到字符隐约出现。 2. 运行I2C扫描程序,确认找到的设备地址,并修改代码中的 I2C_ADDR(尝试0x27或0x3F)。3. 重新检查VCC、GND、SDA、SCL四根线是否连接牢固且位置正确。 4. 确认代码中 I2C_NUM_ROWS和I2C_NUM_COLS与你的屏幕一致(常见为2行16列)。 |
Thonny Shell中报错ModuleNotFoundError: No module named ‘ahtx0’ | 1. 库文件未上传到Pico。 2. 库文件上传位置不对。 3. 文件名拼写错误。 | 1. 检查Thonny文件浏览器,确认ahtx0.py文件存在于Pico的根目录或/lib目录下。2. 尝试通过包管理器安装: Tools -> Manage packages -> 搜索安装 micropython-ahtx0。3. 仔细检查文件名,确保是 ahtx0.py而不是aht20.py或ahtx.py。 |
| 读取传感器数据为0或明显错误(如湿度>100%) | 1. 传感器I2C通信失败。 2. 供电电压不足。 3. 传感器初始化或读取间隔太短。 | 1. 运行I2C扫描,检查地址0x38是否存在。检查AHT20的SDA、SCL接线是否与GP20、GP21对应且牢固。2. 确保使用Pico的**3V3(OUT)**引脚为传感器供电,而非5V的VBUS。 3. 在读取数据前,确保给传感器足够的初始化时间(代码中 sensor = ahtx0.AHT10(i2c)已包含初始化)。连续读取间隔建议大于1秒。 |
程序在lcd.putstr()处卡住或报错 | 1. LCD的I2C通信失败。 2. 使用了错误的I2C引脚或模式。 3. 库文件不兼容或损坏。 | 1. 运行I2C扫描检查LCD地址。确认接线(VCC, GND, SDA to GP0, SCL to GP1)。 2. 尝试将 SoftI2C改为硬件I2C(1, ...),但需注意GP0/GP1是否支持硬件I2C1(查阅Pico引脚图)。3. 尝试从可靠的源(如GitHub官方仓库)重新下载 lcd_api.py和pico_i2c_lcd.py。 |
| 设备运行一段时间后死机或无响应 | 1. 电源不稳定或功率不足。 2. 代码陷入死循环或内存泄漏(较少见)。 3. 传感器或LCD通信异常导致程序挂起。 | 1. 尝试使用输出电流更大的电源(如1A以上的手机充电器)。检查所有接线点是否虚焊或接触不良。 2. 在主循环 while True内增加print(“Looping…”)语句,观察Shell输出是否持续。检查是否有未处理的异常。3. 在I2C读写操作外包裹 try-except,捕获OSError等异常,避免单次通信失败导致整个程序崩溃。 |
| 想恢复Pico W出厂设置或清除错误程序 | 错误的main.py导致无法启动。 | 进入BOOTSEL模式(按住BOOTSEL键插USB),电脑会出现RPI-RP2磁盘。删除里面的main.py等用户文件,然后重新拔插即可从干净状态启动。或者直接重新烧录MicroPython固件,这会清除所有用户文件。 |
长期维护建议:
- 防静电与物理保护:完成后的项目可以放入一个合适大小的塑料盒中,既能保护电路,也显得更美观专业。
- 定期校准(可选):虽然AHT20出厂已校准,但如果你有更高精度的参考仪器,可以运行一个长期的对比测试,在代码中加入一个微小的偏移量进行软件补偿。
- 电池供电优化:如果使用电池,可以在代码中深度优化功耗,例如让Pico W在两次读取间隔进入休眠模式(
machine.deepsleep()),并将屏幕背光调暗或间歇性关闭,这将极大延长续航时间。
这个基于Raspberry Pi Pico W的气象站项目,从一根跳线开始,到最终稳定运行,完整地走了一遍嵌入式开发的原型设计流程。它最宝贵的价值不在于显示那几个数字,而在于你亲手实现了从物理世界(温湿度)到数字世界(数据),再反馈到物理世界(屏幕显示)的完整闭环。过程中遇到的每一个错误提示、每一次排查,都是比书本知识更深刻的经验。当你看到屏幕上跳出第一个正确的温度读数时,那种成就感是无可替代的。希望这个详细的教程和其中穿插的“踩坑”经验,能帮你更顺畅地完成自己的第一个物联网气象站,并以此为起点,探索更广阔的硬件编程世界。
