Rheinturm Uhr met programmeerbare RGB-LED strip, Arduino Uno en RTC DS3231

De Rheinturm Uhr kan gebouwd worden rondom een Arduino Uno en DS3231 RTC met een programmeerbare RGB-LED strip.
Hierbij wordt gebruik gemaakt van een RGB-strip met 60 LEDs/meter, waarvan er 53 worden gebruikt.
De real-time clock (RTC) DS3231 is een klok met hoge precisie.

In plaats van een Arduino Uno kan men ook een ATmega328P programmeren en alles opbouwen op een printplaatje.

Om het programma te laten werken, is de volgende Arduino bibliotheek nodig:
Adafruit NeoPixel

Unzip het bestand en plaats het in de 'libraries' folder van de Arduino-IDE. Verander de naam 'Adafruit Neopixel-master' in 'Adafruit Neopixel'.
Er zijn andere bibliotheken beschikbaar om adresseerbare RGB-LED strips aan te sturen, zoals FastLED. Het programma voor de Rheinturm gebruikt Neopixel.

De voeding van de Arduino (+5V) is voldoende om de LEDs te laten oplichten. Bij een hogere stroomconsumptie van de LEDs is het verstandig een aparte voeding voor de LED-strip te gebruiken. Gebruik parallel aan de voeding een 1000µF elco (C1) om pieken op te vangen. In het programma wordt digital pin 6 van de Arduino gebruikt om de data-lijn van de RGB-strip te besturen. Deze wordt verbonden via een 330-470Ω weerstand. De RTC wordt met de +5V pin van de Arduino gevoed. Dit is voldoende om de klok te laten lopen. De backup-batterij is een CR2032 knoopcel. De RTC communiceert met de Arduino via I2C. De SDA wordt verbonden met Arduino A4-pin en SCL met A5-pin. Bij een Arduino Mega2560 zijn dit de pins 20 (SDA) en 21 (SCL)

avr met usbasp programmeren

 Je kunt ook de Arduino zelf gebruiken om de chip te programmeren. Of de USBasp v2.0 unit:  bekijk ook deze duitstalige website.

 

  WordClock

 

 Programma voor Arduino

Het programma is aangepast om de RGB-LED strip aan te sturen.
In het programma is ON gezet op Color(31,31,31)
oftewel de LEDs zijn wit. Dit is gedaan, omdat een waarde van 255 veel te fel is. Bovendien kunnen dan niet alle LEDs via een Arduino worden gevoed, maar is een aparte 5V/3A voeding nodig. Arduino die 3A moet leveren, is rijp voor de prullenbak. Bij volle sterkte trekt één kleur van de LED 60 mA; wit licht (RGB) trekt dus als zo'n 180 mA. Stel alle 60 LEDs schakelen wit licht op volle sterkte dan loopt er een stroom van 10.8A.
De DS3231 is zeer accuraat, misschien een afwijking van 5 seconden per maand. Verdere ontwikkeling zou de toevoeging van een DCF77 module zijn. De DS3231 zou dan eens per maand bijvoorbeeld een update kunnen krijgen via de DCF77 tijd. Of wanneer de DCF77 tijd en de DS3231 tijd van elkaar afwijken. Ook de winter- en zomertijd worden dan automatisch aangepast, terwijl nu deze tijden handmatig in de RTC module moeten worden ingelezen. Een andere manier om de tijd op te vragen is via WiFi en een NTP time-server.

arduino usb and external power ws2812 Bron: https://www.tweaking4all.nl/hardware/arduino/arduino-ws2812-led/

In de codes wordt gebruik gemaakt van de zgn. 'ternary if-statement'.
Hierbij wordt in 1 regel de conditie, uitvoer True, uitvoer False geschreven. Dit ziet er zo uit:

x = (condition) ? (value_if_true) : (value_if_false);

Er is geen sprake van if-else-elseif-endif. Ternary if kan gebruikt worden als er sprake is van 1 conditie.
Om de bovenste LED op de secondes te laten knipperen (oneven seconden AAN, even seconden UIT) wordt modulus (%) gebruikt.
b.v. als s1 = 1 dan zal s1 % 2 een 1 (TRUE) opleveren en gaat de LED aan; s1 = 2 dan is s1 % 2 = 0 (FALSE), LED uit.

(s1 % 2 ? LED(Marker[3],MARKER) : LED(Marker[3],AUS));

MARKER is de definitie voor de kleurcode rood bij aan, AUS is de definitie voor kleurcode zwart (UIT).


Hieronder staat een alternatief voor de klok. De uren, minuten en seconden aanduiding wordt gescheiden door een rode LED. De tientallen en eenheden worden door een andere kleur gescheiden, zodat het aflezen van de tijd eenvoudiger wordt.

Een 7Kb versie van het programma gebruikt de DS3232RTC en TimeLib bibliotheken:

DS3232RTC
Time


In deze versie staat geen 'settime' om de tijd in te stellen. Dit wordt met een apart programma gedaan, SetSerial. Bovendien wordt de tijd voor het dimmen van de LEDs bepaald door weekdagen en weekend. De tijden kunnen anders worden ingesteld voor beide opties.

SetSerial laat de huidig ingestelde tijd van de RTC zien in de 'Serial Monitor' van de Arduino IDE. Om de tijd en datum exact in te stellen, wordt de baudrate op 115200 gezet en het volgende verzonden: bv. 9 oktober 2016 16:21:33 => 2016,10,9,16,21,33,

De laatste komma na secondes zet de exacte tijd in de RTC zonder tijdverlies, waardoor de tijd exact kan worden ingesteld. Het programma maakt ook gebruik van de 'Streaming' bibliotheek.

In plaats van een RTC-module kan ook de ESP8266 met WiFi worden gebruikt om de tijd weer te geven. De code is hier te vinden.