当前位置: 首页 > backend >正文

【树莓派 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 temperatureoled.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_factortemp = 27 - (reading - 0.706)/0.001721# 打印到串口print("Analog Voltage: {:.2f} V , Temperature: {:.2f} °C".format(vol,temp))# 显示到OLEDdisplay_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-leveloled.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_factortemp = 27 - (reading - 0.706)/0.001721 # temperature (Celsius)# 打印到串口print("Analog Voltage: {:.2f} V , Temperature: {:.2f} °C , Water Level: {:.2f} mm".format(vol,temp,wl))# 显示到OLEDdisplay_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 的快速开发和相关产品的应用提供了参考。

http://www.xdnf.cn/news/2270.html

相关文章:

  • ZBrush2025.1.3 中文版【ZBrush2025版下载】附安装教程
  • tkinter中Listbox列表框常用的操作方法
  • 单片机-89C51部分:4、固件烧录
  • Pygame多人游戏开发:本地双人对战实战
  • C++篇——继承
  • 详解Adobe Photoshop 2024 下载与安装教程
  • Adruino:人机界面及接口技术
  • SSE协议
  • 飞帆:自定义控件平台
  • 【CF】Day44——Codeforces Round 908 (Div. 2) C + Codeforces Round 1020 (Div. 3) DE
  • PyQt6实例_消息工具_使用与完整代码分享
  • 网络安全于应用服务web中间件服务 默认配置文件的关联(配置漏洞)(完成)
  • 理解计算机系统_网络编程(3)
  • Python循环结构深度解析与高效应用实践
  • 基于STM32定时器中断讲解(HAL库)
  • leetcode66.加一
  • Dubbo(79)Dubbo的监控机制是如何实现的?
  • Python部署Docker报错:curl: (56) Recv failure: Connection reset by peer
  • 零拷贝技术原理的详细解析与java实战方案
  • Java中的final关键字【最通俗易懂】
  • 【Linux网络#1】:网络基础知识
  • Redux基础知识
  • 论文笔记(八十)π0.5: a Vision-Language-Action Model with Open-World Generalization
  • MCP协议:AI与数据世界的“万能连接器“
  • 作为无线信号传输如何理解WIFI信号本质上也是串行传输?
  • 基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
  • 【C++11】右值引用和移动语义:万字总结
  • 如何选择游戏支付平台呢?
  • RabbitMQ安装流程(Windows环境)
  • 数据库MySQL学习——day5(总结与复习实践)