连接到运行Python脚本的Raspberry Pi的磁性门传感器报告错误警报

时间:2015-06-24 04:54:20

标签: python linux python-3.x raspberry-pi raspbian

这是一个奇怪的问题。我甚至不确定如何解决它...

我在家门口为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毫米)。

那么......有没有人有任何想法或解释?

谢谢!

1 个答案:

答案 0 :(得分:4)

“每周一次”发生的问题可能是我在嵌入式系统中遇到的最烦人的问题,它们使调试变得特别困难。

以下是您可以尝试的一些事项:

首先,使用其他方法进行调查。通过这种方式,我的意思是使用某种记录设备(例如录像机)监视门,最好是一个可以适当地交叉引用警报响起的时间。

其次,如果这是一个电气断断续续的问题(比如我们以前看到的旧便宜键盘的键弹跳),你可以稍微修改一下代码以减少误报。

换句话说,请勿在第一个检测到的问题上发出警报。相反,进入更紧密的循环并(例如)以十分之一秒的延迟对输入进行五次采样。

然后根据证据的优势决定是否是实际警报。

  

而且,作为一个旁白,我想知道关闭一个可能永远不会被打开的套接字的智慧。这不太可能是你的问题,但在某些时候清理doorOpened中的逻辑是值得的。