Featured image of post 电阻式土壤湿度传感器使用指南:从校准到Arduino实战

电阻式土壤湿度传感器使用指南:从校准到Arduino实战

本文详细介绍了电阻式土壤湿度传感器的工作原理、校准方法及Arduino集成实战,包含两个完整示例项目:模拟输出百分比转换和数字输出状态检测,适合物联网和智能农业开发者参考。

电阻式土壤湿度传感器使用指南

电阻式土壤湿度传感器是一种广泛使用、简单且经济的方法,用于估算土壤中的水分含量。本教程将指导您如何将电阻式土壤湿度传感器与Arduino UNO微控制器连接,包括传感器部件说明、土壤类型校准方法以及模拟和数字输出数据的读取。

教程内容概览

您将在本教程中实现两个实际示例:

  1. 示例一:读取传感器的模拟输出数据,并将模拟读数转换为百分比值
  2. 示例二:使用传感器的数字输出来判断土壤干湿状态,并通过红绿LED指示灯显示结果

完成本教程后,您将深入了解电阻式土壤湿度传感器的工作原理,并掌握如何将其集成到基于微控制器的项目中。

前置要求

为有效跟随本教程,您需要以下组件:

  • Arduino UNO
  • 电阻式土壤湿度传感器
  • 面包板
  • 5个LED(用于模拟示例,颜色不限)
  • 1个红色LED和1个绿色LED(用于数字示例)
  • 220欧姆电阻(每个LED一个)
  • 跳线

目录

什么是土壤湿度传感器?

土壤湿度传感器是一种估算土壤中水分含量的设备。土壤湿度传感器通常通过测量土壤的电学特性(如介电常数和电阻)来工作。一些土壤湿度传感器还使用时域方法来确定电磁波在土壤中的传播速度。

土壤湿度传感器在不同领域有各种应用,包括但不限于:

  • 气候与环境研究
  • 自动化/智能灌溉系统
  • 温室监测系统
  • 城市规划

土壤湿度传感器的类型

土壤湿度传感器根据其测量的土壤特性作为水分含量指标进行分类。小型项目中最常见的土壤湿度传感器是:

  • 电阻式土壤湿度传感器
  • 电容式土壤湿度传感器

电阻式土壤湿度传感器

电阻式土壤湿度传感器基于水分含量与土壤电阻率之间的关系来估算水分含量。土壤的电阻率随着水分含量的增加呈指数下降。

电阻式土壤湿度传感器有两个探针插入土壤中,测量两个探针之间土壤的电阻。

电容式土壤湿度传感器

电容式土壤湿度传感器根据水分含量与土壤介电特性之间的关系来确定土壤的水分含量。土壤的介电常数随着水分含量的增加而增加。

电容式土壤湿度传感器通常有一个正极板和一个负极板,两者之间有空间。当插入土壤时,土壤成为两个极板之间的介电介质。传感器测量土壤介电特性的变化。

如何选择电阻式与电容式传感器

选择电阻式还是电容式土壤湿度传感器取决于几个因素:

  • 成本:电阻式土壤湿度传感器通常比电容式传感器便宜
  • 精度:电容式土壤湿度传感器比电阻式更准确。土壤类型和肥料施用等因素对电容式土壤湿度传感器灵敏度的影响较小
  • 长期使用:电阻式土壤湿度传感器在频繁使用下容易腐蚀。这是因为流经与土壤接触的探针的电流会导致探针中的金属电极发生电解。另一方面,电容式土壤湿度传感器耐腐蚀,因为接触板嵌入在耐腐蚀材料中,不需要直接与土壤接触

电阻式土壤湿度传感器的部件

电阻式土壤湿度传感器模块通常由两部分组成:传感器探针和电压比较器模块。

传感器探针

探针是传感器放置在土壤中的部分,用于检测土壤中两点之间的电阻。

如示意图所示,传感器探针包含以下组件:

  • 电极:金属电极通过土壤传导电流。当传感器通电时,电流从一个电极通过土壤流到另一个电极,然后返回比较器模块。传感器测量土壤对流过电极的电信号的电阻来确定湿度水平
  • 非极化连接器引脚:两个连接器引脚用于将探针连接到电压比较器模块。这些引脚没有极性,可以以任何顺序连接到电压比较器模块上的相应连接器引脚。探针使用母对母跳线连接到比较器模块

电压比较器模块

电压比较器模块解释来自探针的电信号,处理这些信号,并提供微控制器可以读取的模拟和数字输出。

电压比较器模块包含以下组件:

  • LM393比较器芯片:LM393比较器是一个双比较器,它将来自探针的电信号与电位器设置的参考值进行比较,并产生数字输出。参考信号对应于特定的土壤湿度水平(阈值),并使用电位器设置
    • 当从探针读取的模拟信号高于参考值时,比较器输出HIGH,这意味着土壤的湿度低于阈值湿度水平
    • 当从探针读取的模拟信号低于参考值时,比较器输出LOW,这意味着土壤的湿度高于阈值湿度水平
  • 电位器:电位器用于设置LM393比较器芯片使用的参考电信号。电位器升高或降低阈值湿度水平。它由一个可以顺时针或逆时针旋转的旋钮组成
  • 电源指示灯(PWR-LED):电源指示灯是一个LED,当模块通电时会亮起
  • 数字输出指示灯(DO-LED):数字输出指示灯是一个LED,当传感器检测到湿土壤时亮起。也就是说,从传感器读取的当前湿度水平高于阈值,比较器输出LOW
  • 电源引脚(VCC):此引脚用于向传感器供电。传感器模块可以由5V或3.3V电压源供电。您应注意,更改电压源也会改变传感器的模拟输出。在本教程中,您将使用一个数字引脚为传感器供电。Arduino的数字引脚输出5V。传感器的典型工作电流为15mA,而Arduino数字输出引脚可提供最大40mA的电流,因此可以安全地为传感器供电
  • 接地引脚(GND):此引脚用于为传感器提供接地参考。它通常连接到微控制器中的任何接地引脚
  • 数字输出引脚(DO):数字输出引脚根据从LM393比较器获得的值输出HIGH或LOW。此引脚通常由微控制器用于读取LM393比较器的数字输出
  • 模拟输出引脚(AO):模拟输出引脚提供10位模拟电压值。值范围从0到1023,表示土壤的湿度水平。通常,在大多数传感器中,较高的模拟值表示较干的土壤,较低的模拟值表示较湿的土壤
  • 传感器探针连接器引脚:这两个引脚用于将传感器探针连接到电压比较器模块

如何为您的土壤校准传感器

如前所述,电阻式土壤湿度传感器对土壤类型敏感。这意味着为您打算使用的土壤类型校准传感器非常重要。这样做可以提高在特定土壤上读数的准确性。

校准传感器的一种方法是确定土壤类型的可能值范围。也就是说,测量土壤完全干燥和完全湿润时传感器的输出。然后,您可以使用这个值范围将传感器的读数映射到新的刻度,如百分比。以下步骤描述了如何校准传感器:

步骤1:将传感器连接到Arduino

参考上图,将传感器连接到Arduino微控制器,如下所示:

  • 将传感器模块的VCC或电源引脚连接到Arduino的数字引脚7。这允许您在Arduino草图中控制传感器的供电电压,确保仅在需要读数时才为传感器供电。这样做有助于提高传感器的耐用性
  • 将传感器模块的GND引脚连接到微控制器中的接地引脚
  • 将传感器模块的模拟输出引脚AO连接到Arduino的模拟引脚A0。这是您将从传感器读取模拟数据的引脚
  • 将探针上的两个引脚连接到传感器模块上的两个连接器引脚。连接器引脚没有极性

步骤2:将校准草图上传到微控制器

将以下草图上传到Arduino:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const int sensorPin = A0; // 传感器的模拟输入引脚
const int powerPin = 7; // 为传感器供电的数字引脚

int getAverageReading(int analogPin, int powerPin, int samples = 10) {
  long total = 0;

  digitalWrite(powerPin, HIGH); // 传感器通电
  delay(500); // 等待传感器稳定

  for (int i = 0; i < samples; i++) {                    
    total += analogRead(analogPin);
    delay(10); // 周期之间的短间隔
  }

  digitalWrite(powerPin, LOW); // 传感器断电
  return total / samples;
}

void setup() {
  Serial.begin(9600);

  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, LOW); // 确保传感器开始时关闭

  Serial.println("校准模式:插入干燥或湿润土壤并观察值。");
}

void loop() {
  int avgReading = getAverageReading(sensorPin, powerPin, 20); // 取20个平均样本
  Serial.print("平均模拟读数:");
  Serial.println(avgReading);
  delay(2000); // 每2秒更新一次
}

在草图中,您首先定义用于为传感器供电和从传感器读取模拟数据的引脚。数字引脚7为传感器供电,模拟引脚A0从传感器读取数据。

getAverageReading函数为传感器通电,从传感器获取多个读数,为传感器断电,并返回所取读数的平均值。该函数有三个参数:

  • analogPin - 模拟输入引脚,将数据从传感器读取到微控制器
  • powerPin - 用于为传感器供电的引脚。仅在需要读数时才为传感器供电
  • samples - 从传感器获取的读数数量。默认为10。您获取多个读数作为过滤传感器数据中噪声的一种方式

setup函数中,您首先设置波特率,Arduino UNO为9600,不同微控制器可能不同。然后,您将用于为传感器供电的数字引脚7设置为输出引脚,并向传感器写入LOW以确保其在开始时关闭。

最后,在loop函数中,您从getAverageReading函数获取平均模拟读数并将其打印到串行监视器。您应注意,在草图中,每2秒获取一次读数 - 在实际应用中,此延迟应更长,以提高传感器的耐用性。

步骤3:记录干燥土壤的值

将传感器的探针插入完全干燥的土壤样本中,并记录平均模拟读数。您可以通过在烤箱中烘烤土壤来去除水分以干燥土壤。注意,必须让土壤冷却后再插入传感器的探针。热土壤可能会损坏传感器。传感器的模拟读数根据土壤类型而异,但对于干燥土壤通常非常高。这是我在干燥土壤样本中获得的结果:

步骤4:记录湿润土壤的值

将传感器的探针插入完全湿润的土壤样本中,并记录平均模拟读数。当土壤饱和时,该值通常较低。这是我在湿润土壤样本中获得的结果:

您将在后续部分中使用这些记录的湿润和干燥土壤的模拟值作为参考点,将未来的读数映射到百分比刻度。在本教程后面提供的示例中,湿度水平表示为百分比,介于0%(干燥)和100%(湿润)之间。使用校准值确保百分比输出准确反映您土壤类型的条件。

示例1:从模拟输出确定土壤湿度百分比

在此示例中,您将学习如何从土壤湿度传感器读取模拟数据,将模拟读数转换为百分比值,并使用五个LED视觉表示湿度水平。

来自传感器的模拟读数与土壤湿度水平成反比。这意味着较高的模拟读数表示较干的土壤,较低的读数表示较湿的土壤。

LED作为湿度百分比的视觉指示器。LED根据土壤湿度范围点亮:

  • 1个LED:0-20%(非常干燥)
  • 2个LED:20-40%
  • 3个LED:40-60%
  • 4个LED:60-80%
  • 5个LED:80-100%(非常湿润)

电路图

参考上面的示意图,按如下方式设计电路:

  • 以与校准部分中描述的相同方式将传感器连接到Arduino。也就是说,将传感器的电源引脚(VCC)连接到数字引脚7,模拟输出引脚AO连接到模拟引脚A0,接地引脚连接到微控制器的任何接地引脚
  • 将每个LED与一个220欧姆电阻串联连接
  • 将五个LED的阳极连接到微控制器的数字引脚3、4、5、6和8

这是我的设置外观:

Arduino代码

将以下草图上传到您的Arduino:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const int sensorPin = A0; // 土壤湿度传感器的模拟输入
const int powerPin = 7; // 为传感器供电的数字引脚

// LED条形图引脚(从最低到最高)
const int ledPins[5] = {3, 4, 5, 6, 8};

// 校准的模拟值 - 替换为您的值
const int dryValue = 1005;
const int wetValue = 254;

// 全局变量保存最后的模拟值
int lastAnalogReading = 0;

// 读取并计算土壤湿度百分比
int getMoisturePercent(int analogPin, int powerPin, int samples = 10) {
  unsigned long total = 0;

  digitalWrite(powerPin, HIGH);
  delay(10); // 允许传感器稳定

  for (int i = 0; i < samples; i++) {
    total += analogRead(analogPin);
    delay(10);
  }

  digitalWrite(powerPin, LOW);

  int avgReading = total / samples;
  lastAnalogReading = avgReading;

  int percent = map(avgReading, dryValue, wetValue, 0, 100);
  return constrain(percent, 0, 100);
}

// 使用布尔数组更新LED状态
void updateLEDBar(int percent) {
  bool ledStates[5] = {0, 0, 0, 0, 0}; // 默认全部关闭

  if (percent <= 20) {
    ledStates[0] = true;
  } else if (percent <= 40) {
    ledStates[0] = ledStates[1] = true;
  } else if (percent <= 60) {
    ledStates[0] = ledStates[1] = ledStates[2] = true;
  } else if (percent <= 80) {
    ledStates[0] = ledStates[1] = ledStates[2] = ledStates[3] = true;
  } else {
    for (int i = 0; i < 5; i++) ledStates[i] = true;
  }

  // 将LED状态写入引脚
  for (int i = 0; i < 5; i++) {
    digitalWrite(ledPins[i], ledStates[i] ? HIGH : LOW);
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, LOW); // 开始时传感器断电

  for (int i = 0; i < 5; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW); // 确保所有LED开始时关闭
  }

  Serial.println("带5-LED条形图的土壤湿度监测器(布尔数组)");
}

void loop() {
  int moisturePercent = getMoisturePercent(sensorPin, powerPin, 20);

  // 打印模拟读数和百分比
  Serial.print("模拟读数:");
  Serial.print(lastAnalogReading);
  Serial.print("  |  湿度:");
  Serial.print(moisturePercent);
  Serial.println(" %");

  updateLEDBar(moisturePercent);

  delay(2000); // 每2秒更新一次
}

在草图中,您首先定义用于从传感器读取数据的模拟引脚和用于为传感器供电的数字引脚。您还定义了以下变量,这些变量将在代码中使用:

  • ledPins[5] - 一个数组,存储用于为每个LED供电的数字引脚。引脚从第一个LED到最后一个LED排列。即从左到右的视觉显示顺序
  • dryValue - 此变量存储在校准部分记录的干燥土壤的模拟值
  • wetValue - 此变量存储在校准部分记录的湿润土壤的模拟值
  • lastAnalogReading - 此变量存储传感器获取的最后读数。您使用此变量将实际模拟读数记录到串行监视器

getMoisturePercent函数为传感器通电,获取多个读数,为传感器断电,计算平均模拟读数,以百分比表示模拟读数,并返回百分比值。该函数还将平均模拟读数保存到lastAnalogReading变量。您可以在此处直接打印,但此草图将其保存在单独的变量中,以便稍后在loop函数中打印以提高可读性。

您可以使用map(avgReading, dryValue, wetValue, 0, 100)函数将存储在avgReading中的平均读数表示为百分比。该函数将平均读数从您的校准值dryValuewetValue的范围重新映射到0到100之间的新范围(其中0是最干燥,100是最湿润)。然后,您使用constrain函数将值保持在0和100范围内。

updateLEDBar函数使用LED显示百分比值。函数中的ledStates数组存储每个LED的逻辑状态。您首先设置所有LED关闭 - 即状态为0。接下来的逻辑是一个简单的if语句,通过将数组中的元素设置为true(相当于1)来打开对应于特定百分比范围的所需LED。您通过将ledStates中的状态写入ledPins中的引脚来结束函数。

setup函数相当常规:您设置串行通信的波特率,定义输入和输出数字引脚,并向数字输出引脚写入LOW以确保它们在开始时全部关闭。

loop函数中,您调用getMoisturePercent函数以获取百分比湿度值。然后,您将百分比值和平均模拟读数打印到串行监视器以清晰显示。最后,您调用updateLEDBar函数,以百分比值作为参数,打开相应的LED以指示湿度水平。

测试系统

您可以继续使用不同的湿度水平测试示例。例如:

  • 在约37%的湿度水平时,两个LED点亮
  • 在约76%的湿度水平时,四个LED点亮

您还可以在Tinkercad上模拟此示例:https://www.tinkercad.com/embed/6s47ZvIrNOP

示例2:从数字输出确定土壤湿度状态

在前一个项目中,您学习了如何从传感器

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计