Ding:Wortuhr von Udo: Unterschied zwischen den Versionen

Aus FabLab Region Nürnberg
Keine Bearbeitungszusammenfassung
(→‎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 />
<br />
<<nowiki /> <code> ... </code>>
<br />
<pre>
<Code>
code tags durch pre ersetzt
≠include <Wire.h><br />
<code> ... </code>
≠include <Time.h><br />
</pre>
≠include <DS1307RTC.h><br />
Dann bleibt die Formatierung erhalten da das Wiki die Finger davon läßt. [[User:heinz|heinz]]
int latchPin = 10;         // Pin connected to ST_CP of 74HC595<br />
 
int clockPin = 13;         // Pin connected to SH_CP of 74HC595<br />
 
int dataPin = 11;         // Pin connected to DS of 74HC595<br />
<pre>
int Oe = 9;               // Output Enable der Shift Register<br />
#include <Wire.h>
int s1 = 14;                // Taster S1 analog0 = digital-Pin14 <br />
#include <Time.h>
int s2 = 15;                // Taster S2 analog1 = digital-Pin15 <br />
#include <DS1307RTC.h>
int s3 = 16;                // Taster S3 analog2 = digital-Pin16 <br />
int latchPin = 10;         // Pin connected to ST_CP of 74HC595
int s4 = 17;                // Taster S4 analog3 = digital-Pin17 <br />
int clockPin = 13;         // Pin connected to SH_CP of 74HC595
char anzeige[2];            // (Anzeigemuster-Array 0-2)<br />
int dataPin = 11;           // Pin connected to DS of 74HC595
tmElements_t tm;            // Uhrzeit und Datum Variable<br />
int Oe = 9;                 // Output Enable der Shift Register
<br />
int s1 = 14;                // Taster S1 analog0 = digital-Pin14
void setup()<br />
int s2 = 15;                // Taster S2 analog1 = digital-Pin15
{<br />
int s3 = 16;                // Taster S3 analog2 = digital-Pin16
Serial.begin(9600);<br />
int s4 = 17;                // Taster S4 analog3 = digital-Pin17
pinMode(latchPin, OUTPUT);  // für das Shift Register<br />
char anzeige[2];            // (Anzeigemuster-Array 0-2)
pinMode(clockPin, OUTPUT);  // für das Shift Register<br />
tmElements_t tm;            // Uhrzeit und Datum Variable
pinMode(dataPin, OUTPUT);   // für das Shift Register<br />
 
<br />
void setup()
pinMode(Oe, OUTPUT);        // Output Enable<br />
{
pinMode(s1, INPUT);        // Analog 0 als Digitaler Eingang<br />
    Serial.begin(9600);
pinMode(s2, INPUT);        // Analog 1 als Digitaler Eingang<br />
    pinMode(latchPin, OUTPUT);  // für das Shift Register
pinMode(s3, INPUT);        // Analog 2 als Digitaler Eingang<br />
    pinMode(clockPin, OUTPUT);  // für das Shift Register
pinMode(s4, INPUT);        // Analog 3 als Digitaler Eingang<br />
    pinMode(dataPin, OUTPUT); // für das Shift Register
<br />
 
digitalWrite(Oe, LOW);      // Ausgänge der Schieberegister aktivieren<br />
    pinMode(Oe, OUTPUT);        // Output Enable<br />
}<br />
    pinMode(s1, INPUT);        // Analog 0 als Digitaler Eingang
<br />
    pinMode(s2, INPUT);        // Analog 1 als Digitaler Eingang
void Loop()<br />
    pinMode(s3, INPUT);        // Analog 2 als Digitaler Eingang
{<br />
    pinMode(s4, INPUT);        // Analog 3 als Digitaler Eingang
RTC.read(tm);                  // Auslesen der RTC<br />
 
Serial.print("RTC: ");<br />
    digitalWrite(Oe, LOW);      // Ausgänge der Schieberegister aktivieren
if (tm.Hour <10) {Serial.print("0");} // Führende Null einblenden<br />
}
Serial.print(tm.Hour);<br />
 
Serial.print(":");<br />
void Loop()
if (tm.Minute <10) {Serial.print("0");} // Führende Null einblenden<br />
{
Serial.print(tm.Minute);<br />
    RTC.read(tm);                  // Auslesen der RTC
Serial.print(":");<br />
    Serial.print("RTC: ");
if (tm.Second <10) {Serial.print("0");} // Führende Null einblenden<br />
    if (tm.Hour <10) {Serial.print("0");}   // Führende Null einblenden
Serial.println(tm.Second);<br />
    Serial.print(tm.Hour);
  // Hier muss noch der Code für die Ausgabe geschrieben werden um dann letztendlich die Ausgabe durchzuführen
    Serial.print(":");
  // Natürlich ist auch die Bedienung der Taster-Abfrage hier noch zu berücksichtigen.
    if (tm.Minute <10) {Serial.print("0");} // Führende Null einblenden
ausgabe(); // Das Variablen Array an die Schieberegister senden<br />
    Serial.print(tm.Minute);
}<br />
    Serial.print(":");
<br />
    if (tm.Second <10) {Serial.print("0");} // Führende Null einblenden
void ausgabe()<br />
    Serial.println(tm.Second);
{<br />
    // 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<br />
    // Natürlich ist auch die Bedienung der Taster-Abfrage hier noch zu berücksichtigen.
// beschrieben werden können.<br />
    ausgabe(); // Das Variablen Array an die Schieberegister senden
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[0]); // Katoden Bits 0 bis 7<br />
}
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[1]); // Katoden Bits 0 bis 7<br />
 
shiftOut(dataPin, clockPin, MSBFIRST, anzeige[2]); // Katoden Bits 0 bis 7<br />
void ausgabe()
<br />
{
digitalWrite(latchPin, HIGH); // LATCH: übertrag vom Register in den Speicher<br />
    digitalWrite(latchPin, LOW);  // Latch ausschalten (LOW), damit die Register
// und damit auch die Werte in die Anzeige<br />
    // beschrieben werden können.
// übernehemen, dies geschieht nur bei einem<br />
    shiftOut(dataPin, clockPin, MSBFIRST, anzeige[0]); // Katoden Bits 0 bis 7
// LOW-HIGH Übergang des Latch-Pin<br />
    shiftOut(dataPin, clockPin, MSBFIRST, anzeige[1]); // Katoden Bits 0 bis 7
}<br />
    shiftOut(dataPin, clockPin, MSBFIRST, anzeige[2]); // Katoden Bits 0 bis 7
</Code><br />
 
<br />
    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 />
<code><br />
<pre>
void arrayleeren()<br />
void arrayleeren()
{<br />
{
anzeige[0]=0;<br />
    anzeige[0]=0;
anzeige[1]=0;<br />
    anzeige[1]=0;
anzeige[2]=0;<br />
    anzeige[2]=0;
}<br />
}
<br />
void minuten_drei()<br />
{<br />
/ 3. Datenbyte Bit 6<br />
bitSet(anzeige[2],6;<br />
}<br />
<br />
void minuten_viertel()<br />
{<br />
/ 3. Datenbyte Bit 7<br />
bitSet(anzeige[2],7);<br />
}<br />
</Code><br />
<br />


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
Wortuhr V1.0.1 esistzehnvorhalbvier.png
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:



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)...