Montag, 25. Mai 2015

Mein Wecker

Heute möchte ich euch mein erstes Projekt mit dem Arduino zeigen. Meinen Wecker. Leider habe ich beim Bau ein paar Sachen gemacht, die ich im Nachhinein verbessern würde. Deshalb: Bevor du selbst mit dem Bau beginnst, lies dir meine Verbesserungen am Ende durch.


Die Hardware

Für die Stromversorgung habe ich mich gegen eine Batterie entschieden, da man die Position eines Weckers fast nie ändert. Deshalb verwende ich ein Netzteil mit Spannunsversorgungsgerät, das zwei 5V Anschlüsse mit zugehörigem Ground und zwei 3.3V Anschlüsse mit zugehörigem Ground hat.
Ich verwende zum Anzeigen der Uhrzeit ein 16 Zeichen, 2 Zeilen Display. Wenn ihr wissen wollt, wie man ein Display ansteuert: hier! Zum Wecken verwende ich einen ganz normalen Buzzer. Ihr könnt jedoch auch einen Lautsprecher, wie vorgestern, verwenden oder euch sonst irgendwie wecken lassen. Um die aktuelle Uhrzeit einzustellen und die Weckzeit einzustellen, verwende ich 4 Buttons. Die müsst ihr wie hier anschließen.  Zusätzlich verwende ich einen Wechselschalter(ohne Arduino, reines Bauteil) um die Hintergrundbeleuchtung ein- und auszuschalten.
Ein Wechselschalter hat in der Mitte eine Verbindung, und abhängig von der Stellung des Schalters ist diese mit dem rechten oder dem linken Kontakt leitend verbunden. Als Herz des Weckers verwende ich einen ATmega328P-PU. Wie ihr den anschließt um ihn zu programmieren findet ihr hier.
Die gesamte Schaltung sieht dann so aus. Lasst euch davon nicht abschrecken! :) Ihr könnt, dass ganze natürlich auch umbelegen. Das Ganze sieht dann in echt so aus:
Ich habe erst alle Verbindungen die zum Ground/5V müssen zu einem "Knödel" zusammengelötet bevor ich dann das Verbindungskabel zum Ground/5V dazugelötet habe.

Die Software

Hier werde ich nur ein paar grundsätzliche Dinge erklären, da der Code an sich relativ logisch ist. Um sich die aktuelle Uhrzeit anzeigen zu lassen bzw. zu speichern gibt es die Bibliothek Time.h, die man hier downloaden kann. Über die Funktion setTime(Stunde,Minute,Sekunde,Tag,Monat,Jahr); kann man die aktuelle Uhrzeit festlegen lassen. Die Funktion hour() gibt die aktuelle Stunde zurück und die Funktion minute() gibt die aktuelle Minute zurück. Nun zur Funktionsweise des Weckers/ den Aufgaben der Buttons. Beim ersten Einschalten muss die aktuelle Uhrzeit eingestellt werden. Dazu muss Button 1(der Weiße) und Button 2(der Rote) gedrückt werden. Jetzt kann man die aktuelle Stunde verstellen, Button 3(der linke Blaue) stellt den Wert um eins höher, Button 4(der rechte Blaue) stellt den Wert um eins höher. Nach dem Drücken auf Button 1 stellt man die Minute genauso ein(steht auch auf dem Display dabei!) und nach erneutem Drücken sieht man die aktuelle Uhrzeit. Nun ist die Uhr gestellt. Um nun auch den Wecker zu stellen wiederholt man das Verfahren nur beginnt man nur mit Button 2 (der Rote) und muss auch zwischendrin Button 2 zum Weiterkommen drücken. Das Programm überprüft dann laufend ob die "Weckzeit" gleich der aktuellen Uhrzeit ist. Wenn dem so ist, wird eine "Blink-Spannung" an den Buzzer angelegt. Dieser macht dann das typische Weckerpiepen.

Nun noch zu einer Besonderheit, die ich in meinen bisherigen Post noch nicht ansprechen konnte: die analog Eingänge.  Am Arduino sind diese hier:
Am ATmega328 sind es die Pins 23 - 28. Ich habe sie am Wecker verwendet, da ich dadurch mehr freie universell einsetzbare digital Pins habe. Ein Analogeingang ist ein Eingang,der nicht nur zwischen HIGH oder LOW unterscheidet sondern 1023 verschiedene Abstufungen der Spannung erkennt. Um die aktuelle Spannung zu messen verwendet man die Funktion analogRead(Pin);. Diese gibt eine Zahl zurück. Wenn eine Spannung anliegt so gibt die Funktion 1023 zurück. Wenn jedoch keine anliegt, so ist der Wert nicht Null sondern abhängig vom Arduino bei ca. 450. Das ist darauf zurückzuführen, dass der analog Eingang dann Spannungen von den Leiterbahnen nebenan oder andere Verbindungen des Arduino(beispielsweise darüber laufende Kabel) wahrnimmt. Da wir jedoch jeweils nur eine Unterscheidung zwischen HIGH oder LOW benötigen, nehmen wir an, dass unter 600 keine Spannung anliegt und über 600 Spannung anliegt. Das Ergebnis, 0 unter 600 und 1 über 600, speichern wir dann in einer Variable mit der wir weiterarbeiten können.

Was ihr anders machen solltet :)

Zunächst einmal die Fehler die ich gemacht habe:
-> Ihr solltet einen externen Uhrenquarz verwenden. Jeder Mikrocontroller hat einen Takt ähnlich wie euer PC oder Smartphone. Dieser wird entweder mit dem internen Oszillator generiert, der jedoch etwas ungenau ist. Das macht normalerweise nichts, ist bei einer Uhr jedoch ungünstig, da man sie so alle paar Tage nachstellen muss :(
->Bei mir ist die Idee eines Weckers erst so herangewachsen. Deshalb habe ich immer die noch freien Pins genommen, weshalb auch mein Schaltplan so kompliziert ist. Ihr solltet, dass etwas geordneter machen.
->Man könnte das Design der UI der Uhr schöner gestallten. Zum Beispiel das Uhrzeit:Stunde:12Minute:15.
[Update 26.08.15]
->Es wäre sinnvoll eine Funktion hinzuzufügen mittels der man einstellen kann, ob die Weckfunktion "scharf gestellt ist" oder nicht. Dadurch bekommt man kein Problem am Wochenende. :) [/Update]

Was ihr also machen solltet

Ich wollte euch mit dem heutigen Projekt nur zeigen, wie ich meinen Wecker mit dem Arduino/einem ATmega328 gemacht habe. Wenn ihr auch einen Wecker machen wollt, so empfehle ich euch erst alles mit dem Arduino auszuprobieren und aus meinen Erfahrungen zu lernen. Ihr könnt natürlich gerne meinen Schaltung und meinen Programmcode verwenden, jedoch würde ich euch einfach empfehlen, dass ihr den Sketch anschaut und daraus die Funktionen und Befehle kennenlernt. 

Viel Spaß beim bauen eures Weckers! Schickt doch mal in den Kommentaren, wie ihr das Gehäuse baut und wie ihr euren Wecker gemacht habt.

Keine Kommentare:

Kommentar veröffentlichen