====== Rheinturmuhr//Lichtzeitpegel ======
=== Idee nach Horst.H.Baumann ===
**DIESE ANLEITUNG IST FÜR DEN ARDUINO**
__Lichtzeitpegel :__
{{:turm.jpg?direct&400|}}
Diese Uhr zeigt die Uhrzeit 19:33:43
- Wir lesen von oben nach unten.
- Die erste lila LED steht für 10 Stunden.
- Die 9 gelb leuchtenden LED`s stehen für 9 Stunden.
- Die 3 grünen LED`s stehen für 30 Minuten.
- Die 3 blauen LED`s stehen für 3 Minuten.
- Die 4 lila LED`s stehen für 40 Sekunden.
- 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 ===
{{:reinturmuhr_verkabelung.png?400|}}
* 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;
{{:spi_pins.png?direct&400|}}
* 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 :
#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
#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.
#include //Für die Uhrzeit nutzen wir die Bibliothek von Time
#include
#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()
{
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.igharo@stud.hn.de|Philida Amas Igharo]] 2017/06/27 16:20//
--- //[[mara.van.stiphoudt@web.de|Mara van Stiphoudt]] 2017/06/27 16:20//