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. 

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

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 3

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!

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.