為了避免這個問題,你可以進行以下操作:
確保 GPIO 模式的一致性:檢查你的程式中是否有其他地方設置了 GPIO 模式,並確保整個程式中使用的是一致的模式。
使用 try 和 except 處理模式設置:你可以在設置 GPIO 模式之前檢查是否已經設置了模式,如果出現 ValueError,則忽略它。
下面是修改後的程式碼示例,展示如何安全地設定 GPIO 模式:
在程式開始時禁用警告:如果你確定重複使用的接腳不會引起問題,你可以在程式一開始加入一行代碼來禁用這些警告。
確保適當清理 GPIO:在程式的每次運行後都應該進行 GPIO 清理,以避免留下未解除配置的接腳。
以下是考慮上述解決方案修改後的程式碼:
python
複製程式碼
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import time
# 禁用 GPIO 警告
GPIO.setwarnings(False)
# 設置 GPIO 模式
GPIO.setmode(GPIO.BCM)
reader = SimpleMFRC522()
button_pin = 21
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 設置按鈕接腳
try:
last_id = None
print("開始讀取,按下按鈕停止...")
while GPIO.input(button_pin): # 檢查按鈕是否被按下
id, text = reader.read_no_block()
if id is not None and id != last_id:
last_id = id
print(f"新的 RFID 標籤被讀取: ID: {id}, Text: {text}")
time.sleep(0.5)
finally:
GPIO.cleanup() # 清理 GPIO 設置
print("清理完成,程式結束。")
確保在每次程式結束時調用 GPIO.cleanup() 來清理你的配置,這樣可以減少在後續運行中遇到的問題。
如果你發現 reader.read_no_block() 不工作(因為 mfrc522 函式庫可能沒有這個方法),你可能需要回到使用阻塞方法 reader.read(),或者修改函式庫來實現非阻塞讀取。
根據你的描述,看起來程序運行後立即結束了。這可能是因為 GPIO.input(button_pin) 檢查失敗(即按鈕已經被按下或接腳狀態不符合預期),你可能需要檢查按鈕的接線是否正確,或調整 GPIO.setup 的參數。