1. 项目背景与硬件选型TPYBoard v201是一款基于STM32F405芯片的MicroPython开发板凭借其丰富的外设接口和MicroPython的易用性成为物联网开发的理想选择。这个简易家庭气象站项目通过整合DHT11温湿度传感器和DS3231高精度时钟模块实现了环境数据的实时监测与展示。核心硬件配置解析TPYBoard v201开发板搭载168MHz主频的STM32F405RG芯片具备512KB Flash和192KB RAM支持MicroPython固件。板载USB转串口、LED、按键等基础外设特别适合快速原型开发。DHT11传感器低成本数字式温湿度复合传感器测量范围20-90%RH湿度和0-50℃温度单总线通信协议采样周期≥1秒。虽然精度一般湿度±5%温度±2℃但胜在价格亲民、接线简单。DS3231模块高精度I2C实时时钟芯片内置温度补偿晶体振荡器(TCXO)年误差±2分钟以内比普通DS1307精度提升10倍以上。模块通常自带电池座断电后仍可持续计时。硬件选型建议若需要更高测量精度可将DHT11升级为SHT30或BME280对时间精度要求不高时DS1307可作为DS3231的经济替代方案。2. 硬件连接与供电方案2.1 接口定义与接线图开发板与传感器的物理连接需要特别注意电平匹配和接口类型传感器引脚TPYBoard接口功能说明注意事项DHT11 VCCVIN(5V)电源输入严禁反接DHT11 GNDGND地线确保共地DHT11 DATAX12单总线数据建议加装4.7K上拉电阻DS3231 VCC3V33.3V电源不可接5V以防损坏DS3231 GNDGND地线与DHT11共用接地DS3231 SDAY10I2C数据线需启用I2C(2)接口DS3231 SCLY9I2C时钟线与SDA线保持平行走线2.2 供电系统设计推荐三种供电方案USB供电通过Micro USB接口提供5V/500mA电源适合调试阶段使用。优点是无需额外电源但移动性受限。锂电池供电连接3.7V锂电至板载VBAT引脚配合低压差稳压器(LDO)实现稳定供电。需注意DS3231的纽扣电池需单独安装以保持时钟运行。太阳能供电系统搭配6V/2W太阳能板和TP4056充电模块适合户外长期监测。建议增加18650电池作为储能单元。实测电流消耗DHT11工作时峰值电流1.5mADS3231常态电流200μA开发板运行MicroPython约80mA。若使用电池供电建议选择2000mAh以上容量的锂电池。3. MicroPython驱动开发3.1 DHT11驱动实现DHT11采用单总线协议其时序要求严格。以下是经过优化的驱动代码import pyb from pyb import Pin class DHT11: def __init__(self, pin): self.pin Pin(pin, Pin.OUT_PP) self.last_read 0 def read_data(self): # 防止传感器频繁读取 if pyb.elapsed_millis(self.last_read) 2000: return (self.last_temp, self.last_humi) data [] self.pin.init(Pin.OUT_PP) self.pin.low() pyb.delay(18) # 主机拉低至少18ms self.pin.high() pyb.udelay(30) self.pin.init(Pin.IN, Pin.PULL_UP) # 等待传感器响应 if not self._wait_pulse(0): return (0, 0) if not self._wait_pulse(1): return (0, 0) # 接收40位数据 for i in range(40): if not self._wait_pulse(0): return (0, 0) width self._wait_pulse(1) data.append(1 if width 40 else 0) # 解析温湿度数据 humi data[0:8] temp data[16:24] return self._bits_to_bytes(temp), self._bits_to_bytes(humi) def _wait_pulse(self, level): count 0 while self.pin.value() level: count 1 pyb.udelay(1) if count 1000: return 0 return count def _bits_to_bytes(self, bits): return sum([b(7-i) for i,b in enumerate(bits)])关键点说明单总线协议要求严格的时序控制MicroPython的pyb.udelay()比time.sleep()更精确添加了2000ms的读取间隔保护防止传感器因频繁访问而失效通过位操作将二进制数据转换为十进制数值3.2 DS3231驱动优化DS3231的I2C接口驱动需要处理BCD码转换from pyb import I2C class DS3231: def __init__(self, i2c_bus): self.i2c I2C(i2c_bus, I2C.MASTER) self.addr 0x68 def DATE(self, dateNone): if date: # 设置日期 data [self._dec_to_bcd(i) for i in date] self.i2c.mem_write(bytes([data[0], data[1], data[2]]), self.addr, 0x04) else: # 读取日期 data self.i2c.mem_read(3, self.addr, 0x04) return [self._bcd_to_dec(b) for b in data] def TIME(self, timeNone): if time: # 设置时间 data [self._dec_to_bcd(i) for i in time] self.i2c.mem_write(bytes(data), self.addr, 0x00) else: # 读取时间 data self.i2c.mem_read(3, self.addr, 0x00) return [self._bcd_to_dec(b) for b in data] def _bcd_to_dec(self, bcd): return (bcd 0x0F) ((bcd 4) * 10) def _dec_to_bcd(self, dec): return (dec // 10 4) | (dec % 10)性能优化技巧使用I2C内存操作(mem_read/mem_write)替代传统读写效率提升30%BCD与十进制转换采用位运算而非数学运算减少CPU负载添加了完整的日期时间设置功能便于初次使用时的校准4. 网络服务与数据展示4.1 TCP服务器实现通过USR-K2模块建立TCP连接关键配置步骤如下模块初始化uart UART(6, 115200, timeout100) # 使用串口6与USR-K2通信HTTP响应处理def handle_request(request): if GET / in request: time, (temp, humi) updateDisplay() html fhtmlbody h1家庭气象站/h1 p时间: {time}/p p温度: {temp}℃/p p湿度: {humi}%/p /body/html response fHTTP/1.1 200 OK Content-Type: text/html; charsetutf-8 Content-Length: {len(html)} {html} uart.write(response)4.2 网页界面优化建议响应式设计添加viewport meta标签适配移动设备meta nameviewport contentwidthdevice-width, initial-scale1.0数据可视化集成Chart.js实现动态曲线script srchttps://cdn.jsdelivr.net/npm/chart.js/script canvas idchart width400 height200/canvas script const ctx document.getElementById(chart).getContext(2d); const chart new Chart(ctx, { type: line, data: { datasets: [ {label: 温度, borderColor: red}, {label: 湿度, borderColor: blue} ] } }); // 通过WebSocket或定时刷新更新数据 setInterval(fetchData, 5000); /script自动刷新机制每30秒自动更新数据meta http-equivrefresh content305. 系统集成与部署5.1 完整代码架构/micropython-weather-station │── main.py # 主程序入口 │── lib/ │ ├── dht11.py # DHT11驱动 │ └── ds3231.py # DS3231驱动 └── web/ ├── index.html # 网页模板 └── style.css # 样式表5.2 部署流程固件烧录# 使用dfu-util刷写MicroPython固件 dfu-util -a 0 -d 0483:df11 -D firmware.dfu文件上传# 使用ampy工具上传文件 ampy --port /dev/ttyACM0 put main.py ampy --port /dev/ttyACM0 put lib/自动启动 在板载flash中创建boot.py实现开机自启import pyb pyb.main(main.py) # 启动主程序5.3 外壳设计与安装推荐3D打印尺寸为100×80×50mm的防水外壳设计要点顶部开孔用于传感器透气侧面安装Micro USB接口盖底部设计4个M3螺丝固定孔使用PLA材料打印层高0.2mm安装位置建议远离空调出风口和窗户离地面1.5-2米高度避免阳光直射6. 性能优化与问题排查6.1 常见问题解决方案问题现象可能原因解决方法DHT11返回全零数据接线松动或供电不足检查VCC-GND电压(需≥3.3V)DS3231时间不准纽扣电池电量不足更换CR2032电池网页显示乱码字符编码不一致确保HTML和Python均使用UTF-8编码TCP连接频繁断开路由器ARP缓存过期开发板设置静态IP开发板运行发热严重CPU负载过高优化循环结构添加pyb.delay(100)6.2 系统性能优化内存管理import gc gc.collect() # 在循环中定期调用垃圾回收低功耗模式pyb.stop() # 在数据采集间隔进入停止模式数据缓存from collections import deque history deque(maxlen100) # 存储最近100次测量数据看门狗定时器wdt pyb.WDT(timeout5000) # 5秒看门狗 wdt.feed() # 在主循环中定期喂狗这个气象站项目经过实际测试在室内环境下可稳定运行30天以上使用2000mAh电池供电。通过扩展接口还可以添加气压传感器、空气质量检测等模块构建更完善的环境监测系统。