Intelligente wekker – Het in- en uitschakelen van het alarm (deel 2)

schak_dubbel_witAls je mijn blog regelmatig bezoekt, dan zal het je niet ontgaan zijn dat ik mijn huishoudelijke apparaten graag op mijn Domotica aansluit. Nu is het fantastisch dat je je lichten met je telefoon kunt bedienen, maar ik merk ook dat het soms toch fijner is om het gewoon met een schakelaar te kunnen doen. Dat kan ik nu niet, maar dat is wel iets dat hoog op mijn verlanglijst staat.

De les die ik daar uitgeleerd heb, is dat ik de wekker ook aan- en uit moet kunnen zetten zonder een telefoon. Het instellen van het alarm zal wel via de telefoon gaan. Om dit te kunnen doen, heb ik een schakelaar aan de wekker toegevoegd. Dankzij AdaFruit en hun tutorials stelt dat niet veel voor, maar voor degene die dit project volgen heb ik het schema ook aangepast.

Wekker_v2_aan_uit_schakelaar_bbAdaFruit schrijft een 10K ohm weerstand voor en daar heb ik me ook aangehouden. En hiermee kreeg ik voor het eerst te maken met de GPIO pinnen van de Raspberry Pi.

Nu stelt het uitlezen van die poorten in Python echt niks voor. Je importeert de GPIO library, definieert de poort die je wilt gebruiken en je kunt hem uitlezen. Aan het programma dat de tijd weergeeft, heb ik een paar regels toegevoegd. Als de tijd op het display getoond moet worden, dan lees ik de stand van de schakelaar uit (GPIO pin 23) en zet het alarm indicatielampje aan of uit. Als indicatie gebruik ik het bovenste lampje in de linkse dubbele punt van het 7 segment display. Volgens mij doen de meeste wekkers met een 7 segment display dit.

Dit is alles wat ik nodig heb, om de tijd en de alarmindicatie op het display te tonen.

def displayTime():
    GPIO.setmode( GPIO.BCM )
    GPIO.setup(23, GPIO.IN)
    alarmIndicator = GPIO.input(23)

    # lees de configuratie uit, voor 
    # de brightness instelling
    preparePiClock() 
    display.clear()
    now = datetime.datetime.now()
    hour = now.hour
    minute = now.minute
    second = now.second

    # Set hours
    display.set_digit(0, int(hour / 10))     # Tens
    display.set_digit(1, hour % 10)          # Ones

    # Set minutes
    display.set_digit(2, int(minute / 10))   # Tens
    display.set_digit(3, minute % 10)        # Ones
    display.set_colon(True)

    if alarmIndicator:
        display.buffer[4] |= 0x04
    display.write_display()

Omdat het tonen van de tijd door de CRON tab van de Pi wordt aangeroepen, controleert de wekker nu 1 keer per minuut of de alarm indicator aan of uit moet. In het ergste geval moet je dus bijna een minuut wachten, totdat de klok visueel de nieuwe stand van de schakelaar toont. Ik weet niet hoe dat met u zit, maar zoveel geduld heb ik.

Het programma uit de AdaFruit tutorial hoefde ik maar een klein beetje aan te passen. Zodat ik een klein programmaatje heb die continu de schakelaar uitleest. Als de stand wijzigt, dan roep ik het programma aan, waarmee ik de actuele tijd op het display toon. Het programmaatje blijft draaien totdat het gestopt wordt, dus ook als de Pi uitgezet of gereboot wordt.

#!/usr/bin/env python
 
import os
from time import sleep
 
import RPi.GPIO as GPIO

GPIO.setmode( GPIO.BCM )
GPIO.setup( 23, GPIO.IN )

oldValue = GPIO.input(23)

while True:
    newValue = GPIO.input(23)
    if ( newValue != oldValue ):
        os.system( "python /usr/local/bin/piClock.py -time" )
        oldValue = newValue
    sleep( 0.1 )

Om ervoor te zorgen dat dit programma automatisch opgestart wordt, heb ik het init.d script iets uitgebreid.

#!/bin/bash
# /etc/init.d/seven-segment

### BEGIN INIT INFO
# Provides:          seven-segment
# Required-Start:    $time
# Required-Stop:     $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Display's current time on an i2c 7 segment display
# Description:       Clears or display's current time on an i2c 7 segment display connected to the pi
### END INIT INFO


case "$1" in
    start)
        python /usr/local/bin/piClock.py -init
        python /usr/local/bin/piClock-swith-checker.py
        ;;
    stop)
        python /usr/local/bin/piClock.py -clear
        ;;
    *)
        echo "Usage: /etc/init.d/seven-segment start|stop"
        exit 1
        ;;
esac

exit 0

Ik kan op dezelfde wijze ook een schakelaar toevoegen, die als snooze of alarm-uit schakelaar gaat dienen. Maar daarover twijfel ik nog. Ik ben een enorme snoozer. Met deze wekker wil ik zorgen dat ik echt uit bed kom, als de wekker voor het eerst af gaat.

Nu dit deel af is, is het tijd om wat kleine onderdelen te bestellen, zodat ik de opstelling kan gaan solderen. En dan kan ik eindelijk beginnen aan het eerste houtbewerkingsproject van de wekker. Zoals je leest, knip de hele bouw op in kleinere projecten. Daarmee houd ik het overzicht en blijft alles simpel. Zoals ik hem nu in mijn hoofd heb is het in zijn geheel al complex genoeg.

Leave a Reply