风筝
发表于: 2022-11-15 15:48:35 | 显示全部楼层

如果您曾经遇到过热水器爆炸或者想要制作一款潜水电子产品,那么您就会知道检测水的重要性。


这正是水位传感器的有用之处!它可以测量水位、监测污水池、检测降雨以及检测泄漏。让我们开始详细地研究该传感器。


硬件概述

水位传感器(Water Level Sensor)有十根露铜的走线,其中五根是电源线,剩余五根是感测线。这些迹线纵向交错,每两根电源走线之间都有一根感测线。


通常情况下,电源走线和感测走线并没有连接,但是当浸入水中时,它们就会被水桥接。

Water-Level-Sensor-Hardware-Overview.jpg


传感器电路板上有一个电源LED灯,供电后,该LED灯将点亮。


水位传感器是如何工作的?

水位传感器的工作过程非常简单。电源走线和感测走线之间形成一个可变电阻器(非常类似于电位器),其电阻值取决于其暴露在水中的程度。

Water-Level-Sensor-Working.gif


该电阻值随传感器沉浸在水中的深度而变化:

●   传感器浸入水中越深,电导率越好,电阻值越小。

●   传感器浸入水中越浅,电导率越差,电阻值越大。

传感器产生与电阻成正比的输出电压。通过测量该电压,可以确定水位。


水位传感器引脚

水位传感器非常易于使用,只需要三个引脚即可连接。

Water-Level-Sensor-Pinout.jpg

●    S(信号)是一个模拟输出引脚,连接到Arduino其中一个模拟输入引脚。

●    +(VCC)引脚为传感器提供电源。建议将传感器连接到3.3V-5V。请记住,模拟输出将根据提供给传感器的电压而有所不同。

●    - (GND)是接地引脚。


水位传感器与Arduino开发板的硬件连接

让我们将水位传感器连接到Arduino开发板。首先,将模块上的 +(VCC)引脚连接到Arduino上的5V,将 - (GND)引脚连接到地。


这些传感器的一个众所周知的问题是它们的寿命较短,因为它们不断暴露于水分。此外,在浸入水中的同时不断向传感器施加电源会显着加速腐蚀速度。为了避免这种情况,建议仅在读取时才向传感器供电。


一种简单的方法是将传感器的电源引脚连接到Arduino上的数字引脚,并根据需要将其设置为高或低。因此,我们将 +(VCC)引脚连接到Arduino的数字引脚#7。


最后,将S(信号)引脚连接到Arduino的ADC引脚A0。下图是接线方式:

Wiring-Water-Level-Sensor-with-Arduino.jpg


Arduino基础示例

电路搭建完成后,将以下草图上传到Arduino开发板。

  1. // Sensor pins
  2. #define sensorPower 7
  3. #define sensorPin A0

  4. // Value for storing water level
  5. int val = 0;

  6. void setup() {
  7.         // Set D7 as an OUTPUT
  8.         pinMode(sensorPower, OUTPUT);
  9.         
  10.         // Set to LOW so no power flows through the sensor
  11.         digitalWrite(sensorPower, LOW);
  12.         
  13.         Serial.begin(9600);
  14. }

  15. void loop() {
  16.         //get the reading from the function below and print it
  17.         int level = readSensor();
  18.         
  19.         Serial.print("Water level: ");
  20.         Serial.println(level);
  21.         
  22.         delay(1000);
  23. }

  24. //This is a function used to get the reading
  25. int readSensor() {
  26.         digitalWrite(sensorPower, HIGH);        // Turn the sensor ON
  27.         delay(10);                                                        // wait 10 milliseconds
  28.         val = analogRead(sensorPin);                // Read the analog value form sensor
  29.         digitalWrite(sensorPower, LOW);                // Turn the sensor OFF
  30.         return val;                                                        // send current reading
  31. }
复制代码

上传草图后,打开串口监视器窗口。当传感器干燥时,它将输出值0;但是,随着传感器浸入水中,输出值将逐渐增加。

Water-Level-Sensor-Output.jpg


代码说明

首先声明传感器 +(VCC)和S(信号)引脚连接到的Arduino引脚编号。

  1. #define sensorPower 7
  2. #define sensorPin A0
复制代码

接下来定义一个变量val,保存当前的水位。

  1. int val = 0;
复制代码

在setup()函数中,我们首先配置传感器的电源连接为输出,然后将其设置低电平以使传感器最初保持关闭状态。

  1. pinMode(sensorPower, OUTPUT);
  2. digitalWrite(sensorPower, LOW);
  3. Serial.begin(9600);
复制代码

在loop()函数中,我们每一秒调用readSensor()自定义函数并打印结果。

  1. Serial.print("Water level: ");
  2. Serial.println(readSensor());
  3. delay(1000);
复制代码

readSensor()自定义函数只需打开传感器,等待10毫秒,从传感器读取模拟值,将其关闭并返回模拟值。

  1. int readSensor() {
  2.         digitalWrite(sensorPower, HIGH);
  3.         delay(10);
  4.         val = analogRead(sensorPin);
  5.         digitalWrite(sensorPower, LOW);
  6.         return val;
  7. }
复制代码

查找阈值

要估算水位,请记录传感器在完全干燥、部分浸入并完全浸入水中时传感器输出的值。只需运行上面的草图并读取读数即可。


当您运行草图时,您应该看到与下面的读数类似的读数:

●    传感器干燥时(0)

●    当传感器部分浸入水中时(〜420)

●    当传感器完全浸入水中时(〜520)

Water-Level-Sensor-Calibration.jpg


该测试可能需要一些反复试验。读取后,您可以将它们用作阈值来触发某些动作。


Arduino项目 - 水位指示器

在下一个示例中,我们将制作一个简单的水位指示器,该指示器将根据水位点亮LED。


我们将重复使用上一个示例的电路。这次我们只需要添加一些LED灯。使用220欧姆电阻将三个LED连接到数字引脚#2、#3和#4。


如下所示,连接电路:

Determining-Water-Level-with-LED-Indicators.jpg


Arduino代码

电路搭建完成后,将以下草图上传到Arduino。


该草图定义了两个变量:lowerThreshold和upperThreshold。这些变量代表水位阈值。


如果输出落在阈值下限以下,则红色LED将点亮,如果它升高到阈值上限以上,则绿色LED将点亮,如果它落在中间的某个位置,则黄色的LED会点亮。

  1. /* Change these values based on your calibration values */
  2. int lowerThreshold = 420;
  3. int upperThreshold = 520;

  4. // Sensor pins
  5. #define sensorPower 7
  6. #define sensorPin A0

  7. // Value for storing water level
  8. int val = 0;

  9. // Declare pins to which LEDs are connected
  10. int redLED = 2;
  11. int yellowLED = 3;
  12. int greenLED = 4;

  13. void setup() {
  14.         Serial.begin(9600);
  15.         pinMode(sensorPower, OUTPUT);
  16.         digitalWrite(sensorPower, LOW);
  17.         
  18.         // Set LED pins as an OUTPUT
  19.         pinMode(redLED, OUTPUT);
  20.         pinMode(yellowLED, OUTPUT);
  21.         pinMode(greenLED, OUTPUT);

  22.         // Initially turn off all LEDs
  23.         digitalWrite(redLED, LOW);
  24.         digitalWrite(yellowLED, LOW);
  25.         digitalWrite(greenLED, LOW);
  26. }

  27. void loop() {
  28.         int level = readSensor();

  29.         if (level == 0) {
  30.                 Serial.println("Water Level: Empty");
  31.                 digitalWrite(redLED, LOW);
  32.                 digitalWrite(yellowLED, LOW);
  33.                 digitalWrite(greenLED, LOW);
  34.         }
  35.         else if (level > 0 && level <= lowerThreshold) {
  36.                 Serial.println("Water Level: Low");
  37.                 digitalWrite(redLED, HIGH);
  38.                 digitalWrite(yellowLED, LOW);
  39.                 digitalWrite(greenLED, LOW);
  40.         }
  41.         else if (level > lowerThreshold && level <= upperThreshold) {
  42.                 Serial.println("Water Level: Medium");
  43.                 digitalWrite(redLED, LOW);
  44.                 digitalWrite(yellowLED, HIGH);
  45.                 digitalWrite(greenLED, LOW);
  46.         }
  47.         else if (level > upperThreshold) {
  48.                 Serial.println("Water Level: High");
  49.                 digitalWrite(redLED, LOW);
  50.                 digitalWrite(yellowLED, LOW);
  51.                 digitalWrite(greenLED, HIGH);
  52.         }
  53.         delay(1000);
  54. }

  55. //This is a function used to get the reading
  56. int readSensor() {
  57.         digitalWrite(sensorPower, HIGH);
  58.         delay(10);
  59.         val = analogRead(sensorPin);
  60.         digitalWrite(sensorPower, LOW);
  61.         return val;
  62. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 10:46 , Processed in 0.047721 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表