IoT-For-Beginners 数字农业实战:在 Raspberry Pi 上用 Grove 电容式土壤湿度传感器测量土壤含水量
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
土壤湿度是影响植物生长的关键环境因素——水过多会导致根系缺氧,水过少则让植物无法吸收养分。本指南以 IoT-For-Beginners 课程中"检测土壤湿度"一课(2-detect-soil-moisture)的 Raspberry Pi 实验为基础,带你把 Grove 电容式土壤湿度传感器接到树莓派上,用 Python 读取土壤的湿度数值,并理解模拟信号经 ADC 转换、通过 I²C 传输到代码的完整链路。学完后,你将能独立完成传感器接线、编写采集程序,并为后续的自动浇水系统与云端迁移实验打下基础。
硬件准备
本实验需要以下硬件:
- Raspberry Pi(单板计算机)及已安装好的Grove Base Hat
- Grove 电容式土壤湿度传感器(Grove Capacitive Soil Moisture Sensor)
- Grove 连接线(一端接传感器,一端接 Base Hat)
- 一盆绿植或一小块土壤作为测量对象
该传感器通过检测土壤的电容(capacitance)来测量湿度。电容是元件存储电荷的能力,土壤的电容会随含水量的变化而变化,传感器将此变化转换为可测量的电压:土壤越湿,输出电压越低。
与使用两根探针、通过测量电阻来判断湿度的电阻式传感器不同,电容式传感器采用正负金属板结构,不直接接触土壤导电部分,更耐腐蚀,适合长期埋在土壤中使用。
信号链路:从模拟电压到数字读数
理解数据如何从传感器到达你的 Python 代码,是本节实验的重要收获。整个链路如下:
- 传感器输出模拟电压:电容式土壤湿度传感器是模拟传感器,输出电压表示土壤湿度,电压随湿度增加而降低。
- Grove Base Hat 上的 10 位 ADC 完成模数转换:树莓派本身只有数字 GPIO 引脚,无法直接读取模拟电压。Grove Base Hat 内置了 10 位模数转换器(ADC),把电压映射为1~1,023的整数。例如在 3.3V 的板子上,传感器输出 3.3V 时读数为 1,023,输出约 1.65V 时读数约为 511。
- 通过 I²C 协议经 GPIO 引脚传输:转换后的数字值以 I²C(Inter-Integrated Circuit,读作 I-squared-C)协议发送。I²C 使用 SDA(数据线)与 SCL(时钟线)两根主线路外加电源线 VCC 和地线 GND,数据以带目标设备地址的数据包形式传输,Grove 传感器通过 Base Hat 上的 I²C 接口把模拟读数的数字表示送给树莓派。
💡 如果你在"夜灯"课程(1-introduction-to-iot)中使用 Wio Terminal 做过实验,当时光线传感器是直接接到带 ADC 的模拟引脚上的;而树莓派场景下,传感器接到 Base Hat 的模拟插座,由 Base Hat 内部的 ADC 完成转换后再走 I²C。两种路径殊途同归,最终代码里拿到的都是 0~1,023 的数字。
接线:连接土壤湿度传感器
接线前请确保树莓派处于断电状态,操作步骤如下:
- 将 Grove 连接线的一端插入土壤湿度传感器上的插座。连接线只有一种插入方向,反了是插不进去的。
- 在树莓派断电状态下,将 Grove 连接线的另一端插入 Grove Base Hat 上标记为A0的模拟插座。该插座位于紧挨 GPIO 引脚那一排插座的右数第二个位置。
- 将传感器插入土壤中。传感器上有一条白色"最高位置线"(highest position line),插入时最多埋到这条线处,不要越过它——过深的埋入可能会让水浸到传感器电路部分。
环境准备:确保 Grove 库与 I²C 已就绪
本实验依赖 Grove 的 Python 库grove.py,以及树莓派上开启的 I²C 接口。若你尚未配置,请参照入门课程中树莓派环境搭建的完整说明,关键步骤包括:
sudo apt install git python3-dev python3-pip --yes git clone https://github.com/Seeed-Studio/grove.py cd grove.py sudo pip3 install . sudo raspi-config nonint do_i2c 0 sudo reboot上述命令依次安装了 Git 与 pip,从源码编译安装 Seeed 官方的 Grove Python 包,并通过raspi-config开启 I²C 接口后重启生效。接线完成后即可给树莓派上电。
编写代码:读取土壤湿度
创建项目与文件
- 给树莓派上电并等待系统启动完成。
- 启动 VS Code——可以直接在 Pi 的桌面上启动,也可以通过Remote SSH扩展从你的电脑远程连接(连接方式同样见入门课程说明)。
- 在终端中,于
pi用户的主目录下新建名为soil-moisture-sensor的文件夹,并在其中创建app.py文件。 - 在 VS Code 中打开该文件夹。
导入所需库
在app.py中加入以下代码:
import time from grove.adc import ADCimport time导入 Python 的time模块,稍后用它控制两次读取之间的等待时间。from grove.adc import ADC从 Grove Python 库中导入ADC类。这个类封装了与 Grove Base Hat 上模数转换器的交互逻辑,负责读取模拟传感器的电压值。
创建 ADC 实例
在导入语句下方加入:
adc = ADC()这行代码创建了一个ADC类的实例,之后就可以通过它读取模拟插座上的电压数字化结果。
无限循环读取 A0 引脚
继续追加一个无限循环,从 A0 引脚(adc.read(0)中的通道号0即对应 A0 插座)读取土壤湿度,打印到控制台,并等待 10 秒再进行下一次读取:
while True: soil_moisture = adc.read(0) print("Soil moisture:", soil_moisture) time.sleep(10)完整代码与仓库中提供的参考实现一致,可直接对照 code/pi/soil-moisture-sensor/app.py:
import time from grove.adc import ADC adc = ADC() while True: soil_moisture = adc.read(0) print("Soil moisture:", soil_moisture) time.sleep(10)运行并观察数值变化
在终端中运行:
python3 app.py控制台会持续输出土壤湿度读数,例如:
pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py Soil moisture: 615 Soil moisture: 612 Soil moisture: 498 Soil moisture: 493 Soil moisture: 490 Soil Moisture: 388现在做两个实验验证传感器工作正常:
- 往土壤中加水:观察读数逐渐下降。由于电容式传感器的特性是"越湿电压越低",上例中从 615 一路降到 388 正是浇水后电压下降的体现。
- 把传感器从土壤中拔出:传感器脱离土壤后电容变化,读数会明显上升。
注意:读数本身是 1~1,023 的相对数值,并不是直接的含水量百分比。要换算成真实的土壤含水量,需要做传感器校准(见下文)。
深入源码:ADC 读取背后的实现
仓库中 code/pi/soil-moisture-sensor/app.py 是本节实验的完整参考实现。其中adc.read(0)的参数0对应 Grove Base Hat 上A0 模拟插座的通道号;若将传感器改插到 A1 插座,则需把参数改为1。
从源码结构看,ADC类来自 Seeed 官方 Grove Python 库,它通过 I²C 与 Base Hat 上的 ADC 芯片通信,内部完成"发起 I²C 读取 → 接收 10 位转换结果"的完整过程,因此你的代码无需关心底层的 I²C 时序细节。
其他硬件平台的对照实现
同一个实验在 IoT-For-Beginners 课程中还有其他硬件版本,方便你横向理解不同平台的差异:
- Wio Terminal(Arduino):code/wio-terminal/soil-moisture-sensor/src/main.cpp 使用
analogRead(A0)直接读取模拟引脚,delay(5000)控制 5 秒间隔,项目由 platformio.ini 定义(atmelsam平台 +seeed_wio_terminal板卡)。这是因为 Wio Terminal 自带 ADC,无需额外的 Base Hat。 - 虚拟设备(Virtual device):code/virtual-device/soil-moisture-sensor/app.py 使用 CounterFit 模拟环境,通过
counterfit_shims_grove.adc模拟 ADC 读取,让没有实体硬件的学习者也能完成实验。
三者的核心逻辑完全一致:初始化 ADC → 循环读取 → 打印读数 → 休眠等待,只是底层访问硬件的方式不同。
校准:把 1~1,023 的读数换算成真实含水量
本课作业(assignment.md)要求完成传感器校准,方法是通过**重量法(gravimetric soil moisture)**建立读数与真实含水量的映射:
- 用传感器读取土壤湿度数值并记录。
- 取土壤样本称重(湿重 W_wet)。
- 在 110°C(230°F)烤箱中烘干数小时(实验室标准为 48~72 小时),或置于阳光、温暖干燥处直至土壤呈粉末状。
- 再次称重(干重 W_dry)。
- 按公式计算重量含水量:
含水量 % = (W_wet − W_dry) / W_dry × 100例如湿重 212g、干重 197g 的样本:(212 − 197) / 197 × 100 ≈7.6%。
对不同湿度(不同含水量)的土壤样本至少重复 3 次,记录"传感器读数 × 含水量"数据对,绘制散点图并拟合一条直线。之后任意一次传感器读数,都能通过这条直线反推出对应的土壤含水量百分比。校准后,你的树莓派就从"读取一个抽象数字"升级为"直接报告土壤含水率",这正是下一课自动浇水系统中按需灌溉的控制依据。
小结
本实验带你完成了树莓派 + Grove 电容式土壤湿度传感器的完整闭环:理解电容式测量原理 → 完成 A0 插座接线 → 编写 8 行 Python 程序持续读取湿度 → 观察浇水后电压读数下降 → 通过重量法校准读数。同时,通过对照 Wio Terminal 与虚拟设备的实现,你也掌握了"模拟传感器 → ADC → I²C → 代码"这条 IoT 数据通路的通用模式,为后续课程中的自动化灌溉、云端数据上报打下坚实基础。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考