Zum Inhalt springen
Arduino Rheinturm Lichtpegel Uhr

Arduino Rheinturm –Lichtzeitpegel

Die Lichtzeitpegel-Skulptur am Düsseldorfer Rheinturm ist die größte digitale Zeitskala der Welt und leuchtet bereits seit 1981. Und da mir Thomas zu diesem Thema eine Frage gestellt hat, dachte ich mir, ich probiere auch gleich mal aus, wie man diese Uhr mit Arduino umsetzen könnte: die Arduino Rheinturm-Uhr.

Mehr Infos zum Hintergrund des Lichtzeitpegels finden sich natürlich auf Wikipedia.

Funktionsweise

Die Rheinturm-Uhr ist im Grunde eine Anzeige, die die Uhrzeit in die Einzelstellen zerlegt und dann auf Leuchten anzeigt. Aus 23:19:04 wird also von unten nach oben: 4 Leuchten, 0 Leuchten, Trennleuchte (rote Lampe), 9 Leuchten, 1 Leuchte, Trennleuchte, 3 Leuchten, 2 Leuchten.


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


In diesem Beispiel baue ich, genau wie Thomas, die Leuchten mit WS2812-LED-Streifen nach. Das verringert den Verkabelungsaufwand extrem und ist dazu noch relativ günstig. Details dazu habe ich hier schon mal zusammengefasst: WS2812 – Der einfachste Weg, viele LEDs mit Arduino zu steuern.

Ich lasse zwischen den Einer- und Zehnerstellen der Sekunden, Minuten und Stunden jeweils zwei LEDs frei und zwischen den Sekunden, Minuten und Stunden selbst drei LEDs, wobei ich die mittlere der drei als Trennzeichen (rot blinkende LED) verwende. Im Original blinkt die übrigens nicht.

Für die Uhrzeit verwende ich ein RTC-Modul DS1307 (RTC = Real Time Clock).

Bauteile

Schaltung

Arduino Rheinturm Lichtpegel Uhr mit Arduino

Die Schaltung besteht aus dem RTC Modul, dass per I2C-Schnittstelle verbunden ist. Dazu werden die SDA- und SCL-Pins mit den SDA und SCL-Pins des Arduino-Boards verbunden. Zusätzlich wird das Modul mit GND und 5V+ verbunden. Der WS2812-Streifen wird ebenfalls mit GND und 5V verbunden. Über beide Potenziale wird ein großer Elektrolytkondensator (1000uF) geschaltet. Der D-In Pin des WS2812-Streifens wird über einen 300 – 500 Ohm großen Widerstand mit dem digitalen Pin 6 des Arduino-Boards verbunden. Die Zuleitungskabel sollten übrigens so kurz wie möglich sein. (Das findet sich in den Best Practices von Adafruit wieder.)

Libraries

Für dieses Projekt wird die Adafruit NeoPixel Bibliothek benötigt. Man kann sie hinzufügen, indem man im Arduino Menü > Sketch > Bilbiothek hinzufügen > Bibliotheken verwalten nach »NeoPixel« sucht und die aktuelle Version installiert.

Darüber hinaus wird die RTC by Makuna Bibliothek verwendet. Auch diese installiert man über Bibliotheken verwalten. Hier kann man einfach nach RTC Makuna suchen.

Code: Arduino Rheinturm

Sind die Bibliotheken installiert, kann man einfach den folgenden Code auf das Arduino-Board laden. Im oberen Teil kann man noch die Blinkgeschwindigkeit der Trennleuchten einstellen: 1 = nicht blinken, 1000 = jede halbe Sekunde ein- bzw. ausschalten.

/* Rheinturmuhr mit NeoPixel WS2812 LED-Streifen */

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);

#define PIN        6            // Pin, an dem der Datenpin der Neopixel angeschlossen ist
#define NUMPIXELS 51            // Anzahl der LEDs 

int blinkgeschwindigkeit = 1000;    // hier kann man die roten Trenn-LEDs blinken lassen – wenn man das nicht will, kann man die Variable auf 1 setzen 

int theLEDsAus[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0};
int theLEDs[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0};

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);   // Anlegen des Neopixel-Objektes

/* ***** ***** ***** ***** SETUP ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
void setup() {
  pixels.begin();               // Initialisierung des Neopixel Objektes
  pixels.setBrightness(50);     // Set BRIGHTNESS to about 1/5 (max = 255)
  rtcInit();                    // Real Time Clock Initialisierung
}

/* ***** ***** ***** ***** LOOP ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
void loop() {
  if (!Rtc.IsDateTimeValid())  {
    if (Rtc.LastError() != 0)    {
      // we have a communications error
      // see https://www.arduino.cc/en/Reference/WireEndTransmission for
      // what the number means
      Serial.print("RTC communications error = ");
      Serial.println(Rtc.LastError());
    } else {
      // Common Causes:
      //    1) the battery on the device is low or even missing and the power line was disconnected
      Serial.println("RTC lost confidence in the DateTime!");
    }
  }

  RtcDateTime now = Rtc.GetDateTime();

  printDateTime(now); Serial.print(" ");
  updateTime(now);
  showTime();
  Serial.println();

  delay(10); 
}

void updateTime(const RtcDateTime& dt)
{
  /* Reset aller LED Einträge */
  for (int i = 0; i < NUMPIXELS; i++) {
    theLEDs[i] = theLEDsAus[i];
  }

  /* Sekunden Einer */
  for (int i = 0; i < dt.Second() % 10; i++) {
    theLEDs[i] = 1;
  }
  /* Sekunden Zehner */
  for (int i = 0; i < dt.Second() / 10; i++) {
    theLEDs[15 - i] = 1;
  }

  /* Minuten Einer */
  for (int i = 0; i < dt.Minute() % 10; i++) {
    theLEDs[19 + i] = 1;
  }
  /* Minuten Zehner */
  for (int i = 0; i < dt.Minute() / 10; i++) {
    theLEDs[34 - i] = 1;
  }

  /* Stunden Einer */
  for (int i = 0; i < dt.Hour() % 10; i++) {
    theLEDs[38 + i] = 1;
  }

  /* Stunden Zehner */
  for (int i = 0; i < dt.Hour() / 10; i++) {
    theLEDs[50 - i] = 1;
  }
}

void showTime() {
  
  pixels.clear();               // Schalte alle LEDs aus
  
  for (int i = 0; i < NUMPIXELS; i++) {
    switch (theLEDs[i]) {
      case 0:
        Serial.print("-");
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        break;
      case 1:
        Serial.print("*");
        pixels.setPixelColor(i, pixels.Color(100, 100, 100));
        break;
      case 2:
        Serial.print(" ");
        break;
      case 3:
        if (millis() % blinkgeschwindigkeit < blinkgeschwindigkeit/2) {
          Serial.print("|");
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        } else {
          Serial.print("–");
          pixels.setPixelColor(i, pixels.Color(100, 0, 0));
        }
        break;
    }
  }
  pixels.show();   // Sende die Farbinformationen an den LED-Streifen
}

/* ***** ***** ***** ***** Methoden für die Real Time Clock ***** ***** ***** ***** ***** ***** */

void rtcInit() {
  Serial.begin(115200);

  Serial.print("compiled: ");
  Serial.print(__DATE__);
  Serial.println(__TIME__);

  //--------RTC SETUP ------------
  // if you are using ESP-01 then uncomment the line below to reset the pins to
  // the available pins for SDA, SCL
  // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL

  Rtc.Begin();

  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  printDateTime(compiled);
  Serial.println();

  if (!Rtc.IsDateTimeValid())
  {
    if (Rtc.LastError() != 0)
    {
      // we have a communications error
      // see https://www.arduino.cc/en/Reference/WireEndTransmission for
      // what the number means
      Serial.print("RTC communications error = ");
      Serial.println(Rtc.LastError());
    }
    else
    {
      // Common Causes:
      //    1) first time you ran and the device wasn't running yet
      //    2) the battery on the device is low or even missing

      Serial.println("RTC lost confidence in the DateTime!");
      // following line sets the RTC to the date & time this sketch was compiled
      // it will also reset the valid flag internally unless the Rtc device is
      // having an issue

      Rtc.SetDateTime(compiled);
    }
  }

  if (!Rtc.GetIsRunning())
  {
    Serial.println("RTC was not actively running, starting now");
    Rtc.SetIsRunning(true);
  }

  RtcDateTime now = Rtc.GetDateTime();
  if (now < compiled)
  {
    Serial.println("RTC is older than compile time!  (Updating DateTime)");
    Rtc.SetDateTime(compiled);
  }
  else if (now > compiled)
  {
    Serial.println("RTC is newer than compile time. (this is expected)");

  }
  else if (now == compiled)
  {
    Serial.println("RTC is the same as compile time! (not expected but all is fine)");
  }

  // never assume the Rtc was last configured by you, so
  // just clear them to your needed state
  Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
  char datestring[20];

  snprintf_P(datestring,
    countof(datestring),
    PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
    dt.Month(),
    dt.Day(),
    dt.Year(),
    dt.Hour(),
    dt.Minute(),
    dt.Second() );
  Serial.print(datestring);
}

Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

  • Die beliebtesten Arduino-Projekte von StartHardware
  • Inklusive Schaltplan, Beschreibung und Code
  • Arduino-Schnellstart-Kapitel
  • Kompakter Programmierkurs


0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

39 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
bartholomeus
3 Monate zuvor

working with DS3231 ?

bartholomeus
3 Monate zuvor

Das System funktioniert einwandfrei, zeigt aber 11 Minuten nach der korrekten Zeit an.
Was kann ich tun?
Danke.

google translate

Dirk
7 Monate zuvor

Hallo Stefan, erstmal herzlichen Dank für deine Arbeit und die tolle Idee. Ich versuche die Uhr grad nachzubauen und habe ein seltsames Bild, bei den 51 LED’s leuchten die letzte 12 gar nicht und alle darunter scheinen, ab und an, also nicht alle, „zusammengerutscht“ zu sein, Bsp. die dritte Sek. LED leuchte in Sek 3 grün statt weiss und bei Sek. 4 dann weiß, bei der 7. das selbe Bild die anderen Sekunden LED sind, natürlich mit dem einen Versatz ok, bei den Minuten und Stunden scheint es ähnlich zu sein, was erklären würde, das die oberen gar nicht leuchten, ich finde den Fehler aber absolut nicht, Aufbau ist korrekt, bis auf den Elko, da hab ich statt dem einen 1000 2 mit je 470 parallel, aber das ist ja nur ein Puffer für die Spannung, sollte also egal sein.
Hast du eventuell eine Idee, wo ich suchen könnte ?
Beim LED Streifen habe ich einen SK6812, der soll aber ja exakt gleich sein wie ein 2812….
Lieben Dank schon vorab, für jede gute Idee!
Dirk

Dirk
Antworte an  Stefan Hermann
4 Monate zuvor

Hallo Stefan,

nochmals herzlichen Dank für deine super ausführliche Antwort !

Ich habe den Fehler, nachdem ich alle deine Punkte nochmal geprüft habe, endlich gefunden. Es war der LED Streifen. Ich hatte das mit einem SK6812 probiert da überall zu lesen ist, der ist zum WS2812B baugleich, ist er scheinbar aber wohl doch nicht. Habe jetzt nochmal einen WS2812B bestellt und es hat auf Anhieb geklappt.Ich freu mich schon wie Bolle die Schaltung meinem Bastelfreund demnächst mitzubringen, das soll nämlich ein Geschenk werden. Ein lieber Freund von mir wollte die Uhr als Drechsel Projekt umsetzen und ihm fehlte die Elektronik.
Hab vielen lieben Dank für all deine Mühe !Viele Grüße Dirk

Dennis
8 Monate zuvor

Guten Tag,

hat einer für die aktuelle Uhrzeit ein Funkmodul DCF 77 eingebaut. Wenn ja, bitte ich um Info.

Danke im Voraus

Christian Voigt
2 Jahre zuvor

Hallo , bekomme Fehlermeldung ,Compilation error: redefinition of ‚void setup()‘ kenne mich nicht so aus.
bitte um Hilfe

Christopher
2 Jahre zuvor

Hallo Stefan,

vielen Dank für den Sketch, leider funktioniert das bei mir nicht so ganz.
Bei mir sind von unten aus gesehen 5 led´s dauerhaft weiß dann 3 led´s aus dann sind 8 dauerhaft weiß dann 1 aus dann blinkt eine rot dann wieder 1 aus dann 16 dauerhaft weiß 1 aus 1 rot blinkend 1 aus 7dauerhaft weiß 3 aus und noch 3 dauerhaft weiß.
vielleicht hast du eine Idee was ich falsch gemacht habe.

Gruß Christopher

Christopher
Antworte an  Stefan Hermann
2 Jahre zuvor

Ich denke die Verschaltung ist richtig ich bekomme über andere sketch‘es die led‘s angesteuert wie gewünscht. Ich bin mir nur mit dem real time clock Modul
Unsicher. Kann man das ohne Batterie betreiben? Gibt es eine Möglichkeit das zu testen? Ich habe das led Band ws2812 von Amazon verwendet.

Uli
2 Jahre zuvor

Hallo Stefan,
vielen Dank für das tolle Programm, es läuft alles ganz wunderbar und macht Lust auf mehr!
Kann man statt des Arduino Uno auch den Nano einsetzen oder müsste dafür etwas am Programm geändert werden? (ein schneller Test brachte als Ergebnis nur das alle LED´s permanent leuchten!)
Vielen Dank aus Düsseldorf
Uli

Norbert Schrills
2 Jahre zuvor

Hallo Stefan, habe die Rheinturmuhr nachgebaut und es funktioniert fast alles.
Bei den roten Trenn LED blinkt die Mittlere oder ist nach Änderung der Software nach deiner Anleitung in
Zeile 11 dauerhaft an. Aber ich hätte gerne alle 3 Trenn LED dauerhaft an. Ist das möglich ???
Wenn Ja, wo muss im Sketch etwas geändert werden.
Hardware kann ich, Software leider nicht.
Ich vermute die Änderung in Zeile 13 und 14. Auch wenn ich die nicht begriffen habe.
Ich bitte um deine Hilfe.
Vielen Dank im Voraus.
Gruß
Norbert Schrills

Heiko
3 Jahre zuvor

Erstmal Danke für das Projekt. klingt toll

Blöde Frage von einem Nichtelektroniker
Wozu der Kondensator? Ist der obligatorisch?

Re
3 Jahre zuvor

Hallo Freunde der Rheinturmuhr,

meine Uhr hat zur Zeit ein Problem, sie verliert immer den Kontakt zum RTC-Modul. Anschlüsse sowie Batterie hab ich gecheckt, der Serial Monitor zeigt keine Auffälligkeiten.
Der Fehler äußert sich immer dadurch, dass alle LED leuchten und eingefroren scheinen, circa einmal die Woche. Hat jemand dieses Problem auch schon gehabt und vielleicht einen Lösungsvorschlag?
Und hat schon jemand den Uhren-Code umgebaut, so dass man die Uhrzeit aus dem Internet bekommt?

Bilder zu meine Uhr. https://www.dropbox.com/sh/znxgw4f2izlks75/AAD4-mG-u-AO_Dp0Nl0IdOX_a?dl=0

Michael
Antworte an  Re
3 Jahre zuvor

Hi, ich bin immer noch bei dem Versuch das ganze zu lösen mit der Uhrzeit aus dem Inet. Bekomme ich aber nicht hin. Posting von mir weiter unten…

Antworte an  Stefan Hermann
3 Jahre zuvor

Hallo Stefan,
ich bin leider auch noch lange nicht in der Lage das Problem selbst lösen zu können. Aber da bei mir auch vermehrt Probleme mit dem RTC Modul auftreten hätte ich auch Interesse an einer Lösung mit Zeit aus dem Internet.

MFG René DO2Vi

39
0
Ich würde mich über deine Meinung freuen.x