Arduino Tutorial Lesemodus schließen

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

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