RPi: Automatisk väckarklocka

Trädvy Permalänk
Medlem
Plats
Järfälla
Registrerad
Jan 2004

RPi: Automatisk väckarklocka

Hej!

Jag köpte en liten buzzer till min RPi och har gjort så att den automatiskt ringer efter synkronisering med en eller flera ical filer. Jag väljer att synka den mot mitt skolschema (Ringer 75 minuter innan första lektionen) eller om ett eget larm är inställt i min google kalender innan.

I och med att jag har lätt att somna om har jag valt att göra att jag måste logga in på RPi för att stänga av alarmet (det stängs dock av automatiskt efter en tid, men innan dess får man spader).

Som det är nu är allting ihopslängt i hast för att bara fungera, men funderar på hur man kan förbättra saker och ring.

Alarmsignalen består av att en av utgångarna växlar mellan hög och låg med en specifik frekvens (5 Hz). Jag funderar på hur man ska låta detta gå till. Just nu har jag ett pythonskript som läser av om en fil innehåller en 1a eller 0a. Är det en etta är alarmet igång och en kodad signal gör att alarmet tjuter. Denna lösning känns inte optimal. Har ni något bättre förslag på detta? Det känns som att programmet ligger och suger onödigt mycket kraft. Jag startar det genom att helt enkelt köra:

sudo ./alarm.sh &

alarm.sh

import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) while 1: status = open("status.txt","r") status = status.readline().strip() if int(status) == 0: GPIO.output(18, GPIO.HIGH) sleep(1) else: GPIO.output(18, GPIO.LOW) sleep(0.2) GPIO.output(18, GPIO.HIGH) sleep(0.2) GPIO.cleanup()

För att starta eller stänga av alarmet kör jag något av dessa skript.
startAlarm.sh och stopAlarm.sh

#!/bin/sh echo 0 > /home/pi/alarm/status.txt #!/bin/sh echo 1 > /home/pi/alarm/status.txt

För att schemalägga alarm kör jag kl 00.01 varje natt (via cronjob) ett PHP skript som kollar mina ical filer, detta schemalägger att köra startAlarm.sh vid angiven tid.

Så här ser det ut. Jag har valt att prioritera de alarmtider jag sätter själv för mitt synkade med skolschema.

<?php date_default_timezone_set('Europe/Stockholm'); function setAlarm($calendar, $today, $offset = 0) { $rows = explode("\n", file_get_contents($calendar)); $alarmOffset = $offset; //Hela denna slinga kan förbättras :) Men skit samma for ($n = 0; $n < count($rows); $n++) { if (substr($rows[$n], 0, 12) == "BEGIN:VEVENT") { while (substr($rows[$n], 0, 7) != "DTSTART") { $n++; } $eventTime = strtotime(substr($rows[$n], strpos($rows[$n], ":") + 1)); $eventDay = strtotime(substr($rows[$n], strpos($rows[$n], ":") + 1, 8)); if ($today == $eventDay && $eventTime > time()) { $alarmTime = $eventTime-$alarmOffset*60; file_put_contents("log.txt", "Found alarm event, alarm will set off at ".date("Y-m-d H:i", $alarmTime)."\n", FILE_APPEND); file_put_contents("log.txt", 'Executing: at '.date("H:i mdY", $alarmTime)." -f startAlarm.sh\n", FILE_APPEND); file_put_contents("log.txt", 'Executing: at '.date("H:i mdY", $alarmTime+5*60)." -f stopAlarm.sh\n", FILE_APPEND); exec('at '.date("H:i mdY", $alarmTime).' -f startAlarm.sh'); exec('at '.date("H:i mdY", $alarmTime+5*60).' -f stopAlarm.sh'); //echo 'at '.date("H:i mdY", $alarmTime)." -f startAlarm.sh\n"; //echo 'at '.date("H:i mdY", $alarmTime+5*60)." -f stopAlarm.sh\n"; return true; } } } return false; } if ($argc > 1) { $today = strtotime($argv[1]); } else { $today = strtotime(date("Ymd")); } file_put_contents("log.txt", "---------- ".date("Y-m-d H:i")." ----------\n", FILE_APPEND); file_put_contents("log.txt", "Looking for alarm event in google calendar.\n", FILE_APPEND); $cal = 'länk till google ical fil'; if (setAlarm($cal, $today)) { die(); } file_put_contents("log.txt", "Nothing found.\n", FILE_APPEND); $cal = 'länk till kth schema'; file_put_contents("log.txt", "Looking for lesson in kth schedule.\n", FILE_APPEND); if (!setAlarm($cal, $today, 60)) { file_put_contents("log.txt", "Nothing found.\n", FILE_APPEND); }

Tänkte höra om ni har några direkta förslag på förbättringar eller bara ge lite idéer på vad man kan använda enkortsdatorer till

Trädvy Permalänk
Medlem
Registrerad
Dec 2008

Ett riktigt smart sätt att använda en raspberry på. Skulle jag förbättrat din lösning hade jag velat ha en knapp för att starta alarmet, som då hämtat kalendern på nytt och på en display visat när den tänkt väcka dig.

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011

Häftigt! Länka gärna buzzern du använder!

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Järfälla
Registrerad
Jan 2004

Jag tror att det är en sån här: http://www.ebay.com/itm/1pc-3-3-5V-Passive-Buzzer-Module-For-...

Kostade ca 10kr med frakt hehe

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Jul 2009

Roligt projekt!

En kul sak att lägga till vore kanske att simulera en soluppgång med en led-list i taket innan larmet startar? Efter larmet startat och du vaknat skulle du kunna visa vädret med samma LEDlist. Tex rött ljus för solsken, grått för regn och antal lysande leds motsvarar temperaturen ute.

Visa nattens nyheter via RSS på en liten 24 tecken LCD skärm?
Via högtalare läsa upp facebook och tvitter meddelanden? Spana in "Jasper" för RPin
Sätta igång kaffebryggarn eller vattenkokarn automatiskt när larmet går? Lägg ett ägg i vattenkokarn kvällen innan så kan du få färdig kokta ägg
Persienn-motor?
Sätta igång duschen så man inte får de 10 första kalla sekunderna?

Finns säkert hur mycket som helst