Ich will eine Eieruhr bauen, bei der ich die Länge bis sie losgeht per Tastenfeld eingebe

Dies ist mein Code soweit. Ich speichere das Eingegeben ab und habe es durch Serial.print überprüft ob es durch den # Knopf druck nochmals angegeben wird. Nun dachte ich, dass ich den keyBuffer in ein delay eingeben kann, was leider nicht geht und es gehen mir die Ideen aus. Hat jemand einen Rat?


#include "Keypad.h"
const byte ROWS = 4; // vier Reihen
const byte COLS = 4; // vier Spalten
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; // Pins fuer die Reihen
byte colPins[COLS] = {6,7,8,9}; // Pins fuer die Spalten
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char keyBuffer[] = "----";
void setup() {
Serial.begin(9600);
}


void loop() {
char key = keypad.getKey();
  if (key) { 
    if((int(key) >= 48) && (int(key) <= 57)) {
      addToKeyBuffer(key); }
      
      if (key == '#') {
        checkKey(); }
  }
}
    
    void addToKeyBuffer(char inkey) {
      
      
      for (int i=1; i<4; i++) {
        keyBuffer[i-1] = keyBuffer[i];
      }
      
      keyBuffer [4-1] = inkey;
      Serial.println(keyBuffer); }
    
    void checkKey() {
      Serial.println(keyBuffer);        
     
}
  

Was willst du eigendlich machen?

Ich glaube, du suchst: atoi()

dein

char keyBuffer[] = "----";

ist ein char Array und keine Zahl.

Wie aber schon vorgeschlagen, könntest du atoi probieren und daraus eine Zahl machen.

Und was genau soll dies bedeuten ?

Na das soll bedeuten, dass er über das Keypad die Zeitspanne eingeben möchte, die die Eieruhr laufen soll..

Und was hat das mit dem "delay" zu tun, das würde ich gern mal vom TO hören oder lesen.

#include "Keypad.h"
const byte ROWS = 4; // vier Reihen
const byte COLS = 4; // vier Spalten
char keys[ROWS][COLS] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; // Pins fuer die Reihen
byte colPins[COLS] = {6, 7, 8, 9}; // Pins fuer die Spalten
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char keyBuffer[] = "----";
uint32_t laufzeit;

void setup()
{
  Serial.begin(9600);
}


void loop()
{
  char key = keypad.getKey();
  if (key)
  {
    if ((int(key) >= 48) && (int(key) <= 57))
    {
      addToKeyBuffer(key);
    }
    if (key == '#')
    {
      checkKey();
    }
  }
}

void addToKeyBuffer(char inkey)
{
  for (int i = 1; i < 4; i++)
  {
    keyBuffer[i - 1] = keyBuffer[i];
  }
  keyBuffer [4 - 1] = inkey;
  Serial.println(keyBuffer);
}

void checkKey()
{
  laufzeit = atoi(keyBuffer);
  Serial.println(keyBuffer);
  Serial.print(F("Laufzeit in Sekunden: "));
  Serial.println(laufzeit);
  eierUhr();
}

void eierUhr()
{
  while (laufzeit)
  {
    Serial.print(F("Noch: "));
    Serial.print(laufzeit);
    Serial.println(" Sekunden");
    delay(1000);
    laufzeit--;
  }
}
1 Like

Ich habe etwas ähnliches mit 5 Tasten hinbekommen. Allerdings nur Minuten da ich keine Sekunden brauchte.

Die Tastenbeschriftung war : 10, 5, 1 , Kill, Start
Wurde die richtige Taste gedrückt, habe ich einfach die Anzahl der Minuten um die Taste erhöht. Kill Setze den Wert auf 0, Start lies das Prg. laufen.

Das hat mir den Theater mit den Parser erspart. :wink:

Ach ja, ich habe übrigens das 12Er Membran-Tastenfeld benutzt. Ein Aufkleber drauf und Fertig. Die anderen Tasten waren für hier nicht relavanten Funktionen. Bei dir würde ein 8er Feld locker reichen.

Gruß´

Pucki

Ich würde als Eingabe zu einem Encoder tendieren. Ist einfacher.
Ansonsten ist eine Lösung bereits gezeigt.
Ansosnsten ohne Strings könnte man die 4 eingegeben Zahlen auch in 2 Variablen abspeichern: in Minuten und Sekunden. und als Zahlen weiterarbeiten.

Grüße Uwe

@my_xy_projekt zeigt, wie man einen Text ( eventuell :wink: ) in eine Zahl wandeln kann --> atoi
Dass er diese nicht in "ein delay eingibt", liegt daran, dass dann während des delays gar nichts mehr passieren würde. So ist immerhin jede Sekunde eine Fortschrittsmeldung möglich.
Allerdings blockiert solange die Funktion eierUhr und anderes (z.B. Tastereingaben) sind nicht möglich.
Da hat er nur dir zuliebe etwas geschrieben, was er eigentlich besser könnte.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.