You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取湿度传感器数据并启动水泵后程序卡顿,仅输出一次数据?

自动浇水系统GPIO卡住问题排查与修复

问题描述

我正在用湿度传感器搭配3.3V潜水泵制作自动浇水系统,原型开发阶段遇到异常:代码运行后仅打印一次湿度值就停止输出,疑似卡在GPIO引脚置高的步骤。

原代码

# import required modules
from machine import ADC, Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
 
# use variables instead of numbers:
soil = ADC(Pin(26)) # Soil moisture PIN reference
gpio_pin = machine.Pin(15, machine.Pin.OUT)

#Calibraton values
min_moisture=19200
max_moisture=49300
 
readDelay = 0.5 # delay between 
 
while True:
    # read moisture value and convert to percentage into the calibration range
    moisture = (max_moisture-soil.read_u16())*100/(max_moisture-min_moisture) 
    # print values
    print("moisture: " + "%.2f" % moisture +"% (adc: "+str(soil.read_u16())+")")
    
    if moisture < 80:
        gpio_pin.value(1)
        utime.sleep(2)
        gpio_pin.value(0)
    else:
        gpio_pin.value(0)
 
    utime.sleep(readDelay) # set a delay between readings

运行输出

moisture: 2.53% (adc: 48347)

问题根源

  1. GPIO直接驱动潜水泵导致硬件异常:3.3V潜水泵启动电流远超过单片机GPIO引脚的承载极限(通常仅能提供几毫安到几十毫安电流),直接连接会造成电源电压骤降,导致单片机复位或引脚损坏,程序因此终止运行。
  2. 代码冗余与小问题:已从machine模块导入Pin,却重复使用machine.Pin初始化引脚;两次调用soil.read_u16()会导致计算值与打印值不一致,但并非卡死直接原因。

修复方案

1. 必须添加驱动电路

禁止用GPIO直接驱动潜水泵,通过以下方式实现电流放大:

  • NPN三极管驱动:基极串联1kΩ电阻接GPIO,集电极连接潜水泵正极与电源,发射极接地;
  • 继电器/MOS管驱动:继电器需搭配续流二极管保护,防止反向电动势损坏电路。

2. 代码优化

# import required modules
from machine import ADC, Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
 
# use variables instead of numbers:
soil = ADC(Pin(26)) # Soil moisture PIN reference
gpio_pin = Pin(15, Pin.OUT)  # 统一引用方式

#Calibraton values
min_moisture=19200
max_moisture=49300
 
readDelay = 0.5 # delay between readings
 
while True:
    adc_value = soil.read_u16()  # 单次读取复用,避免误差
    # read moisture value and convert to percentage into the calibration range
    moisture = (max_moisture - adc_value) * 100 / (max_moisture - min_moisture) 
    # print values
    print(f"moisture: {moisture:.2f}% (adc: {adc_value})")
    
    if moisture < 80:
        gpio_pin.value(1)
        utime.sleep(2)
        gpio_pin.value(0)
    else:
        gpio_pin.value(0)
 
    utime.sleep(readDelay) # set a delay between readings

3. 额外硬件保护

在潜水泵供电回路中添加小型保险丝,防止短路损坏电源或单片机。

内容的提问来源于stack exchange,提问作者cw23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:11