Taster abfrage ( Anzahl )

Moin Community,

ich bin realtiv neu in der Arduino Welt und bräuchte mal etwas Hilfe.

folgendes:
ich habe bis jetzt einen Taster mit dem ich mittels millis Leuchtmodis einstelle also einmal drücken 1 Sekunde pause nochmal drücken halbe Sekunde usw. ( nicht selber geschrieben aber verstanden )
jetzt möchte ich aber wenn ich den Taster einmal drück die led 1 Sekunde leucht wenn ich den Taster mal hintereinander drücke soll er ne halbe sekunde leuchten und 3 mal drücken 100ms.
hat jemand da ne Idee oder sogar einen Beispielcode?
danke schon mal:))

// Konstanten
const int tasterPin = 2;          // Pin Nummer des Tasters
const int ledPin =  3;            // Pin Nummer der LED des Arduinos
 
// Variablen
int tasterStatus = LOW;           // aktuelles Signal vom Eingangspin
int tasterGedrueckt = 0;          // abfragen ob Taster gedrückt war
int lichtmodus = 0;               // festlegen der verschiedenen Lichtprogramme
int ledStatus = LOW;              // aktueller Zusatnd der LED
int entprellZeit = 200;           // Zeit für Entprellung, anpassen!
 
unsigned long tasterZeit = 0;     // Zeit beim drücken des Tasters
unsigned long ledMillis = 0;      // Zeit für den Blinkrythmus der LED
 
 
void setup()
{
  pinMode(ledPin, OUTPUT);      // LED Pin wird als Ausgang gesetzt
  pinMode(tasterPin, INPUT);    // Taster Pin wird als Eingang gesetzt
}
 
 
void loop()
{
  // Lesen des tasterPin
  tasterStatus = digitalRead(tasterPin);
 
  // Wenn der Taster gedrückt ist...
  if (tasterStatus == HIGH) 
  {
    tasterZeit = millis();      // aktualisiere tasterZeit
    tasterGedrueckt = 1;        // speichert, dass Taster gedräckt wurde
  } 
 
  // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
    {
      lichtmodus++;             // lichtmodus wird um +1 erhöht
      tasterGedrueckt = 0;      // setzt gedrückten Taster zurück
    }
  
   
  ***************************Leuchtprogramme************************************
   
  // Wenn Lichtmodus 0 ist, blinke im 1000ms Rythmus
  if (lichtmodus == 0)
  {
    // Wenn 1000ms vergangen sind...
    if (millis() - ledMillis > 1000)
    {
      ledStatus = !ledStatus;             // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
      digitalWrite(ledPin, ledStatus);    // Ausgabe am LED Pin
      ledMillis = millis();               // beginne die Zeitzählung von vorne
    }
  }
 
  // Wenn Lichtmodus 1 ist, blinke im 500ms Rythmus
  else if (lichtmodus == 1)
  {
    // Wenn 500ms vergangen sind...
    if (millis() - ledMillis > 500)
    {
      ledStatus = !ledStatus;             // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
      digitalWrite(ledPin, ledStatus);    // Ausgabe am LED Pin
      ledMillis = millis();               // beginne die Zeitzählung von vorne
    }
  }
 
  // Wenn Lichtmodus 2 ist, blinke im 250ms Rythmus
  else if (lichtmodus == 2)
  {
    // Wenn 250ms vergangen sind...
    if (millis() - ledMillis > 250)
    {
      ledStatus = !ledStatus;             // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
      digitalWrite(ledPin, ledStatus);    // Ausgabe am LED Pin
      ledMillis = millis();               // beginne die Zeitählung von vorne
    }
  }
 
  // Wenn Lichtmodus 3 ist, leuchte durchgehend
  else if (lichtmodus == 3)
  {
    digitalWrite(ledPin, HIGH);           // LED leuchtet
  }
   
  // Wenn Lichtmodus 4 ist, LED aus
  else if (lichtmodus == 4)
  {
    digitalWrite(ledPin, LOW);            // LED ist aus
  }
 
  // Wenn der Lichtmodus auf 5 sprngt, setzte ihn wieder zurück auf 0 um von vorne zu beginnen
  else
  {
    lichtmodus = 0;
  }
}

Ich glaube:
Du möchtest dich mit endlichen Automaten beschäftigen.

combie:
Ich glaube:
Du möchtest dich mit endlichen Automaten beschäftigen.

sagt mir grad nichts

Das dachte ich mir schon....
Darum sagte ich es ja auch!

Tipp:
"Endlicher Automat" ist das Stichwort, nach dem du suchen solltest

combie:
Tipp:
"Endlicher Automat" ist das Stichwort, nach dem du suchen solltest

gut endlicher Automat ist ein wer hätte es gedacht ein Automat der unendliche Zustände hat und ein Übergang nur durch eine Eingabe stattfindet (habe eine Ampelschaltung als bsp. gefunden). Aber ich versteh nicht ganz wie mir das weiter hilft ? ich meine zustände habe ich ja auch also meine leuchtmodis die ja auch nur durch Taster drücken einen Übergang hat also ist das doch genau das was ich habe oder versteh ich das falsch ?

Proton1999:
... endlicher Automat ... unendliche Zustände ...

Du verstehst was falsch, siehst Du den Unterschied?

Proton1999:
... ich meine zustände habe ich ja auch ...

Wo? Ich bekomme manchmal auch Zustände, aber wenn Du ein Programm meinst, dann wäre es hilfreich, wenn wir es auch sehen könnten.

agmue:
wenn Du ein Programm meinst, dann wäre es hilfreich, wenn wir es auch sehen könnten.

stimmt ohne mein Programm hilf das nicht viel. hab ihn mal hinzugefügt :slight_smile:

agmue:
Du verstehst was falsch, siehst Du den Unterschied?

ja mein Fehler habs gesehen

Proton1999:
hab ihn mal hinzugefügt :slight_smile:

Wo? Ich kann nichts sehen :frowning:

Oder beziehst Du Dich auf #0?

Du willst also, dass die LED nach der Eingabe per Taster nur ein mal leuchtet, und zwar für die gewählte Dauer?

Mahimus:
Du willst also, dass die LED nach der Eingabe per Taster nur ein mal leuchtet, und zwar für die gewählte Dauer?

Das habe ich auch noch nicht verstanden!

Dabei könnte ein Ablaufdiagramm hilfreich sein.

Mahimus:
Du willst also, dass die LED nach der Eingabe per Taster nur ein mal leuchtet, und zwar für die gewählte Dauer?

nein ich möchte das so haben :

1x taste drücken sagen wir mal vereinfacht Programm 1 soll ausgeführt werden
2x hintereinander taste drücken Programm 2 soll aufgeführt werden
3x hintereinander taste drücken Programm 3 soll ausgeführt werden

jetzt ist es nämlich so ich drücke die taste und er führt das Programm aus drücke ich 3x weil ich Programm 3 haben will durchläuft er ja auch 1 und 2 und das möchte ich umgehen

mit einem PAP hab ich mich einmal beschäftigt ich glaube wenn ich einen mache seid ihr noch verwirrter ich hoffe meine Antwort war verständlich

1x taste drücken sagen wir mal vereinfacht Programm 1 soll ausgeführt werden
2x hintereinander taste drücken Programm 2 soll aufgeführt werden
3x hintereinander taste drücken Programm 3 soll ausgeführt werden

jetzt ist es nämlich so ich drücke die taste und er führt das Programm aus drücke ich 3x weil ich Programm 3 haben will durchläuft er ja auch 1 und 2 und das möchte ich umgehen

Dann brauchst du einen nichtdeterministischen endlichen Automaten!

Denn er muss beim ersten Tastendruck 3 potentielle Zustände erkennen.
Beim 2ten sind es dann nur noch 2 mögliche Zustände.
usw.

Erst wenn die möglichen/potentiellen Zustände auf einen reduziert sind, hat der Automat einen deterministischen/eindeutigen Zustand erreicht, und es ist klar, welche Funktion ausgeführt werden muss.

Also wird hier auch ein Zeitdiagramm gemalt werden müssen.
(wenn man es nicht im Kopf abhandeln kann)

Ich würde halt einfach nach jedem Tastendruck (außer dem dritten) eine gewisse Zeit warten ob noch was kommt (und sonst nichts tun lassen). Dabei eine Variable hochzählen nach dem Schema "if Taster, dann ++i". Danach dann if-Abfragen: "if i = 1, dann Programm 1"

Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können. Viel Erfolg und wenn die ersten Versuche nicht funktionieren zeig einfach was du hast.

combie:
Dann brauchst du einen nichtdeterministischen endlichen Automaten!

wie realiesiere ich das ?

oder gibt es da irgendeine quelle worauf ich mich beziehen kann? so drin bin ich beim Arduino nicht.

mache mich gleich mal an den PAP :smiley:

Mahimus:
Danach dann if-Abfragen: "if i = 1, dann Programm 1"

Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können. Viel Erfolg und wenn die ersten Versuche nicht funktionieren zeig einfach was du hast.

Wenn Du den Unterschied zwischen = und == verstanden hast, kannst Du das ja nochmal versuchen.

Gruß Tommy

Mahimus:
Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können.

naja ich hab das schon verstanden was millis macht und auch mit meinem Code aber ob ich jetzt einfach so was zusammenbasteln kann weiß ich nicht. hab heute das erste mal von millis gehört. ich dachte delay wäre der letzte schrei

Proton1999:
wie realiesiere ich das ?

Wenn der entprellte Taster gedrückt (oder losgelassen) wird, inkrementierst Du den Zähler und startest eine Zeit. Läuft die Zeit ab, startest Du den zum Zähler passenden Programmteil und setzt den Zähler auf 0.

Bei einem nicht entprellten Taster darfst Du während der Prellzeit nicht zählen.

Tommy56:
Wenn Du den Unterschied zwischen = und == verstanden hast, kannst Du das ja nochmal versuchen.

Gruß Tommy

Wenn du den Unterschied zwischen Code und Pseudocode verstanden hast kannst du wieder versuchen an meinen Aussagen rum zu meckern.

An Mr. Proton: Natürlich ist es richtig, dass zwischen = und == ein Unterschied besteht, das ist in "deinem" Code oben ja auch richtig verwendet. Ich hoffe du hast verstanden, dass ich dir nur einen groben Ablauf geben wollte, ohne dabei schon einen lauffähigen Code zu liefern. Es war offenbar nicht so offensichtlich wie ich dachte. Als Tipp: Schau dir ein paar der zahlreichen Tutorials an und versuch auch mal einen einfachen Code (einfach nur LED mit millis() blinken lassen z.B.) von Grund auf selbst zu schreiben.

Gerade bei Antworten an Anfänger sollte man auch bei sogenanntem "Pseudocode" solche wesentlichen Unterschiede beachten.

Gruß Tommy

Tommy56:
Gerade bei Antworten an Anfänger sollte man auch bei sogenanntem "Pseudocode" solche wesentlichen Unterschiede beachten.

Gruß Tommy

Da würde ich dir sogar Recht geben und ich versuche in Zukunft daran zu denken. Nächstes mal den Hinweis nur bitte ohne einen Vorwurf, z.B. dass etwas Einfaches nicht verstanden wäre.