Eine Sanduhr besteht aus einem oberen und unteren Behälter. Wenn sich Sand in dem oberen Behälter befindet, fließt er langsam durch eine Verengung in den unteren. Die Sanduhr mit Arduino werden wir nicht mit Sand, sondern mit Elektronen füllen und damit LEDs leuchten lassen :-)
Bauteile für die Sanduhr mit Arduino
- Arduino-Set
- Tilt-Switch
- 12 LEDs (gleiche Farbe)
Schaltplan

Die Schaltung besteht aus sechs LED-Schaltkreisen, die jeweils mit einem digitalen Output-Pin des Arduino-Boards und über einen Vorwiderstand von 220 Ohm mit dem GND verbunden sind.
Zusätzlich wird ein Tilt-Switch als digitaler Input verwendet. Er reagiert darauf, wie er ausgerichtet ist. (Nach oben oder unten stehend).
Neu in der Arduino-Welt? Dann sieh Dir diesen Artikel an: Blink – Start mit Arduino.
Code
const int ledPins[] = {12,11,10,5,4,3};
const int tiltPin = 2;
int myState = 0;
long myTimer = 0;
int myTimeout = 1000;
int top = 3;
int bottom = 0;
int myOrientation = 1;
void setup() {
for (int i = 0; i < 6; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(tiltPin, INPUT_PULLUP);
myTimer = millis();
}
void allOff(){
for (int i = 0; i < 6; i++) {
digitalWrite(ledPins[i], LOW);
}
}
void showAnimation() {
digitalWrite(ledPins[2], LOW);
digitalWrite(ledPins[3], HIGH);
delay(200);
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[3], LOW);
delay(200);
}
void showTop() {
if (top > 2) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
} else if (top > 1) {
if (myOrientation < 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[2], LOW);
} else {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], HIGH);
}
digitalWrite(ledPins[1], HIGH);
} else if (top > 0) {
if (myOrientation < 0) {
digitalWrite(ledPins[0], HIGH);
digitalWrite(ledPins[2], LOW);
} else {
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[2], HIGH);
}
}
}
void showBottom() {
if (bottom > 2) {
digitalWrite(ledPins[5], HIGH);
digitalWrite(ledPins[4], HIGH);
digitalWrite(ledPins[3], HIGH);
} else if (bottom > 1) {
if (myOrientation > 0) {
digitalWrite(ledPins[5], HIGH);
digitalWrite(ledPins[3], LOW);
} else {
digitalWrite(ledPins[5], LOW);
digitalWrite(ledPins[3], HIGH);
}
digitalWrite(ledPins[4], HIGH);
} else if (bottom > 0) {
if (myOrientation > 0) {
digitalWrite(ledPins[5], HIGH);
digitalWrite(ledPins[3], LOW);
} else {
digitalWrite(ledPins[5], LOW);
digitalWrite(ledPins[3], HIGH);
}
}
}
void loop() {
if (digitalRead(2) == HIGH) {
myOrientation = 1;
} else {
myOrientation = -1;
}
if (millis() > myTimer + myTimeout) {
myTimer = millis();
if (myOrientation >0) {
if (top>0) top--;
if (bottom<3) bottom++;
} else {
if (top<3) top++;
if (bottom>0) bottom--;
}
}
if ((top<3) && (bottom<3)){
showAnimation();
}
allOff();
showTop();
showBottom();
}
Das Programm für die Sanduhr mit Arduino ist etwas komplexer. Als Erstes wird die Lage der Sanduhr abgefragt und in der Variable myOrientation gespeichert. Steht die Uhr auf dem Kopf ist sie negativ (-1), steht sie normal, ist sie positiv (1).
Dazu gibt es eine Timer-Funktion, die jeweils nach einer bestimmten Zeit (myTimeout) ausgeführt wird.
if (millis() > myTimer + myTimeout) {
myTimer = millis();
...
}
Wird sie aufgerufen, werden die Werte top und bottom verändert. Diese beiden Variablen speichern, wie viele LED-Reihen im oberen bzw. unteren »Behälter« leuchten sollen.
Solange auf keiner der beiden Seiten drei LED-Reihen leuchten »fließt Sand« und eine Animation wird angezeigt. Dabei handelt es sich um abwechselnd blinkende LEDs in der Mitte der Sanduhr.
Im Loop werden außerdem drei Funktionen ausgeführt. Die Funktion allOff() schaltet alle LEDs aus. Dies geschieht sehr schnell und dient dem Vorbereiten für die Anzeige-Funktionen: showTop(); und showBottom().
Diese Funktionen unterscheiden nach der Richtung (myOrientation) der Sanduhr und können die LEDs an den richtigen Stellen einschalten.
Natürlich könnte man den Code noch schlanker gestalten oder noch mehr LEDs hinzufügen. (Ich freue mich auf Fotos und Vorschläge) Erweitere die Schaltung gern und hab viel Spaß beim Nachbauen.
Wenn dir das Projekt gefallen hat, drücke doch den Like-Button und hinterlasse mir einen Kommentar. Liebe Grüße :-)
Aus RailFX ist SceneFX geworden
Dein nächstes RailFX-Modul ist eine App
In den RailFX-Tutorials bekommt jeder Effekt sein eigenes Modul: hier eine Kirche mit DFPlayer, dort ein Blaulicht mit Nano. Was fehlt, ist der Tag, der alles zusammenhält. Den gibt SceneFX deiner Anlage.
- Klang zuerst. Zwei Lautsprecher, App starten: Die Kirche schlägt zur vollen Stunde, im Gasthaus wird es abends laut, und manchmal zieht ein Gewitter auf.
- Szenen statt Sketche. Kleine Abläufe mit Rollen – „Letzte Runde in der Kneipe“, „Das Dorf geht schlafen“ –, die du mit deinen Motiven besetzt.
- Und fürs Löten: Licht und Bewegung laufen über WLAN-Module mit ESP32, die du selbst aufbaust. Noch in der Beta.
Kostenlos für macOS (Apple Silicon) und Windows 10/11 · Erweiterung „Dorf“ inklusive · weitere Erweiterungen je 39,90 €
SceneFX kostenlos ladenWenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs

Braucht der Tilt-Switch keinen Vorwiderstand? Auf einigen Videos mit Tilt-Switch wird ein Vorwiderstand verwendet.
Hallo Jason, in diesem Beispiel verwende ich die internen Pullups des Arduinos. Man kann sie per Software im Setup hinzuschalten:
pinMode(tiltPin, INPUT_PULLUP);
Das ist ziemlich cool, weil man dann weniger Bauteile benötigt. Der Pin ist dann HIGH, wenn der Button nicht gedrückt ist und LOW, wenn er gedrückt wird. Liebe Grüße