Skip to content

Arduino - 水位检测器/传感器

水传感器是一种简单的设备,用于检测水的存在,在雨水检测器、泄漏报警器或植物浇水系统等项目中非常有用。虽然它可以用于简单的干湿检测,但当它被视为模拟设备时,其真正的潜力才能被释放。

本更新教程将向您展示如何将水传感器连接到Arduino的模拟输入端口。这使您能够测量检测到多少水,而不仅仅是水的存在。我们还将讨论传感器的主要限制——腐蚀,以及延长其寿命的技术。

  • 1 × Arduino Uno R3 (或类似型号)
  • 1 × 电阻式水传感器
  • 1 × LED
  • 1 × 220 欧姆电阻
  • 1 × 面包板和跳线

传感器有三个引脚:信号 (S)、VCC (+) 和 GND (-)。我们将把信号引脚连接到模拟输入端口,以读取变化的电阻。

Sensor Pin Arduino Pin
-----------------------------------
S -----------> A0
+ -----------> 5V
- -----------> GND
LED Anode (+) ----> (220 Ohm Resistor) ----> Pin 9
LED Cathode (-) --> GND

此草图从传感器读取模拟值,并使用一个阈值来判断是否存在水。它将原始传感器值打印到串行监视器,这对于校准至关重要。

/*
* 高级水检测器
*
* 此草图通过模拟引脚读取水传感器,以获取水的存在情况的变量读数。
* 它还将值打印到串行监视器,便于校准。
*/
// --- 引脚定义 ---
const int waterSensorPin = A0; // 传感器的S引脚连接到模拟引脚A0
const int ledPin = 9; // LED指示灯引脚
// --- 校准 ---
// 此阈值决定了传感器值达到多少时我们认为有水。
// 您可能需要根据您的传感器和设置调整此值。
// 检查串行监视器以找到一个合适的值。
const int waterThreshold = 400;
void setup() {
// 初始化串行通信用于调试
Serial.begin(9600);
// 设置引脚模式
pinMode(ledPin, OUTPUT);
}
void loop() {
// 从传感器读取模拟值(范围0-1023)
int sensorValue = analogRead(waterSensorPin);
// 将值打印到串行监视器以进行调试/校准
Serial.print("Sensor Value: ");
Serial.println(sensorValue);
// 检查传感器值是否超过阈值
if (sensorValue > waterThreshold) {
// 检测到水!
digitalWrite(ledPin, HIGH);
Serial.println("Status: Water Detected");
} else {
// 未检测到水
digitalWrite(ledPin, LOW);
Serial.println("Status: Dry");
}
// 等待半秒钟再进行下一次读取
delay(500);
}

analogRead(pin): 与简单的HIGH/LOW不同,此函数返回一个0到1023之间的整数值,代表引脚上的电压(0表示0V,1023表示5V)。随着传感器的更多走线被水连接,电阻下降,A0引脚上的电压升高,从而导致更高的sensorValue。

校准是关键:waterThreshold的值400只是一个起始点。要为您的设置找到合适的值:

  1. 上传代码并打开串行监视器(工具 > 串行监视器)。
  2. 保持传感器干燥并观察读数(例如,它们可能在0-50之间)。
  3. 将传感器浸入水中并观察新的更高读数(例如,它们可能在500-700之间)。
  4. 选择一个介于干燥和潮湿读数之间的安全阈值。

这些简单的电阻式传感器有一个主要缺陷:电解。当直流电流通过水中暴露的金属走线时,它们会迅速腐蚀和降解,导致传感器在几天或几周内变得不可靠。这是初学者项目中常见的故障点。

为了显著延长传感器的寿命,只在需要读取数据的那一小段时间内为其供电。您可以通过将传感器的VCC引脚连接到Arduino的数字引脚而不是5V电源轨来实现这一点。

以下是您将如何修改代码以实现此改进设置(假设传感器+现在连接到引脚7):

// 将此添加到您的引脚定义中
const int sensorPowerPin = 7;
// 在setup()中添加:
pinMode(sensorPowerPin, OUTPUT);
// 在loop()中,像这样封装您的读取操作:
digitalWrite(sensorPowerPin, HIGH); // 打开传感器电源
delay(10); // 等待片刻,让电压稳定
int sensorValue = analogRead(waterSensorPin);
digitalWrite(sensorPowerPin, LOW); // 立即关闭传感器电源
// ... 其余逻辑保持不变

该传感器非常适合简单的地下室洪水报警器(可与蜂鸣器结合使用!)或雨水检测器。对于需要长期可靠性的应用,特别是在土壤中,请考虑使用电容式湿度传感器。这些传感器没有裸露的电极,并且不受腐蚀影响,使其成为永久安装的更好选择。