基于气泡式测压法的水井液位监测与自动泵控系统设计

发布时间:2026/5/25 21:08:44

基于气泡式测压法的水井液位监测与自动泵控系统设计 1. 项目概述用气压法实现水井液位监测与自动泵控对于拥有水井的家庭或小型农场来说实时掌握井里的水位深度并根据需要自动控制水泵启停是一个既实用又能省心省力的需求。传统的浮球开关虽然简单但在深井、狭窄井或水质浑浊的环境中容易卡住或失效维护起来也不方便。我最近完成了一个自制的井水位监测与自动控制系统它采用了一种在工业上被称为“气泡式”或“吹气式”的液位测量原理核心思想非常巧妙通过向插入井底的管道里持续吹入微量空气测量管道内的背压这个压力值就直接对应了井水的水位高度。我的这口井大约6米深。整个系统的硬件核心是一块小小的ATTiny13单片机它负责读取经过放大的压力传感器信号计算出水位百分比然后驱动一个继电器来控制一台水泵我用的是一台Comet品牌水泵将井水抽到一个蓄水罐中。同时水位数据和泵的状态还会通过串口发送到一个外置的2行20字符的LCD屏幕上显示方便随时查看。整个电路板由12V直流电源供电这个电源也同时为水泵提供动力。下面我就把这个项目的设计思路、硬件搭建、软件编程以及调试中踩过的坑毫无保留地分享给大家。2. 核心原理与方案选型为什么选择“吹气法”在开始动手之前选择合适的测量方法是成功的第一步。对于家庭水井监测常见的方法有超声波、浮球、压力传感器直接投入以及我采用的这种气泡式测压法。2.1 各种液位测量方法的利弊分析超声波法在井口安装探头向水面发射超声波并接收回波通过时间差计算距离。这种方法非接触安装方便。但对于家庭水井环境井口可能有杂物、蜘蛛网水面波动会产生干扰且深井如6米对超声模块的功率和灵敏度要求较高成本也上去了。浮球法最经典的方法一个浮球随着水位升降带动杆或绳索触发开关。优点是极其简单、成本低。缺点是在深井中需要很长的机械结构容易卡滞特别是井壁不光滑或有沉淀物时长期浸泡也容易导致机构锈蚀或浮球破损。投入式压力传感器将传感器用电缆直接沉入井底测量其上的水压。这种方法精度高响应快。但最大的问题是传感器本身需要长期浸泡在水中对传感器的密封和耐腐蚀性要求极高。普通的传感器很快会损坏而高品质的潜水型压力传感器价格昂贵。气泡式吹气式测压法这正是本项目采用的方法。它的原理基于流体静力学P ρ * g * h。其中P是压力ρ是液体密度g是重力加速度h是液位高度。方法是将一根坚固的管道如PVC管或特氟龙管插入井底确保端口始终在最低水位以下。然后通过一个气泵我用的就是鱼缸增氧泵向这根管道里持续吹入非常缓慢、恒定的气流。气流在管道出口井底以气泡形式逸出。此时要维持气泡逸出管道内的空气压力必须刚好等于管道出口处的水压。因此测量管道内的气压就等于测量了井底以上的水柱高度即水位深度。2.2 气泡式测压法的独特优势选择这个方法我主要基于以下几点考虑传感器完全与水隔离压力传感器MPX10DP测量的是干燥的空气压力它被安装在井上的控制箱内环境干燥、清洁寿命极大延长。这是相比投入式传感器最大的优势。对管道要求低只需要一根能通气的管道插入井中管道本身无需任何电子部件不怕水泡成本低廉可靠性高。精度满足需求对于6米的水井水压约为0.6 bar约60kPa。MPX10DP的量程是0-10 kPa看似不够但通过后续会讲到的信号调理电路我们可以只测量水位变化范围内的压力差从而充分利用传感器的灵敏度。维护方便如果管道堵塞概率很低只需从井口提拉疏通或吹气清理即可传感器和气泵都在地上维护工作非常轻松。当然它也有缺点需要持续消耗微小的电能驱动气泵鱼缸泵功耗很低并且响应速度比直接投入式稍慢但对于水位变化缓慢的水井监测来说这完全不是问题。3. 硬件系统设计与核心元件解析整个硬件系统可以分为四个部分气路与压力产生单元、压力传感与信号调理单元、主控与逻辑处理单元、输出与显示单元。电源统一为12V DC。3.1 气路与压力产生单元这是测量的源头必须保证稳定。气泵选用普通鱼缸用微型空气泵。它的作用是提供持续、微小的气流。关键点不在于压力多大而在于流量要小且稳定。太大的气流会导致管道内压力波动测量不稳。我选择的泵标称出气量很小并通过一个可调节的阀门可以用医用输液调节阀或专门的针阀进一步精细控制直到在管道出口能看到缓慢、间隔均匀的单个气泡冒出为宜。这样能保证管道内的气压始终与静水压平衡。管道我使用了一段内径约4mm的聚乙烯软管。它柔软便于盘绕和固定。必须确保管道从井口到井底全程密封良好无漏气点。管道末端应固定在井底上方几厘米处防止吸入泥沙。管道在井口进入密封接头连接到三通。3.2 压力传感与信号调理单元这是系统的“感官”和“神经末梢”将物理量转化为单片机可以读取的电信号。压力传感器 MPX10DP这是一款非常经典的差分/表压传感器。它有两只压力端口P1和P2和一个电压输出端。在差分模式下输出与P1 - P2的压差成正比。在本应用中我们将P1端口连接到通往井底的气管感受水压对应的气压将P2端口敞开直接暴露在大气中。这样传感器输出的电压就直接正比于“井内气压 - 大气压”也就是消除了大气压变化的影响直接得到由水位引起的净压差。MPX10DP的满量程10kPa对应约1米水柱高度。对于6米井最大压差约60kPa远超其量程所以我们需要在电路上处理。运算放大器电路基于LM1458NLM1458N是一片双运放芯片。这里我们用两级运放电路来处理MPX10DP的信号。第一级差分放大与偏置消除。MPX10DP的典型输出是差分信号且有一个固定的偏置电压例如供电5V时零压差输出约为2.5V。第一级运放配置成差分放大器有两个作用一是放大微弱的压差信号二是通过调节参考电压将这个2.5V的偏置“归零”。假设我们只关心0-3米的水位变化对应0-30kPa传感器输出变化范围可能只有1.5V。我们可以通过调整差分放大器的增益将这1.5V的变化映射到更宽的电压范围比如0-3V以提高ADC转换的分辨率。第二级电压平移与限幅保护。ATTiny13的ADC输入范围是0到Vcc5V。经过第一级放大后的信号可能是以某个中间值为中心的例如1.5V为中心变化±0.75V。第二级运放可以配置成一个加法器或电平移位电路将这个信号整体平移并进一步放大最终确保在预期水位变化范围内输出信号严格落在0-5V之间最好留有裕量如0.2V~4.8V避免饱和。同时可以在输出端加入钳位二极管如1N4148到Vcc和GND保护单片机ADC引脚。注意运放电路的精确增益和偏置电压需要根据你使用的具体传感器数据手册参数、供电电压以及你期望测量的水位范围来计算和调整。最好在面包板上先调试好用万用表和可调压力源可以用长水管模拟进行校准。3.3 主控与逻辑处理单元微控制器 ATTiny13这是一款极简但功能齐全的8位AVR单片机。它拥有5个I/O口1个10位精度的ADC以及硬件PWM。对于本项目来说它恰到好处一个ADC通道读取压力电压两个I/O口用于控制继电器和状态LED利用软件模拟串口Software Serial与LCD通信。选择它的原因是成本极低功耗小且完全满足需求。编程使用汇编语言可以极致优化代码大小和运行效率。泵控制继电器模块ATTiny13的I/O口驱动能力有限约20mA无法直接驱动水泵可能几百瓦。因此必须使用继电器模块。我选用了一个标准的5V控制电压、带光耦隔离和续流二极管的继电器模块。ATTiny13的一个I/O口输出高电平5V驱动继电器吸合继电器的主触点接通水泵的220VAC或12VDC电源。强烈建议在继电器线圈两端并联一个反向的续流二极管如1N4007以吸收断开时产生的感应电动势保护单片机。3.4 输出与显示单元串口LCD显示屏我使用了一款支持9600波特率TTL串口通信的LCD20042行20字符模块。ATTiny13没有硬件UART因此需要用软件模拟一个串口Bit-banging来发送数据。程序里需要编写一个精确延时的UART_TX函数按照9600波特率每位约104us的时序将一个字节的数据位逐位发送到指定的I/O口。LCD模块的RX线就连接在这个I/O口上。显示内容可以设计为第一行显示“Level: 85%”第二行显示“PUMP: ON”或“PUMP: OFF”。电源整个系统采用12V/5A的开关电源供电。12V直接给水泵和继电器模块的输入端供电。同时通过一个7805线性稳压芯片将12V降为稳定的5V为ATTiny13、运放电路、压力传感器和LCD模块供电。注意计算总功耗7805在压差较大12V-5V7V时发热会较严重需要加装足够的散热片。4. 软件逻辑与汇编程序实现要点用汇编语言编写ATTiny13的程序追求的是极致的控制和精简。程序主要包含以下几个模块4.1 主程序流程与初始化程序上电后首先进行初始化设置时钟ATTiny13默认使用内部9.6MHz RC振荡器并8分频实际系统时钟1.2MHz。对于软件模拟9600波特率这个速度足够。配置I/O口设定用于ADC输入的引脚为输入模式用于继电器控制、LED指示和软件串口TX的引脚为输出模式并初始化为安全状态继电器断开。配置ADC选择连接到运放输出的ADC通道设置参考电压为AVcc5V选择适当的时钟分频如CK/128使ADC转换速度与系统需求匹配。初始化变量在SRAM中分配变量用于存储ADC原始值、滤波后的值、水位百分比、泵控制标志等。主循环是一个无限循环顺序执行以下任务主循环开始 - 调用【ADC采样与滤波函数】 - 调用【水位百分比计算函数】 - 调用【泵控制逻辑函数】 - 调用【显示更新函数】 - 延时例如等待约1秒 循环结束4.2 ADC采样与数字滤波压力信号可能含有毛刺来自气泵微小波动或电气噪声。直接读取单次ADC值是不可靠的。多次采样平均我连续进行16次ADC转换将结果累加然后右移4位除以16得到平均值。这能有效抑制随机噪声。软件低通滤波更进一步可以采用一阶无限脉冲响应IIR滤波公式如filtered_value α * new_sample (1-α) * old_filtered_value其中α是一个小于1的系数如0.1。这种滤波能平滑掉快速波动让水位读数更稳定。在汇编中实现乘法和定点小数运算需要一些技巧。4.3 水位百分比计算与标定这是核心算法。我们需要将滤波后的ADC值比如0-1023对应0-5V转换为水位百分比0%-100%。确定空井和满井的ADC值这是需要现场标定的。假设管道末端固定在井底0%水位对应管道口刚好露出不应该是井水抽干管道口暴露在空气中此时压力为0不对对于气泡法如果井水完全抽干管道口暴露在空气中那么管道内将没有背压传感器读数为0相对于大气压。但通常我们不会把井完全抽干而是设定一个最低安全水位防止泵空转比如对应ADC值ADC_MIN。同样设定一个最高水位井水满溢比如对应ADC值ADC_MAX。这两个值需要通过实际测量获得记录水泵停止后水位稳定在最低安全水位时的ADC值ADC_MIN以及井水自然满溢时的ADC值ADC_MAX。线性映射计算水位百分比 (当前ADC值 - ADC_MIN) * 100 / (ADC_MAX - ADC_MIN)。在汇编中实现16位减法和除法运算。结果限制在0-100之间。4.4 泵控制逻辑控制逻辑要兼顾自动化和保护。; 伪代码逻辑 if (水位百分比 启动阈值如90%) then if (泵状态 关闭) then 打开泵继电器 设置泵状态标志为开 endif else if (水位百分比 停止阈值如30%) then if (泵状态 开启) then 关闭泵继电器 设置泵状态标志为关 endif endif这里引入了“启动阈值”和“停止阈值”并设置了一个回差90%开30%关。这能防止水泵在水位临界点附近频繁启停称为“水泵抖动”保护水泵和继电器。阈值可以根据蓄水罐大小和个人用水习惯调整。4.5 软件串口发送与显示格式化由于ATTiny13没有硬件串口我们需要用软件精确控制一个I/O口的高低电平时间来模拟串口时序。位时序9600波特率意味着每位持续时间为1/9600 ≈ 104.17微秒。在1.2MHz系统时钟下需要精确延时约125个时钟周期。通常用循环嵌套来实现微秒级延时。发送函数函数接收一个待发送的字节。流程是先发送一个起始位低电平持续104us然后从最低位LSB开始依次发送8个数据位每个位根据值是0或1输出低或高电平持续104us最后发送1-2个停止位高电平持续104us。数据格式化将计算出的水位百分比数值0-100转换为ASCII字符串。例如数值85需要转换为字符‘8’和‘5’。汇编中可以通过除以10得到十位和个位然后加上字符‘0’的ASCII码0x30得到对应字符。然后按照“Level: XX%”和“PUMP: ON/OFF”的格式依次调用串口发送函数发送每个字符。5. 系统组装、校准与调试实录5.1 PCB制作与组装为了可靠性我将运放电路、单片机最小系统和继电器驱动电路整合到一块自制的PCB上。7805稳压芯片和继电器等发热元件要布局在板子边缘并预留散热空间。电源入口、气泵接口、水泵接口、LCD接口都用接线端子引出方便连接。单片机建议使用IC座便于烧写和更换。5.2 气路安装与密封将气管牢固地插入井底井口部分用防水密封胶如硅橡胶妥善密封防止雨水渗入或漏气。气管另一端连接到三通三通另外两口分别接气泵和压力传感器。在气泵出口处安装那个微型调节阀。5.3 上电调试与校准步骤基本功能测试不接气管先给电路板上电。用万用表测量7805输出是否为稳定的5V。测量运放电路当传感器两个端口都暴露在空气中时压差为0调节运放的偏置电位器使最终输出到单片机ADC引脚的电压在中间值附近如2.5V。气路测试连接气管和气泵。将气管的测量端放入一个已知深度的水桶中。打开气泵调节阀门使气泡缓慢冒出。用万用表测量运放输出电压同时用尺子测量水深。记录不同水深例如0cm 50cm 100cm下的输出电压。检查其线性度。软件标定将系统安装到井口。确保水泵电源断开。让井水处于最高水位自然满溢状态。运行单片机程序通过调试接口或让LCD显示原始ADC值记录此时的ADC值这就是ADC_MAX。启动水泵抽水直到水位下降到你认为的最低安全水位防止水泵干抽的水位。停止水泵记录此时的ADC值这就是ADC_MIN。将这两个值写入程序的常量定义中重新编译烧录。泵控制逻辑测试修改程序中的启动/停止阈值到容易触发测试的值比如当前水位附近。连接水泵可以先接一个灯泡做假负载测试观察水位变化时继电器动作和LCD显示是否符合预期。6. 常见问题、故障排查与优化建议在实际搭建和运行中你可能会遇到以下问题6.1 压力读数不稳定或跳动大可能原因1气流量过大。气泡变成连续气流导致管内压力波动。解决调小气泵阀门确保是缓慢的单个气泡。可能原因2气路漏气。解决用肥皂水涂抹所有气管接头检查是否有气泡产生。紧固或更换接头。可能原因3电气噪声。解决确保传感器和运放电路的电源去耦电容通常为0.1uF陶瓷电容并联10uF电解电容紧靠芯片电源引脚安装。模拟部分传感器、运放的接地与数字部分单片机、继电器的接地最好在一点相连星型接地。可能原因4软件滤波不足。解决增加ADC采样次数或采用更强的IIR滤波算法。6.2 水位百分比计算不准可能原因标定不准确。ADC_MAX和ADC_MIN是在特定条件下记录的如果气泵压力特性变化或环境温度变化可能漂移。解决进行多点标定。记录多个水位深度对应的ADC值观察线性关系。如果非线性严重可能需要查气路或传感器。也可以考虑在软件中采用查表法LUT进行非线性校正。6.3 水泵频繁启停抖动可能原因控制逻辑回差太小。例如设置成水位到50%开49%关。解决增大回差。如“高于80%开启低于40%关闭”。回差区间应大于水位测量本身的波动范围和泵抽水引起的瞬时水位下降。可能原因水位测量更新太快。主循环延时太短水位微小波动被迅速捕捉。解决增加主循环的延时比如每2-3秒测量控制一次。或者在控制逻辑中加入“状态保持时间”即水泵开启或关闭后必须稳定运行至少一段时间如30秒才允许再次判断切换。6.4 软件串口显示乱码可能原因波特率不匹配。软件模拟的延时不够精确。解决仔细计算延时循环的时钟周期数。由于ATTiny13内部RC振荡器频率有偏差±10%可能导致波特率误差过大。解决方法是使用芯片的校准字节OSCCAL来微调内部振荡器频率或者改用外部晶振但ATTiny13通常不支持。一个更简单的方法是调整软件延时通过示波器测量实际发出的位宽度反复调整直到接近104us。也可以尝试降低波特率到4800位宽变为208us对时序精度要求降低。6.5 系统长期运行建议气管保护井内部分的气管建议使用抗老化、防藻类的材料或者放入一根较粗的护套管中。防雷与防浪涌如果井口距离控制箱较远建议在气管进入控制箱处安装一个气体放电管或TVS管防止感应雷击从气管引入损坏电路。电源保护水泵是大感性负载启停时会产生很大的电压尖峰。除了继电器线圈加续流二极管最好在12V电源入口处也加上压敏电阻和滤波电容。功能扩展ATTiny13的Flash和RAM几乎用尽。如果想增加更多功能如水位历史记录、通过Wi-Fi远程查看、多级泵控制等可以考虑升级到ATTiny85、ATmega328PArduino Nano核心或ESP8266等资源更丰富的芯片。

相关新闻