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块,跑个基础气象站绰绰有余。

好了,第一章就聊这么多。记住一句话:嵌入式系统设计,七分在选型,三分在编码。选对了硬件,后面写代码会轻松很多。下一章咱们聊聊传感器驱动怎么写——那才是真正考验功底的地方。