ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用 IoT 预测植物生长:基于温度传感器的生长度日(GDD)计算实战(IoT for Beginners 农场项目第 1 课)

用 IoT 预测植物生长:基于温度传感器的生长度日(GDD)计算实战(IoT for Beginners 农场项目第 1 课) 用 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 设备上测量环境温度。本课程为不同硬件提供了三条测量路径ArduinoWio Terminal见 wio-terminal-temp.md单板机Raspberry Pi见 pi-temp.md单板机虚拟设备见 virtual-device-temp.mdWio 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 选HumidityPin 设为5再选TemperatureUnits 保持CelsiusPin 设为6 CounterFit 通过把温度传感器放在湿度传感器 Pin 的下一个 PinPin 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(fTemperature {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 − TbaseGDD—— 生长度日数量Tmax—— 当日最高温度°CTmin—— 当日最低温度°CTbase—— 植物基础温度°C 还有针对 Tmax高于 30°C、或 Tmin低于 Tbase的修正变体本课程先忽略这些情况。实例玉米Corn/Maize玉米因品种不同成熟需要 8002700 GDD基础温度为 10°C。假设高于基础温度的第一天测得测量项温度 °C最高温16最低温12代入公式Tmax 16Tmin 12Tbase 10计算过程16 12 2828 / 2 1414 − 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 分钟。运行后控制台输出示例piraspberrypi:~/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函数之前添加如下代码声明文件名与列头并在文件不存在时创建带表头的 CSVtemperature_file_name temperature.csv fieldnames [date, temperature] if not path.exists(temperature_file_name): with open(temperature_file_name, modew) as csv_file: writer csv.DictWriter(csv_file, fieldnamesfieldnames) writer.writeheader()然后在handle_telemetry函数末尾追加写入逻辑with open(temperature_file_name, modea) as temperature_file: temperature_writer csv.DictWriter(temperature_file, fieldnamesfieldnames) temperature_writer.writerow({date : datetime.now().astimezone().replace(microsecond0).isoformat(), temperature : payload[temperature]})这段代码打开 CSV 文件并在末尾追加新行该行包含可读格式的当前日期时间以及从 IoT 设备收到的温度。数据以 ISO 8601 格式 存储——带时区、不含微秒。运行代码并确保 IoT 设备正在发送数据同目录下会生成temperature.csvdate,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°C25 12 3737 / 2 18.518.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 公式逐行计算每日 GDDdef 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), axis1) print(min_max_by_date[[date, gdd]].to_string(indexFalse))评分标准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),仅供参考
返回列表