实验06:土壤湿度与浇水提醒
这个实验做完你会得到什么
把传感器插进花盆,手机上显示土壤含水量百分比;土干到设定值以下时弹出浇水提醒。
这一篇的重点不是代码,是标定 —— 传感器给的是原始电压值,要先量出”干”和”湿” 两个端点,才能换算成有意义的百分比。这是所有模拟传感器的通用功课。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 40 分钟 |
| 前置 | 实验05:光照传感器 |
改编自 MIT 官方教程 App Inventor + IoT: Moisture Sensor。 完成品工程:Arduino101MoistureSensor.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | |
| Grove 土壤湿度传感器 | 1 | 插 A2 |
| 一杯水 + 一盆干土 | — | 标定用 |
二、接线
传感器插在 Grove 扩展板的 A2 接口,代码里 Pin 填 2。
固件:.ino 里把 MOISTURE 设为 ENABLED,其余 DISABLED。
金属探针不要整根泡进水里,只插到土里探针部分即可,接口和电路板保持干燥。 长期通电会让探针电解腐蚀,做完实验拔掉;要长期监测建议用电容式传感器。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 标签 | 标签_原始 |
文本「原始值:–」 |
| 标签 | 标签_百分比 |
字号 40、粗体,文本「–」 |
| 标签 | 标签_建议 |
字号 20 |
| 按钮 | 按钮_标干 |
文本「记录:干」 |
| 按钮 | 按钮_标湿 |
文本「记录:湿」 |
| 对话框 | 对话框1 |
不可见 |
| Arduino101Moisture | Arduino101Moisture1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 2 |
四、分步搭代码块
第 1 步:先看原始值
global 原始值 = 0
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接"
Arduino101Moisture1.RequestMoistureUpdates()
}
when Arduino101Moisture1.MoistureReceived(moisture) {
global 原始值 = moisture
标签_原始.Text = join("原始值:", round(moisture))
}
中途验证:数字开始跳动。把探针放在空气里记一个数,再插进湿土(或水杯)记一个数 —— 这两个值就是下一步要用的端点。空气里通常接近 0,水里通常几百。
第 2 步:两点标定
不写死数字,让用户自己按一下按钮记录:
global 原始值 = 0
global 干值 = 0
global 湿值 = 600
when 按钮_标干.Click() {
global 干值 = 原始值
标签_状态.Text = join("已记录干值:", round(干值))
}
when 按钮_标湿.Click() {
global 湿值 = 原始值
标签_状态.Text = join("已记录湿值:", round(湿值))
}
中途验证:探针在空气里点「记录:干」,插进水里点「记录:湿」,状态栏分别显示两个数。
为什么要标定:不同传感器、不同土质、甚至电源电压变化,原始值都不一样。 写死
0~600换算,换个环境就不准了。两点标定十秒钟搞定,一劳永逸。
第 3 步:换算成百分比并提醒
global 原始值 = 0
global 干值 = 0
global 湿值 = 600
global 已提醒 = false
when Arduino101Moisture1.MoistureReceived(moisture) {
global 原始值 = moisture
标签_原始.Text = join("原始值:", round(moisture))
var 百分比 = round((moisture - 干值) / max(1, 湿值 - 干值) * 100)
var 夹紧 = max(0, min(100, 百分比))
标签_百分比.Text = join(夹紧, "%")
if 夹紧 < 30 {
标签_建议.Text = "土壤偏干,该浇水了"
标签_建议.TextColor = "&HFFEF6C00"
if not 已提醒 {
对话框1.ShowAlert("该浇水啦")
global 已提醒 = true
}
} else {
标签_建议.Text = "湿度正常"
标签_建议.TextColor = "&HFF43A047"
global 已提醒 = false
}
}
中途验证:探针在空气里显示接近 0% 并弹一次提醒;插进水里接近 100%,提示变绿。
max(1, 湿值 - 干值)是防除零:万一两次标定记的是同一个值,不加这个会直接崩。
已提醒标志保证一次干燥只弹一次窗,否则每秒弹一个对话框根本没法用。 湿度恢复正常后标志复位,下次变干再提醒。
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 收不到数据 | ① 没订阅;② Pin 填成了 A2,只填数字 2;③ 固件 MOISTURE 没 ENABLED |
| 百分比一直是 0 或 100 | 标定没做,或干湿两个值记反了。重新标定 |
| 数值忽高忽低 | 探针接触不良(土太松),插实一点;或加一阶低通滤波 |
| 弹窗弹个不停 | 少了 已提醒 标志 |
| 探针发绿 / 有白色结晶 | 电解腐蚀,正常现象。不用时拔掉,或改用电容式传感器 |
| 换了个花盆就不准 | 土质不同,重新标定一次 |
六、下一步
- 实验07:接近传感器 —— 有一个 PDF 明写的接线坑
- 把这一篇和 实验09 电机 合起来,就是自动浇水装置
相关文档
- Arduino101Moisture 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Moisture_Sensor.pdf
扫码添加客服咨询