Packet Tracer中Override按钮无法正常工作问题求助(自动模式正常)
Packet Tracer中Override按钮失效问题修复
问题原因分析
你的代码存在两处关键逻辑错误,导致Override按钮无法正常工作:
重复写入加热器状态导致覆盖
在update_heater_state函数中,当user_override为True时,代码先执行digitalWrite(HEATER_PORT, HIGH)强制开启加热器,但随后又执行了digitalWrite(HEATER_PORT, HIGH if self.heater_on else LOW)。由于Override模式下self.heater_on的值未同步更新,这条语句会将加热器状态重新拉回自动模式的判断结果,直接覆盖了之前的强制设置。按钮事件处理的电平触发问题
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
相关产品推荐
相关产品推荐

