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?!

6 tanker om “Raspberry Pi-dørklokke”

  1. Din støj stammer nok fra den komponent du ikke har tegnet ind i diagrammet: Solonoiden i dørklokken.
    Kaster du lidt med den, kan remanensen i hammeren nemt inducere lavfrekvent støj der kan får transistoren til at gå on kortvarigt.

    Twitter er måske i øvrigt ikke den hurtigteste transportvej til den slags signalering.

    1. I see… Det giver meget god mening, for tit går den også, bare ungerne tramper op ad trappen… Men hvad er løsningen på det? En større kondensator? Og måske en modstand i serie? Eller er det helt håbløst?

      Og nej, twitter er forbløffende langsomt 🙂 Men dels ser det ud til at være ret langhåret at gå i krig med push-notifikationer på Android, dels kan jeg godt frygte, at det ikke er væsentligt hurtigere…

  2. Du har lavet et rimeligt lavimpedant filter, i virkeligheden en svingkreds. Må jeg ikke foreslå et lavpasfilter?

    Hvis du nu deler den øverst modstand op i to lige store dele, vil du få en egentlig lavpas filtrering. Midtpunktet i den øverste modstand afkobler du så via din kondensator til stel.

    Og så kunne du overveje at erstatte transistoren med en optokobler, så får du adskilt de 2 potentialer.

    1. Det skal nok snarere være IF; DO er vist primært til at gøre noget, når du gør noget. Men skal jeg bruge IF, skal jeg først finde en kanal, der passer, og jeg er ikke faldet over en oplagt endnu. Men det kan godt være, jeg skal kigge på det igen!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *