1、气象站系统概述
各位同学好,我是你们这堂课的主讲人。做了十几年嵌入式气象站开发,踩过的坑比走过的路还多。今天咱们聊聊气象站系统的整体面貌——不扯虚的,全是实战经验。
1.1 嵌入式系统定义
嵌入式系统,说白了就是「专机专用」的计算机。跟咱们桌上那台能打游戏、能写文档的PC不一样,它只干一件事——比如采集温度、处理数据、控制风扇。
我习惯这么定义:嵌入式系统是软硬件紧密结合、面向特定应用、资源受限的计算系统。注意三个关键词:紧密结合、特定应用、资源受限。
为什么会资源受限?你想想看,气象站要放在野外,电池供电,内存就几百KB,CPU主频几十兆赫。跟手机比?那是天壤之别。但人家能连续跑一年不重启,这就是嵌入式系统的魅力。
核心特征:
- 实时性要求高——数据采集必须准时
- 资源受限——RAM/ROM/功耗都得精打细算
- 可靠性优先——野外环境,坏了没人修
- 软硬件协同——选型阶段就要考虑代码怎么写
我在项目中遇到过一件事:某次给农业大棚做气象站,选了颗性能很强的芯片,结果功耗太大,太阳能板带不动。最后换回一颗8位MCU,反而稳定运行了两年。嗯,选型这事,后面细说。
1.2 气象站功能需求
一个正经的气象站,到底要干哪些活?我把它分成三个层次:
1.2.1 数据采集层
这是基本功。你得能感知环境参数:
- 温度:-40℃~85℃,精度±0.5℃(我一般用DS18B20或SHT30)
- 湿度:0~100%RH,精度±3%
- 气压:300~1100hPa,精度±1hPa(BMP280是经典选择)
- 风速风向:超声波式或机械式,注意防冻
- 降雨量:翻斗式雨量计,每0.5mm触发一次中断
这里有个坑:传感器不是越多越好。我曾经在一个项目里堆了8个传感器,结果数据总线冲突,采集周期乱套。后来砍到4个,反而更稳定。
1.2.2 数据处理层
原始数据不能直接用。你得做:
- 滤波:滑动平均、中值滤波,去掉毛刺
- 校准:每个传感器都有偏差,得做线性修正
- 单位转换:ADC值→电压→物理量,公式要写对
- 数据融合:比如用温度和湿度计算露点温度
我的习惯:在代码里单独建一个 sensor_calib.c 文件,专门放校准参数。这样换传感器时,只改这一个文件就行。
1.2.3 数据通信层
数据采完了,得传出去。常见方案:
| 通信方式 | 距离 | 功耗 | 适用场景 |
|---|---|---|---|
| LoRa | 2~15km | 低 | 野外、农村 |
| NB-IoT | 覆盖范围广 | 中 | 城市、有基站 |
| 4G/5G | 不限 | 高 | 实时视频监控 |
| RS485 | 1.2km | 极低 | 本地组网 |
我个人建议:能选有线就别选无线。无线虽然方便,但干扰、丢包、功耗都是头疼事。我有个项目在山区,LoRa信号被山体挡住,最后不得不架中继站——那叫一个折腾。
1.3 系统架构概览
一个典型的气象站嵌入式系统,长这样:
┌─────────────────────────────────────────┐
│ 应用层 │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │数据采集 │ │数据处理 │ │通信管理 │ │
│ │ 任务 │ │ 任务 │ │ 任务 │ │
│ └─────────┘ └─────────┘ └──────────┘ │
├─────────────────────────────────────────┤
│ 中间层 │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │传感器 │ │文件系统 │ │通信协议 │ │
│ │驱动库 │ │(FATFS) │ │(MQTT) │ │
│ └─────────┘ └─────────┘ └──────────┘ │
├─────────────────────────────────────────┤
│ 硬件抽象层(HAL) │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │GPIO驱动 │ │I2C驱动 │ │UART驱动 │ │
│ └─────────┘ └─────────┘ └──────────┘ │
├─────────────────────────────────────────┤
│ 硬件平台 │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │STM32 │ │传感器 │ │通信模块 │ │
│ │ MCU │ │阵列 │ │(LoRa) │ │
│ └─────────┘ └─────────┘ └──────────┘ │
└─────────────────────────────────────────┘
这个架构我用了好多年,核心思想就一句话:分层解耦。每一层只关心自己的事,上层不关心底层怎么实现。
举个例子:你换了一个风速传感器,从机械式换成超声波式。如果代码写得好,只需要改传感器驱动库那一层,上层的采集任务完全不用动。嗯,这就是架构设计的意义。
注意:千万别把业务逻辑和硬件驱动混在一起写。我见过一个项目,采集风速的代码里直接操作GPIO寄存器,后来换芯片,整个模块重写——那叫一个酸爽。
1.4 硬件选型原则
选硬件,说白了就是做权衡。我总结了五条原则:
1.4.1 够用就好
别追求高性能。气象站不需要跑神经网络,一颗Cortex-M0+足够了。我见过有人用树莓派做气象站,结果功耗10W,太阳能板得脸盆那么大——何必呢?
1.4.2 功耗优先
野外气象站,电池是命根子。选型时关注三个参数:
- 休眠电流:最好低于10μA
- 工作电流:采集一次数据,时间越短越好
- 供电电压:3.3V是主流,别选5V的(效率低)
1.4.3 温度范围
工业级(-40℃~85℃)是底线。商业级(0℃~70℃)在北方冬天直接罢工。我吃过这个亏——在黑龙江的项目,冬天零下30℃,商业级芯片直接不干活。
1.4.4 供货稳定
别选冷门芯片。万一停产了,整个项目得重新设计。我习惯选ST、NXP、TI这些大厂的经典型号,虽然贵点,但放心。
1.4.5 开发工具链
选芯片时,先看看有没有好用的IDE、调试器、库函数。Keil、IAR、STM32CubeIDE都行。别选那种只能用汇编开发的——那是自找麻烦。
我的推荐配置(入门级):
- MCU:STM32F103C8T6(蓝 pill 板,便宜又好用)
- 温度湿度:SHT30(I2C接口,精度高)
- 气压:BMP280(SPI/I2C都行)
- 通信:LoRa模块(SX1278,淘宝20块一个)
- 供电:TP4056充电模块 + 18650电池 + 5W太阳能板
这套配置,成本不到100块,跑个基础气象站绰绰有余。
好了,第一章就聊这么多。记住一句话:嵌入式系统设计,七分在选型,三分在编码。选对了硬件,后面写代码会轻松很多。下一章咱们聊聊传感器驱动怎么写——那才是真正考验功底的地方。