Zum Inhalt springen
Sanduhr mit Arduino und LEDs

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 Tilt-Switch als digitaler Input verwendet. Er reagiert darauf, wie er ausgerichtet ist. (Nach oben oder unten stehend).


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


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


    Wenn 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


    3 Gedanken zu „Sanduhr mit Arduino und LEDs“

    1. Pingback: Arduino millis() – Arduino Tutorial

      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.