1. 项目导学与系统架构:农业气象站背景、系统总体架构、技术选型

大家好,我是你们这趟实战之旅的向导。做嵌入式这么多年,我见过不少学生和工程师在物联网项目上栽跟头——要么是硬件选型拍脑袋,要么是通信协议一团乱麻。今天咱们要聊的农业气象站,其实是个特别典型的物联网案例。它不复杂,但五脏俱全。你把它吃透了,以后做智能大棚、环境监测、甚至工业数据采集,都能直接复用这套思路。

1.1 为什么选农业气象站?

说白了,农业气象站就是个「数据搬运工」。它把田间的温度、湿度、光照、风速这些物理量,变成数字信号,再传到你的手机或电脑上。我2018年给山东一个葡萄园做过类似项目,当时果农最头疼的就是「看天吃饭」——明明要下雨了,人还在外地,大棚没关。后来我们装了这套系统,他直接在微信上就能看到实时数据,还能远程控制卷帘机。

你想想看,这个场景里藏着三个核心问题:

  • 怎么感知?——传感器怎么选、怎么接、怎么校准
  • 怎么传输?——数据从田间到服务器,走有线还是无线?
  • 怎么展示?——用户看到的是图表还是数字?报警怎么推?

嗯,这三个问题,其实就是咱们整个课程要攻克的三个关卡。

1.2 系统总体架构:三层模型

物联网架构,业内公认的分法是「感知层、网络层、应用层」。我在项目里习惯叫它「端-管-云」。别被这些术语吓到,咱们拆开看:

层级 通俗理解 咱们用啥
感知层 就是「眼睛和手」——传感器采集数据,执行器干活 温湿度传感器、风速风向仪、Modbus RTU采集模块
网络层 就是「神经」——把数据从田间搬到服务器 4G DTU、MQTT协议、Wi-Fi(实验室环境)
应用层 就是「大脑」——存数据、算数据、展示数据 Django + MySQL + ECharts

核心要点:这三层不是孤立的。感知层采集的原始数据,经过网络层「翻译」成标准格式,应用层才能消费。我曾经见过一个团队,传感器采集频率是1秒一次,但MQTT的QoS设成了2(保证必达),结果服务器直接被打崩了。这就是层与层之间没协调好。

1.3 技术选型:为什么是它们?

选技术栈,我有个原则:成熟、稳定、社区活跃。咱们这个项目,我选了四样东西:Python、Django、Modbus、MQTT。下面一个一个说。

1.3.1 Python —— 胶水语言,万物可粘

Python做嵌入式后端,其实挺常见的。它不像C语言那么贴近硬件,但开发效率高啊。我习惯用Python写数据采集的「胶水代码」——串口通信、协议解析、数据入库,一套下来行云流水。而且Python的库生态太丰富了,pymodbus、paho-mqtt、django,都是现成的轮子。

我的习惯:Python版本选3.8以上,别用2.7了,官方都停止维护了。虚拟环境一定要用,我吃过亏——有一次pip install装了个新库,结果把系统自带的Python搞坏了,重装系统才解决。

1.3.2 Django —— 大而全的Web框架

为什么选Django而不是Flask?因为咱们这个项目需要:用户认证、数据模型、后台管理、API接口。Django自带ORM和Admin后台,省去很多重复造轮子的时间。我记得第一次用Django的Model写气象数据表,从建表到迁移,一行SQL没写,全自动搞定。

不过要注意,Django默认是同步框架。如果咱们要处理大量并发连接(比如几百个设备同时上报),得配合Celery或者用Django Channels。这个后面章节会细讲。

1.3.3 Modbus —— 工业界的「普通话」

Modbus是工业通信的元老级协议。咱们的传感器,很多都支持Modbus RTU(串口)或Modbus TCP(以太网)。我选Modbus的原因很简单:几乎所有工业传感器都支持它。你买个温湿度变送器,说明书上大概率写着「支持Modbus RTU通信」。

Modbus的寄存器地址,说白了就是一张「数据地图」。比如地址0x0001存温度,0x0002存湿度。咱们的Python程序,就是通过pymodbus库去读这些地址。我曾经踩过一个坑:某个传感器的数据格式是32位浮点数,但Modbus默认只支持16位整数。后来我手动做了字节序转换,才把数据读对。

避坑指南:Modbus的从站地址(Slave ID)不能重复。我见过有人把两个传感器都设成地址1,结果数据全乱了。建议用标签纸贴在传感器上,写清楚地址和量程。

1.3.4 MQTT —— 轻量级消息协议

MQTT是物联网场景的标配。它基于发布/订阅模式,设备端发布数据,服务器端订阅主题。为什么不用HTTP?因为HTTP是请求-响应模式,设备得主动问服务器「有数据吗?」。而MQTT是服务器主动推,延迟低、流量小。

咱们的架构是这样的:

传感器 → Modbus RTU → 采集终端(树莓派/STM32) → MQTT发布 → MQTT Broker(Mosquitto) → Django订阅 → 数据库

MQTT的QoS等级,我建议用QoS 1(至少一次)。QoS 0可能丢数据,QoS 2太慢。农业场景对实时性要求没那么苛刻,丢一两条数据问题不大,但别丢太多。

1.4 整体技术栈一览

最后,我把咱们课程会用到的技术栈整理成一张表。你可以把它当作「购物清单」,后面每个章节都会用到:

类别 技术/工具 版本建议
硬件 树莓派4B / STM32F103 树莓派推荐4B,2GB内存版
传感器 温湿度(SHT30)、风速(三杯式)、光照(BH1750) 支持Modbus RTU的型号
通信 Modbus RTU (RS485) + MQTT (TCP) Modbus波特率9600,MQTT端口1883
后端 Python 3.8+ + Django 4.x Django 4.2 LTS
数据库 MySQL 8.0 / SQLite(开发用) 生产环境用MySQL
前端 Bootstrap 5 + ECharts 5 图表库用ECharts
消息中间件 Mosquitto (MQTT Broker) Docker部署更方便

好了,第一章的导学就到这里。你可能会觉得信息量有点大,没关系,后面每一章都会把这些技术点拆开揉碎了讲。下一章,咱们直接上手硬件——把传感器接到树莓派上,用Python读第一组数据。到时候你会发现,Modbus其实没那么神秘。

公众号:蓝海资料掘金营,微信deep3321