|
如果您曾经遇到过热水器爆炸或者想要制作一款潜水电子产品,那么您就会知道检测水的重要性。
这正是水位传感器的有用之处!它可以测量水位、监测污水池、检测降雨以及检测泄漏。让我们开始详细地研究该传感器。
硬件概述 水位传感器(Water Level Sensor)有十根露铜的走线,其中五根是电源线,剩余五根是感测线。这些迹线纵向交错,每两根电源走线之间都有一根感测线。
通常情况下,电源走线和感测走线并没有连接,但是当浸入水中时,它们就会被水桥接。
传感器电路板上有一个电源LED灯,供电后,该LED灯将点亮。
水位传感器是如何工作的? 水位传感器的工作过程非常简单。电源走线和感测走线之间形成一个可变电阻器(非常类似于电位器),其电阻值取决于其暴露在水中的程度。
该电阻值随传感器沉浸在水中的深度而变化: ● 传感器浸入水中越深,电导率越好,电阻值越小。 ● 传感器浸入水中越浅,电导率越差,电阻值越大。 传感器产生与电阻成正比的输出电压。通过测量该电压,可以确定水位。
水位传感器引脚 水位传感器非常易于使用,只需要三个引脚即可连接。
● S(信号)是一个模拟输出引脚,连接到Arduino其中一个模拟输入引脚。 ● +(VCC)引脚为传感器提供电源。建议将传感器连接到3.3V-5V。请记住,模拟输出将根据提供给传感器的电压而有所不同。 ● - (GND)是接地引脚。
水位传感器与Arduino开发板的硬件连接 让我们将水位传感器连接到Arduino开发板。首先,将模块上的 +(VCC)引脚连接到Arduino上的5V,将 - (GND)引脚连接到地。
这些传感器的一个众所周知的问题是它们的寿命较短,因为它们不断暴露于水分。此外,在浸入水中的同时不断向传感器施加电源会显着加速腐蚀速度。为了避免这种情况,建议仅在读取时才向传感器供电。
一种简单的方法是将传感器的电源引脚连接到Arduino上的数字引脚,并根据需要将其设置为高或低。因此,我们将 +(VCC)引脚连接到Arduino的数字引脚#7。
最后,将S(信号)引脚连接到Arduino的ADC引脚A0。下图是接线方式:
Arduino基础示例 电路搭建完成后,将以下草图上传到Arduino开发板。 - // Sensor pins
- #define sensorPower 7
- #define sensorPin A0
- // Value for storing water level
- int val = 0;
- void setup() {
- // Set D7 as an OUTPUT
- pinMode(sensorPower, OUTPUT);
-
- // Set to LOW so no power flows through the sensor
- digitalWrite(sensorPower, LOW);
-
- Serial.begin(9600);
- }
- void loop() {
- //get the reading from the function below and print it
- int level = readSensor();
-
- Serial.print("Water level: ");
- Serial.println(level);
-
- delay(1000);
- }
- //This is a function used to get the reading
- int readSensor() {
- digitalWrite(sensorPower, HIGH); // Turn the sensor ON
- delay(10); // wait 10 milliseconds
- val = analogRead(sensorPin); // Read the analog value form sensor
- digitalWrite(sensorPower, LOW); // Turn the sensor OFF
- return val; // send current reading
- }
复制代码上传草图后,打开串口监视器窗口。当传感器干燥时,它将输出值0;但是,随着传感器浸入水中,输出值将逐渐增加。
代码说明 首先声明传感器 +(VCC)和S(信号)引脚连接到的Arduino引脚编号。 - #define sensorPower 7
- #define sensorPin A0
复制代码接下来定义一个变量val,保存当前的水位。 在setup()函数中,我们首先配置传感器的电源连接为输出,然后将其设置低电平以使传感器最初保持关闭状态。 - pinMode(sensorPower, OUTPUT);
- digitalWrite(sensorPower, LOW);
- Serial.begin(9600);
复制代码在loop()函数中,我们每一秒调用readSensor()自定义函数并打印结果。 - Serial.print("Water level: ");
- Serial.println(readSensor());
- delay(1000);
复制代码readSensor()自定义函数只需打开传感器,等待10毫秒,从传感器读取模拟值,将其关闭并返回模拟值。 - int readSensor() {
- digitalWrite(sensorPower, HIGH);
- delay(10);
- val = analogRead(sensorPin);
- digitalWrite(sensorPower, LOW);
- return val;
- }
复制代码
查找阈值 要估算水位,请记录传感器在完全干燥、部分浸入并完全浸入水中时传感器输出的值。只需运行上面的草图并读取读数即可。
当您运行草图时,您应该看到与下面的读数类似的读数: ● 传感器干燥时(0) ● 当传感器部分浸入水中时(〜420) ● 当传感器完全浸入水中时(〜520)
该测试可能需要一些反复试验。读取后,您可以将它们用作阈值来触发某些动作。
Arduino项目 - 水位指示器 在下一个示例中,我们将制作一个简单的水位指示器,该指示器将根据水位点亮LED。
我们将重复使用上一个示例的电路。这次我们只需要添加一些LED灯。使用220欧姆电阻将三个LED连接到数字引脚#2、#3和#4。
如下所示,连接电路:
Arduino代码 电路搭建完成后,将以下草图上传到Arduino。
该草图定义了两个变量:lowerThreshold和upperThreshold。这些变量代表水位阈值。
如果输出落在阈值下限以下,则红色LED将点亮,如果它升高到阈值上限以上,则绿色LED将点亮,如果它落在中间的某个位置,则黄色的LED会点亮。 - /* Change these values based on your calibration values */
- int lowerThreshold = 420;
- int upperThreshold = 520;
- // Sensor pins
- #define sensorPower 7
- #define sensorPin A0
- // Value for storing water level
- int val = 0;
- // Declare pins to which LEDs are connected
- int redLED = 2;
- int yellowLED = 3;
- int greenLED = 4;
- void setup() {
- Serial.begin(9600);
- pinMode(sensorPower, OUTPUT);
- digitalWrite(sensorPower, LOW);
-
- // Set LED pins as an OUTPUT
- pinMode(redLED, OUTPUT);
- pinMode(yellowLED, OUTPUT);
- pinMode(greenLED, OUTPUT);
- // Initially turn off all LEDs
- digitalWrite(redLED, LOW);
- digitalWrite(yellowLED, LOW);
- digitalWrite(greenLED, LOW);
- }
- void loop() {
- int level = readSensor();
- if (level == 0) {
- Serial.println("Water Level: Empty");
- digitalWrite(redLED, LOW);
- digitalWrite(yellowLED, LOW);
- digitalWrite(greenLED, LOW);
- }
- else if (level > 0 && level <= lowerThreshold) {
- Serial.println("Water Level: Low");
- digitalWrite(redLED, HIGH);
- digitalWrite(yellowLED, LOW);
- digitalWrite(greenLED, LOW);
- }
- else if (level > lowerThreshold && level <= upperThreshold) {
- Serial.println("Water Level: Medium");
- digitalWrite(redLED, LOW);
- digitalWrite(yellowLED, HIGH);
- digitalWrite(greenLED, LOW);
- }
- else if (level > upperThreshold) {
- Serial.println("Water Level: High");
- digitalWrite(redLED, LOW);
- digitalWrite(yellowLED, LOW);
- digitalWrite(greenLED, HIGH);
- }
- delay(1000);
- }
- //This is a function used to get the reading
- int readSensor() {
- digitalWrite(sensorPower, HIGH);
- delay(10);
- val = analogRead(sensorPin);
- digitalWrite(sensorPower, LOW);
- return val;
- }
复制代码
|