Aktion ausführen, wenn ein Taster länger betätigt wird

Hay How,

ich möchte zwischen kurzem Tasterdruck und langem unterscheiden, wobei bei langer Betätigung schon während der Betätigung eine Aktion ausgeführt werden soll.

Ich als frischer Elektronik-Ingenieur sollte es eig. hinbekommen jedoch hab ich eine solche Aufgabenstellung noch nicht gehabt. Ich hab auch schon 1-2 Bibliotheken ausfindig gemacht mit denen es wohl funktionieren mag jedoch nur erst nachdem man den Taster nach einer langen Betätigung los lässt nicht aber schon während der Betätigung. Leider habe ich nicht alle meine Versuche abgespeichert im folgendem jedoch mein letzter Ansatz:

void loop() {
  if (Taster_In == 1) {   //wenn Taster gedrückt, dann schaue 2s lang ob der Taster weiterhin betätigt wird
    for (int i=0; i<21; i++) {
      while (Taster_In == 1 && i < 21) {
        delay(100);
      }
    }
  }
  else { 
        int i;
        if (i == 20) {   //wenn Taster 2s lang gedrückt wurde, dann ändere SSA-OFF Automatik Status
        Automatik_Status = !Automatik_Status;
        EEPROM.write(EEPROM_Adresse, Automatik_Status);      
        }
        else {
        digitalWrite(Taster_Out, HIGH);
        delay(500);
        digitalWrite(Taster_Out, LOW);
        SSA_Status = !SSA_Status;
        }
      }
  }

Aktuell noch mit “delay”-Befehl(en) ist aber eig. egal für diese Anwendung, da es nichts zeitkritisches ist/gibt.

ich wäre jedenfalls sehr dankbar, wenn mir wer unter die Arme greifen kann/könnte :wink:

Gruß Frosch

(deleted)

Peter-CAD-HST:
Moin Frosch

wo wird die Variable "Taster_In" gelesen ?

Gruss Peter

Moin Peter,

also ich vermute, dass ich deine Frage nicht richtig verstehe ansonsten frage ich doch mit "if (Taster_In == 1) {..." den Taster ab?!

Du fragst eine Variable ab. Wie kommt aber die Info, ob der Taster gedrückt ist in die Variable? Wo fragst Du den Eingang ab?

Gruß Tommy

ich als frischer Elektronik-Ingenieur sollte es eig. hinbekommen

Das denke ich aber auch!

Das realisieren eines (retriggerbaren) Monoflop und einer Flankenerkennung in Software, ist wahrlich keine Raketentechnik.

ansonsten frage ich doch mit "f (Taster_In == 1) {..." den Taster ab?!

Der typische Arduino User verwendet digitalRead()

combie:
Das denke ich aber auch!

Das realisieren eines (retriggerbaren) Monoflop und einer Flankenerkennung in Software, ist wahrlich keine Raketentechnik.

Der typische Arduino User verwendet digitalRead()

AuuuuuuuA,

das hab ich tatsächlich in dieser Variante völlig vergessen *facepalm

werd sofort versäumtes nachholen :smiley:

ist denn die Herangehensweise soweit korrekt?

ich DANKE euch... .

Gruß Frosch

(deleted)

Peter-CAD-HST:
und das Ganze mal wieder Kosten- und Gebührenfrei :slight_smile:

Ich weiß nicht so ganz, wie das gemeint war, jedenfalls sollte ich an dieser Stelle erwähnen, dass es sich um ein non-kommerzielles Projekt handelt bzw. ein Privates Projekt :wink:

Hallo,

wenn du nur eine Lösung haben willst , dann schau die mal die oneButton Lib an. Da kannst Du 3 Funktionen auf einen Taster legen.

Heinz

Rentner:
Hallo,

wenn du nur eine Lösung haben willst , dann schau die mal die oneButton Lib an. Da kannst Du 3 Funktionen auf einen Taster legen.

Heinz

Ja, das ist eine der Bibliotheken die ich eingangs erwähnte, die nicht exakt das machen, was ich benötige. Denn die werten einen langen Tasterdruck erst beim loslassen des Tasters aus und nicht währenddessen. (Sofern ich mich nicht vertue)

Ich bin gerade an einer Lösung dran, aber danke, mal gucken, obs was wird :slight_smile:

Gruß Frosch

frosch2006:
Ja, das ist eine der Bibliotheken die ich eingangs erwähnte, die nicht exakt das machen, was ich benötige. Denn die werten einen langen Tasterdruck erst beim loslassen des Tasters aus und nicht währenddessen. (Sofern ich mich nicht vertue)

Ich bin gerade an einer Lösung dran, aber danke, mal gucken, obs was wird :slight_smile:

Gruß Frosch

das stimmt so nicht, ich mache damit eine Lautstärkenänderung ,wenn ich den Taster lange drücke wird es immer lauter oder leiser während des drückens

Heinz

frosch2006:
Denn die werten einen langen Tasterdruck erst beim loslassen des Tasters aus und nicht währenddessen.

Die müssen ja erst mal "lang" verkennen.

Gruß Tommy

Hm jedenfalls ist vorerst mein PAP fertig, mal schauen, wenn ichs umgesetzt hab, ob es klappt.

Ansonsten guck ich mir die Bib nochmal an^^ :wink:

Hier mal mein PAP, interessant wird es eig. ab der roten Linie :wink: (hat wer Einwände?!):
(Link zum Bild)

Hi

Soll der Arduino während dessen noch 'Was Anderes' machen, oder soll Der 'nur' die LED blinken lassen, je nachdem, in welchen Modus wir nun gewechselt haben?

Die Tastenerkennung kannst Du mit der oneButton machen.
Ein KURZER Tastendruck wird dabei erst beim LÖSEN erkannt (vorher ist ja nicht klar, ob's ein Langer werden soll).
Ein LANGER ist nach der Dauer eines langen Tastendruck erkannt.
Ob Dieser erkannt bleibt, oder ob man mit .pressed() sich selber was basteln muß - bin ich momentan überfragt.

Nebenbei kann man per Doppelklick (2x kurz) auch noch was auslösen :wink:

MfG

ich finds übersichtlich.
Wenn man post-masters Post als Anforderung nähme:

Ein KURZER Tastendruck --> taster war gedrückt ist losgelassen und die Zeit für die Releasetime beim Doppelclick ist auch um

Ein LANGER --> feuern sobald Tastendruck lang erfüllt ist

Doppelklick (2x kurz): --> kurz - Release - kurz - Zeitablauf für kurz

nette Spielerei.

Warum funktioniert folgender Code nicht so, wie erwartet?

#include <EEPROM.h>

int Taster_In = 2;
int Taster_Out = 3;
int Taster_LED = 4;
int EEPROM_Adresse = 0;

int i;
bool Automatik_Status;
bool SSA_Status;

void setup() {
  Serial.begin(9600);
  pinMode(Taster_In, INPUT);
  pinMode(Taster_Out, OUTPUT);
  pinMode(Taster_LED, OUTPUT);
  Automatik_Status = EEPROM.read(EEPROM_Adresse);
}

void loop() {
  if (digitalRead(Taster_In) == 1) {            
    if (digitalRead(Taster_In) == 1 && i<20) {          
      for (int i=0; i<21; i++) {        
        delay(100);     
      }       
    }         
  }           
    else {          
      if (i == 20) {        
        Automatik_Status = !Automatik_Status;     
        if (Automatik_Status == 1) {      
          for (int i=0; i<5; i++) {   
            digitalWrite(Taster_LED, HIGH); 
            delay(150); 
            digitalWrite(Taster_LED, LOW);  
            delay(150); 
            digitalWrite(Taster_LED, HIGH); 
            delay(150); 
            digitalWrite(Taster_LED, LOW);  
            delay(550); 
            EEPROM.write(EEPROM_Adresse, Automatik_Status); 
          }   
        }     
        else {      
          if (Automatik_Status == 0) {    
            for (int i=0; i<5; i++) { 
              digitalWrite(Taster_LED, HIGH);
              delay(250);
              digitalWrite(Taster_LED, LOW);
              delay(750);
              EEPROM.write(EEPROM_Adresse, Automatik_Status);
            } 
          }   
        }     
      }       
      else {        
        if (i == 1 && digitalRead(Taster_In) == 0) {      
          SSA_Status = !SSA_Status;   
          digitalWrite(Taster_Out, HIGH);   
          delay(500);   
          digitalWrite(Taster_Out, LOW);    
          if (SSA_Status == 0) {    
            digitalWrite(Taster_LED, HIGH); 
          }   
          else {    
            digitalWrite(Taster_LED, LOW);  
          }   
        }     
      }       
    }
}

Ich hab meinen Programmcode mit Excel erstellt, um mit den ganzen Klammern etc. nicht durcheinander zu kommen jedoch macht mein Code nicht, dass was er soll… :frowning:

Gruß Frosch

Warum funktioniert folgender Code nicht so, wie erwartet?

Was erwartest du, was tut der Code?

Leider kann ich dein Programm nicht gut lesen.
Es ist tief verschachtelt. Davon komme ich leicht durcheinander.
Und du offensichtlich auch.

Auch verwirrt mich die Doppelverwendung von i in einer Funktion.
Gemeint ist: 2 verschiedene Variablen mit ein und dem selben Bezeichner

Seit wann ist Excel ein Editor zum Programmieren?
Da Du nicht schreibst, was der Code tun soll, woher sollen wir dann wissen, warum er das Unbekannte nicht tut?

Baue Dir genügend serielle Ausgaben ein, um herauszufinden, wie Dein Code abläuft.
Die vielen delay werden höchstwahrscheinlich eins Deiner Probleme sein.

Gruß Tommy

Tommy56:
Seit wann ist Excel ein Editor zum Programmieren?
Da Du nicht schreibst, was der Code tun soll, woher sollen wir dann wissen, warum er das Unbekannte nicht tut?

Baue Dir genügend serielle Ausgaben ein, um herauszufinden, wie Dein Code abläuft.
Die vielen delay werden höchstwahrscheinlich eins Deiner Probleme sein.

Gruß Tommy

combie:
Was erwartest du, was tut der Code?

Leider kann ich dein Programm nicht gut lesen.
Es ist tief verschachtelt. Davon komme ich leicht durcheinander.
Und du offensichtlich auch.

Auch verwirrt mich die Doppelverwendung von i in einer Funktion.
Gemeint ist: 2 verschiedene Variablen mit ein und dem selben Bezeichner

Hm, so recht kann ich eure Aussagen nicht verstehen, da ich auf der ersten Seite bereits recht detailliert erläutert habe, was ich vorhabe, ich habe sogar ein PAP dafür erstellt.

frosch2006:
Hm jedenfalls ist vorerst mein PAP fertig, mal schauen, wenn ichs umgesetzt hab, ob es klappt.

Ansonsten guck ich mir die Bib nochmal an^^ :wink:

Hier mal mein PAP, interessant wird es eig. ab der roten Linie :wink: (hat wer Einwände?!):
(Link zum Bild)

aber um das nochmal zusammenzufassen, jeglicher Tastendruck wird ignoriert sei es ein kurzer Tastendruck noch ein langer...

Gruß Frosch

Hallo,

warum erstellst Du den Code mit Excell ? ich denke du bist auf den völlig falschen Dampfer.

Die IDE kann doch super mit Klammeren umgehen und die Zeilen eirücken. Zudem bekommst Du angezeigt welche Klammern zusammen gehören.

Mal abgesehen davon , was soll dein Sketch den machen ? ein paar Kommentare wären nicht schlecht.

Warum führst Du 20 mal eine delay(100) in einer Schleife aus und machst sonst nicht innerhalb der Schleife. Dann lässt du in einer Schleife 5 mal etwas blinken und schreibst 5 mal auf den Eprom ????

In for Schleifen ist die Laufvarieble nur innerhalb der Schleife gültig.

Heinz