====== 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//