Arduino 101 实验06 - 土壤湿度传感器,做一个浇水提醒

« 返回 Arduino101 平台  IoT 专题

实验06:土壤湿度与浇水提醒

这个实验做完你会得到什么

把传感器插进花盆,手机上显示土壤含水量百分比;土干到设定值以下时弹出浇水提醒

这一篇的重点不是代码,是标定 —— 传感器给的是原始电压值,要先量出”干”和”湿” 两个端点,才能换算成有意义的百分比。这是所有模拟传感器的通用功课。

项目 说明
难度 ★★★☆☆
用时 约 40 分钟
前置 实验05:光照传感器

改编自 MIT 官方教程 App Inventor + IoT: Moisture Sensor。 完成品工程:Arduino101MoistureSensor.aia


一、器材清单

器材 数量 说明
Arduino 101 1  
Seeed Grove 扩展板 1  
Grove 土壤湿度传感器 1 A2
一杯水 + 一盆干土 标定用

二、接线

传感器插在 Grove 扩展板的 A2 接口,代码里 Pin2

固件:.ino 里把 MOISTURE 设为 ENABLED,其余 DISABLED。

金属探针不要整根泡进水里,只插到土里探针部分即可,接口和电路板保持干燥。 长期通电会让探针电解腐蚀,做完实验拔掉;要长期监测建议用电容式传感器。


三、界面组件

组件 命名 关键属性
标签 标签_原始 文本「原始值:–」
标签 标签_百分比 字号 40、粗体,文本「–」
标签 标签_建议 字号 20
按钮 按钮_标干 文本「记录:干」
按钮 按钮_标湿 文本「记录:湿」
对话框 对话框1 不可见
Arduino101Moisture Arduino101Moisture1 不可见,BluetoothDevice = BluetoothLE1Pin = 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 标定没做,或干湿两个值记反了。重新标定
数值忽高忽低 探针接触不良(土太松),插实一点;或加一阶低通滤波
弹窗弹个不停 少了 已提醒 标志
探针发绿 / 有白色结晶 电解腐蚀,正常现象。不用时拔掉,或改用电容式传感器
换了个花盆就不准 土质不同,重新标定一次

六、下一步


相关文档

文档反馈