【树莓派 PICO 2 测评】ADC 水位监测系统

【树莓派 PICO 2 测评】ADC 水位监测系统

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

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

本文介绍了树莓派 PICO 2 开发板结合水位传感器实现水位监测计的项目设计。

项目介绍

项目方案

  1. ADC 获取 analog I/O 接口的模拟值;
  2. 电压转换,获取 I/O 电压值;
  3. 连接水位传感器,进行电压-水位校准;
  4. OLED 实时显示电压、温度、水位高度,完成水位监测系统

电压转换

根据欧姆定律, V = I ⋅ R V=I\cdot R V=IR,电压和电阻成正比;

因此通过获取 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 软件对数据进行拟合

工程代码

代码包括两部分:

  1. ADC 测量电压并实现芯片温度转换;
  2. 水位传感器模拟电压的采集、水位高度转换。

电压和温度

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秒更新一次

预期显示效果

在这里插入图片描述

参考:ADC 的使用 – 树莓派 Pico 实验室 .

水位显示

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 的快速开发和相关产品的应用提供了参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值