IR RC5, I2C, DCF77, 7-Segmente Uhr mit Alarm (mit Bildern)

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo zusammen!

Ich möchte hier mal einen weiteren "Eigenbau" von mir einstellen, der sich gerade in der Fertigstellung befindet.

Es handelt sich um meine 7-Segmente Uhr mit
-DCF77-Empfang
-I2C-Bus für die Anzeigen, Temperatur, "Debug"-LCD und Erweiterungsport
-IR (RC5e) Empfänger
-IR (RC5e) Sender
-Alarmfunktionen
-Relais (230V AC) Schaltausgänge

Die erste Version hatte ich noch auf Lochraster aufgebaut und war eigentlich nur der praktische Versuch, mal zwei AVR`s seriell miteinander kommunizieren zu lassen.
Ein Mega16 steuerte damals die 7-Segmente und den Mega8, der für das IR-Signal und die Steuerung der zusätzlichen LED`s verantwortlich war.

Die zweite Version basierte auf der Ersten.... jedoch mit einer selbst geäzten Platine und ein paar Soft- und Hardwareerweiterungen.


Die jetzige dritte Version wurde von Grund auf neu bearbeitet.
Zwar ist das "Design" nach Außen hin gleich geblieben, jedoch wurde Hard- und Softwaretechnisch alles geändert.

So werden nun die vier 7-Segmente und die sieben Zusatz-LED`s nicht mehr direkt vom Controller angesteuert sondern per I2C.

Die 7-Segmente sind mit einem PCF8577C verbunden, der seine Daten über den I2C-BUS erhält und über vier ULN2803 die 32 einzelnen Segmente ansteuern kann.

Die sieben zusätzlichen LED`s sind mit einem PCF8574A verbunden, der ebenfalls seine Daten über den I2C-BUS erhält und über einen ULN2803 die LED`s ansteuert.

Desweiteren wird die Temperatur nun nicht mehr über den 1-Wire-BUS Sensor DS18S20 ermittelt sondern über den I2C-Baustein DS1624.

IC-Detail.jpg

Dank des I2C-BUS Systems steht auf der Rückseite der Platine ein Anschluss zur Verfügung, der für spätere Erweiterungen und als "Zusatzschnittstelle" genutzt werden kann.
Während der Softwareentwicklung habe ich zum Beispiel an diesen Anschluss mein 16x2 LCD angeschlossen, um mir ein paar "Debug"-Ausgaben live ansehen zu können.


Die hauptsächliche Arbeit bestand aber in der Entwicklung der neuen Software.
Natürlich musste ich diese zum Einen wegen dem I2C-BUS System komplett neu schreiben......
zum Anderen wollte ich aber auch die Bedienung freundlicher und einfacher gestalten. ;)


Da sich die Uhr mit Alarm später bei mir AUF dem Schlafzimmerschrank befindet, besitzt sie keine Tasten (außer 1x Reset und 1x Test) und wird komplett mit der TV/VCR Fernbedienung meines Fernsehers eingestellt.
Hierfür habe ich den TSOP1736 IR-Empfänger verwendet. Alternativ kann auch ein SFH5110 (SFH5111) genommen werden.

Der Alarm wird ebenfalls per IR-Code abgegeben. Hierfür arbeite ich mit einer SFH485 Sendediode.
Bei einem Alarm sendet die Uhr nun einen RC5e-Code zum Fernseher, der daraufhin sein Radiomodul in Betrieb nimmt. :)


Da die Software noch nicht ganz fertig gestellt ist und Bilder meistens mehr als tausend Worte sagen, folgen nun mal ein paar aktuelle Fotos mit kurzen Erklärungen. ;)


Anzeige der aktuellen Uhrzeit, des Wochentages und ob ein Sync per DCF77 erfolgt ist.
Uhrzeit_sync1.jpg Uhrzeit_sync2.jpg

Die unteren sieben LED`s zeigen den Wochentag an:
Montag , Dienstag , Mittwoch , Donnerstag , Freitag , Samstag , Sonntag
Die LED des aktuellen Tages blinkt dann.

Zum Blinken gibt es noch eine Besonderheit.....
Ob die Uhr synchronisiert wurde kann man an zwei LED`s sehen....
Blinken der Wochentag und der "Sekundenpunkt" im Gleichtakt (synchron), dann wurde die Uhr per DCF77 auch synchronisiert.
Blinken sie gegensätzlich, fehlte in der letzten Minute die Synchronisierung.
So einfach ist das. ;)


Alle 20 Sekunden, genauer gesagt in jeder 10., 30. und 50. Sekunde, wird automatisch der aktuelle Temperaturwert ermittelt und angezeigt:
Temperatur.jpg

Hierbei blinkt der Sekundenpunkt dann nicht mehr sondern dient als festes Komma und am Ende wird noch ein kleines C angehängt.


Auf "Knopfdruck" lassen sich aber auch die laufenden Sekunden anzeigen:
Sekunden.jpg
 
Da die Uhr sowieso per IR gesteuert wird, habe ich auch gleich eine RC5E-Code Anzeige mit integriert.
Per Tastendruck wird das RC5e-Menü aufgerufen und optisch quittiert:
rc5e.jpg


Empfangen und Anzeigen des aktuell gesendeten RC5e-Codes:
rc-code1.jpg

War der Empfang des IR-Codes in Ordnung wird er folgendermaßen angezeigt:
IR-Adresse steht links, also hier 05 (VCR)
IR-Kommando steht rechts, also hier 82


Bei IR-Kommandos über 100 leuchten zusätzlich die vier LED`s unter dem IR-Kommando....
rc-code2.jpg

Hier also der RC5E-Code = 03 / 113 (nicht 03 / 13 !)
 
Da die Uhr auch zwei getrennte Alarmzeiten besitzt, werden diese über ein separates Menü bearbeitet.

Das Verzweigen in das Alarmmenü wird wie folgt quittiert:
Alarm-menue.jpg

Jetzt muss man sich nur noch entscheiden, ob man Alarm-1 oder Alarm-2 bearbeiten möchte.


Verzweigt man z.B. in die Routine zum Bearbeiten des 1. Alarms, wird dies eine Sekunde lang quittiert.
Alarm1.jpg

Da der erste Alarm nur an den Werktagen (Montag bis Freitag) ausgeführt wird, leuchten bei der Bearbeitung der Alarmzeit auch nur die Wochentag-LED`s 1-5 als Hinweis.


Der zweite Alarm dient für Weckzeiten am Wochenende (Samstag und Sonntag).
Alarm2.jpg

Auch hier erfolgt wieder das Bearbeiten der Alarmzeit mit dem optischen Hinweis der Wochtentag-LED`s !
 
Der Programmablauf zum Bearbeiten der Alarmzeit ist wie folgt.....


Zu Beginn wird die derzeitig (im EEPROM) gespeicherte Alarmzeit angezeigt:
Alarmzeit1.jpg

Möchte man eine neue Alarmzeit eingeben, wechselt die Anzeige sofort zur ersten Stelle und unterlegt die verbleibenden Stellen mit einem Unterstrich.
Alarm1-neu.jpg

Die Eingabe der Alarmzeit kann direkt über die Ziffern 0-9 der Fernbedienung erfolgen.... und nicht mehr wie früher mit "Hoch" und "Runter" Tasten.
Gibt man also der Reihe nach 1, 2, 3, 4 ein, ergibt dies dann eine Alarmzeit von 12:34 Uhr.

Bei der Eingabe der Alarmzeit (24h Anzeige) wird für jede Stelle auch SOFORT eine Plausibilitätsprüfung durchgeführt!
So ist es zum Beispiel nicht möglich die Zeit mit einer "3" zu beginnen.......
In Abhängigkeit zur ersten Ziffer (Zehner-Stunden) wird dann auch die Eingabe der zweiten Ziffer (Einer-Stunden) überprüft.
War die erste Ziffer eine "2", dann darf die zweite Ziffer nur "0", "1", "2", oder "3" betragen. Alle anderen Ziffern sind dann ungültig!
Erst nach Eingabe einer gültigen Ziffer ist es möglich die nächste Ziffer einzugeben!
Auf diese Weise kann es bei der Eingabe auch nicht passieren, dass irrtümlich eine 35:61 Uhr abgespeichert wird. ;)


Soll nach Eingabe der Alarmzeit diese abgespeichert werden, wird dies nach erfolgtem "Tastendruck" ausgeführt und über die Anzeige bestätigt.
Alarm1-save.jpg


Kurz nach der "Save"-Meldung fragt die Uhr auch gleich, ob der Alarm jetzt "aktiv" geschaltet werden soll:
Alarm1-on.jpg


Mit den Tasten "1"= Ja oder "0"= Nein kann dies ausgewählt werden und wird ebenfalls entsprechend bestätigt:
Alarm1-on-ja.jpg
 
Mann Cassio,
wenn ich mit meiner Uhr erst mal so weit wäre.
Schicke Ideen die du umgesetzt hast.
Wie groß sind denn die Segmente, wenn du die Uhr auf dem Schrank ablesen kannst?
Mein Wecker hat schon 30mm LCD-Anzeigen, damit ich den im Halbschlaf ohne Brille ablesen kann.

HBA
 
Hallo HBA !

Nun ja... ich werde auch langsm älter und darum sind die 7-Segment-LED`s auch vorsichtshalber 57mm hoch. ;)

Da klappt das Ablesen der Uhrzeit dann auch im Halbschlaf.... trotz der Entfernung zum Schrank. :)

Grüße,
Cassio
 
...weiter gehts....

Da die zweite Alarmzeit programmtechnisch identisch funktioniert, muss ich hierzu ja nicht mehr viel schreiben. ;)

Auf den Bildern ist lediglich zu sehen, dass bei der Abfrage und Einstellung der zweiten Alarmzeit nur die beiden LED`s für Samstag und Sonntag als Hinweis leuchten.

Aktuelle Alarmzeit:
Alarm2-zeit.jpg

Speichern der Alarmzeit:
Alarm2-save.jpg

Frage nach Aktivierung:
Alarm2-on.jpg


Antwort: Nö ! ;)
Alarm2-on-nein.jpg



Das war es erst mal bis hier hin......
Soweit steht das Programm also schon.
Was nun noch fehlt ist folgendes:
-Alarm sendet den IR-Code zum "Wecken" an den TV
-Schlummerfunktion (10 min.) über die "Aus"-Taste der Ferbedienung
-Alarm-Aus Funktion auch während der Schlummerphase
-abdimmen aller LED`s und Segmente zur Nacht
-Ansteuerung der zwei Relais-Ausgänge (230V AC)
-Gehäuse anfertigen
-und noch ein paar Kleinigkeiten ;)

Grüße,
Cassio
 
Hi Cassio,

ja, nette Idee. Teile der Hardware hatte ich ja schon gesehen.


Nach Anzahl der Widerstände magst Du das Multiplexen auch nicht so gern. So hat man dadurch alle Timer zur Verfügung. Und der geringe Mehraufwand - Basteln macht ja immer noch Spass, es soll ja kein Wettrennen werden (HBA???).


Grüsse,

Michael
 
Hallo Michael!

Nein, Multiplex benötige ich bei dieser Variante nicht, weil alle LED`s, ob nun Segment oder Diode, über die PCF`s einzeln angesteuert werden.

Bei einer Matrix, so wie HBA es vor hat, würde es mir aber auch nicht erspart bleiben. ;)
So gesehen habe ich es also viiiiel einfacher.


Meinen Schaltplan und das Programm-Blockbild werde ich die Tage noch nachreichen.

Schöne Grüße,
Cassio
 
Basteln macht ja immer noch Spass, es soll ja kein Wettrennen werden (HBA???).
Ehrlich gesagt, wollte ich mir selber etwas Druck machen, indem ich die Wordclock hier zeige, damit ich endlich fertig werde.
Mir passiert es immer wieder, dass ich mehrere Runden drehe mit
  • Mechanik bauen
  • Elektronik löten
  • Programm erstellen
Also kein Wettstreit mit Cassio, aber sehr wohl Ansporn für mich selbst.

HBA
 
Also kein Wettstreit mit Cassio, aber sehr wohl Ansporn für mich selbst.


Hallo zusammen!

Nein, also in einen Wettstreit möchte ich auch nicht treten !
Außerdem würde ich beim Erstellen des Programms gegen HBA sowie haushoch verlieren. ;)

Normalerweise stelle ich meine Arbeiten auch nur dann ein, wenn sie fertig sind.
Da aber zur Zeit so viele Themen mit 7-Segmente, Matrixmodulen und Dergleichen im Forum sind.... und ich nicht die Threads der Anderen für meine Fortschritte missbrauchen möchte.... habe ich mich dazu entschlossen, das teilfertige Produkt hier jetzt schon mal einzustellen. :)

Meine Software befindet sich momentan in der Revision 4.1 !
Es werden also immer wieder mal Ansteuerungen- und/oder Ablaufänderungen von mir vorgenommen.

Ich hatte mir eigentlich vorgenommen, dass die Uhr heute Abend fertig ist.... :rolleyes:
Das wird wohl leider nichts mehr werden und darum gebe ich mir Zeit bis zum Wochenende...... weil dann ein erster Wecktest auch ruhig mal fehlschlagen darf. :D

Grüße,
Cassio
 
Außerdem würde ich beim Erstellen des Programms gegen HBA sowie haushoch verlieren. ;)
Ja, nee, is klar. Er stellt mal wieder sein Licht unter Scheffel. ;)

Von deinen bald 2000 Posts sind mindestens 1500 gute Programmier Tipps. Da bin ja wohl ich derjenige der meilenweit abgeschlagen ist.
Hoffentlich kriegen wir dein Programm trotzdem zu sehen.

HBA
 
Hi HBA,

Ehrlich gesagt, wollte ich mir selber etwas Druck machen, indem ich die Wordclock hier zeige, damit ich endlich fertig werde.
Mir passiert es immer wieder, dass ich mehrere Runden drehe mit
  • Mechanik bauen
  • Elektronik löten
  • Programm erstellen
Also kein Wettstreit mit Cassio, aber sehr wohl Ansporn für mich selbst.

HBA

ja, geht mir ja auch so. Nach einer (nötigen) Pause muss man sich selbst einen Ruck geben, damit es weitergeht. Das Thema Wettstreit ist damit wohl gegessen.


Grüsse,

Michael
 
Hallo HBA!

Danke für die Blumen.....
aber es stimmt so nicht und daher kann ich sie so auch nicht annehmen. ;)

Ich habe das Programmieren beruflich nicht gelernt und gezeigt hat es mir privat auch keiner.
Alles was ich hier an mehr oder minder "wertvollen" Tipps geben kann, habe ich mir seit 2007 selber beigebracht..... angelesen und ausprobiert. ;)


Du darfst das Lob für deine Porgammierkentnisse aber ruhig behalten. :flowers:

So, nun aber wieder an die Arbeit..... ;)


Gruß,
Cassio
 
Hallo HBA!
Ich habe das Programmieren beruflich nicht gelernt und gezeigt hat es mir privat auch keiner.
Alles was ich hier an mehr oder minder "wertvollen" Tipps geben kann, habe ich mir seit 2007 selber beigebracht..... angelesen und ausprobiert. ;)
Umso besser.
Aber auch da haben wir etwas gemeinsam, denn das ist genau die Art, wie ich µC Programmierung seit 2006 gelernt habe: Viel Lesen, Ausprobieren, einige Tipps holen und ganz wichtig: niemals aufgeben.
Viele, die hier herkommen, holen sich den schnellen Rat und werden danach nicht mehr gesehen.

Und ja, jetzt wieder an die Arbeit.

HBA
 
Hallo zusammen!

Ich hab da mal eine Frage.....

Damit mir die LED`s und die 7-Segmente in der Nacht nicht den Schlaf rauben, weil sie viel zu hell sind, möchte ich eine automatische Dimmung einbauen.

Da es in BASCOM den Befehl "Getrc" gibt, bei dem die Ladezeit eines Kondensators gemessen wird, wollte ich die Funktion dafür nutzen.
Getrc-schaltung.gifEDIT: Falsches Anschlussbild ! Bitte nicht verwenden!
............................Für das richtige Anschlussbild bitte HIER klicken!

Schließlich möchte ich keine gleichmäßige Dimmung der LED`s erreichen sondern einfach nur einen Schwellwert verwenden.
Bei überschreiten des Schwellwertes ist es Tag und der Lasttransistor wird voll durchgesteuert.
Beim Unterschreiten steuert der Transistor dann nur noch 50% durch..... oder weniger, dass muss ich dann noch mal testen.


EDIT: Falsche Überlegungen durch falsches Anschlussbild!

Da mein LDR leider nur 1K hat muss der Kondensator doch relativ groß sein, um eine vernünftige Differenz zu erhalten.
Nun habe ich hier einen 10µF Kondensator gefunden, der einen vernünftigen Wert liefert.....
Im "Dunkeln" < 56 und im "Hellen" > 80


RC-C.jpg

Ich überlege nun gerade, ob es für den Kondensator und/oder dem AVR-Pin schädlich sein kann, wenn er eine so hohe Kapazität hat. :hmmmm:

Auf Grund der kurzen Entladezeit durch den AVR-Pin wird der C aber nicht vollständig entladen.... und damit sollte sich die Energie doch in Grenzen halten, oder?
Ich habe davon mal zwei Bilder gemacht....
Einmal im "Hellen" und einmal im "Dunkeln" (unterschiedliche Zeitachse beachten!)

1126382826.gif 1702832212.gif


Was meint ihr dazu?
Kann ich das so lassen?


Grüße,
Cassio
 
Hallo Cassio,
ich habe den Befehl GetRC noch nicht benutzt.
Wenn ich mir die Graphik in der Hilfe ansehe schätze ich mal, dass die den Pin kurz als Ausgang mit High Potential setzen, dann auf Low umschalten und dann in einer Schleife kurz auf Eingang setzen und schauen, wann der Wert0 ist. Die Anzahl Loops wird dann ausgegeben.
Dabei sollte der Strom durch den Pin haupsächlich von dem Widerstand (deinem LDR) abhängen. Wenn der also etwa 1K ist, fließen ja max 5mA aus dem Pin und in den Pin.
Da die Sache ohne Timer läuft, schätze ich mal, dass das einige Zeit dauert.

Bei meinem Projekt habe ich ja auch eine solche Helligkeitsänderung drin, aber ohne den GetRC Befehl. Dazu wird in einem Timer der Pin als Ausgang kurz auf High geschaltet und der Kondensator entlädt sich dann über den LDR. Bei jedem weiteren Timeraufruf wird dann überprüft, ob der Pin als Eingang schon low ist.
Funktioniert ausgezeichnet und benötigt praktisch keine Rechenzeit.

HBA
 
Hallo HBA!

Ich habe den GETRC() schon ein paar mal verwendet....
aber eben mit 10K und 100nF bis 470nF.

EDIT: Falsche Überlegungen durch falsches Anschlussbild !
Zum besseren Verständnis habe ich das Bild mit dem Scope gemacht.
Ich denke mal, es funktioniert so:
1) Am Pin liegt demnach immer 5V an.....
2) dann wird der Pin wohl kurz gegen GND geschaltet und der Kondensator entlädt sich (zumindest telweise, ich denke mal 1Tau)....
3) nun wird der Kondensator wieder aufgeladen....
4) jetzt wird die Zeit gezählt, bie die "HIGH"-Schwelle am Pin erreicht ist.
5) der Wert wird nun zurück gegeben.

Ich habe ja nun auch nur etwas Sorge wegen dem Punkt 2) !

Natürlich wird der Strom von der Quelle her mit dem LDR begrenzt.
Allerdings fließt nun aber auch die Ladung vom Tantal-C völlig "ungebremst" (nur durch den Innenwiderstand des Pin`s im AVR) gegen GND ab.
Das ist der Punkt, den ich mit "Schaden nehmen" meine. ;)

Mir fällt momentan aber auch keine Messmethode ein, um das zu kontrollieren. :hmmmm:

Grüße,
Cassio
 
Was nun noch fehlt ist folgendes:
-Alarm sendet den IR-Code zum "Wecken" an den TV
-Schlummerfunktion (10 min.) über die "Aus"-Taste der Ferbedienung
-Alarm-Aus Funktion auch während der Schlummerphase
-abdimmen aller LED`s und Segmente zur Nacht
-Ansteuerung der zwei Relais-Ausgänge (230V AC)
-Gehäuse anfertigen
-und noch ein paar Kleinigkeiten ;)


Hallo zusammen !

Es ist vollbracht! :D
(Naja, fast. ;) )

Heute habe ich die Endfassung geschrieben und nun kann es in die Betaphase gehen. :)

Nach einigen letzten Grübeleien wegen der "Alarm-IR-Signale"......
und über 1300 Zeilen Programmcode später kann ich nun behaupten,
dass meine Arbeit zum größten Teil abgeschlossen ist.


Was mir von der obigen Liste nun noch fehlt sind zwei Punkte:
-Ansteuerung der zwei Relais-Ausgänge (230V AC)
-Gehäuse anfertigen

Die Relaisansteuerung ist nicht das Problem und momentan nur ein Gedankenspiel, dass hardwaretechnisch aber schon fertig ist.

Das Gehäuse ist bei mir (wie immer) der schwierigste Teil. :rolleyes:
Passende fertige und gefällige Gehäuse habe ich mal wieder keine Gefunden. :mad:
Also muss ich selber etwas zaubern und darum kann dies noch ein wenig dauern. :cool:


Es folgen dann in Kürze also der Schaltplan, das Programm als Blockbild, der Programmcode und die restlichen Bilder.

Schöne Grüße,
Cassio
 
Hallo zusammen!

Ich stelle hier nun schon mal den Schaltplan ein....
57mm-led-i2c-uhr_Plan.gif

Der Plan ist soweit aktuell.
Alledings habe ich zur Ansteuerung der ULN2803 nicht die aufgeführten 27K Widerstände genommen sondern nur 12K Widerstände!

Die Netzteilplatine nehme ich dann später von der Vorgängerversion.....
darum gibt es davon zur Zeit auch keine Bilder.


Ich versuche mich auch gerade an dem Blockbild/Flussdiagramm des Programms.
Das ist eine ganz schöne Arbeit, wenn man alles mit berücksichtigen möchte. :rolleyes:
Ich habe zwar alles im Kopf, aber dies unter Berücksichtigung z.B. jeden Flags aufzumalen ist doch ganz schön heftig.
Aus dem Grunde werde ich nur eine grobe Übersicht erstellen, die den Ablauf und das Prinzip beschreibt.

Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)