发帖
3 0 0

【Ai-M61-32S开发板】水位监测计

无垠的广袤
论坛元老

27

主题

28

回帖

3121

积分

论坛元老

积分
3121
QQ
电子DIY 29 3 3 小时前

【Ai-M61-32S开发板】水位监测计

水位检测在水资源管理、城市防洪、农业灌溉、家用电器和工业生产等多领域发挥积极建设作用。

利用水位传感器,可以实现水资源的智能管理,提高生产效率。

本文介绍了安信可 Ai-M61-32S 开发板结合水位传感器实现水位监测计的项目设计。

项目方案

  1. 通过读取 IO 接口的模拟值,
  2. 进行电压转换,获取检测到的电压值,
  3. 进一步通过电压-水位校准,实现水位高度的串口打印和串口绘图
  4. 实时水位监测功能

电压转换

根据欧姆定律,V = I / R,电压和电阻成正比;

因此通过获取 3.3V 和 GND 对应的模拟数值(实测为 3199 和 21),

即可得到实际电压的转换公式 Valtage = val * (3.3 / (3199-21)) .

代码

结合前面关于 IO 模拟值读取 的工程测试,进一步实现 实际电压 转换

#include <stdio.h>
​
void setup() {
    pinMode(19, INPUT);
    Serial.begin(115200);
}
​
void loop() {
    int val = analogRead(19); // analog value reading
    float vlt = val * (3.3 / (3199-21)); // real voltage conversion
    Serial.println(vlt);
    delay(200);
}

按住 IO2 键的同时,短按 EN 键,进入下载模式,配置端口号后上传工程,复位运行程序。

效果

analog_valtage.jpg

水位传感器

水位传感器(Water Sensor)可以检测水位高度(检测高度:0 - 40 mm),亦可用作雨滴传感器,用于各种天气状况的监测,检测是否下雨及雨量的大小,广泛应用于汽车自动刮水系统、智能灯光系统、洗衣机和智能天窗系统等。

模块简介

  • 当模块上电,电源指示 LED 点亮;
  • 工作电压:DC 3.3V - 5V
  • 输出类型:模拟信号;

water_level_sensor.jpg

传感器具有 10 条裸露的铜线,其中 5 条是电源铜线,另外 5 条是感测铜线。

走线隔行平行排列,每两条电源铜线间有一条感测铜线。

模块原理图

SCH_water-sensor2.jpg

参考:水位检测报警 - Telesky .

引脚定义

  • S(信号)为模拟输出;
  • +(VCC)为传感器供电;
  • –(GND)为接地。

water_sensor_pinout.jpg

参考:Arduino Uno 水位传感器 .

运行原理

当平行铜线之间有水时,水浸没的高度不同,电流不同。 铜线间的电阻根据水位的变化而变化。

电阻与水的高度成反比(传感器浸水越深,导电性越好,电阻越小,电流越大)。

water_level_sensor_resistance.gif

参考:水位传感器如何工作并与Arduino接口 .

因此根据 ADC 测量传感器输出的电压,便可以确定水位。

硬件连接

S -> IO19

+ -> 3V3

- -> GND

water_sensor_connect.jpg

硬件连接完成后,打开串口,此时输出的电压值应为 0 .

水位校准

由于各地的水质差异,导电性能不同,因此需要根据实际情况进行校准。

  • 多次校准,取平均值;
  • 每次校正前,需将 PCB 表面的平行铜线擦干,待测得电压为 0 时再置入水中,记录水位值和电压值。

校准数据采集

水位 10 毫米,相应的串口输出电压为 1.25 伏特

water-level-10mm.jpg

……

增加水位高度,采集多组电压-水位数据。

假设 ADC 读取电压(V)与水位高度(mm)为线性相关关系,
对上述数据进行拟合

water_level_linear_fit.jpg

获得拟合表达式 y = 41.774 x - 38.686

这里使用 Excel 软件进行拟合

工程代码

在代码中添加相应的水位高度定义

#include <stdio.h>
​
void setup() {
    pinMode(19, INPUT);
    Serial.begin(115200);
}
​
void loop() {
    int val = analogRead(19); // analog sensor value
    float vlt = val * (3.3 / (3199-21)); // real voltage conversion
    float wl = 41.774 * vlt - 38.686; // water level (mm) 
    Serial.print(val);
    Serial.print(",");
    Serial.print(vlt);
    Serial.print(",");
    Serial.println(wl);
    delay(200);
}

保存代码,构建工程,上传固件,复位后运行程序;

打开串口助手,连接目标串口对应的设备端口号,打开串口,获取实时 IO 模拟值、电压值(伏特)和水位值(毫米)

uart_val_vlt_wl.jpg

效果演示

water_level_sensor_move.gif

对应的水位演化曲线

water_level_curve.gif

结果分析

经过多次测量,可以获得较为理想的检测结果。

此外,校准和测量过程中发现 ADC 采集的电压值会随时间逐渐减小,可能原因是

  • PCB 板被液体浸润,液体表面张力导致初始时刻覆盖更大面积的铜板,电阻较小,输出电压较大;
  • 随着时间推移,表面张力被克服,PCB板液面覆盖面积逐渐平稳下降,此时电压也逐渐减小,最后趋于稳定。

类似“海水退潮”

因此采样和校准时需要等待示数稳定,再记录数值,以提高精度。

总结

本文介绍了安信可 Ai-M61-32S 开发板结合水位传感器实现水位监测计的项目设计,使用 Arduino IDE 编程,通过 IO 接口的模拟值的电压转换、电压-水位校准等流程,实现水位高度的串口打印和串口绘图,以及实时水位监测功能,为该模组的快速开发和相关产品的应用提供了参考。

──── 0人觉得很赞 ────

使用道具 举报

后续加个显示器,实时显示水位~
记得加个视频详细展示
传感器好多呀
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28580 个
  • 话题数: 40686 篇