用 IoT 预测植物生长:基于温度传感器的生长度日(GDD)计算实战(IoT for Beginners 农场项目第 1 课)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本文是开源课程IoT for Beginners「智能农场」项目第 1 课的实战指南,核心主题是:如何用温度传感器测量环境温度,并通过**生长度日(Growing Degree Days, GDD)**这一农学指标,预测植物的生长与成熟进度。你将掌握数字农业与精准农业的背景知识、植物温度三要素(基础/最适/最高温度)、GDD 计算公式与手工推算方法,以及一条完整的 IoT 数据链路——从设备读取温度、通过 MQTT 发布遥测数据、在服务器端存储为 CSV,最终用 Jupyter Notebook 可视化并累计 GDD 的端到端方案。
课程背景:数字农业(Agriculture 4.0)
数字农业正在改变耕作方式,它利用工具收集、存储和分析农业数据。当前被世界经济论坛称为「第四次工业革命」,而数字农业的兴起则被称为「第四次农业革命」或「Agriculture 4.0」。
🎓 「数字农业」一词还涵盖了整个「农业价值链」,即从农场到餐桌的完整旅程,包括食品运输与加工过程中的品质追踪、仓储与电商系统,甚至拖拉机租赁 App。
这些变革让农民能够提高产量、减少化肥和农药使用、更高效地用水。虽然数字农业目前主要在较富裕国家应用,但传感器等设备的价格正逐步下降,使其在发展中国家也日益普及。
数字农业催生的典型技术包括:
- 温度测量——通过测量温度,农民可以预测植物的生长与成熟。
- 自动灌溉——测量土壤湿度,在土壤过干时才开启灌溉系统,而非定时灌溉。定时灌溉可能在炎热干旱期让作物缺水,或在降雨时过度浇水;按需灌溉可以优化用水量。
- 害虫防治——农民可以利用自动机器人或无人机上的摄像头巡查害虫,只在需要的地方施药,从而减少农药用量并降低农药流入当地水源的风险。
🎓 「精准农业」(Precision Agriculture)指在逐块田地、甚至田地局部进行观察、测量和响应的农业实践,包括测量水分、养分和虫害水平并精准响应,例如只浇灌田地的某一部分。
为什么温度对种植如此重要?
学习植物知识时,大多数人会被告知水、光、二氧化碳和养分是必需条件,但植物同样需要热量才能生长——这就是为什么植物在春季气温回升时开花,为什么一次短暂回暖就能让雪花莲或水仙提前发芽,为什么温室(hothouse)与暖房(greenhouse)对植物生长如此有效。
🎓 温室和暖房的作用相似,但有一个重要区别:hothouse 是人工加热的,能让农民更精确地控制温度;而 greenhouse 依赖太阳热量,通常只能通过窗户或其他开口散热。
每种植物都有基于日均温度的三个关键温度值:
| 温度参数 | 定义 |
|---|---|
| 基础温度(Base temperature) | 植物生长所需的最低日均温度 |
| 最适温度(Optimum temperature) | 获得最大生长量的最佳日均温度 |
| 最高温度(Maximum temperature) | 植物能承受的最高温度,超过后植物会停止生长以节约水分、维持生存 |
💁 这些是日均温度,即昼夜温度的平均值。植物白天与夜间也需要不同的温度,以帮助它们更高效地进行光合作用并在夜间节省能量。
不同植物物种的基础、最适与最高温度各不相同,这正是有些植物在炎热国家茁壮成长、有些则在寒冷国家生长的原因。
上图展示了一条典型的「生长速率—温度」曲线:在基础温度之前没有生长;生长速率随温度上升而增加,达到最适温度后开始回落;到最高温度时生长停止。曲线的形状因植物种类而异——有的在最适温度之上下降更陡峭,有的从基础温度到最适温度的爬升更平缓。
💁 农民若想获得最佳生长,就需要知道自己所种作物的三个温度值,并理解曲线形状。例如,种植番茄的商业温室白天会设置在约 25°C、夜间 20°C,以获得最快的生长速度;结合人工光照、肥料和受控的 CO2浓度,商业种植者甚至可以实现全年种植与采收。
第一步:用 IoT 设备测量环境温度
温度传感器可以接在 IoT 设备上测量环境温度。本课程为不同硬件提供了三条测量路径:
- Arduino(Wio Terminal):见 wio-terminal-temp.md
- 单板机(Raspberry Pi):见 pi-temp.md
- 单板机(虚拟设备):见 virtual-device-temp.md
Wio Terminal 硬件接线要点
课程选用的是DHT11 温湿度一体传感器(Seeed Grove 系列),其温度传感核心是负温度系数(NTC)热敏电阻——电阻随温度升高而降低,传感器内部自带 ADC,将温度与湿度数据转为微控制器可读的数字信号。
接线时,用 Grove 线缆连接传感器与 Wio Terminal 屏幕朝上时右侧的 Grove 插座(即离电源键最远的一个)。然后在 PlatformIO 项目中配置依赖库:
lib_deps = seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1并在源码中声明传感器(连接到D0端口):
#include <DHT.h> #include <SPI.h> DHT dht(D0, DHT11);虚拟设备:用 CounterFit 模拟 DHT11
虚拟设备使用 CounterFit 模拟 Grove 温湿度传感器,让实验与真实 Raspberry Pi + 物理 DHT11 保持一致。安装 shim 包后,需在 CounterFit 界面中创建两个传感器:
pip install counterfit-shims-seeed-python-dht- 在Sensors面板的Create sensor中,Sensor type 选Humidity,Pin 设为5
- 再选Temperature,Units 保持Celsius,Pin 设为6
💁 CounterFit 通过把温度传感器放在湿度传感器 Pin 的下一个 Pin(Pin 6)来模拟这一组合传感器。
Python 端代码骨架如下:
from counterfit_connection import CounterFitConnection CounterFitConnection.init('127.0.0.1', 5000) import time from counterfit_shims_seeed_python_dht import DHT sensor = DHT("11", 5) while True: _, temp = sensor.read() print(f'Temperature {temp}°C') time.sleep(10)DHT("11", 5)声明了一个虚拟DHT11传感器实例,第一个参数为传感器型号,第二个参数为所连接的端口。sensor.read()返回(湿度, 温度)元组,这里只取温度。每 10 秒采样一次即可——温度在短时间内不会剧烈变化,降低采样频率有助于减少设备功耗。
生长度日(GDD):用温度量化植物生长
生长度日(Growing Degree Days,也叫生长度单位)是一种基于温度衡量植物生长的方法。在水分、养分和 CO2充足的假设下,温度决定了生长速率。
GDD 按天计算,定义为一天内高于植物基础温度的摄氏平均温度。每种植物都需要一定数量的 GDD 才能生长、开花、结果并让作物成熟;每天的 GDD 越多,植物生长越快。
🇺🇸 对美国人而言,GDD 也可以用华氏度计算:5 GDDC(摄氏生长度日)等价于 9 GDDF(华氏生长度日)。
完整的 GDD 公式较为复杂,但有一个常用的简化近似方程:
GDD = (Tmax+ Tmin) / 2 − Tbase
- GDD—— 生长度日数量
- Tmax—— 当日最高温度(°C)
- Tmin—— 当日最低温度(°C)
- Tbase—— 植物基础温度(°C)
💁 还有针对 Tmax高于 30°C、或 Tmin低于 Tbase的修正变体,本课程先忽略这些情况。
实例:玉米(Corn/Maize)
玉米因品种不同,成熟需要 800~2700 GDD,基础温度为 10°C。假设高于基础温度的第一天测得:
| 测量项 | 温度 °C |
|---|---|
| 最高温 | 16 |
| 最低温 | 12 |
代入公式:
- Tmax= 16
- Tmin= 12
- Tbase= 10
计算过程:16 + 12 = 28,28 / 2 = 14,14 − 10 =4。即玉米当天获得了 4 GDD。若某品种玉米成熟需要 800 GDD,则还需 796 GDD 才能成熟。
端到端方案:用温度传感器数据计算 GDD
植物并不会按固定日期生长——你不能种下种子就知道它恰好 100 天后结果。农民通常只有大概的生长时长概念,然后每天去检查作物是否成熟。这在大型农场会造成巨大的劳动力负担,还容易错过提前成熟的作物。
通过测量温度,农民可以计算出植物已获得的 GDD,从而只需在接近预期成熟期时检查。借助 IoT 设备采集温度数据,农民甚至可以在植物接近成熟时自动收到通知。
典型架构
本课采用的典型架构是:
- IoT 设备测量温度;
- 通过 MQTT 等协议将遥测数据发布到互联网;
- 服务器代码订阅数据并将其保存(如数据库或 CSV 文件);
- 之后对数据进行分析,例如每晚的任务计算当天的 GDD、累加各作物迄今的 GDD,并在植物接近成熟时发出提醒。
服务器代码还可以为数据附加额外信息,例如:IoT 设备发布一个标识符表明设备身份,服务器代码据此查询设备位置与所监测的作物;也可以补充当前时间——因为部分 IoT 设备没有精确计时的硬件,或需要额外代码通过网络读取时间。
发布温度遥测数据
复用第 4 课连接 MQTT 与发送遥测数据的方法,即可把温度作为遥测数据发布。设备端需要:安装 MQTT pip 包、连接 MQTT broker、发布遥测消息。
客户端名称应反映项目名,并将遥测中的 light 值替换为 DHT 传感器读取的温度(JSON 属性名为temperature),同时把time.sleep设为 10 分钟——温度短时间内不会变化太多,无需频繁上报:
client_name = id + 'temperature_sensor_client' while True: _, temp = sensor.read() telemetry = json.dumps({'temperature' : temp}) print("Sending telemetry ", telemetry) mqtt_client.publish(client_telemetry_topic, telemetry) time.sleep(10 * 60)💁
sleep函数以秒为单位,10 * 60即 10 分钟。
运行后控制台输出示例:
pi@raspberrypi:~/temperature-sensor $ python3 app.py MQTT connected! Sending telemetry {"temperature": 25} Sending telemetry {"temperature": 25}完整参考代码见 code-publish-temperature/virtual-device/temperature-sensor/app.py 与 code-publish-temperature/pi/temperature-sensor/app.py。发布温度的完整步骤见 single-board-computer-temp-publish.md。
捕获并存储温度数据:写入 CSV 文件
设备发布遥测数据后,服务器代码订阅数据并存储。本课不存数据库,而是保存为CSV(逗号分隔值)文件——它以文本形式将数据按行存储,每个值用逗号分隔、每条记录占一行,便于人类阅读、兼容性好,非常适合以文件方式保存数据。
CSV 文件包含两列:date(服务器收到消息时的当前日期时间)与temperature(来自遥测消息)。
首先创建服务器项目(文件夹命名为temperature-sensor-server),重复第 4 课订阅遥测的步骤(配置激活 Python 虚拟环境、安装 paho-mqtt、编写监听遥测主题 MQTT 消息的代码,无需添加发送命令的代码),并设置客户端名称:
client_name = id + 'temperature_sensor_server'在文件顶部已有导入语句下方追加导入:
from os import path import csv from datetime import datetime在handle_telemetry函数之前添加如下代码,声明文件名与列头,并在文件不存在时创建带表头的 CSV:
temperature_file_name = 'temperature.csv' fieldnames = ['date', 'temperature'] if not path.exists(temperature_file_name): with open(temperature_file_name, mode='w') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader()然后在handle_telemetry函数末尾追加写入逻辑:
with open(temperature_file_name, mode='a') as temperature_file: temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames) temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']})这段代码打开 CSV 文件并在末尾追加新行:该行包含可读格式的当前日期时间,以及从 IoT 设备收到的温度。数据以 ISO 8601 格式 存储——带时区、不含微秒。
运行代码并确保 IoT 设备正在发送数据,同目录下会生成temperature.csv:
date,temperature 2021-04-19T17:21:36-07:00,25 2021-04-19T17:31:36-07:00,24 2021-04-19T17:41:36-07:00,25💁 如果使用虚拟 IoT 设备,请勾选 CounterFit 中的Random复选框并设置范围(Min/Max),避免每次返回相同的温度值。 💁 若要连续运行一整天,需要确保运行服务器代码的计算机不会休眠——可调整电源设置,或运行类似 keep-system-active 的 Python 防休眠脚本。
完整参考代码见 code-server/temperature-sensor-server/app.py。从源码可以看到,该服务在mqtt_client.subscribe(client_telemetry_topic)后通过on_message = handle_telemetry回调接收每条遥测消息,loop_start()启动后台网络循环,主线程则time.sleep(2)保持进程常驻。
手工计算 GDD
服务器捕获温度数据后,即可计算植物的 GDD。手工步骤如下:
- 确定植物的基础温度。例如草莓的基础温度为10°C。
- 从
temperature.csv中找出当天的最高与最低温度。 - 使用前面给出的 GDD 公式计算。
例如,当天最高温度 25°C、最低温度 12°C:
- 25 + 12 = 37
- 37 / 2 = 18.5
- 18.5 − 10 =8.5
因此草莓当天获得了8.5GDD。草莓结果大约需要 250 GDD,所以距离成熟还有一段时间。
作业:用 Jupyter Notebook 可视化 GDD 数据
要得到可靠的 GDD 数据,需要采集多天数据。本课作业 assignment.md 要求用 Jupyter Notebook 可视化温度数据并计算 GDD。仓库提供了现成的笔记本 code-notebook/gdd.ipynb。
操作步骤:
- 创建名为
gdd-calculation的文件夹; - 下载
gdd.ipynb并复制到该文件夹; - 复制 MQTT 服务器生成的
temperature.csv到同目录; - 在
gdd-calculation中创建 Python 虚拟环境; - 安装依赖:
pip install --upgrade pip pip install pandas pip install matplotlib pip install jupyter- 运行笔记本:
jupyter notebook gdd.ipynb笔记本的核心逻辑(与 code-notebook/gdd.ipynb 一致)包括:
- 设置植物基础温度(可修改,例如
base_temperature = 10); - 用 pandas 读取
temperature.csv; - 用 matplotlib 绘制温度曲线;
- 将日期时间转换为纯日期并
groupby('date'),提取每天的min与max温度; - 用标准 GDD 公式逐行计算每日 GDD:
def calculate_gdd(row): return ((row['temperature_max'] + row['temperature_min']) / 2) - base_temperature min_max_by_date['gdd'] = min_max_by_date.apply(lambda row: calculate_gdd(row), axis=1) print(min_max_by_date[['date', 'gdd']].to_string(index=False))评分标准(Rubric):
| 标准 | 优秀 | 合格 | 需改进 |
|---|---|---|---|
| 数据采集 | 采集至少 2 整天数据 | 采集至少 1 整天数据 | 仅采集了部分数据 |
| 计算 GDD | 成功运行笔记本并计算 GDD | 成功运行笔记本 | 无法运行笔记本 |
拓展挑战与延伸学习
挑战:植物生长需要的不止热量,还需要其他因素。请调查:是否存在传感器可以测量这些因素?是否存在执行器(actuator)来控制这些数值?你会如何组合一个或多个 IoT 设备来优化植物生长?
延伸学习方向:
- 数字农业的完整 GDD 计算比本课给出的简化版更复杂,例如如何应对低于基础线的温度,可以进一步研究完整的 GDD 方程;
- 本课的温度测量仅是「智能农场」项目的第一步,后续课程将围绕土壤湿度检测、自动浇水、云端迁移等主题继续展开,形成完整的 IoT 农业监测体系。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考