Problem mit Multifunktionstaster

Hallo Leute , Möchte mit einen Multifunktionstaster Codes per Serial senden Wie zb: Druckt man 1-mal die Taster und wartet 5sec … "sendecode 1" Druckt man 2-mal die Taster und wartet 5sec … "sendecode 2" Druckt man 3-mal die Taster und wartet 5sec … "sendecode 3" Druckt man 4-mal die Taster und wartet 5sec … "sendecode 4" Soweit funktioniert auch alles… Mein Problem ist jetzt: Angenommen ich möchte denn Code 3 senden: Drücke ich 3-mal die Taste und warte 5sec es kommt in Serial Monitor "sendecode 3" soweit so gut… Aber warte ich jetzt länger als 5sec und drücke dann wieder die Taste sendet er sofort denn Code: "sendecode 1" Irgendwie läuft mir hier die Zeit über…

const int  buttonPin = 12;    
const int ledPin = 13;       



unsigned long buttonPushCounter = 0;   
int buttonState = 0;         
int lastButtonState = 0;     
int sperrzeit = 20;
int interval = 5000;
unsigned long prev;
unsigned long start;
void setup() {
  
  pinMode(buttonPin, INPUT);
  
  pinMode(ledPin, OUTPUT);
  
  Serial.begin(9600);
  
}


void loop() {
  
  buttonState = digitalRead(buttonPin);

  start = millis();
  
  if (buttonState != lastButtonState) {
    
    if (buttonState == HIGH) {
      
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    } 
    else {
      
      Serial.println("off"); 
    }
  }
  
 if (buttonPushCounter >= sperrzeit){
   buttonPushCounter = 0;
 }
     lastButtonState = buttonState;
  

  if (((start - prev) > interval) && (buttonPushCounter == 4) ){
   prev = start;
    digitalWrite(ledPin, HIGH);
    
    Serial.println("sendecode 4");
    buttonPushCounter = 0;
  } 
  if (((start - prev) > interval) && (buttonPushCounter == 3) ){
   prev = start;
    digitalWrite(ledPin, HIGH);
    Serial.println("sendecode 3");
    buttonPushCounter = 0;
  
  }
  if (((start - prev) > interval) && (buttonPushCounter == 2) ){
   prev = start;
    digitalWrite(ledPin, HIGH);
    Serial.println("sendecode 2");
    buttonPushCounter = 0;
    }
  if (((start - prev) > interval) && (buttonPushCounter == 1) ){
   prev = start;
    digitalWrite(ledPin, HIGH);
    Serial.println("sendecode 1");
    buttonPushCounter = 0;
     }
  if (buttonPushCounter == 5) {
  
    
    buttonPushCounter = 0;
  }else {
   digitalWrite(ledPin, LOW);
}
}

madmexx: Aber warte ich jetzt länger als 5sec und drücke dann wieder die Taste sendet er sofort denn Code: "sendecode 1"

Ein Programm macht immer genau das, was Du programmiert hast.

Damit ein Programm funktionieren kann, mußt Du vorher mit einer präzisen Logik in natürlicher Sprache formulieren können, was das Programm machen soll.

Für mich kommt bei Deinem Vorhaben eigentlich nur (in etwa) folgende Logik in Frage: - beim ersten Tastendruck: Millisekundenzähler starten, Anzahl=1 - bei weiterem Tastendruck innerhalb 1 Sekunde seit Zählerstart: Millisekundenzähler Neustart, Anzahl+1 - falls Millisekundenzähler über 1000: Ergebnis senden, Anzahl=0

Ich bin Anfänger und weiß nicht genau wie ich das Programmtechnisch umsetzten soll :blush:

madmexx: Ich bin Anfänger und weiß nicht genau wie ich das Programmtechnisch umsetzten soll :blush:

Kleines Beispielprogramm anbei.

Bei den Ausgaben der einzelnen Tastendrücke über Serial gehe ich davon aus, dass es sich um Debug-Ausgaben handelt und habe diese im Quellcode auskommentiert.

Im übrigen: Strukturiere Dein Programm in einzelne Funktionen und packe nicht den gesamten Code in die loop-Funktion!

Eine vernünftige Gliederung kann zum Beispiel in verschiedene Funktionsbereiche durch das EVA-Prinzip erfolgen - Eingabe - Verarbeitung - Ausgabe

Aufgrund der Einfachheit des Programms hier mal nur ein Beispielprogramm mit den Funktionen "eingabe()" und "ausgabe()":

#define BUTTON 12
#define LED 13
#define TIMEOUT 1000
#define PRELLZEIT 5

void setup() {
  pinMode(BUTTON, INPUT);
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

int buttonPushCounter = 0;   
int lastButtonState = 0;     
unsigned long lastButtonPress;


int eingabe()
// Rückgabewert: Anzahl der Tastendrücke innerhalb einer Timeout-Zeit
{
  int returnValue=0;
  unsigned long now=millis();
  int buttonState = digitalRead(BUTTON);
  digitalWrite(LED,buttonState);
  if (buttonState==HIGH && lastButtonState == LOW) {
    lastButtonPress=now;
    buttonPushCounter++;  
//    Serial.print("number of button pushes:  ");
//    Serial.println(buttonPushCounter);
  }
  lastButtonState=buttonState;
  if (buttonPushCounter>0 && now-lastButtonPress>TIMEOUT) 
  {
    returnValue=buttonPushCounter;
    buttonPushCounter=0;
  }
  delay(PRELLZEIT); // entprellen mit delay
  return returnValue;
}

void ausgabe(int number)
// Ausgabe einer Zahl auf Serial
{
  Serial.print("sendecode");
  Serial.println(number);
}


void loop() {
  int number=eingabe();
  if (number>0) ausgabe(number);
}