Arduino Tutorial Lesemodus schließen

Tee-Timer mit Arduino

Vielleicht kennst du das ja. Da arbeitet man konzentriert an einer Sache und schon ist der Tee bitter, weil er wieder zu lange gezogen hat. Abhilfe schafft da der Tee-Timer mit Arduino. Hier kannst Du einfach Deine Teetasse drauf stellen, auf den richtigen Knopf drücken und nach einer eingestellten Zeit erinnert dich eine blinkende LED daran, dass der Tee fertig ist.

Drei Button können zur Auswahl von Schwarzem, Grünen, Früchte- und Kräutertee verwendet werden. Die Zieh-Zeiten habe ich übrigens von hier.

Bauteile

Schaltplan

Vier Taster sind mit digitalen Pins des Arduinos verbunden. Auf einem davon steht die Teetasse, die anderen sind für die Auswahl der Tee-Zeiten vorgesehen. Eine LED ist in Reihe mit einem Widerstand zwischen einem PWM-Pin (Pin 11) und dem GND geschaltet. Die zwei nicht angeschlossenen Taster dienen als Auflagefläche für die Tee-Tasse. Da kann man natürlich auch was anderes drunter packen. Wichtig ist nur, dass genügend Gewicht der Tasse auf den Button ausgeübt wird.

Funktionsweise des Programmes

Das Programm sieht erstmal komplex aus, basiert aber im Grunde auf einer State-Machine, die aus vier States besteht.

switch (myState) {
    case 0:  // keine Tasse auf dem Untersetzer
     break;
    case 1: // Tasse auf Untersetzer, warte auf Eingabe
     break;
    case 2: // Ziehzeit läuft
     break;
    case 3: // Ziehzeit abgelaufen
     break;
}

State 0 bedeutet, dass keine keine Tasse auf dem Untersetzer (also auf den Buttons) steht. Hier müssen wir also nur gucken, ob der Button, auf dem die Tasse stehen soll, irgendwann gedrückt wird. Dann wechseln wir in den nächsten State. Die Tasse ist auf dem Untersetzer und wir warten auf Eingabe. Dazu lassen wir noch die LED ungeduldig blinken. Wird einer der drei Button für die Teesorte gedrückt, merken wir uns die mit ihm verknüpfte Zieh-Zeit:

myTimeout = time2;

Nun befinden wir uns im Ziehzeit-State und warten einfach, bis die Zeit abgelaufen ist. Wie ein Timer funktioniert, kannst du übrigens hier nachlesen. Zusätzlich faden wir die LED langsam ein und aus.

Ist die Zeit abgelaufen, springen wir in den letzten State, in dem wir einfach die LED blinken lassen. Nimmt man nun die Tasse hoch, springt das Programm wieder an den Anfang. Das ist es auch schon.

Code für den Tee-Timer mit Arduino

const int ledPin1 =  11;
const int buttonPin1 = 8;   // schwarzer Tee
const int buttonPin2 = 6;   // grüner Tee
const int buttonPin3 = 4;   // Kräuter- und Früchtetee
const int buttonPinTasse = 12; // hier steht die Tasse drauf

const long time1 = 180000; // 3 Minuten für schwarzen Tee
const long time2 = 240000; // 4 Minuten für grünen Tee
const long time3 = 480000; // 8 Minuten für Kräuter- und Früchtetee

int myState = 0;
int myTimeout = 0;
long myStartTime = 0;

int myBreathTimer = 0;
int myBreathTimeout = 200;

void setup() {
  pinMode(buttonPinTasse, INPUT_PULLUP);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  switch (myState) {
    case 0:  // keine Tasse auf dem Untersetzer
      analogWrite(ledPin1, 0);
      if (digitalRead(buttonPinTasse) == 0) myState = 1;
      break;
    case 1: // Tasse auf Untersetzer, warte auf Eingabe
      blinkSlow(); // LED Ausgabe langsames Blinken
      if (digitalRead(buttonPin1) == 0) {
        blinkIndikator(1);
        myState = 2;
        myTimeout = time1;
        myStartTime = millis();
      }
      if (digitalRead(buttonPin2) == 0) {
        blinkIndikator(2);
        myState = 2;
        myTimeout = time2;
        myStartTime = millis();
      }
      if (digitalRead(buttonPin3) == 0) {
        blinkIndikator(3);
        myState = 2;
        myTimeout = time3;
        myStartTime = millis();
      }
      break;
    case 2: // Ziehzeit läuft
      // Reset, wenn alle drei Buttons gleichzeitig gedrückt werden
      if ((digitalRead(buttonPin1) == 0) && (digitalRead(buttonPin1) == 0) && (digitalRead(buttonPin1) == 0)) {
        resetIndication(); // LED Ausgabe langes Leuchten
        myState = 0;
      }
      breath(); // LED Ausgabe langsames faden
      
      if (millis() - myStartTime > myTimeout) myState = 3; // dann ist der Tee fertig :-)
      break;
    case 3: // Ziehzeit abgelaufen
      blinkFast();
      if (digitalRead(buttonPinTasse) == 1) myState = 0;
      break;
  }
}

void blinkFast(){
  if (millis() % 200 > 100) analogWrite(ledPin1, 155);
  else analogWrite(ledPin1, 0);
}

void resetIndication() {
  analogWrite(ledPin1, 255);
  delay(3000);
  analogWrite(ledPin1, 0);
  delay(10);
}

void blinkSlow() {
  if (millis() % 2000 > 1000) analogWrite(ledPin1, 255);
  else analogWrite(ledPin1, 0);
}

void breath() {
  int myValue = (millis() / 10) % 1020;
  if (myValue < 512) analogWrite(ledPin1, (myValue/2));
  else analogWrite(ledPin1, 255 - ((myValue/2) - 255));
}

void blinkIndikator(int wiederholungen) {
  analogWrite(ledPin1, 0);
  delay(500);
  for (int i=0; i<wiederholungen; i++){
    analogWrite(ledPin1, 255);
    delay(80);
    analogWrite(ledPin1, 0);
    delay(80);
  }
};

Ich hoffe, das Projekt hat dir gefallen und du hast was gelernt. Lass mir gern einen Kommentar da und über einen Daumen nach oben freue ich mich immer!