Ding:Wortuhr von Udo: Unterschied zwischen den Versionen
Udo (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Heinz (Diskussion | Beiträge) (→Grundlagen zur Programmierung:: code tag to pre ersetzt und source-code formatiert eintückung und br tag entfernt) |
||
Zeile 76: | Zeile 76: | ||
'''Anmerkung:''' das Zeichen # am Zeilenanfang wird hier nicht korrekt angezeigt (Formatierung) und daher durch ≠ dargestellt. <br /> | '''Anmerkung:''' das Zeichen # am Zeilenanfang wird hier nicht korrekt angezeigt (Formatierung) und daher durch ≠ dargestellt. <br /> | ||
Im Code ist dies natürlich zu berücksichtigen. Ebenfalls betroffen ist die Strukturierung ich bitte um Nachsicht<br /> | Im Code ist dies natürlich zu berücksichtigen. Ebenfalls betroffen ist die Strukturierung ich bitte um Nachsicht<br /> | ||
< | <<nowiki /> <code> ... </code>> | ||
< | <pre> | ||
< | code tags durch pre ersetzt | ||
<code> ... </code> | |||
</pre> | |||
Dann bleibt die Formatierung erhalten da das Wiki die Finger davon läßt. [[User:heinz|heinz]] | |||
int latchPin = 10; | |||
int clockPin = 13; | |||
int dataPin = 11; | <pre> | ||
int Oe = 9; | #include <Wire.h> | ||
int s1 = 14; // Taster S1 analog0 = digital-Pin14 | #include <Time.h> | ||
int s2 = 15; // Taster S2 analog1 = digital-Pin15 | #include <DS1307RTC.h> | ||
int s3 = 16; // Taster S3 analog2 = digital-Pin16 | int latchPin = 10; // Pin connected to ST_CP of 74HC595 | ||
int s4 = 17; // Taster S4 analog3 = digital-Pin17 | int clockPin = 13; // Pin connected to SH_CP of 74HC595 | ||
char anzeige[2]; // (Anzeigemuster-Array 0-2) | int dataPin = 11; // Pin connected to DS of 74HC595 | ||
tmElements_t tm; // Uhrzeit und Datum Variable | int Oe = 9; // Output Enable der Shift Register | ||
int s1 = 14; // Taster S1 analog0 = digital-Pin14 | |||
void setup() | int s2 = 15; // Taster S2 analog1 = digital-Pin15 | ||
{ | int s3 = 16; // Taster S3 analog2 = digital-Pin16 | ||
Serial.begin(9600); | int s4 = 17; // Taster S4 analog3 = digital-Pin17 | ||
pinMode(latchPin, OUTPUT); // für das Shift Register | char anzeige[2]; // (Anzeigemuster-Array 0-2) | ||
pinMode(clockPin, OUTPUT); // für das Shift Register | tmElements_t tm; // Uhrzeit und Datum Variable | ||
pinMode(dataPin, OUTPUT); | |||
void setup() | |||
pinMode(Oe, OUTPUT); // Output Enable<br /> | { | ||
pinMode(s1, INPUT); // Analog 0 als Digitaler Eingang | Serial.begin(9600); | ||
pinMode(s2, INPUT); // Analog 1 als Digitaler Eingang | pinMode(latchPin, OUTPUT); // für das Shift Register | ||
pinMode(s3, INPUT); // Analog 2 als Digitaler Eingang | pinMode(clockPin, OUTPUT); // für das Shift Register | ||
pinMode(s4, INPUT); // Analog 3 als Digitaler Eingang | pinMode(dataPin, OUTPUT); // für das Shift Register | ||
digitalWrite(Oe, LOW); // Ausgänge der Schieberegister aktivieren | pinMode(Oe, OUTPUT); // Output Enable<br /> | ||
} | pinMode(s1, INPUT); // Analog 0 als Digitaler Eingang | ||
pinMode(s2, INPUT); // Analog 1 als Digitaler Eingang | |||
void Loop() | pinMode(s3, INPUT); // Analog 2 als Digitaler Eingang | ||
{ | pinMode(s4, INPUT); // Analog 3 als Digitaler Eingang | ||
RTC.read(tm); // Auslesen der RTC | |||
Serial.print("RTC: "); | digitalWrite(Oe, LOW); // Ausgänge der Schieberegister aktivieren | ||
if (tm.Hour <10) {Serial.print("0");} // Führende Null einblenden | } | ||
Serial.print(tm.Hour); | |||
Serial.print(":"); | void Loop() | ||
if (tm.Minute <10) {Serial.print("0");} // Führende Null einblenden | { | ||
Serial.print(tm.Minute); | RTC.read(tm); // Auslesen der RTC | ||
Serial.print(":"); | Serial.print("RTC: "); | ||
if (tm.Second <10) {Serial.print("0");} // Führende Null einblenden | if (tm.Hour <10) {Serial.print("0");} // Führende Null einblenden | ||
Serial.println(tm.Second); | Serial.print(tm.Hour); | ||
Serial.print(":"); | |||
if (tm.Minute <10) {Serial.print("0");} // Führende Null einblenden | |||
ausgabe(); // Das Variablen Array an die Schieberegister senden | Serial.print(tm.Minute); | ||
} | Serial.print(":"); | ||
if (tm.Second <10) {Serial.print("0");} // Führende Null einblenden | |||
void ausgabe() | Serial.println(tm.Second); | ||
{ | // Hier muss noch der Code für die Ausgabe geschrieben werden um dann letztendlich die Ausgabe durchzuführen | ||
digitalWrite(latchPin, LOW); // Latch ausschalten (LOW), damit die Register | // Natürlich ist auch die Bedienung der Taster-Abfrage hier noch zu berücksichtigen. | ||
// beschrieben werden können. | ausgabe(); // Das Variablen Array an die Schieberegister senden | ||
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[0]); // Katoden Bits 0 bis 7 | } | ||
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[1]); // Katoden Bits 0 bis 7 | |||
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[2]); // Katoden Bits 0 bis 7 | void ausgabe() | ||
{ | |||
digitalWrite(latchPin, HIGH); // LATCH: übertrag vom Register in den Speicher | digitalWrite(latchPin, LOW); // Latch ausschalten (LOW), damit die Register | ||
// und damit auch die Werte in die Anzeige | // beschrieben werden können. | ||
// übernehemen, dies geschieht nur bei einem | shiftOut(dataPin, clockPin, MSBFIRST, anzeige[0]); // Katoden Bits 0 bis 7 | ||
// LOW-HIGH Übergang des Latch-Pin | shiftOut(dataPin, clockPin, MSBFIRST, anzeige[1]); // Katoden Bits 0 bis 7 | ||
} | shiftOut(dataPin, clockPin, MSBFIRST, anzeige[2]); // Katoden Bits 0 bis 7 | ||
</ | |||
digitalWrite(latchPin, HIGH); // LATCH: übertrag vom Register in den Speicher | |||
// und damit auch die Werte in die Anzeige | |||
// übernehemen, dies geschieht nur bei einem | |||
// LOW-HIGH Übergang des Latch-Pin | |||
} | |||
</pre> | |||
'''Das Array könnte folgendermaßen beschrieben werden:'''<br /> | '''Das Array könnte folgendermaßen beschrieben werden:'''<br /> | ||
< | <pre> | ||
void arrayleeren() | void arrayleeren() | ||
{ | { | ||
anzeige[0]=0; | anzeige[0]=0; | ||
anzeige[1]=0; | anzeige[1]=0; | ||
anzeige[2]=0; | anzeige[2]=0; | ||
} | |||
} | |||
void minuten_drei() | |||
{ | |||
// 3. Datenbyte Bit 6 | |||
bitSet(anzeige[2],6; | |||
} | |||
void minuten_viertel() | |||
{ | |||
// 3. Datenbyte Bit 7 | |||
bitSet(anzeige[2],7); | |||
} | |||
</pre> | |||
Version vom 12. März 2016, 17:11 Uhr
Foto | |
---|---|
Basisdaten | |
Status | funktionstüchtig |
Schöpfer | Udo (Diskussion) |
Udo's Version einer Wortuhr
Eine Uhr welche die Zeit nicht mit Zeigern oder Zahlen sondern als geschriebene Wörter in Intervallen von Fünf Minuten anzeigt.
Zusammenfassung:
- Zum Einbau in einen IKEA RIBBA Bilderrahmen
- Für jeden verwendeten Buchstaben wird eine LED (99 LED'S) verwendet, daher gleichmäßige Ausleuchtung aber auch höherer Kosten- und Zeitaufwand.
- größeres Projekt für Fortgeschrittenen Bastler, daher leider nicht für Einsteiger geeignet (Mechanik und Elektronik)
- Die angesteuerten Leds leuchten alle gleichzeitig, kein Multiplexing, daher höhere Lichtausbeute aber auch höherer Strombedarf als bei Multiplexing
- für die Komplette Darstellung der Zeit werden lediglich drei (3) Byte verwendet (24-Bit)
- Differenzierung zwischen EIN und EINS (ES IST EIN UHR / ES IST FÜNF NACH EINS)
- Geschlossenes Gehäuse (Bilderrahmen) mit freien Zugang zu den Bedienelementen (Taster) zum einstellen / ändern der Uhrzeit
- Batterie gestützte Echtzeit Uhr, d.h. die Zeit läuft weiter auch wenn die Schaltung von der Versorgung/Netzteil getrennt wurde und ist sofort wieder verfügbar sobald die Versorgung (Netzteil) angeschlossen wird.
geplante Erweiterungen:
- An eine Funk Uhr Anbindung mit DCF77 Empfänger wurde zwar gedacht, wegen schlechten Empfangs (allgemein bekannt) jedoch wieder verworfen
- über eine Zeit Synchronisierung mit RDS Signal des UKW Radios' (z.B. mit SI4735 o.ä.) denke ich gerade nach Ein fertiges Modul bekommt man u.a. bei ELV hier auch ein nettes Video vom CCzwei: SDR Software Defined Radio von Burkhard Kainka und ein weiteres Video auch vom CCzwei DSP Radio mit dem Arduino Testboard
- auch eine Synchronisierung über WLAN und Zeit-Server (NTP) ist noch nicht gänzlich aus dem Rennen
- Dimmer Funktion zur Helligkeitsanpassung an das Umgebungslicht
- Näherungssensor für "Magic Mirror" Effekt (steht man direkt vor der Uhr wird das Display ausgeschaltet und die gesamte Fläche ist dann ein Spiegel) natürlich muss dann eine durchlässige Spiegelfolie hinter der Glasplatte angebracht werden
Downloads:
- mechanische Baupläne als SVG für VisiCut: http://wiki.fablab-nuernberg.de/files/1/12/Wortuhr_V1.0.1_VisiCut_Daten.zip
- komplettes 3D Modell erstellt mit SketchUp: http://wiki.fablab-nuernberg.de/w/Datei:Wortuhr_V1.0.1_3D_Sketchup.zip
- Schaltplan der Controllerplatine mit Bedienelementen: http://wiki.fablab-nuernberg.de/files/f/f7/WortUhr_Controller_V1.0.1c_Schaltplan.pdf
- für VisiCut Zifferblatt mit FAB LAB Schriftzug und Logo: http://wiki.fablab-nuernberg.de/files/1/1a/Wortuhr_V1.0.1_mit_FabLab_Zifferblatt_%2B_Trenner_3mm.svg
Alternative Elektronik:
Wer den Nachbau der kompletten Elektronik Scheut kann auch meinem Entwurf "Schieberegister_mit_Leistung"
mit einem Arduino (FabUino) kombinieren und hierfür verwenden, es werden drei (3) Platinen "Schieberegister_mit_Leistung" ohne FET's benötigt.
Das ganze verschwindet dann natürlich nicht mehr 'unsichtbar' in den Bilderrahmen :-(
Außerdem muss dann auch noch ein extra RTC-Modul besorgt werden, es sei denn man verzichtet auf den Komfort eines Batterie gestützten Uhr-Moduls und nimmt in Kauf dass die Zeit noch stärker als mit dem DS1307 abweicht, wenn der Arduino nicht Zeitkalibriert wird.
Modding:
Die Dateien "Wortuhr_V1.0.1 Grundplatte für 5mm LED + Aufbaurahmen + Kleinteile 3mm.svg" und "Wortuhr_V1.0.1 Segment - Trenner Karton.svg" (Beide Dateien im ZIP Archiv der mechanischen Baupläne für VisiCut "Wortuhr_V1.0.1_VisiCut_Daten.zip") wurden so gestaltet dass anstelle der einzelnen LEDs auch LED Strips mit Controller (WS2812B)
z.B. http://www.adafruit.com/products/1461
o.ä. mit 60 LED/m eingesetzt werden können (RM 16.666mm). Die LED Streifen werden dann auf die Grundplatte geklebt und die Montagerahnen und Segment-Trenner darüber angebracht. Die Ausschnitte sollten breit und hoch genug sein um genügend Raum für die LED Streifen zu gewährleisten. Natürlich ist für dieses Modding auch eine Anpassung der Ansteuerung nötig, IC2 bis IC7 fallen ersatzlos weg und die LED Strips werden mit dem SPI (ISP) Port angesprochen. natürlich kann dann auch ein "normaler" Arduino oder auch der FabUino verwendet werden.
Zum Programmieren steht im GitHub die Library Fastled mit ausführlicher Beschreibung bereit.
http://github.com/FastLED/FastLED
Grundlagen zur Programmierung:
Verwendete Libraries:
DS1307 Library - http://playground.arduino.cc/Main/DS1302RTC
I2C-Library - http://www.arduino.cc/en/Reference/Wire
Time-Library - http://playground.arduino.cc/code/time
Für die Programmierung (Arduino-IDE) wichtige Infos
In das Char - Array "Anzeige" werden später die anzusteuernden LED-Gruppen geschrieben,
(HI/BitSet = LEDs Leuchten)
Anmerkung: das Zeichen # am Zeilenanfang wird hier nicht korrekt angezeigt (Formatierung) und daher durch ≠ dargestellt.
Im Code ist dies natürlich zu berücksichtigen. Ebenfalls betroffen ist die Strukturierung ich bitte um Nachsicht
< ...
>
code tags durch pre ersetzt <code> ... </code>
Dann bleibt die Formatierung erhalten da das Wiki die Finger davon läßt. heinz
#include <Wire.h> #include <Time.h> #include <DS1307RTC.h> int latchPin = 10; // Pin connected to ST_CP of 74HC595 int clockPin = 13; // Pin connected to SH_CP of 74HC595 int dataPin = 11; // Pin connected to DS of 74HC595 int Oe = 9; // Output Enable der Shift Register int s1 = 14; // Taster S1 analog0 = digital-Pin14 int s2 = 15; // Taster S2 analog1 = digital-Pin15 int s3 = 16; // Taster S3 analog2 = digital-Pin16 int s4 = 17; // Taster S4 analog3 = digital-Pin17 char anzeige[2]; // (Anzeigemuster-Array 0-2) tmElements_t tm; // Uhrzeit und Datum Variable void setup() { Serial.begin(9600); pinMode(latchPin, OUTPUT); // für das Shift Register pinMode(clockPin, OUTPUT); // für das Shift Register pinMode(dataPin, OUTPUT); // für das Shift Register pinMode(Oe, OUTPUT); // Output Enable<br /> pinMode(s1, INPUT); // Analog 0 als Digitaler Eingang pinMode(s2, INPUT); // Analog 1 als Digitaler Eingang pinMode(s3, INPUT); // Analog 2 als Digitaler Eingang pinMode(s4, INPUT); // Analog 3 als Digitaler Eingang digitalWrite(Oe, LOW); // Ausgänge der Schieberegister aktivieren } void Loop() { RTC.read(tm); // Auslesen der RTC Serial.print("RTC: "); if (tm.Hour <10) {Serial.print("0");} // Führende Null einblenden Serial.print(tm.Hour); Serial.print(":"); if (tm.Minute <10) {Serial.print("0");} // Führende Null einblenden Serial.print(tm.Minute); Serial.print(":"); if (tm.Second <10) {Serial.print("0");} // Führende Null einblenden Serial.println(tm.Second); // Hier muss noch der Code für die Ausgabe geschrieben werden um dann letztendlich die Ausgabe durchzuführen // Natürlich ist auch die Bedienung der Taster-Abfrage hier noch zu berücksichtigen. ausgabe(); // Das Variablen Array an die Schieberegister senden } void ausgabe() { digitalWrite(latchPin, LOW); // Latch ausschalten (LOW), damit die Register // beschrieben werden können. shiftOut(dataPin, clockPin, MSBFIRST, anzeige[0]); // Katoden Bits 0 bis 7 shiftOut(dataPin, clockPin, MSBFIRST, anzeige[1]); // Katoden Bits 0 bis 7 shiftOut(dataPin, clockPin, MSBFIRST, anzeige[2]); // Katoden Bits 0 bis 7 digitalWrite(latchPin, HIGH); // LATCH: übertrag vom Register in den Speicher // und damit auch die Werte in die Anzeige // übernehemen, dies geschieht nur bei einem // LOW-HIGH Übergang des Latch-Pin }
Das Array könnte folgendermaßen beschrieben werden:
void arrayleeren() { anzeige[0]=0; anzeige[1]=0; anzeige[2]=0; } void minuten_drei() { // 3. Datenbyte Bit 6 bitSet(anzeige[2],6; } void minuten_viertel() { // 3. Datenbyte Bit 7 bitSet(anzeige[2],7); }
--Udo (Diskussion) 13:19, 24. Aug. 2015 (CEST)...