Raspberry Pi-dørklokke

Da jeg (forholdsvis!) nemt kunne trække et kabel fra min dørklokke til den ene af de Raspberry Pi’er, der kører 24/7, var det jo lidt oplagt af få dørklokken på nettet. Vi kan nemlig godt have svært ved at høre klokken, når døren ud til gangen er lukket, og vi står i køkkenet og larmer. Og så ville det jo være smart, om ens mobiltelefon kunne sige ding-dong, når man trykker på knappen.

Figur 1: En klassisk Friedland Ding Dong.
Figur 1: En klassisk Friedland “Ding Dong”.

Det er en klassisk Friedland “Ding Dong”, som tager fire C-batterier. Der er fire skrueterminaler i den: To, der går til trykknappen, og to ubrugte. Det viser sig, at når man trykker på knappen, ligger der ca. 4,8 V på de to ubrugte skrueterminaler. Det skal så hældes ind i en Raspberry Pi. Og det går selvfølgelig ikke sådan uden videre, så jeg har lavet et lille interface:

Figur 2: Diagram over interfacet mellem dørklokke og Raspberry Pi. Lavet med det gratis værktøj Digi-Key Scheme-it, som varmt kan anbefales.

(Hvordan skal man i grunden smide sådan noget sammen? Pt. er det bare en fuglerede…)

Figur 3: En rigtig god, gammel 8 µF foliekondensator. Mums!
Figur 3: En rigtig god, gammel 8 µF foliekondensator.

Kondensatoren er en gammel 8 µF foliekondensator – se figur 3. Hvorfor ikke? Jeg burde jo nok beregne den nødvendige kondensatorværdi ud fra tidskonstanten

τ = RC

men eftersom der ikke er nogen modstand, kan tidskonstanten hurtigt blive meget lille, uanset hvor stor en kondensatorværdi jeg vælger – eller er der noget, jeg har misforstået?

Jeg kører GPIO4 med en pull-up-modstand (indbygget i Raspberry Pi), og så har jeg skrevet et lille program i Python, som ser sådan her ud:

import datetime
import logging
import os
import RPi.GPIO as GPIO
import subprocess
import sys
import time

GPIO.setmode(GPIO.BCM)
pin = 14
GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)

while True:
  try:
    logging.basicConfig(filename="dingdong.log", format="%(asctime)s %(message)s", level=logging.DEBUG)
    GPIO.wait_for_edge(pin,GPIO.FALLING)
    logging.info("Ding")
    subprocess.call("/home/pi/dingdong/tweet.sh", shell=True)

  except:
    logging.warning(sys.exc_info()[0])

Det program ligger i en fil, der hedder dingdong.py. Den kaldes fra et init-script:

echo 14 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio14/direction
python3 /home/pi/dingdong/dingdong.py

der køres af cron ved boot.

Så når nogen ringer på, sendes der et tweet, som min mobiltelefon så gør mig opmærksom på.

Problemer

  1. Kredsløbet er temmelig støjfølsomt. Skramler jeg lidt rundt om det, kan det trigge en jording af GPIO4.
  2. Processen med et tweet er alt for langsom. Der kan gå flere minutter, før jeg modtager en push-notifikation, og så er folk jo nok gået igen. Det må da for katten kunne lade sig gøre at sende et signal til en mobiltelefon i real time?!