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

树莓派Pico项目:满足条件时Relay未激活的Python逻辑问题排查

树莓派Pico继电器逻辑问题修复

问题概述

基于树莓派Pico的项目中,按下offSwitch时,其状态值从1变为0,控制器能检测到状态变化,但offRelay未按预期激活。手动在主代码块前设置offRelay(1)时继电器可正常工作,说明引脚配置正确,问题出在Python逻辑实现上。

原代码

from machine import Pin
from time import sleep
#var's pinouts
offRelay = Pin(18,Pin.OUT)
offSwitch = Pin(2,Pin.IN, Pin.PULL_UP)
leadRelay = Pin(19,Pin.OUT)            
leadFloat = Pin(6, Pin.IN, Pin.PULL_UP)
lagFloat = Pin(10, Pin.IN, Pin.PULL_UP)
lagRelay = Pin(20, Pin.OUT)
hwwFloat = Pin(14, Pin.IN, Pin.PULL_UP)
hwwRelay = Pin(21, Pin.OUT)
offLight = Pin(3, Pin.OUT)
pumpOneLight = Pin(7, Pin.OUT)
pumpTwoLight = Pin(11, Pin.OUT)
hwwLight = Pin(15, Pin.OUT)

#Functions



#main code
while offSwitch == 1:
  if offSwitch == 0:
   offRelay(1)
  if offSwitch(0) and leadFloat(0):
   leadRelay(1)
   offLight(1)
   pumpOneLight(1)
  if offSwitch(0) and leadFloat(0) and lagFloat(0):
   lagRelay(1)
   pumpTwoLight(1)
  if hwwFloat == 0:
   hwwRelay(1)
   hwwLight(1)

#Test activity
print(offSwitch.value(),"off float")
print(offRelay.value(), "off relay")
print(leadFloat.value(), "lead float")
print(leadRelay.value(), "lead relay")
print(offLight.value(), "off float led light")
print(lagFloat.value(), "lag float")
print(lagRelay.value(), "lag relay")
print(pumpTwoLight.value(), "pump 2 led light")
print(hwwFloat.value(), "hww float")
print(hwwRelay.value(), "hww relay")

核心错误分析

  1. Pin对象直接与整数比较:所有判断开关/浮球状态的代码(如while offSwitch == 1、if offSwitch == 0)都是错误的,必须通过Pin.value()方法获取引脚的数字电平值。
  2. 错误的引脚状态调用方式:offSwitch(0)这种写法不符合MicroPython的Pin API,读取状态要写offSwitch.value() == 0,设置输出才用Pin.value(1)或直接Pin(1)(规范写法是用value方法)。
  3. 主循环逻辑矛盾:原循环条件是while offSwitch == 1,当offSwitch变为0时循环直接退出,导致循环内的if offSwitch == 0永远不会被执行,这是offRelay无法激活的根本原因。
  4. 无延时导致CPU过载:循环内没有sleep,会让CPU持续高负载运行,也可能导致状态检测不稳定。

修正后的代码

from machine import Pin
from time import sleep

# 引脚配置
offRelay = Pin(18, Pin.OUT)
offSwitch = Pin(2, Pin.IN, Pin.PULL_UP)
leadRelay = Pin(19, Pin.OUT)            
leadFloat = Pin(6, Pin.IN, Pin.PULL_UP)
lagFloat = Pin(10, Pin.IN, Pin.PULL_UP)
lagRelay = Pin(20, Pin.OUT)
hwwFloat = Pin(14, Pin.IN, Pin.PULL_UP)
hwwRelay = Pin(21, Pin.OUT)
offLight = Pin(3, Pin.OUT)
pumpOneLight = Pin(7, Pin.OUT)
pumpTwoLight = Pin(11, Pin.OUT)
hwwLight = Pin(15, Pin.OUT)

def update_devices():
    # 获取各输入引脚状态
    off_switch_state = offSwitch.value()
    lead_float_state = leadFloat.value()
    lag_float_state = lagFloat.value()
    hww_float_state = hwwFloat.value()
    
    # 处理offSwitch逻辑:按下时(状态0)激活offRelay和offLight
    if off_switch_state == 0:
        offRelay.value(1)
        offLight.value(1)
        # 处理主泵逻辑
        if lead_float_state == 0:
            leadRelay.value(1)
            pumpOneLight.value(1)
            # 处理副泵逻辑
            if lag_float_state == 0:
                lagRelay.value(1)
                pumpTwoLight.value(1)
            else:
                lagRelay.value(0)
                pumpTwoLight.value(0)
        else:
            leadRelay.value(0)
            pumpOneLight.value(0)
            lagRelay.value(0)
            pumpTwoLight.value(0)
    else:
        # 未按下offSwitch时,关闭所有继电器和指示灯
        offRelay.value(0)
        offLight.value(0)
        leadRelay.value(0)
        pumpOneLight.value(0)
        lagRelay.value(0)
        pumpTwoLight.value(0)
    
    # 处理热水箱浮球逻辑
    if hww_float_state == 0:
        hwwRelay.value(1)
        hwwLight.value(1)
    else:
        hwwRelay.value(0)
        hwwLight.value(0)

# 主循环
while True:
    update_devices()
    sleep(0.1)  # 添加延时,降低CPU负载并稳定检测

# 测试输出(若需要可放在循环内或单独执行)
# def print_status():
#     print(offSwitch.value(),"off float")
#     print(offRelay.value(), "off relay")
#     print(leadFloat.value(), "lead float")
#     print(leadRelay.value(), "lead relay")
#     print(offLight.value(), "off float led light")
#     print(lagFloat.value(), "lag float")
#     print(lagRelay.value(), "lag relay")
#     print(pumpTwoLight.value(), "pump 2 led light")
#     print(hwwFloat.value(), "hww float")
#     print(hwwRelay.value(), "hww relay")

修正说明

  • 统一使用Pin.value()方法读取/设置引脚状态,符合MicroPython规范。
  • 重构主逻辑为函数update_devices(),让代码更清晰易维护。
  • 主循环改为while True,持续检测状态变化,避免原循环条件导致的逻辑失效。
  • 添加sleep(0.1)降低CPU占用,同时保证状态检测的及时性。
  • 补充了未触发条件下的设备关闭逻辑,避免继电器/指示灯异常保持激活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:52:37