2010
HOME
Weitere Software

Die Rheinturmuhr
mit Arduino
Arduino-Simulator und Rheinturmuhr
Arduino Rheinturmuhr auf TFT-Display
Arduino Rheinturmuhr mit DCF77-Funk

Arduino ist eine "open-source electronics prototyping platform" und im Netz sehr beliebt. Das Mikrocontrollerboard verfügt über 14 Digitalausgänge und 6 Analogeingänge, ist jedoch mit seinen Anschlüssen flexibel. Programmiert wird in C und der Rechner überträgt die Programme via USB.
RheinturmZiel dieses kurzen Projekts ist mit so wenig Hardware als möglich 39 Leuchtdioden so anzusteuern, dass das Bild der Rheinturmuhr in Düsseldorf entsteht. Wie diese Uhr die Zeit anzeigt findet man im Netz.

Die Uhr arbeitet mit Einer- und Zehnerstellen. Die Einerstellen von Sekunde, Minute und Stunde werden mit neun Lampen oder LED  (1 - 9), die Zehnerstellen von Sekunde und Minute mit fünf Lampen (1 - 5) und die Zehnerstellen der Stunden mit zwei Lampen (1 - 2) dargestellt.

Mit den 14 Digitalausgängen läßt sich also das Sekundenband z.B. problemlos mit seinen 9 + 5 Lampen darstellen. Um die Minuten und Stunden auch schalten zu können muss leicht getrickst bzw. gemultiplext werden. Die drei Zeitbalken für Sekunden, Minuten und Stunden werden nicht gleichzeitig, sondern so schnell hintereinander umgeschatet, dass das Auge kaum ein Flimmern wahrnimmt.

Damit wären alle Leitungen beim Standard-Arduino schon verbraucht. Ein Arduio-Mega hätte mehr Ausgänge. Da könnte man auf Tricks verzichten. Auch könnte man mit fünf Schieberegistern (z.B. 74xx595) die Ausgänge "vermehren": Hier soll aber keine Zusatzhardware benutzt werden.

Analogeingänge werden zu zusätzlichen Digitalausgängen

Arduino auf rotem Teppich
Die Dokumentation auf www.arduino.cc zeigt, dass die Analogeingänge auch als Digitalausgänge geschaltet werden können. Somit stehen also bis zu 20 Digitalausgänge zur Verfügung, wenn man keine analogen Daten benötigt.

Drei dieser neuen Digitalausgänge (14, 15, 16)  dienen nun dazu zwischen den einzelnen Zeitbalken umzuschalten. Sie werden pro Baken für ertwa 1 ms auf LOW gelegt, so dass sie quasi die Masse für die LED darstellen. Der Schaltplan gestaltet sich somit extrem einfach. Aufgrund von Arduinos Strombegrenzung und der Zeitsteuerung wird auf Vorwiderstände verzichtet.


Schaltplan
Die Digitalausgänge D0 bis D13 sind parallel mit allen Anoden der 39 LED, wie links dargestellt, verbunden.

D0 bis D8 für die Einer, D9 bis D13 für die Zehner. Bei der Zehnerstunde nur D9 bis D10, da ja nach 23:59:59 ein neuer Tag mit 00:00:00 beginnt.

Die Software schaltet die Balken über die analogen Anschlüsse A0 bis A2 entsprechend und legt dann die Masse an, so dass die LED der entsprechenden Balken kurz leuchten. Danach kommt der folgende Balken dran. Auf diese Art wird zwischen Sekunden-, Minuten- und Stundenbalken geschaltet.

Die Leitungen A3 bis A5 stehen noch zur Verfügung. Sie könnten zum Stellen der Uhr über einen Drehencoder mit Schalter oder zum Auslesen einer RTC (Hardware-Uhr) benutzt werden.

Plan und Programm als PDF

Programm
Das Programm entspricht den obigen Ausführungen und ist nicht platzoptimiert (Lesbarkeit). Die Routinen TIMEINIT und TIMEREAD wurden der RSAPI.DLL nach empfunden und sorgen dafür, dass das Multipexen während der Wartezeit einer Sekunde (INTERVAL) statt findet. Hier der Quelltext für die Arduino-IDE 0.23:
#define A0 14 //ANALOG 0
#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13};     //
byte theSwitch[] = {14,15,16};//SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=5,m1=9; // Start mit 23:59:00 Uhr
int h10=2,h1=3; //

unsigned long t,t0; //TIMEINIT

void TIMEINIT(void){t0=millis();}
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
 for(i=0; i< sizeof(onesecond);i++)pinMode(oneSecond[i],OUTPUT);
 for(i=0; i< sizeof(tensecond);i++)pinMode(tenSecond[i],OUTPUT);
 for(i=0; i< sizeof(theswitch);i++)pinMode(theSwitch[i],OUTPUT);
 digitalWrite(A0, HIGH);
 digitalWrite(A1, HIGH);
 digitalWrite(A2, HIGH);
}

void loop()
{int i;
 t=TIMEREAD();
 do
 {for(i=0;i< sizeof(onesecond);i++)digitalWrite(oneSecond[i],s1<=i?LOW:HIGH);
  for(i=0;i< sizeof(tensecond);i++)digitalWrite(tenSecond[i],s10<=i?LOW:HIGH);
  digitalWrite(A0, LOW);//Masse an Sekunden
  delay(1);             //SHOWTIME SEKUNDEN
  digitalWrite(A0, HIGH);
  for(i=0;i< sizeof(onesecond);i++)digitalWrite(oneSecond[i],m1<=i?LOW:HIGH);
  for(i=0;i< sizeof(tensecond);i++)digitalWrite(tenSecond[i],m10<=i?LOW:HIGH);
  digitalWrite(A1, LOW);//Masse an MINUTEN
  delay(1);             //SHOWTIME MINUTEN
  digitalWrite(A1, HIGH);
  for(i=0;i< sizeof(onesecond);i++)digitalWrite(oneSecond[i],h1<=i?LOW:HIGH); 
  for(i=0;i< sizeof(tensecond);i++)digitalWrite(tenSecond[i],h10<=i?LOW:HIGH); 
  digitalWrite(A2, LOW);//Masse an STUNDEN
  delay(1);             //SHOWTIME STUNDEN
  digitalWrite(A2, HIGH);
 }while(TIMEREAD()<(t+INTERVAL));
 //---------------------------------
 s1++;                   //s++;
 if(s1>=10){s1=0;s10++;} 
 if(s10>=6){s10=0;m1++;} //m1++;
 if(m1>=10){m1=0;m10++;}
 if(m10>=6){m10=0;h1++;} //h1++;
 if(h1>=10){h1=0;h10++;}
 if(h10>=2 && h1>=4){h10=0;h1=0;}
}

Sizeof macht HTML-Formatierungsprobleme, Arduino-Quelltext hier. Ab Arduino-IDE 1.0 sind die ersten drei Ausdrücke A0 bis A2 reserviert und sollten überall durch freie Bezeichner ersetzt werden.


Weitere Software
.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt