Mit einem Potentiometer mit Rastungen wähle ich unter vier (später mehr) Funktionen aus. Mit einem Taster starte ich dann die ausgewählte Funktion. Jede Funktion hat eine unterschiedliche Laufzeit (hier nur im Sekundenbereich, später Minuten). Siehe WOKWI Simulation.
Problem: Wenn ich, während eine Funktion läuft, den Potentiometerknopf drehe, wird eine neue Funktion angewählt (die Variable selection ändert sich), und auch ohne den Taster zu bedienen interferiert die neu angewählte mit der noch laufenden.
-
Frage: Wie kann ich verhindern, dass das Drehen am Potentiometerknopf interferiert? Dann liefe jede Funktion gemäss ihrer Laufzeit zuende, bevor man mit dem Taster eine neue starten kann.
-
Frage: Wie kann ich erreichen, dass man, während eine Funktion läuft ohne Interferenz eine andere Funktion ablaufen lassen kann?
Vielen Dank für ein paar Hinweise!
const byte pinSwitch = 8;
const byte pinsLED[] = {3, 4, 5, 6};
const size_t numLEDs = sizeof pinsLED / sizeof pinsLED[0];
const unsigned long functionIntervals[] = {6900, 4600, 2500, 1000};
byte selection = 0;
byte lastSelection = 0;
byte lastSwitchState = HIGH;
unsigned long timestamp = 0;
bool functionStart = false;
void function0(), function1(), function2(), function3();
void (*functionPointerArray[])() = {function0, function1, function2, function3};
void setup()
{
Serial.begin(9600);
for (int i = 0; i < numLEDs; i++)
{
pinMode(pinsLED[i], OUTPUT);
}
pinMode (pinSwitch, INPUT_PULLUP);
}
void loop()
{
int readingPotentiometer = analogRead(A0);
switch (readingPotentiometer)
{
case 0 ... 255:
selection = 0;
break;
case 256 ... 511:
selection = 1;
break;
case 512 ... 767:
selection = 2;
break;
case 768 ...1023:
selection = 3;
break;
}
setSelectionLED();
checkSwitch();
if ((millis() - timestamp <= functionIntervals[selection]) && functionStart)
{
functionPointerArray[selection]();
}
else
{
functionStart = false;
}
}
void setSelectionLED()
{
if (lastSelection != selection)
{
digitalWrite(pinsLED[selection], HIGH);
digitalWrite(pinsLED[lastSelection], LOW);
lastSelection = selection;
}
}
void checkSwitch()
{
byte switchState = digitalRead (pinSwitch);
if (switchState != lastSwitchState)
{
if (switchState == HIGH)
{
timestamp = millis();
functionStart = true;
}
lastSwitchState = switchState;
}
}
void function0()
{
Serial.println("function0");
}
void function1()
{
Serial.println("function1");
}
void function2()
{
Serial.println("function2");
}
void function3()
{
Serial.println("function3");
}