Taster neu definieren, ist das möglich?

Hi,
ich bin jetzt schon einige Zeit auf der Suche nach einer Lösung aber ohne Erfolg.
Und zwar möchte ich einem Taster eine neue Funktion zuweisen nachdem ein Zweiter einmalig gedrückt wurde. Für alle die mir nicht folgen können hier nochmal in einer anderen Sprache :wink:
Bisher hatte ich es immer so:

int Taster = 6;
int tasteDruck = 0;

void setup() {
  pinMode(Taster, INPUT);
  
}

void loop() {
  tasteDruck = digitalRead(Taster);
  if(taseDruck == HIGH) {

    /*gewünschte Funktion */
  }
/* nach dem das Ganze ausgeführt worden ist, soll der Taster eine andere Funktion bekommen, bzw. es würde genügen wenn nicht mehr gilt tasteDruck = digitalRead(Taster). 

}

Würde mich freuen, wenn mir da jemand weiterhelfen könnte ! :slight_smile:
Liebe Grüße

Wenn du eine Veränderung eines Zustandes bewirken willst, dann wirst du einen Zustandsmerker einführen müssen.

Auf welche Art auch immer....

Da du ausdrücklich über das "auswechseln von Funktionen" sprichst, nehme ich dich mal wörtlich!
Dafür wurden "Function Pointer" erfunden.

Obwohl hier sicherlich ein einfaches Flag genügen würde.

Vermutlich möchtest du eine Ablaufsteuerung bauen, eine Schrittkette, also einen endlichen Automaten.

Ich würde es nicht so wörtlich nehmen.

  • Zustand des Tasters1 abspeichern oder durch Tastendruck umschalten/weiterschalten
  • if Zustand == HIGH Funktion 1
  • else Funktion 2

So kannst Du verschiedene Reaktionen in den 2 Funktionen Funktion1 und Funktion2 für den selben 2. Taster festlegen.

Grüße Uwe

Wie gesagt, aus meiner Sicht ist es recht egal, wie man das mit dem Zustand abhandelt.
Man muss es nur tun.

Aber andererseits, werden if und switch mit zunehmender Anzahl, Verschachtelungstiefe und Komplexität der Bedingungen immer unübersichtlicher.
Zumindest ich, gelange da ganz schnell an meine Grenzen.

Hier mal nur für einen Taster, mit wechselnder Funktionalität.
(aus meiner Wühlkiste)

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

using namespace Combie::Tools;
using namespace Combie::Timer;
using namespace Combie::Pin; 

using CounterType = Counter<byte>;

TasterGND<2>      taster; // Taster gegen GND geschaltet
EntprellTimer     entprellen(20); // entprellzeit in ms
FlankenErkennung  flankenerkennung;
CounterType       counter;


void klappeAuf(CounterType &counter) 
{
  Serial.println("Klappe geht auf");
  counter.onCount(buttermilchEinspritzen); // naechsten Schritt vorbereiten
}

void buttermilchEinspritzen(CounterType &counter) 
{
  Serial.println("Buttermilch wird eingespritzt");
  counter.onCount(klappeZu); // naechsten Schritt vorbereiten
}

void klappeZu(CounterType &counter) 
{
  Serial.println("Klappe geht zu");
  counter.onCount(klappeAuf); // naechsten Schritt vorbereiten
}

void setup() 
{
    Serial.begin(9600);
    taster.initPullup();
    counter.onCount(klappeAuf);  // ersten Schritt vorbereiten
}

void loop() 
{ 
  counter = flankenerkennung = entprellen = taster;
}

CombieLib.zip (31.3 KB)

Vielen Dank für eure Antworten! Hab es jetzt mir einer else gelöst, da es sich nur um einen Ein / Aus Schalter handelt :slight_smile: