Rheinturmuhr//Lichtzeitpegel

Idee nach Horst.H.Baumann

DIESE ANLEITUNG IST FÜR DEN ARDUINO

Lichtzeitpegel :

Diese Uhr zeigt die Uhrzeit 19:33:43

  1. Wir lesen von oben nach unten.
  2. Die erste lila LED steht für 10 Stunden.
  3. Die 9 gelb leuchtenden LED`s stehen für 9 Stunden.
  4. Die 3 grünen LED`s stehen für 30 Minuten.
  5. Die 3 blauen LED`s stehen für 3 Minuten.
  6. Die 4 lila LED`s stehen für 40 Sekunden.
  7. Die 3 gelben LED`s stehen für 3 Sekunden.

Material

  • Arduino Mega ADK
  • 46 LED`s LPD8806
  • 5 Kabel
  • Stromquelle 10A und 5V
  • USB-Kabel
  • 2 m PVC Rohr (d=9cm)

Software

  • Arduino IDE 1.8.3
  • Cura 2.6 → für den 3D Drucker
  • 3DBuilder → zum zuschneiden des 3D Modells

Anschließen des LED-Streifen

  • Orange GND in GND des Arduino
  • Grün DI (Data Input) in Pin 2 des Arduino
  • Blau CI (Clock Input) in Pin 3 des Arduino
  • Rot 5V+ in den +Pol der Stromquelle
  • Schwarz vom – Pol der Stromquelle in einen GND des Arduino

Installieren der Bibliotheken

  • Time.h

→ http://playground.arduino.cc/code/time

  • LPD8806.h

→ https://github.com/adafruit/LPD8806

Beide Bibliotheken lassen sich mit Arduino IDE 1.8.3. installieren.

  • → Sketch / Bibliotheken einbinden /Bibliotheken verwalten
  • → ansonsten Anweisungen auf den zugehörigen Seiten folgen.

Testen der Bibliotheken

  • 1.Strandtest öffnen
  • → Datei/ Beispiele / LPD8806/ Strandtest
  • 2.Code anpassen auf int nLED`s = 45;

  • 3. Überprüfen und Hochladen
  • 4. Schauen ob alle LED`s funktionieren
  • 5. TimeSerial öffnen
  • → Datei/ Beispiele / Time/ TimeSerial
  • 6. Überprüfen und Hochladen
  • 7. Seriellen Monitor öffnen
  • 8. Oben eine Unix Zeit eingeben und Enter drücken.
  • → Unix-Zeit z.B T1357041600
  • 9. Überprüfen ob nun die Zeit läuft.

Code

Zusammenführen der Codes aus den Bibliotheken :

Einbinden_des_Streifen_Treibers.c
#include "LPD8806.h" //Hier wird der Treiber des LED-Strip eingebunden.
#include "SPI.h"  //Hier wird die SPI-Funkion eingebunden, diese wird zum Ansprechen des LED-Streifens nötig. SPI-Pins des Arduino werden benötigt.
#ifdef __AVR_ATtiny85__  //  Dies ist ein AVR Microcontroller von Atmel zum Steuern der SPI-Ports
 #include <avr/power.h>
 #endif   //alternative zur geschlossenen geschweiften Klammer
 
 
int nLEDs = 45; // Nummer der Leds die sich im Streifen befinden. Die erste LED ist 0. Also betreiben wir 46 LEDs
 
// SPI Pins des Arduino, die genutzt werden.
int dataPin  = 2; //Hier wird jeder Bit hingesendet
int clockPin = 3; //Dieser Pin schaltet zum richtigen Wert (int) um sobald der DatenPin eingestellt ist.
 
 
// Hier werden dem LPD Strip Parameter übergeben.
// Erster Parameter ist für die Anzahl der LED`s im Streifen.
// Der Zweite ist für den Daten Pin der genutzt wird.
// Der Dritte ist für den Clock Pin der genutzt wird. 
LPD8806 strip = LPD8806(nLEDs, dataPin, clockPin);

Diesen Code Abschnitt nutzen wir aus LPD8806 und passen ihn auf unsere LED-Streifen an. Die Kommentare sind von uns geschrieben.

Einbinden_der_Zeitbibliothek.c
#include <Time.h>      //Für die Uhrzeit nutzen wir die Bibliothek von Time
#include <TimeLib.h>   
 
#define TIME_HEADER  "T"   // Header tag für den seriellen Monitor. Hier gibt man später die Unixzeit an.
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message -- Hier wird im seriellen Monitor die Zeit angezeigt. 

Hier wird time.h eingebunden.

void_setup.c
void setup()  
{  
  Serial.begin(9600); // 9600 steht für die Übertragungsgeschwindigkeit
  while (!Serial) ; // Needed for Leonardo only
  pinMode(13, OUTPUT); //Dieser Pin auf dem Arduino leuchtet, wenn der Code läuft.
  setSyncProvider( requestSync);  //Bei älteren Arduino Versionen konnte man über Prozessing die Uhrzeit des PC`s mit dem Arduino synchronisieren.
  Serial.println("Waiting for sync message"); //Diese Aussage erscheint im seriellen Monitor, wenn die Uhrzeit noch nicht synchonisiert ist.
 
 
 
//Setup zum Anschalten des LED-Strip
 
 #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L) 
  clock_prescale_set(clock_div_1); // Hier wird die Geschwindigkeit auf 16MHZ für die LED-Kette gesetzt. 
#endif
 
  strip.begin(); //Dieser Code startet den LED-Streifen.
  strip.show(); //Dieser Befehl updated den LED-Streifen. Beim Start sind alle LED`s aus. 
}

So sollte euer void setup() aussehen wenn ihr das Setup aus LPD8806 und das aus time.h zusammengefügt habt.

void loop(){
if (Serial.available()) { //Wenn die serielle Schnittstelle zwischen PC und Arduino gesetzt ist, kann der Code hier die Uhrzeit vom PC abgreifen, dass geht bei unserem Arduino nicht.
    processSyncMessage();
  }
  if (timeStatus()!= timeNotSet) { //Wenn die Uhrzeit nicht über die serielle Schnittstelle eingebunden wird, soll dieser Befehl den seriellen Monitor öffnen.
    digitalClockDisplay();  //Dieser zeigt den Uhrzeitendisplay an. Dort kann man die Unix-Zeit per T Nummer oben im Header eingeben. Dann beginnt die Zeit zu laufen.
    ledanzeige(); //Hier starten wir schon unseren LED-Anzeige. Da alle 5 Minuten ein [] vor der Uhrzeit im seriellen Monitor erscheint.(Grund noch unbekannt) und die Uhrzeit sonst nicht angezeigt wird.
  }
  if (timeStatus() == timeSet) { //Wenn die Uhrzeit gesetzt ist, soll nun die LED-Anzeige gestartet werden.
    ledanzeige();
  }
  delay(1000); //Jede Sekunde wird diese Schleife wiederholt.
}

Void loop haben wir so geschrieben. Damit dies auch läuft braucht ihr natürlich folgende Methoden aus time.h :

  • void digitalClockDisplay()
  • void printDigits()
  • void processSyncMessage()
  • time_t requestSync()

ledanzeige() haben wir selbst geschrieben.

void ledanzeige(){
    int s; //s steht für Sekunde und ist ein Integer.
    int s1; //s1 steht für alle Sekunden von 1-9 und ist ein Integer.
    int m;  // m steht für die Minuten und ist ein Integer.
    int m1; // m1 steht für alle Minuten von 1-9 und ist ein Integer.
    int h1; // h1 steht für alle Stunden von 1-9 und ist ein Integer.
    int h; // h steht für Stunde und ist ein Integer.
    h1=hour() %10; // h1 ist gleich der Methode hour Modulo (Rest): % bsp: 12%10 = 2. So können nacher LEDs für Stunde 1-9 angezeigt werden und auch 11-19.
    h=hour(); // h ist gleich der Methode hour.
    m1=minute() %10; //m1 ist gleich minute() %10. So können nacher LEDs für Minute 1-9 angezeigt werden auch wenn gerade Minute = 39 ist können die 9 Minuten berechnet und angezeigt werden.
    m=minute(); //m ist gleich der Methode minute. 
    s1=second() %10; //s1 ist gleich second%10. So können nacher LEDs für Sekunde 1-9 angezeigt werden auch wenn gerade Sekunde = 39 ist können die 9 Sekunden berechnet und angezeigt werden.
    s=second(); //s ist gleich der Methode second.
 

Hier haben wir einige Integer eingebunden und definiert, die wir im Laufe unserer Methode nutzen.

//*************************************SekundenAnzeige****************************************************************
  // Hier werden die Sekunden der Uhrenanzeige eingestellt.
 // oneSecond = {0,1,2,3,4,5,6,7,8} hier habe ich alle LED Nummern aufgezählt die für 1ner Sekunden gedacht sind.
if(s1>=1){ //wenn s1 größer oder gleich 1 ist soll die LED mit der Nummer 0 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(0, 255, 204, 0); //Gelb
  strip.show(); // Mit strip.show() wird der LED-Streifen aktualisiert.
}
if(s1>=2){ //wenn s1 größer oder gleich 2 ist soll die LED mit der Nummer 1 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(1, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=3){ //wenn s1 größer oder gleich 3 ist soll die LED mit der Nummer 2 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(2, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=4){ //wenn s1 größer oder gleich 4 ist soll die LED mit der Nummer 3 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(3, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=5){ //wenn s1 größer oder gleich 5 ist soll die LED mit der Nummer 4 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(4, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=6){ //wenn s1 größer oder gleich 6 ist soll die LED mit der Nummer 5 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(5, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=7){ //wenn s1 größer oder gleich 7 ist soll die LED mit der Nummer 6 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(6, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=8){ //wenn s1 größer oder gleich 8 ist soll die LED mit der Nummer 7 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(7, 255, 204, 0); //Gelb
  strip.show();
}
if(s1>=9){ //wenn s1 größer oder gleich 9 ist soll die LED mit der Nummer 8 eingeschaltet werden und gelb leuchten.
  strip.setPixelColor(8, 255, 204, 0); //Gelb
  strip.show();
}
 
// Hier werden alle LED`s ausgeschaltet wenn s1 gleich 0 ist. Die Zahl 60 wird auf einer digital Uhr nicht angezeigt, also wird bei 0 ausgeschaltet. Denn 60 sekunden sind gleich 1Minute 00 Sekunden.
if(s1==0){
 strip.setPixelColor(0, 0, 0, 0);  //LED Nummer 0 wird ausgeschaltet.
  strip.setPixelColor(1, 0, 0, 0); 
   strip.setPixelColor(2, 0, 0, 0);  
    strip.setPixelColor(3, 0, 0, 0);  
     strip.setPixelColor(4, 0, 0, 0);  
      strip.setPixelColor(5, 0, 0, 0);  
       strip.setPixelColor(6, 0, 0, 0);  
        strip.setPixelColor(7, 0, 0, 0);  
         strip.setPixelColor(8, 0, 0, 0);
         strip.show();  
}

Hier seht ihr ein Beispiel mit dem ihr zum Beispiel die Sekunden anschalten könnt und nach 10 Sekunden die LEDs für Sekunde abgeschaltet werden. Viel Spaß beim Rest selber basteln.

— Philida Amas Igharo 2017/06/27 16:20 — Mara van Stiphoudt 2017/06/27 16:20