Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
rheinturmuhr [2017/06/27 16:43] studentrheinturmuhr [2023/07/03 10:16] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== 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 :
 +<file c 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);
 +</file>
 +Diesen Code Abschnitt nutzen wir aus LPD8806 und passen ihn auf unsere LED-Streifen an. Die Kommentare sind von uns geschrieben.
 +
 +<file c 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. 
 +</file>
 +Hier wird time.h eingebunden. 
 +
 +<file c 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. 
 +}
 +</file>
 +So sollte euer void setup() aussehen wenn ihr das Setup aus LPD8806 und das aus time.h zusammengefügt habt.
 +
 +<file void_loop.c>
 +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.
 +}
 +</file>
 +
 +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.
 +
 +
 +<file led_anzeige.c>
 +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.
 +    </file>
 +
 +Hier haben wir einige Integer eingebunden und definiert, die wir im Laufe unserer Methode nutzen.
 +
 +
 +<file led_anzeige_sekunden.c>
 +//*************************************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();  
 +}
 +</file>
 +
 +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//