Energie-
Verbrauch
Bewegungs-
melder
ioBroker-DHT22
ioBroker-
Laufschrift
ioBroker LED-
Thermometer
ioBroker-OLED
ioBroker
Multi-OLEDs
ioBroker
Mini-Mülltonne
Ball on Plate
Sonstige
Basteleien
Multi Mode Digital Clock | ||||||||||||||||||||||||||
https://youtu.be/ukA71b1g7Q0 | ||||||||||||||||||||||||||
| ||||||||||||||||||||||||||
. . . und noch eine Uhr ;-) Achung! Sollte die Anzeige bei euch gedreht sein, schaut bitte am Ende dieser Seite, wie andere User das Problem gelöst haben Dieses Mal handelt es sich um eine Digital-Uhr, welche mit 4 Stck. günstigen LED-Matrix-Modulen MAX7219 (ebay) gebaut wurde. Die Idee dazu und weitere Tipps stammen von dieser Seite: Nick's LED Projects Die aktuelle Zeit wird entweder mit 4, oder mit 6 Ziffern angezeigt, je nach dem, welcher Modus ausgewählt wird. Ich habe Nick's Code etwas modifiziert, so daß insgesamt 6 verschiedene Darstellungsmöglichkeiten angeboten werden. Außerdem wurde noch ein Temperatur-Sensor DS18B20 ergänzt, der die aktuelle Temperatur anzeigt. Zusätzlich findet ein Helligkeits-Sensor (LDR) Verwendung, welcher die Helligkeit der LED-Matrix dem Umgebungslicht anpasst. Entgegen dem von Nick verwendetem Echtzeit-Uhrenmodul DS1307, habe ich ein DS3231-Modul eingebaut, welches PIN-kompatibel ist, aber eine bessere Genauigkeit hat, da es temperaturkompensiert ist. Die 6 verschiedenen Anzeigemodi stellen sich wir folgt dar:
Im normalen Betrieb wird zwischen den Modi 1-5 ca. alle 2 Minuten automatisch gewechselt. Zusätzlich werden zwischenzeitlich der Wochentag, das Datum, die Kalenderwoche sowie die Temperatur angezeigt. Schaut Euch am Besten das obige Video an, dort wird ein kpl. Durchlauf gezeigt. Die Anzeige des Datums kann über den Taster "Date" ( s. Schaltplan Bild 0 und Bild 9 ) deaktiviert werden. Mit dem Taster "Mode" ( s. Schaltplan Bild 0 und Bild 9 ) kann man manuell zwischen den Modi wechseln und Uhrzeit/Datum stellen. Hardware: Zum hardwaremäßigen Aufbau gibt es nicht viel zu sagen, alles Wesentliche ist dem Schaltplan (s. Bild 0) zu entnehmen. Eine Modifikation musste ich allerdings an den MAX7219 LED-Matrix-Modulen vornehmen: Ich habe den standardmäßigen Strombegrenzungswiderstand R1 auf 120 kOhm erhöht (s. Bild 2), da sonst keine vernünftige Anpassung der Helligkeit via LDR möglich war. Wer genau schaut, wird bemerken, daß in Bild 2 noch 47 kOhm Widerstände verlötet sind. Die sind noch aus meiner Testphase und wurden final dann gegen 120 kOhm ausgetauscht. Die 4 LED-Matrix-Module wurden auf eine Lochrasterplatine gelötet (s. Bild 2,3,6) und die Steuerungselektronik auf eine eigene Lochrasterplatine (s. Bild 7,8). Anschließen wurde beide Platinen übereinander (Sandwich-Bauweise) montiert (s. Bild 3,4). Software: Zum Arduino-Sketch (Download am Ende dieser Seite) ist zu sagen, daß er den vorhandenen Speicher des Arduino-Nano fast kpl. ausfüllt. Eventuelle Modifikation sind nur durch Kürzen des Codes an anderer Stelle möglich, wie z.B. Weglassen der Intro-Sequenz, oder der Entfall von Überblend-Routinen möglich. Programmier-Cracks (zu denen ich mich nicht zähle) können aber evtl. auch noch andere Code-Verbesserungen implementieren. Ich hoffe, meine, bzw. Nick's Kommentare im Code tragen zum Verständnis bei. Noch ein Wort zu den Libraries: Die Arduino-IDE schaut ja beim Starten nach, ob es Aktualisierungen bei den Boards/Libraries gibt und ich habe auch immer brav die neuesten Versionen installiert. Allerdings musste ich feststellen, daß beim Erneuten kompilieren des Digi-Clock-Sketches Fehler auftraten. Das liegt wohl an den neueren Library-Versionen, mit denen der Sketch nicht mehr kompatibel ist. Ich habe deshalb die Libraries wieder downgegraded ( was für ein Wort ;-) und sicherheitshalber alle von mir verwendeten Libraries zum Download unten auf dieser Seite eingefügt. |
Downloads | |
Sketch: | digi_clock.ino |
Libraries: | Button.zip |
DallasTemperature.zip | fontDigiClock.zip | LedControl.zip | Onewire.zip | Rtclib.zip | Wire.zip |
Nachtrag 10.12.2023 In den Kommentaren zu meinem DigiClock-Video auf Youtube ( https://youtu.be/ukA71b1g7Q0 ) hatten einige User, welche die Uhr nachgebaut haben, Probleme mit der Anzeige. Bei manchen war sie um 90°, bei anderen um 180° gedreht, bei einigen war sie spiegelverkehrt (mirrored). Das liegt an den verschiedenen Matrix-Modulen, die auf dem Markt erhältlich sind. Freundlicherweise haben einige die entspr. Code-Schnippsel gepostet, wie sie ihre Matrix durch entspr. Anpassung der "void plot function" drehen/spiegeln konnten: _____________________________________________________________________________________________ Anpassung von Stan: void plot (byte x, byte y, byte val) { //select which matrix depending on the x coord //Auswahl der Matrix in Abhängigkeit von der x-Koordinate y=7-y; if (x >=0 && x <= 7) { address = 3; } if (x >= 8 && x <= 15) { address = 2; x = x - 8; } if (x >= 16 && x <= 23) { address = 1; x = x - 16; } if (x >= 24 && x <= 31) { address = 0; x = x - 24; } if (val == 1) { lc.setLed(address, 7-y, x, true); //hier hat man die Möglichkeit die Anzeige auf der Matrix zu drehen } else { lc.setLed(address, 7-y, x, false); //hier hat man die Möglichkeit die Anzeige auf der Matrix zu drehen } } _____________________________________________________________________________________________ Anpassung von TheHoss: //select which matrix depending on the x coord byte address; if (x >= 0 && x <= 7) { address = 3; } if (x >= 8 && x <= 15) { address = 2; x = x - 8; } if (x >= 16 && x <= 23) { address = 1; x = x - 16; } if (x >= 24 && x <= 31) { address = 0; x = x - 24; } ____________________________________________________________________________________________________ Anpassung von DrTronik: Awesome project! Thank you so much... And whoever that use "FC16" hardware ; must change void plot function like this: --- void plot (byte x, byte y, byte val) { //select which matrix depending on the x coord byte address; if (x >= 0 && x <= 7) { address = 3; } if (x >= 8 && x <= 15) { address = 2; x = x - 8; } if (x >= 16 && x <= 23) { address = 1; x = x - 16; } if (x >= 24 && x <= 31) { address = 0; x = x - 24; } if (val == 1) { lc.setLed(address, y, x, true); } else { lc.setLed(address, y, x, false); } } ____________________________________________________________________________________________________ |
Testet bitte selbst, ob und welche Anpassung evtl. bei euch notwendig ist, damit die Anzeige entspr. gedreht wird. |