Teeuhr

Hallo, ich habe mir vorgenommen eine Teeuhr zu bauen. Bei dieser soll man über ein Keypad auf einem LC-Display Teesorten aussuchen können. Dies habe ich auch schon geschafft (siehe Code unten).
Hat man den richtigen Tee ausgesucht, drückt man A und es soll dann ein Timer kommen, der die Zeit bis zum Herausnehmen des Teebeutels herunterzählt. Hat jemand einen Tipp wie ich das realisieren kann?
Wenn ich in
case'1':
lemonhoney();
if(key='A')... eingebe, wird auf dem LC-Display nur der Text überschrieben.

Hier der komplette Code, den ich bisher zusammen habe.

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

//Keypad einrichten
const byte ROWS = 4; 
const byte COLS = 4; 

char hexaKeys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 6, A5, A4}; 
byte colPins[COLS] = {A3, A2, A1, A0};


Keypad kp = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 



void setup() {
 lcd.begin(16,2);
 lcd.print("Tee-Projekt");
 delay(1000);
}


void loop() {
 char key = kp.getKey();
 if(key){
   switch(key){
     case'1':
       lemonhoney();
       break;
     case'2':
       schlaflos();
       break;
   }
 }
 
}


void lemonhoney(){
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("GR Lemon honey");
 lcd.setCursor(0,1);
 lcd.print("70 Grad");
 lcd.setCursor(10,1);
 lcd.print("2min");

}

void schlaflos(){
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("Sencha Schlaflos");
 lcd.setCursor(0,1);
 lcd.print("90 Grad");
 lcd.setCursor(9,1);
 lcd.print("2min");
 lcd.setCursor(14,1);
 lcd.print("7");
}

Naja, im Prinzip ordnest du die Zeit in millis() der gewählten Teesorte einer Variablen zu, die dann als Endwert für den Timer genutzt wird. Mit Bestätigung des Starts setzt du dann einen Vergleichswert auf die aktuellen millis() und vergleichst dann die Differenz der Start-millis() mit den aktuellen millis() und wenn die Differenz deiner Brühzeit enstpricht ist die Endbedingung erreicht...

Rebeccaa:
Hat jemand einen Tipp wie ich das realisieren kann?

Es wäre sehr schön, wenn du deinen Sketch in Code-Tags postest.
Dann ist dieser besser lesbar.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

//Keypad einrichten
const byte ROWS = 4; 
const byte COLS = 4; 

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 6, A5, A4}; 
byte colPins[COLS] = {A3, A2, A1, A0};


Keypad kp = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 



void setup() {
  lcd.begin(16,2);
  lcd.print("Tee-Projekt");
  delay(1000);
}


void loop() {
  char key = kp.getKey();
  if(key){
    switch(key){
      case'1':
        lemonhoney();
        
        break;
      case'2':
        schlaflos();
        break;
    }
  }
  
}


void lemonhoney(){
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("GR Lemon honey");
  lcd.setCursor(0,1);
  lcd.print("70 Grad");
  lcd.setCursor(10,1);
  lcd.print("2min");

}

void schlaflos(){
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Sencha Schlaflos");
  lcd.setCursor(0,1);
  lcd.print("90 Grad");
  lcd.setCursor(9,1);
  lcd.print("2min");
  lcd.setCursor(14,1);
  lcd.print("7");
}

Den Tipp von MaHa76 in Verbindung mit der Funktion wie sie in BlinkWithoutDelay beschrieben wurde und du hast deinen Zeitablauf.

MaHa76:
Naja, im Prinzip ordnest du die Zeit in millis() der gewählten Teesorte einer Variablen zu, die dann als Endwert für den Timer genutzt wird. Mit Bestätigung des Starts setzt du dann einen Vergleichswert auf die aktuellen millis() und vergleichst dann die Differenz der Start-millis() mit den aktuellen millis() und wenn die Differenz deiner Brühzeit enstpricht ist die Endbedingung erreicht...

ja, so hatte ich mir das auch gedacht, aber meine Problem ist momentan, dass der Text auf dem Display überschrieben wird. Also zum Beispiel steht auf dem Display:

Lemon Honey
70Grad 2min

Dann soll man Button A drücken, damit der Timer losgeht. Dies habe ich bisher so gelöst:

void loop() {
  char key = kp.getKey();
  if(key){
    switch(key){
      case'1':
        lemonhoney();
        [b]if (key = 'A'){
          //Hier Code Timer
        }
[/b]        
        break;
      case'2':
        schlaflos();
        break;
    }
  }

Nur leider funktioniert das nicht und ich suche momentan nach Hilfe, wie ich dies Lösen kann /besser machen kann, da ich relativ neu bin. :slight_smile:

Das funktionier so nicht.
Der Sketch wartet ja nicht in der "case 1" sondern durchläuft die Loop erneut.

Du musst also einen Merker setzen, dass er "lemonhoney" gestartet hat und nur auf die Taste "A" reagiert.
Danach deinen Timer starten und nach dessen Ablauf auch den Merker zurück setzen.

HotSystems:
Das funktionier so nicht.
Der Sketch wartet ja nicht in der "case 1" sondern durchläuft die Loop erneut.

Du musst also einen Merker setzen, dass er "lemonhoney" gestartet hat und nur auf die Taste "A" reagiert.
Danach deinen Timer starten und nach dessen Ablauf auch den Merker zurück setzen.

und wie kann ich so einen Merker setzen?

Rebeccaa:
und wie kann ich so einen Merker setzen?

Eine variable die entsprechend mit 1 oder 0 bzw. False oder True gesetzt wird.

Ein Tastenfeld habe ich nicht und mein LCD wird mittels I2C angesteuert. Ansonsten habe ich ein case 'a' ergänzt und ein Herunterzählen der Zeit:

/*
Funktioniert mit Bibliothek http://www.instructables.com/id/How-to-connect-a-serial-LCD-to-an-Arduino-UNO/step2/The-Sketch/   Beschreibung
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads   Download
*/

#include <LCD.h>                //NewliquidCrystal
#include <LiquidCrystal_I2C.h>  //NewliquidCrystal
#include <Wire.h>

#define I2C_ADDR     0x27                         // 20x4 Display
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C  lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin, BACKLIGHT_PIN, POSITIVE);

uint32_t teeMillis;
int16_t teezeit;
byte teetyp;
bool zeitlaeuft;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Tee-Projekt");
  delay(1000);
}

void loop() {
  char key = ' ';
  if (Serial.available()) {
    key = Serial.read();
  }
  switch (key) {
    case'1':
      lemonhoney();
      break;
    case'2':
      schlaflos();
      break;
    case'A':
    case'a':
      teeuhrstart();
      break;
  }
  if (millis() - teeMillis >= 1000 && zeitlaeuft) {
    if (teezeit > 1) {
      teeMillis = millis();
      teezeit--;
      lcd.setCursor(0, 1);
      if (teezeit < 100) {
        lcd.print(" ");
      }
      if (teezeit < 10) {
        lcd.print(" ");
      }
      lcd.print(teezeit);
      lcd.print(" Sekunden ");
    } else {
      zeitlaeuft = false;
      lcd.setCursor(0, 1);
      lcd.print("fertig!         ");
    }
  }
}

void teeuhrstart() {
  teeMillis = millis();
  zeitlaeuft = true;
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(teezeit);
  lcd.print(" Sekunden");
}

void lemonhoney() {
  teetyp = 1;
  teezeit = 120;
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("GR Lemon honey");
  lcd.setCursor(0, 1);
  lcd.print("70 Grad");
  lcd.setCursor(8, 1);
  lcd.print("2:00 Min");
}

void schlaflos() {
  teetyp = 2;
  teezeit = 127;
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Sencha Schlaflos");
  lcd.setCursor(0, 1);
  lcd.print("90 Grad");
  lcd.setCursor(8, 1);
  lcd.print("2:07 Min");
}

IMG_7537.png