这是一个奇怪的问题。我甚至不确定如何解决它...
我在家门口为Raspberry Pi写了一段非常简单的代码。它只需每2秒对GPIO进行一次极化,以查看电路是否已完成。它通过GPIO连接到磁性门传感器,如下所示: https://s3.amazonaws.com/assets.controlanything.com/photos/CKN6004-900.jpg
这是python代码:
import os
import time
import socket
import RPi.GPIO as io
io.setmode(io.BCM)
ADDRESS = "192.168.1.118"
PORT = 1234
def doorOpened():
"report door has been opened"
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ADDRESS, PORT))
s.send(b'DOOR_OPEN')
except Exception as e:
print("Exception: " + e)
s.close()
return
DOOR_PIN = 23
io.setup(DOOR_PIN, io.IN)
print("Watching over the door")
while True:
time.sleep(2)
if io.input(DOOR_PIN):
doorOpened()
time.sleep(60)
无论如何,出于某种原因,例如每周一次,警报会被错误地触发。有时当我在睡觉,工作时,无论如何。我不确定代码是如何从GPIO读取值的,只要磁体彼此靠近,它就不应该完成电路。我打开了门,他们必须在传感器被触发之前相距约1.5-2英寸,所以我不知道在他们基本接触时它是如何触发的(相距不到1毫米)。
那么......有没有人有任何想法或解释?
谢谢!
答案 0 :(得分:4)
“每周一次”发生的问题可能是我在嵌入式系统中遇到的最烦人的问题,它们使调试变得特别困难。
以下是您可以尝试的一些事项:
首先,使用其他方法进行调查。通过这种方式,我的意思是使用某种记录设备(例如录像机)监视门,最好是一个可以适当地交叉引用警报响起的时间。
其次,如果这是一个电气断断续续的问题(比如我们以前看到的旧便宜键盘的键弹跳),你可以稍微修改一下代码以减少误报。
换句话说,请勿在第一个检测到的问题上发出警报。相反,进入更紧密的循环并(例如)以十分之一秒的延迟对输入进行五次采样。
然后根据证据的优势决定是否是实际警报。
而且,作为一个旁白,我想知道关闭一个可能永远不会被打开的套接字的智慧。这不太可能是你的问题,但在某些时候清理
doorOpened
中的逻辑是值得的。