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);
程序实现
// by 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秒
}
往被子里倒水
通过改变水位,可以看到水位的变化。