Магнитный датчик двери, подключенный к Raspberry Pi, на котором запущен скрипт Python, сообщает о ложных тревогах

Это такая странная проблема. Я даже не уверен, как это устранить...

Я написал очень простой код для Raspberry Pi на входе в мой дом. Он просто запирает GPIO каждые 2 секунды, чтобы увидеть, завершена ли цепь. Он подключен через 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 ответ

Решение

Проблемы, которые возникают только "раз в неделю", являются, пожалуй, самыми раздражающими, с которыми я когда-либо сталкивался во встроенных системах, они особенно затрудняют отладку.

Вот несколько вещей, которые вы можете попробовать:

Сначала исследуйте, используя другие средства. Под этим я подразумеваю наблюдение за дверью с помощью какого-либо записывающего устройства (например, видеомагнитофона), предпочтительно такого, которое можно умеренно сопоставить со временем срабатывания будильника.

Во-вторых, если это электрически прерывистая проблема (например, отзвук от старых дешевых клавиатур, которые мы привыкли видеть), вы можете немного изменить код, чтобы уменьшить количество ложных срабатываний.

Другими словами, не вызывайте тревогу при первой обнаруженной проблеме. Вместо этого перейдите к более жесткому циклу и (например) сэмплируйте ввод пять раз с задержкой в ​​одну десятую секунды.

Затем решите, основываясь на преобладании доказательств, была ли это настоящая тревога или нет.

И, как в стороне, я удивляюсь мудрости закрытия розетки, которая, возможно, никогда не была открыта. Это вряд ли будет вашей проблемой здесь, но стоило бы очистить логику в doorOpened в какой-то момент.

Другие вопросы по тегам