/* ---------------------------------------------------------------------
* The Fearless Engineer - Elektronik und Programmieren
* Copyright (C) 2021, Dr. Andreas Haja.
*
* Dieses Programm steht unter der MIT-Lizenz: https://opensource.org/licenses/MIT.
* Die Software wird "as-is" bereitgestellt und kann Fehler enthalten. Die Nutzung erfolgt auf eigenes Riskio, für etwaige Schäden wird keine Haftung übernommen.
*
* http://www.fearlessengineers.de
* http://go.tfe.academy/discord
* ----------------------------------------------------------------------
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Addr, cols, rows
int buzzerPin=2;
int Buzzer = 0;
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 = 6000; // 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;
long myTimeout = 0;
long myStartTime = 0;
unsigned long timeStart;
unsigned long timeNow;
int interval = 1000;
int cntTimer = 0;
void setup() {
pinMode(buttonPinTasse, INPUT_PULLUP);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
Serial.begin(9600);
digitalWrite(buzzerPin, OUTPUT);
lcd.init();
lcd.backlight();
timeStart = millis();
}
void loop() {
switch (myState) {
case 0: // keine Tasse auf dem Untersetzer
analogWrite(ledPin1, 0);
if (digitalRead(buttonPinTasse) == 1) myState = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String("Ziehzeit"));
lcd.setCursor(0, 1);
lcd.print(String(" auswaehlen !! "));
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();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String("Ziehzeit : 3 Min."));
lcd.setCursor(0, 1);
lcd.print(String(cntTimer) + String(" sec. "));
}
if (digitalRead(buttonPin2) == 0) {
blinkIndikator(2);
myState = 2;
myTimeout = time2;
myStartTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String("Ziehzeit : 4 Min."));
lcd.setCursor(0, 1);
lcd.print(String(cntTimer) + String(" sec. "));
}
if (digitalRead(buttonPin3) == 0) {
blinkIndikator(3);
myState = 2;
myTimeout = time3;
myStartTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String("Ziehzeit : 8 Min."));
lcd.setCursor(0, 1);
lcd.print(String(cntTimer) + String(" sec. "));
}
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 :-)
timeNow = millis();
if( (timeNow-timeStart)>=interval )
{
cntTimer++;
timeStart = timeNow;
}
lcd.setCursor(0, 0);
lcd.print(String("Ziehzeit : "));
lcd.setCursor(0, 1);
lcd.print(String(cntTimer) + String(" sec. "));
break;
case 3: // Ziehzeit abgelaufen
blinkFast();
if (digitalRead(buttonPinTasse) == 1) myState = 0;
lcd.setCursor(0, 1);
lcd.print(String(" Fertig !!! "));
int i=0;
do {
i++;
tone(buzzerPin,423,1000);
delay(100);
noTone(buzzerPin);
delay(1000);
tone(buzzerPin,523,1000);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin,623,1000);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin,723,1000);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin,623,1000);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin,523,1000);
delay(100);
noTone(buzzerPin);
delay(100);
}
while(i<5);
delay(1000);
cntTimer = 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);
}
};