Pillenwarner            

von Ralf Beesner                        
Elektronik-Labor   Projekte   AVR 




Im Moment muss ich irgendwelche Tabletten schlucken, und da ich das leicht mal vergesse,  habe ich mir eine kleine AtTiny-Schaltung gebaut, die mich jeden Morgen solange anblinkt, bis ich das Signal per Tastendruck quittiere.

Die Schaltung und die Software sind sehr einfach gehalten. Im Gegensatz zu einer Lösung mit analogen Timer- und Logik-ICs kann man die Zeiten in einem weiten Bereich sehr einfach per Software ändern und auch sehr lange Zykluszeiten im Wochen- oder gar Monatsbereich bis hin zum jährlichen Hochzeitstag ;-) realisieren - mit Quarzgenauigkeit und so geringem Stromverbrauch, dass die Schaltung aus Batterien betrieben werden kann.  Der Pillenwarner lässt sich also leicht für andere Zwecke abwandeln. Da noch ein Pin am Mikrocontroller frei war, habe ich eine Wahl zwischen zwei Zykluszeiten vorgesehen.


Bedienung
Der Pillenwarner hat 3 Bedienelemente: den Quittungstaster, einen Wahlschalter (der im vorliegenden Beispiel zwischen 24h-Modus und 12h-Modus umschaltet) und den Reset-Schalter, der die Uhr startet.

Ausgabe-Element ist eine LED. Als Lebenszeichen blitzt sie alle 8 Sekunden für 20 ms kurz auf (Heartbeat).

Möchte man ein mal pro Tag (also alle 24 Stunden) an die Tabletten-Einnahme (oder was auch immer) erinnert werden, stellt man Schalter 2 auf "OFF", für zweimaliges Erinnern pro Tag (also im 12h-Rhythmus) auf "ON".

Kurzes Betätigen von Schalter 1 löst einen Reset aus; nach Ende des Resets läuft die Uhr los, allerdings startet sie nicht bei 0, sondern mit 7200 Sekunden (2h) Vorlauf, damit sie künftig immer zwei Stunden vor der Tabletten- Einnahme aktiv wird (falls man mal eher aufsteht).

Überschreitet der Zähler 24h (bzw. 12h), blinkt die LED im Sekundentakt für jeweils 100 ms. Durch Druck auf den Quittungstaster fällt sie wieder in den Heartbeat-Modus zurück.

Vergisst man das Quittieren (und vermutlich auch die Tabletten-Einnahme), geht die LED nach einem weiteren Ablauf der Zykluszeit in Doppelblinken über (zwei mal 100ms pro Sekunde) und mahnt auf diese Weise die "Disziplinlosigkeit" an. 



Hardware
Die Schaltung besteht aus einem AtTiny 25 mit 3,6864 MHz-Quarz an PB3 und PB4. An PB1 liegt eine LED mit Vorwiderstand, an PB2 der Quittungstaster. An PB0 liegt der Schalter, mit dem man zwischen den beiden Zykluszeiten wählen kann. Ein weiterer Schalter liegt am Reset- Eingang.







Software
Der AtTiny wird auf Quarzbetrieb gefust. Der Takt wird zur Laufzeit des Programms  mit dem Befehl CLKPR durch 64 geteilt, der Controllertakt beträgt also nur 57600 Hz. Timer 0 erzeugt daraus ein Sekundensignal. Sein Vorteiler wird dazu auf 256 gestellt, und der Timer läuft jeweils nach 225 Schritten über und generiert jeweils einen Interrupt. In der Interruptroutine wird die Sekundenvariable T inkrementiert. 24 Stunden sind 86400 Sekunden, 12 Stunden sind 43200 Sekunden.

Die Hauptschleife prüft ein mal pro Durchlauf, ob 86400 (bzw. 43200) Sekunden ereicht  wurden. Ist dies der Fall, wird T auf 0 zurückgesetzt und die Alarm- Variable A inkrementiert. Anschließend wird geprüft, ob A = 1 ist (dann wird für 100 ms geblinkt) oder ob A > 1 ist (dann wird doppelt geblinkt). Danach geht der Controller in den Idle-Modus (aus dem er durch den nächsten Sekunden-Interrupt geweckt wird).
Ein Druck auf den Quittungstaster setzt die Alarmvariable A auf 0 zurück.



Stromverbrauch
Da der Quarzoszillator ständig laufen muss, darf man den Mikrocontroller nicht in Powerdown, sondern nur in den Idle- Modus schicken. Bei 3 V Betriebsspannung (2 Mignonzellen) verbraucht er aber nur 100 µA, also knapp 900 mAh pro Jahr.
 
Die LED verbraucht max. 10 mA, während sie leuchtet; bei einem Tastverhältnis von 100 ms zu 1s also im Mittel 1 mA. Ist sie durchschnittlich 3 h pro Tag am Blinken, sind das weitere 1095 mAh pro Jahr. Die Schaltung sollte also mit zwei Mignonzellen deutlich länger als ein Jahr laufen.

 

Flashen des AtTiny
Wer nur die Platine aus dem LP Mikrocontroller als Programmiergerät zur Verfügung hat, kann zwar das Programm mit Burkhard Kainkas LPMikroISP.exe in den Mikrocontroller flashen, aber zusätzlich müssen die Fusebytes verändert werden, um den Controller in den Quarzbetrieb umzuschalten. Dies darf jedoch nicht mit LPMikroISP.exe erfolgen!

Unter www.elektroniklabor.de/AVR/AVRdude.html habe ich beschrieben, wie man die Hardware des LP Mikrocontroller mit dem Kommandozeilentool avrdude.exe programmieren kann. Das erforderliche Fusebyte lautet: lfuse=0xfd .
Der komplette Aufruf lautet: avrdude.exe -p t25 -c burkhard -P com1 -U lfuse:w:0xfd:m


Download: Pillenwarner.zip

' Pillenwarner
' erzeugt alle 24h bzw. alle 12h ein Blinksignal, das quittiert werden muss
'
' Hardware:
' Start der Uhr durch Reset- Taster
' Takt durch externen Quarzoszillator mit 3,6864 MHz an PB3
' LED an PB4
' Quittungstaster an PB2
' Umschaltung 24h- / 12h- Modus durch Schalter an PB0
'
' 12h -> 43200 sec. 24h -> 86400 sec

' AtTiny muß auf Quarzbetrieb geflasht werden ( LFuse = 0xFD )
'
' Quarztakt wird zur Laufzeit mit Clkpr auf 3,686400 / 64 herabgesetzt
'
'
'----------------------------------------------------------

$regfile = "attiny25.dat"
$crystal = 57600 ' 3686400 / 64


$hwstack = 32
$swstack = 16
$framesize = 16

On Timer0 Ontimer0 'Interrupt-Routine


' Variablen

Dim T As Long ' Sekunden
Dim M As Long ' Anzahl Sekunden für Modus 12h / 24h
Dim A As Byte ' Alarm
Dim N As Byte ' Zählvariable



' Register


Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Sreg.7 = 1 ' Global Interrupt Enable
Gimsk.5 = 1 ' PCint enable
Pcmsk.2 = 1 ' PCint PB2 enable
Didr0 = &B0001_1010 ' Digitaleingänge PB1, PB3, PB4 abschalten
Ddrb = &B0000_0010 ' alle Pins Eingang bis auf PB1
Portb = &B0000_0101 ' Pullup-Widerstand PB0 und PB2 anschalten


' Alias

Led Alias Portb.1
Taster Alias Pinb.2
Schalter Alias Pinb.0


' Konstanten
'
' Sekunden * Minuten * Stunden * Tage - 1 Sekunde
Const M0 = 60 * 60 * 24 - 1 ' 86399 = 24h - 1s
Const M1 = 60 * 60 * 12 - 1 ' 43199 = 12h - 1s


' Timer 0 für 1 Interrupt / sec vorbereiten:

Config Timer0 = Timer , Prescale = 256
Enable Timer0
Start Timer0


Clkpr = &B10000000 ' Änderung Clockteiler vorbereiten
Clkpr = &B00000110 ' 3686400 / 64
Clkpr = &B10000110

'----------------------------------------------------------


' Hauptprogramm

If Schalter = 0 Then ' 12h- Modus, wenn Schalter auf "ON"
M = M1
Else
M = M0
End If

T = 7200 ' Uhr einmalig 2 h vorstellen, damit Alarm künftig 2h früher
' als Reset- Zeitpunkt

' Hauptschleife

Do


N = N + 1

If N > 7 Then ' Lebenszeichen; alle 8 Sek. kurzes Blinken
N = 0
Led = 1
Waitms 20
Led = 0
End If

' If T > 29 Then ' Testbetrieb 30 sek statt 24h / 12h
If T > M Then ' Realbetrieb 24h/12h sind um
T = 0 ' Uhr rücksetzen
A = A + 1 ' Alarmbyte
End If


If Taster = 0 Then ' Rücksetzen Alarm, wenn Quittungstaster gedrückt
A = 0
End If

If A = 1 Then ' Einfachblinken bei Alarm
Led = 1
Waitms 100
Led = 0
End If

If A > 1 Then ' Doppelblinken, wenn "alter Alarm" nicht quittiert wurde
Led = 1
Waitms 100
Led = 0
Waitms 200
Led = 1
Waitms 100
Led = 0
End If
Idle
Loop


Ontimer0: ' Timer1-Overflow-Interrupt-Routine
Tcnt0 = 31 ' Preset auf 31, damit er 225 Takte bis Ueberlauf zählt
Incr T
Return


Elektronik-Labor   Projekte   AVR