【树莓派 PICO 2 测评】ADC 水位监测系统
水位检测在水资源管理、城市防洪、农业灌溉、家用电器和工业生产等多领域发挥积极建设作用。
利用水位传感器,可以实现水资源的智能管理,提高生产效率。
本文介绍了树莓派 PICO 2 开发板结合水位传感器实现水位监测计的项目设计。
项目介绍
项目方案
- ADC 获取 analog I/O 接口的模拟值;
- 电压转换,获取 I/O 电压值;
- 连接水位传感器,进行电压-水位校准;
- OLED 实时显示电压、温度、水位高度,完成水位监测系统
电压转换
根据欧姆定律, V = I ⋅ R V=I\cdot R V=I⋅R,电压和电阻成正比;
因此通过获取 3.3V 和 GND 对应的模拟数值(分别为 65535 和 0),
即可得到实际电压的转换公式 Valtage = val * (3.3 / (65535 - 0))
.
水位传感器
水位传感器(Water Sensor)可以检测水位高度(检测高度:0 - 40 mm),亦可用作雨滴传感器,用于各种天气状况的监测,检测是否下雨及雨量的大小,广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。
模块简介
- 当模块上电,电源指示 LED 点亮;
- 工作电压:DC
3.3V - 5V
; - 输出类型:模拟信号;
传感器具有 10 条裸露的铜线,其中 5 条是电源铜线,另外 5 条是感测铜线。
走线隔行平行排列,每两条电源铜线间有一条感测铜线。
模块原理图
参考:水位检测报警 - Telesky .
引脚定义
- S(信号)为模拟输出;
- +(VCC)为传感器供电;
- –(GND)为接地。
参考:Arduino Uno 水位传感器 .
运行原理
当平行铜线之间有水时,水浸没的高度不同,电流不同。 铜线间的电阻根据水位的变化而变化。
电阻与水的高度成反比(传感器浸水越深,导电性越好,电阻越小,电流越大)。
参考:水位传感器如何工作并与Arduino接口 .
因此根据 ADC 测量传感器输出的电压,便可以确定水位。
硬件连接
OLED_SCL -> GP5
OLED_SDA -> GP4
Water-Sensor_Signal -> GP26
硬件连接完成后,终端打印测试,此时输出的电压值应为 0
.
水位校准
由于各地的水质差异,导电性能不同,因此需要根据实际情况进行校准。
-
多次校准,取平均值;
-
每次校正前,需将 PCB 表面的平行铜线擦干,待测得电压为 0 时再置入水中,记录水位值和电压值。
校准数据采集
水位 18 毫米,相应的串口输出电压为 1.28 伏特
……
增加水位高度,采集多组电压-水位数据。
假设 ADC 读取电压(V)与水位高度(mm)为线性相关关系,对上述数据进行拟合
获得拟合表达式 y = 41.774 x - 38.686
这里使用 Excel 软件对数据进行拟合
工程代码
代码包括两部分:
- ADC 测量电压并实现芯片温度转换;
- 水位传感器模拟电压的采集、水位高度转换。
电压和温度
OLED 显示 ADC 电压(伏特)和芯片温度(摄氏度)
'''
Name: ADC voltage, temperature and IIC OLED display
Version: v1.0
Date: 2025.04
Author: ljl
Other: Acquiring temperature data by ADC and showing on OLED screen
'''
# ADC
import machine
import time
# OLED
from machine import Pin, SoftI2C
import ssd1306
# ==== Initialized IIC OLED ====
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# ADC voltage and temperature
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535 - 0)
potentiometer = machine.ADC(26)
def display_VT(vol,temp): # voltage and temperature
oled.fill(0) # 清屏
oled.text("Analog Voltage: ", 0, 0)
oled.text("{:.2f} V".format(vol), 0, 15)
oled.text("Sensor Temperature: ", 0, 35)
oled.text("{:.2f} C".format(temp), 0, 50)
oled.show()
while True:
try:
vol = potentiometer.read_u16() * conversion_factor # voltage (V)
reading = sensor_temp.read_u16() * conversion_factor
temp = 27 - (reading - 0.706)/0.001721
# 打印到串口
print("Analog Voltage: {:.2f} V , Temperature: {:.2f} °C".format(vol,temp))
# 显示到OLED
display_VT(vol,temp)
except Exception as e:
print("Error:", e)
oled.fill(0)
oled.text("Error!", 0, 20)
oled.show()
time.sleep(1) # 每2秒更新一次
预期显示效果
水位显示
OLED 显示 ADC 电压(伏特)、芯片温度(摄氏度)和水位高度(毫米)
'''
Name: ADC voltage, temperature, water level and IIC OLED display
Version: v1.0
Date: 2025.04
Author: ljl
Other: Acquiring voltage, temperature and water level by ADC and showing on OLED screen
'''
# ADC
import machine
import time
# OLED
from machine import Pin, SoftI2C
import ssd1306
# ==== Initialized IIC OLED ====
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# ADC voltage and temperature
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
potentiometer = machine.ADC(26)
def display_VTW(vol,temp,wl): # voltage and temperature and water-level
oled.fill(0) # 清屏
oled.text("Analog Voltage: ", 0, 0)
oled.text("{:.2f} V".format(vol), 0, 10)
oled.text("Temperature: ", 0, 22)
oled.text("{:.2f} C".format(temp), 0, 32)
oled.text("Water Level: ", 0, 44)
oled.text("{:.2f} mm".format(wl), 0, 54)
oled.show()
while True:
try:
vol = potentiometer.read_u16() * conversion_factor # voltage (V)
wl = 41.774 * vol - 38.686 # water level (mm)
reading = sensor_temp.read_u16() * conversion_factor
temp = 27 - (reading - 0.706)/0.001721 # temperature (Celsius)
# 打印到串口
print("Analog Voltage: {:.2f} V , Temperature: {:.2f} °C , Water Level: {:.2f} mm".format(vol,temp,wl))
# 显示到OLED
display_VTW(vol,temp,wl)
except Exception as e:
print("Error:", e)
oled.fill(0)
oled.text("Error!", 0, 20)
oled.show()
time.sleep(1) # 每2秒更新一次
预期显示效果
效果展示
包括 ADC 电压采集、温度转换、水位高度的 OLED 显示和终端打印。
ADC 电压
ADC 实现模拟电压读取和芯片温度读取
OLED 显示
水位监测
终端打印
动态演示
分析总结
结果分析
经过多次测量,可以获得较为理想的检测结果。
此外,校准和测量过程中发现 ADC 采集的电压值会随时间逐渐减小,可能原因是
- PCB 板被液体浸润,液体表面张力导致初始时刻覆盖更大面积的铜板,电阻较小,输出电压较大;
- 随着时间推移,表面张力被克服,PCB板液面覆盖面积逐渐平稳下降,此时电压也逐渐减小,最后趋于稳定。
类似“海水退潮”
因此采样和校准时需要等待示数稳定,再记录数值,以提高精度。
总结
本文介绍了树莓派 Pico 2 开发板结合水位传感器实现水位监测计的项目设计,使用 Thonny IDE 编程,通过 IO 接口的模拟值的电压转换、电压-水位校准等流程,实现水位高度的终端输出及 OLED 显示,以及实时水位监测功能,为树莓派 Pico 2 的快速开发和相关产品的应用提供了参考。