芯查查logo
  • 物料选型
  • 数据服务
    1. 新产品
    2. 查替代
    3. 丝印反查
    4. 查品牌
    5. PCN/PDN
    6. 查方案
    7. 查代理
    8. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监测预警
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
无垠的广袤
华东师范大学-学术研究/教师
【树莓派 PICO 2 测评】ADC 水位监测系统

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

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

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

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

项目介绍

项目方案

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

电压转换

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

因此通过获取 3.3V 和 GND 对应的模拟数值(分别为 65535 和 0),

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

水位传感器

水位传感器(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 水位传感器 .

运行原理

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

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

2025-04-26_135112.jpg

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

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

硬件连接

OLED_SCL -> GP5

OLED_SDA -> GP4

Water-Sensor_Signal -> GP26

pico-oled-water-sensor-connect.jpg

硬件连接完成后,终端打印测试,此时输出的电压值应为 0 .

水位校准

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

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

校准数据采集

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

water-level-test.jpg

……

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

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

water_level_linear_fit.jpg

获得拟合表达式 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秒更新一次

预期显示效果

OLED_ADC_voltage_temp.jpg

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

预期显示效果

OLED_ADC_voltage_temp_water-level.jpg

效果展示

包括 ADC 电压采集、温度转换、水位高度的 OLED 显示和终端打印。

ADC 电压

ADC 实现模拟电压读取和芯片温度读取

2025-04-26_135436.jpg

OLED 显示效果

​2025-04-26_135519.jpg

水位监测

终端打印

2025-04-26_135616.jpg

OLED 显示

​
2025-04-26_135657.jpg

分析总结

结果分析

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

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

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

类似“海水退潮”

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

总结

本文介绍了树莓派 Pico 2 开发板结合水位传感器实现水位监测计的项目设计,使用 Thonny IDE 编程,通过 IO 接口的模拟值的电压转换、电压-水位校准等流程,实现水位高度的终端输出及 OLED 显示,以及实时水位监测功能,为树莓派 Pico 2 的快速开发和相关产品的应用提供了参考。

开发板测评 树莓派pico 2
版块: 开发板测评
2025/04/26 13:58
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
【星允派 NEBULA PI】09:USB虚拟CDC与串口1【星允派 NEBULA PI】15:高级定时器输出PWM【星允派 NEBULA PI】14:使用DMA方式读取ADC【有奖话题35期】明明硬件比软件难,但为什么待遇还不如软件?【星允派 NEBULA PI】12:添加时间任务调度器
热门版块
查看更多
问型号
问技术
问行情
电子DIY
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

182

收藏

分享

微信扫码
分享给好友

评论