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:20Mara van Stiphoudt 2017/06/27 16:20