ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

用 IoT 温度传感器与生长度日(GDD)预测植物生长:数字农业实战指南

用 IoT 温度传感器与生长度日(GDD)预测植物生长:数字农业实战指南 用 IoT 温度传感器与生长度日GDD预测植物生长数字农业实战指南【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南基于开源课程项目 IoT-For-Beginners 第二项目「Farming农业」第一课讲解如何用温度传感器采集环境温度、通过生长度日Growing Degree DaysGDD量化植物生长与成熟进度并基于 MQTT 遥测链路把温度数据持久化到 CSV 文件、最终用 Jupyter Notebook 完成 GDD 的自动化计算与可视化。读完本文你将掌握数字农业Agriculture 4.0的核心测温方案、GDD 简化计算公式以及一套从「传感器 → MQTT 发布 → 服务器订阅 → 文件存储 → 数据分析」的完整 IoT 数据管道搭建方法。数字农业为什么用数据驱动种植数字农业Digital Agriculture正在改变农业的生产方式其核心是借助工具对农业生产数据进行采集、存储与分析。世界经济论坛将当前时代称为「第四次工业革命」而数字农业的兴起则被冠以「第四次农业革命」或「Agriculture 4.0」之名。 数字农业的概念还涵盖整个「农业价值链」即从田间到餐桌的全过程包括食品运输与加工过程中的品质追踪、仓库与电商系统甚至拖拉机租赁 App 都属于这一范畴。这些变革让农民能够提高产量、减少化肥和农药的使用、更高效地利用水资源。虽然数字农业目前主要应用在较富裕的国家但传感器等设备的价格正在逐步下降使其在发展中国家也日益普及。数字农业带来的典型技术手段包括温度测量——通过测量温度农民可以预测植物的生长与成熟进度这是本课的核心主题自动化灌溉——测量土壤湿度在土壤过干时开启灌溉系统而不是按固定时间浇水。定时浇水在炎热干旱期会导致作物缺水、在雨天又会造成过度灌溉只在土壤真正需要时浇水可以优化水资源利用病虫害防治——农民可以在自动化机器人或无人机上安装摄像头巡查病虫害然后只对需要的地方喷洒农药从而减少农药用量及其对周边水源的污染。 「精准农业Precision Agriculture」一词特指以田块甚至田块局部为单元对作物进行观察、测量与针对性响应测量水、养分和虫害水平并精准响应例如只对田块的一小部分进行灌溉。本课通过温度测量这一具体切入点示范了数字农业的一条完整技术链路。温度为什么对农业生产如此重要学习植物知识时多数人会关注水、光、二氧化碳CO2和养分。但植物同样需要温暖才能生长——这正是春天温度回升时植物开花、雪莲花或水仙花在短暂暖流后提前发芽、温室hothouse/greenhouse能大幅促进植物生长的原因。 Hothouse 与 greenhouse 功能相近但有重要区别Hothouse 是人工加热的农民可以更精确地控制温度Greenhouse 依靠太阳取暖通常只能通过窗户或其他开口调节热量。每种植物都有基于日均温度的三个关键阈值基温Base temperature——植物开始生长所需的最低日均温度最适温度Optimum temperature——能获得最大生长的最佳日均温度最高温度Maximum temperature——植物能承受的最高温度。超过该值植物会停止生长以保存水分、维持存活。 这些都是日均温度即昼夜温度的平均值。植物在白天和夜间也需要不同的温度以帮助更高效地光合作用并在夜间节省能量。不同植物物种的基温、最适温度和最高温度各不相同。这正是有些植物在炎热国家生长旺盛、而另一些在寒冷国家繁茂的原因。上图是一个生长速率-温度关系示例达到基温之前没有生长生长速率在最适温度之前持续上升越过峰值后回落达到最高温度时生长停止。这条曲线的形状因植物种类而异有的在最适温度之上下降更陡峭有的从基温到最适温度的爬升更平缓。 要想获得最佳生长农民需要同时掌握这三个温度值并理解所种植物对应曲线的形状。如果农民能够控制温度——例如在商业化 hothouse 中——他们就可以针对植物进行优化。例如商业化种植番茄的温室通常把白天温度设定在 25°C、夜间 20°C以获得最快生长。 将温度与人工光源、肥料和受控的 CO2浓度相结合商业种植者可以全年种植和收获。用 IoT 设备测量环境温度温度传感器可以配合 IoT 设备测量环境温度。本课程的仓库为三种硬件形态都提供了完整的分步指南与可运行代码ArduinoWio Terminal——见 wio-terminal-temp.md单板计算机Raspberry Pi——见 pi-temp.md单板计算机虚拟 IoT 设备 / CounterFit——见 virtual-device-temp.md。Wio Terminal使用 DHT11 传感器测温度课程选用的是 DHT11 温湿度传感器它把两个传感器集成在一个封装里属于数字传感器内置 ADC可把温湿度数据转换为微控制器可读的数字信号。其温度传感部分是一个负温度系数NTC热敏电阻——电阻随温度升高而降低。硬件连接上把 Grove 线缆一端插入传感器插座只有一个方向能插进去另一端接到 Wio Terminal 屏幕朝向你时的右侧Grove 插座离电源按钮最远的那一个。注意接线前要断开 Wio Terminal 的电源。随后在 PlatformIO 中新建项目temperature-sensor配置platformio.ini依赖见 platformio.inilib_deps seeed-studio/Grove Temperature And Humidity Sensor 1.0.1在src/main.cpp中加入头文件、声明 DHT 传感器实例并读写数据完整代码见 code-temperature/wio-terminal/temperature-sensor/src/main.cpp#include Arduino.h #include DHT.h #include SPI.h DHT dht(D0, DHT11); void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); dht.begin(); } void loop() { float temp_hum_val[2] {0}; dht.readTempAndHumidity(temp_hum_val); Serial.print(Temperature: ); Serial.print(temp_hum_val[1]); Serial.println (°C); delay(10000); }关键点说明DHT dht(D0, DHT11);声明一个管理数字温湿度传感器的实例第一个参数D0是 Wio Terminal 右侧 Grove 插座对应的端口第二个参数DHT11指定传感器型号该库还支持 DHT 系列的其他变体调用dht.readTempAndHumidity(temp_hum_val)时传入一个包含 2 个浮点数的数组返回后湿度存放在数组第 0 项、温度存放在第 1 项C 数组从 0 开始编号温度以摄氏度读取。换算华氏度的公式为°F (°C / 5) * 9 32例如 20°C → (20/5)×932 68°Fdelay(10000)使采样间隔为 10 秒——温度不会急剧变化不需要连续轮询。编译上传后用串口监视器即可看到温度输出Temperature: 25.00°C Temperature: 25.00°C Temperature: 24.00°CRaspberry Pi 与虚拟设备Python 侧测温在 Raspberry Pi 上需要先安装seeed-python-dhtpip 包然后在app.py中读取传感器完整代码见 code-temperature/pi/temperature-sensor/app.pyimport time from seeed_dht import DHT sensor DHT(11, 5) while True: _, temp sensor.read() print(fTemperature {temp}°C) time.sleep(10)DHT(11, 5)的第一个参数指定 DHT11 型号第二个参数指定传感器连接的 Grove Base Hat 数字端口D5sensor.read()返回(humidity, temperature)元组这里只用温度10 秒的time.sleep(10)同样是为了降低功耗。使用虚拟 IoT 设备CounterFit时需要安装 shim 包counterfit-shims-seeed-python-dht并在 CounterFit Web 应用中创建两个传感器湿度传感器Pin 5单位 Percentage和温度传感器Pin 6单位 Celsius。温度读数落在下一个引脚这一点由 shim 决定——若湿度传感器在 Pin 5shim 会期望温度传感器在 Pin 6。代码与树莓派版本几乎一致只是导入来源变为counterfit_shims_seeed_python_dht并在开头连接 CounterFit见 code-temperature/virtual-device/temperature-sensor/app.pyfrom 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)在 CounterFit 中既可以在Value框输入固定数值也可以勾选Random复选框并设置Min/Max范围让每次读取返回随机数——后者非常适合后面模拟一整天的温度变化。生长度日GDD用温度量化植物生长生长度日Growing Degree Days也叫生长度单位Growing Degree Units是一种基于温度衡量植物生长的指标。假设植物有足够的水、养分和 CO2那么温度就决定了生长速率。GDD 按天计算即某天高于植物基温的日均摄氏温度。每种植物都需要达到一定数量的 GDD 才能生长、开花并成熟结果。每天获得的 GDD 越多植物生长得越快。 美国读者也可以使用华氏度计算 GDD。5 GDDC摄氏生长度日等于 9 GDDF华氏生长度日。完整的 GDD 公式比较复杂但通常用一个简化方程作为良好的近似其中GDD—— 当日获得的生长度日数量Tmax—— 当日最高温度摄氏度Tmin—— 当日最低温度摄氏度Tbase—— 植物的基温摄氏度。 还存在针对 Tmax高于 30°C 或 Tmin低于 Tbase的修正变体本课暂不涉及。计算示例玉米 不同品种的玉米需要 8002,700 GDD 才能成熟基温为 10°C。假设基温以上的第一天测得测量项温度 °C最高温度Maximum16最低温度Minimum12代入公式Tmax 16Tmin 12Tbase 10计算过程16 12 28 → 28 / 2 14 → 14 − 10 4。这一天玉米获得了 4 GDD。假设该玉米品种需要 800 GDD 才能成熟那么距离成熟还差 796 GDD。这个示例说明植物不会按固定日期生长——你无法种下一粒种子就预期它 100 天后精确结果。农民只能对生长周期有个粗略估计再每天实地查看作物是否成熟。这对大型农场意味着巨大的劳动力投入还可能错过意外提前成熟的作物。通过测温并计算植物已获得的 GDD农民只需在接近预期成熟期时去检查即可。端到端架构从温度遥测到 GDD 计算要让农民自动获知作物接近成熟典型架构是IoT 设备测量温度通过 MQTT 等协议把遥测数据发布到 Internet服务器端代码订阅这些数据并保存到数据库随后由每日任务计算当天 GDD、汇总每种作物累计的 GDD并在作物接近成熟时发出告警。服务器端代码还可以对数据做富化augment例如 IoT 设备发布一个设备标识符服务器端据此查出设备所在位置、监测的是哪种作物也可以补充当前时间等基础信息因为部分 IoT 设备没有可靠的计时硬件或者需要额外的代码从 Internet 读取当前时间。本课的实战做法是把「数据库」简化为CSV 文件CSVComma Separated Values以纯文本按行存储数据每个值用逗号分隔、每条记录占一行是人类可读、生态支持广泛的文件存储方式。CSV 文件包含两列——date日期和temperature温度date列由服务器在收到消息时写入当前日期时间temperature来自遥测消息。步骤一发布温度遥测数据把测温程序升级为 MQTT 客户端向公共 Mosquitto brokertest.mosquitto.org发布温度。Wio TerminalC参照第 4 课配置 WiFi 与 MQTT 库重点改动如下完整代码见 code-publish-temperature/wio-terminal/temperature-sensor/src/main.cpp配置见 config.h// config.h const string ID ID; const string BROKER test.mosquitto.org; const string CLIENT_NAME ID temperature_sensor_client; const string CLIENT_TELEMETRY_TOPIC ID /telemetry;// main.cpp 的 loop 函数 float temp_hum_val[2] {0}; dht.readTempAndHumidity(temp_hum_val); DynamicJsonDocument doc(1024); doc[temperature] temp_hum_val[1]; string telemetry; serializeJson(doc, telemetry); client.publish(CLIENT_TELEMETRY_TOPIC.c_str(), telemetry.c_str()); delay(10 * 60 * 1000);JSON 文档中的属性名是temperature取数组第 1 项的温度值发布间隔设为10 分钟delay(10 * 60 * 1000)即 10 × 60 秒 × 1000 毫秒因为温度在短时间内不会显著变化串口输出示例Sending telemetry {temperature:25}。Raspberry Pi / 虚拟设备Python在测温代码基础上加入paho.mqtt.client与json完整代码见 code-publish-temperature/pi/temperature-sensor/app.py 与 code-publish-temperature/virtual-device/temperature-sensor/app.pyimport paho.mqtt.client as mqtt import json id ID client_telemetry_topic id /telemetry client_name id temperature_sensor_client mqtt_client mqtt.Client(client_name) mqtt_client.connect(test.mosquitto.org) mqtt_client.loop_start() 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)注意两个平台的统一约定设备客户端命名为ID temperature_sensor_client遥测主题为ID/telemetryJSON 负载为{temperature: 值}。使用虚拟设备时需保持 CounterFit 运行并确认湿度/温度传感器创建在正确的引脚上。步骤二服务器端捕获并存储温度编写服务器代码订阅遥测主题并追加写入 CSV。你可以复用第 4 课创建订阅 MQTT 遥测的 Python 应用的步骤详见 1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker配置并激活 Python 虚拟环境 → 安装paho-mqttpip 包 → 编写监听遥测主题的 MQTT 消息代码。项目文件夹命名为temperature-sensor-server。先确保client_name反映本项目client_name id temperature_sensor_server在已有导入下方追加文件、CSV 与时间相关库from os import path import csv from datetime import datetime在handle_telemetry函数之前加入 CSV 初始化逻辑——定义文件名与列名若文件不存在则创建并写入表头CSV 第一行传统上是以逗号分隔的列标题temperature_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函数末尾追加写入逻辑——以追加模式打开文件写入当前时间与温度def handle_telemetry(client, userdata, message): payload json.loads(message.payload.decode()) print(Message received:, payload) 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]})日期以 ISO 8601 格式 保存带时区、去掉微秒便于排序与解析由服务器在收到消息时写入时间戳避免依赖 IoT 设备的时钟。完整可运行的服务器代码见 code-server/temperature-sensor-server/app.py。运行服务器并确保 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 为了积累足够用于 GDD 计算的数据理想情况是让设备连续运行一整天。使用虚拟 IoT 设备时建议勾选 Random 复选框并设置范围避免每次返回相同温度见 select-the-random-checkbox-and-set-a-range.png。如果计划跑满一天需要确保运行服务器代码的电脑不会休眠可以调整电源设置或运行一个保持系统活跃的脚本。步骤三用存储的数据计算 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 自动化可视化与计算逐日人工从 CSV 里找最高/最低温再手算 GDD 效率很低。本课程在 assignment.md 中提供了一种自动化方案用 Jupyter Notebook 读取temperature.csv、绘制温度曲线、按天分组求极值并批量计算 GDD。操作步骤创建文件夹gdd-calculation把 code-notebook/gdd.ipynb 复制到该文件夹把 MQTT 服务器生成的temperature.csv一并复制进去在gdd-calculation文件夹中创建 Python 虚拟环境安装依赖pip install --upgrade pip pip install pandas pip install matplotlib pip install jupyter启动 Notebookjupyter notebook gdd.ipynb从仓库附带的 gdd.ipynb 源码看Notebook 的核心逻辑非常清晰先用一个单元格定义植物的基温例如base_temperature 10可直接改成你目标植物的基温再用 pandas 读取 CSVdf pd.read_csv(temperature.csv)用 matplotlib 按时间绘制温度曲线plt.plot(df[date], df[temperature])把日期时间列转换为纯日期并按日期分组提取每天的min与maxdf[date] pd.to_datetime(df[date]).dt.date data_by_date df.groupby(date) min_by_date data_by_date.min() max_by_date data_by_date.max()最后实现 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), axis1) print(min_max_by_date[[date, gdd]].to_string(indexFalse))这样只需把 CSV 放入同目录并逐个运行单元格就能一次性得到每天的最高/最低温、GDD 值及其可视化结果。Rubric 建议至少采集 2 个完整日的数据以获得有意义的 GDD 趋势。挑战从「热量」到完整生长要素热量只是植物生长所需条件之一。植物还需要水、光、CO2和养分。思考以下问题这些要素分别有哪些对应的传感器可以测量有哪些**执行器actuator**可以控制这些水平如何组合一个或多个 IoT 设备来优化植物生长本课程的后续课正是沿着这条思路展开的测量土壤湿度并按需自动灌溉2-detect-soil-moisture、3-automated-plant-watering再把数据迁移到云端进行更深入的分析。整套项目从「预测生长」到「自动灌溉」再到「上云」构成了一个完整的数字农业 IoT 实践闭环。延伸阅读与复习建议关于数字农业可阅读 数字农业维基百科 页面关于精准农业可阅读 精准农业维基百科完整的 GDD 计算公式比本课的简化版更复杂如何处理温度低于基温、Tmax超过 30°C 等边界情况可参考 Growing Degree Day 维基百科 页面即使沿用现有耕作方式未来粮食仍可能短缺可以了解高科技农业技术的相关视频资料。小结本课以「温度 → GDD → 成熟度」为主线串起了数字农业的一条完整技术链路先用 DHT11 传感器Wio Terminal / Raspberry Pi / CounterFit 虚拟设备测量环境温度理解基温、最适温度与最高温度三个阈值再基于 MQTT 把{temperature: 25}这样的遥测负载发布到test.mosquitto.org服务器端temperature-sensor-server订阅主题、补充时间戳并追加写入temperature.csv最后用手工计算或仓库附带的 gdd.ipynb 对多日数据进行可视化并按天计算 GDD从而在作物接近成熟时精准安排巡查。这套「传感器采集 → 协议传输 → 服务端存储 → 数据分析」的模式正是数字农业与精准农业落地到 IoT 工程中的最小可运行范例。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表