Zähneputz-Timer mit Arduino und sechs LEDs

In diesem Projekt zeige ich dir, wie du deinen eigenen mit Arduino gesteuerten Zähneputz-Timer bauen kannst.

Zähneputzen macht Spaß, wenn man die wertvollen Beißer nur nicht immer ausversehen zu lange putzen würde. Wäre es nicht schön, einen Zähneputz-Timer zu haben, der einem sagt, wann man aufhören soll, zu putzen? 

Los jetzt: Sechs LEDs repräsentieren jeweils dreißig Sekunden, was zusammen drei Minuten ergibt. Drückt man einen Button, geht es los. Die erste LED blinkt für 30 Sekunden, bleibt dann leuchten und übergibt an die zweite LED, die losblinkt. Nach drei Minuten leuchten alle sechs LEDs. Zum Abschluss blinken sie noch für 10 Sekunden alle zusammen auf.

Verwendete Bauteile

  • 1x Arduino-Starterkit oder:
  • Breadboard, Arduino, Kabel
  • 6x LED rot
  • 6x Widerstand 220 Ohm
  • 1x Pushbutton

Schaltplan mit 6 LEDs und einem Button

Zähneputz-Timer mit Arduino

Jede der sechs LEDs ist jeweils mit dem kurzen Beinchen (Kathode) über einem Widerstand mit dem GND verbunden. Das lange Beinchen der LED (Anode) ist an einem digitalen Pin des Arduino-Boards angeschlossen. So sind alle LEDs einzeln steuerbar. Darüber hinaus ist ein Taster (Pushbutton) ebenfalls mit einem digitalen Pin des Arduinos verbunden. Die andere Seite des Tasters ist am GND angeschlossen. Wir verwenden den internen Pullup des Arduino-Boards (INPUT_PULLUP). Das bedeutet, dass am digitalen Pin ein LOW anliegt, wenn der Taster geschlossen wird, und ein HIGH, wenn der Taster offen ist. 

Arduino-Code und Erläuterungen für den Zähneputz-Timer

const int ledPins[] = {7, 8, 9, 10, 11, 12};
const int buttonPin = 2;

long myTimer = -200000;

void setup() {
  for (int i = 0; i < 6; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);

  for (int i = 0; i < 6; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    myTimer = millis();
  }

  if (millis() - myTimer < (30000)) { // 30 Sekunden
    digitalWrite(ledPins[0], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (60000)) { // 60 Sekunden
    digitalWrite(ledPins[1], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (90000)) { // 90 Sekunden
    digitalWrite(ledPins[2], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (120000)) { // 120 Sekunden
    digitalWrite(ledPins[3], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (150000)) { // 150 Sekunden
    digitalWrite(ledPins[4], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (180000)) { // 180 Sekunden
    digitalWrite(ledPins[5], ((millis() - myTimer) % 1000) > 500);
  } else if (millis() - myTimer < (190000)) { // nach 180 Sekunden
    for (int i = 0; i < 6; i++) {
      digitalWrite(ledPins[i], ((millis() - myTimer) % 1000) < 500);
    }
  } else {
    for (int i = 0; i < 6; i++) {
      digitalWrite(ledPins[i], LOW);
    }
  }
  delay(10);
}

Wir deklarieren alle benötigten LED-Pins des Arduino-Boards in einem Array:

const int ledPins[] = {7, 8, 9, 10, 11, 12};

Dadurch können wir mit einer einfachen for-Schleife alle Pins als Outputs deklarieren:

for (int i = 0; i < 6; i++) {
  digitalWrite(ledPins[i], LOW);
}

Als Steuerungsinstrument dient die Variable myTimer. Sie zählt Millisekunden, ab dem Moment ab dem der Taster gedrückt wird:

if (digitalRead(buttonPin) == LOW) {
myTimer = millis();
}

Nun lässt sich jeweils prüfen, wie »spät« es im Programm ist, denn die Formel

millis() – myTimer

ergibt immer die Millisekunden, ab dem Startzeitpunkt. Nun kann man einfach prüfen, ob man sich z. B. in den ersten 30 Sekunden befindet:

if (millis() - myTimer < (30000)) { // 30 Sekunden

Um nun die LED im Sekundentakt blinken zu lassen (ein- und ausschalten = 1 Sekunde) kann man die Modulo-Funktion verwenden (%):

(millis() - myTimer) % 1000

Sie teilt einen Wert und liefert nur den Rest. Dieser liegt im Beispiel zwischen 0 und 1000. Prüfen wir also genau die Mitte ab (500). Das ergibt die Hälfte der Zeit 0, die andere Hälfte der Zeit 1. Diesen Wert können wir direkt an die Funktion digitalWrite übergeben:

digitalWrite(ledPins[0], ((millis() - myTimer) % 1000) > 500);

Ich hoffe, das Projekt gefällt dir. Wenn das der Fall ist, drück gern auf den Like-Button und hinterlasse mir gerne einen Kommentar. 

Hast du weitere Fragen? Probier doch mal unser brandneues Forum zu Arduino aus!

Schreibe einen Kommentar

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

Ich akzeptiere

 

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