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

Packet Tracer中Override按钮无法正常工作问题求助(自动模式正常)

Packet Tracer中Override按钮失效问题修复

问题原因分析

你的代码存在两处关键逻辑错误,导致Override按钮无法正常工作:

  1. 重复写入加热器状态导致覆盖
    在update_heater_state函数中,当user_override为True时,代码先执行digitalWrite(HEATER_PORT, HIGH)强制开启加热器,但随后又执行了digitalWrite(HEATER_PORT, HIGH if self.heater_on else LOW)。由于Override模式下self.heater_on的值未同步更新,这条语句会将加热器状态重新拉回自动模式的判断结果,直接覆盖了之前的强制设置。

  2. 按钮事件处理的电平触发问题
    button_event_handler中直接通过digitalRead(BUTTON_PORT) == HIGH判断触发条件,若Packet Tracer中的按钮为持续高电平触发,会导致按钮按下期间多次切换user_override状态,出现逻辑混乱。

修复后的代码

from gpio import *
from time import *

# Define constants
TEMPERATURE_SENSOR_PORT = 0
BUTTON_PORT = 1
HEATER_PORT = 2
LCD_PORT = 3

class GreenhouseController():
    def __init__(self):
        # Set initial states
        self.heater_on = False
        self.user_override = False
        self.last_button_state = LOW  # 用于按钮防抖和边沿检测
        
    def button_event_handler(self):
        # 采用边沿检测(上升沿)处理按钮事件,避免重复触发
        current_state = digitalRead(BUTTON_PORT)
        if current_state == HIGH and self.last_button_state == LOW:
            self.user_override = not self.user_override
            self.update_heater_state()
        self.last_button_state = current_state

    def update_heater_state(self):
        # Update heater state based on temperature or user override
        temperature = self.get_temperature()

        if self.user_override:
            # Override模式下,切换加热器状态并同步标记
            self.heater_on = not self.heater_on
        else:
            # 自动模式下根据温度判断
            self.heater_on = temperature <= 5

        # 统一设置加热器状态,避免重复写入
        digitalWrite(HEATER_PORT, HIGH if self.heater_on else LOW)
        
    def get_temperature(self):
        # Gets temperature from the sensor
        analog_value = analogRead(TEMPERATURE_SENSOR_PORT)
        temperature = ((float(analog_value) / 1024) * 201) - 100
        return temperature

    def update_lcd(self, temperature, heater_state):
        # Update the LCD with temperature and heater status
        message = 'Temp: {:.1f} {}C\nHeater: {} '.format(
            temperature, chr(176), "On" if heater_state else "Off")
        customWrite(LCD_PORT, message)

    def main(self):
        print('Starting Greenhouse Temp...')
        # Add the button event detection
        add_event_detect(BUTTON_PORT, self.button_event_handler)

        while True:
            # Update heater state, Get temperature and Update LCD
            self.update_heater_state()
            temperature = self.get_temperature()
            self.update_lcd(temperature, self.heater_on)

            sleep(0.5)

if __name__ == "__main__":
    greenhouse_controller = GreenhouseController()
    greenhouse_controller.main()

修复说明

  • 调整update_heater_state逻辑:在Override模式下直接切换self.heater_on状态,统一通过最后一条语句设置加热器,避免重复写入导致的覆盖问题。
  • 优化按钮事件处理:增加last_button_state变量实现上升沿检测,确保按钮每按下一次只触发一次状态切换,解决电平触发的重复执行问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:23:10