Sanduhr mit Arduino und LEDs

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

Schaltplan

Sanduhr mit Arduino

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 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 :-)

Ich würde mich freuen, wenn du diesen Beitrag bewerten würdest :-)

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 1

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Deine Meinung ist mir sehr wichtig!

Lasse uns diesen Beitrag verbessern!

Wie kann ich den Beitrag verbessern? Was würdest du dir wünschen? Was hat dir gefehlt?

Ich hoffe, der Beitrag hilft dir weiter. Und falls du weitere Fragen hast, stelle sie gern hier im Arduino-Forum.

Du willst noch tiefer in die Materie einsteigen? Dann präsentiere ich dir die neuen E-Books von StartHardware:

  • 20 Lektionen
  • Projektbasiert und kurzweilig
  • Aus den Erfahrungen unzähliger Workshops
  • Sofortiger Download

  • Die beliebtesten Projekte von StartHardware
  • Mit Code, Schaltplan und Erklärungen
  • Fachwissen-Kapitel
  • Sofortiger Download


Willst du lieber ein Buch zum Anfassen? Dann werde mit diesem hier zum Arduino-Experten! Arduino: Kompendium: Elektronik, Programmierung und Projekte* – Damit lernst du alle Tricks!

2 thoughts on “Sanduhr mit Arduino und LEDs

    1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.