凌顺实验室/指南/Arduino 指南/

Arduino Uno 水位传感器

实现效果

往杯子里倒水,水位的变化,可以通过串口监视器看到水位传感器输出的数值变化。
在本次实验中,用的是自来水。
经过实验,干燥的情况下(还没有浸泡水),电阻值最大,输出的的模拟信号为0,慢慢地,往杯子里加水,会看到模拟信号会越来越大,说明已经发生了导电,而且随着水越来越多,导电性越来越好。直到满水完全覆盖排列的铜线后,获取的模拟信号数值最大为380左右

通过这个数值,我们就可以判断当前水位的高度。

元件说明

水位传感器(Water Sensor),不仅可以检测水位高度(虽然这个只能检测的高度差只有4cm),亦可用作雨滴传感器,用于各种天气状况的监测,检测是否下雨及雨量的大小,广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。

  • 模块上有一个电源LED,当模块上电时,该LED会亮起。
  • 工作电压:DC3.3V-5V
  • 输出类型:模拟信号

!!注意,在使用的过程中,水位传感器/雨滴传感器除了铜线排列部分,其他裸露的电路板位置应应做好防水保护,以免短路烧坏模块

工作原理

水位传感器的工作原理非常简单。

该传感器具有一系列的共十条裸露的铜线,其中五个是电源铜线,另外五个是感测铜线。
这些走线是隔行排列的,因此每两个电源铜线之间就有一个感测铜线。

通常,这些迹线没有连接,但浸入水中时会被水桥接。
这些被水连接起来的铜线,根据水浸没的程度,电流的流通量会不一样。
就好像一个可变电阻(就像一个电位器),其电阻根据水位的变化而变化。
电阻的变化与传感器浸没的多少相对应。

电阻与水的高度成反比,原因如下:
传感器浸入的水越多,导电性就越好,阻力就越小,连通的电量值就越大。
传感器浸入的水越少,导电性越差,电阻越大,连通的电量值就越小。
传感器根据电阻产生输出电压,通过测量我们可以确定水位。

然而,纯净水是不导电的,水中的矿物质和杂质才使其具有导电性。
也就所以,在你的实验当中得出的数值会有可能与我实验的不一样。

在用作雨滴传感器也是一样的原理,雨水滴在排列的铜线表面,就可以产生连接,从而产生导电电量,就有模拟型号的变化。

引脚说明

GND (-) 模拟输出口(Analog Output),输出数值0-1023
VCC (+) 地线,该连接到Arduino的地线(GND)
S 供电口,接3.3V-5V直流电源

BOM表

名称 数量
Arduino Uno x1
水位传感器 x1
跳线(杜邦线) 若干
水杯 x1
适量

接线方式

Arduino Uno 引脚 <-> 水位传感器 引脚
5V <-> VCC(+)
GND <-> GND(-)
S <-> AO

水位传感器fritzing 素材参考下载:
https://fritzing.org/projects/test-water-sensor

程序提点

获取水位传感器模拟信号数据

通过analogRead()函数,获取A0模拟口的数据,并存入指定变量,例如:

val = analogRead(A0);

if语句的用法

if... 就是 如果什么就做什么
if...else... 就是 如果什么就做什么,否则就做什么

if的语法有几种,可以参考一下

if...基本用法

if(boolean_expression)
{
   // 如果布尔表达式为真将执行的语句
}

if...else... 基本用法

if(boolean_expression)
{
   // 如果布尔表达式为真将执行的语句
}
else
{
   // 如果布尔表达式为假将执行的语句
}

多条件if...else...语句

if(boolean_expression 1)
{
   // 当布尔表达式 1 为真时执行
}
else if( boolean_expression 2)
{
   // 当布尔表达式 2 为真时执行
}
else if( boolean_expression 3)
{
   // 当布尔表达式 3 为真时执行
}
else 
{
   // 当上面条件都不为真时执行
}

一行的if语句,则可以省略方括号。

if (x > 120) digitalWrite(LEDpin, HIGH);

如果这样做,下一行(由分号定义)将成为唯一的条件语句。

if (x > 120)
digitalWrite(LEDpin, HIGH);

程序实现

// lingshunlab.com

int val = 0; //定义一个变量 val ,初始化值为0

void setup() {
  Serial.begin(9600); // 设置波特率为9600
}

void loop() {
  val = analogRead(A0); // 获取A0模拟口的数据,并赋值给 val 变量
  Serial.print("val = "); // 串口输出 val 当前的数据
  Serial.print(val);
  
  if(val < 10) { // 如果 val 小于 10 
    Serial.println(" | dry"); // 说明很干,没有水
  } else if(val < 300) { // 如果 小于 300
    Serial.println(" | water level: ~ 0-1 cm"); // 水位大约在0-1cm ,以下语句如此类推
  } else if(val < 345) {
    Serial.println(" | water level: ~ 1-2 cm");
  } else if(val < 365) {
    Serial.println(" | water level: ~ 2-3 cm");
  } else if(val < 385) {
    Serial.println(" | water level: ~ 3-4 cm");
  } else {
    Serial.println(" | water level: over 4 cm");
  }
  delay(1000); // 等待1秒
}

往被子里倒水

通过改变水位,可以看到水位的变化。