Ein Taster unterschiedliche Funktionen????

Hallo Zusammen,

ich verzweifle… (Bin ein Neuling)

Wollte mittels EINES Tasters einen Start/Stopp Button für’s Auto Nutzen. Aber irgendwie bekomme ich die Kurve nicht.

Aufgabe:
-Taster Kurz (<500 ms) betätigt schaltet die Zündung (Klemme 15) EIN oder wieder aus (wenn Sie eingeschaltet war)
-Taster Lang (>500 ms) aktiviert den Anlasser (Klemme 50) wenn die Zündung eingeschaltet war solange der Taster gedrückt wird (zwangsläufig mit 500 ms einschaltverzögerung…)

Habt ihr eine Idee/Sketch für mich???

#include <Bounce2.h>
#define pinT 2
uint32_t aktMillis, altMillis, drueckMillis = 500;
bool status;;
Bounce debouncer = Bounce();
int LED1 = (12);
int LED2 = (13);

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(pinT, INPUT_PULLUP);
  debouncer.attach(pinT);
  debouncer.interval(30);
}

void loop() {
  debouncer.update();
  aktMillis = millis();
  if ( debouncer.fell()  ) {    // Taste gedrückt
    altMillis = aktMillis;
    status = true;
  }
  if ( debouncer.rose()  ) {    // Taste losgelassen
    status = false;
  if ((aktMillis - altMillis < drueckMillis) && (digitalRead (12) == LOW)); {
      Serial.println("AN");
      digitalWrite (LED1, HIGH);
    }
  delay (500);
  if ((aktMillis - altMillis < drueckMillis) && (digitalRead (12) == HIGH)); {
      Serial.println("AUS");
      digitalWrite (LED1, LOW);
    }
  }
  if (status && (aktMillis - altMillis >= drueckMillis)) {
    status = false;
    Serial.println("Lang"); 
    digitalWrite (LED1, HIGH);
  }
}

vielen Dank

Schau Dir mal die Lib OneButton an.

Gruß Tommy

Man kann dazu einen endlichen Automaten (state machine) konstruieren. Dann kann man sicher sein, wenn man das Übergangsdiagramm verfolgt, daß auch immer das richtige passiert.

Das wäre eine rel. einfache Möglichkeit:

#include <MobaTools.h>
#define pinT 2

EggTimer TasterTimer;
bool gedrueckt;
bool zuendung;
bool taster;
int LED1 = (12);
int LED2 = (13);

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(pinT, INPUT_PULLUP);
}

void loop() {
    taster = !digitalRead(pinT);
    
    if ( taster && !gedrueckt ) {
        TasterTimer.setTime(500);   // Zeit aufziehen
        gedrueckt = true;
    }

    if ( gedrueckt && !taster )  {
        // Taste losgelassen
        gedrueckt = false;
        if ( TasterTimer.running() ) { // 500ms noch nicht abgelaufen
            if ( !zuendung ) {
                zuendung = true;
                Serial.println( "Zündung einschalten" );
            } else {
                zuendung = false;
                Serial.println( "Zündung ausschalten" );
            }
        } else if (zuendung) { // 500ms sind abgelaufen, und Zündung ist ein
            Serial.println( "Anlasser starten" );
        }
    }
    delay(20); // zum Entprellen
}

Die MobaTools kannst Du direkt über den Bibliotheksmanager installieren (’ mobatools’ im Suchfeld eingeben )

Edit: Hab’ gerade erst geschnallt, dass Du den Anlasser ja wieder ausschalten willst, wenn der Taster losgelassen wird und bei aktiver Zündung nach 500ms prinzipiell einschalten. Aber das bekommst Du dann bestimmt alleine hin :wink:

Und hier die ‘Kompaktversion’, ohne serielle Ausgaben, nur mit Led für Zündung und Anlasser und einem ‘ordentlichen’ Debounce (ohne delay).
Hat mich jetzt mal gereizt :wink:

#include <MobaTools.h>

EggTimer TasterTimer, Debounce;
bool gedrueckt; // 'true' während der Taster gedrückt ist
bool zuendung;  // Zustand der Zündung
bool taster;    // entprellter Tasterstatus

const byte pinT = 2;
const byte LEDZuendung = 14;
const byte LEDAnlasser = 15;

void setup() {
  pinMode(pinT, INPUT_PULLUP);
  pinMode( LEDZuendung, OUTPUT );
  pinMode( LEDAnlasser, OUTPUT );
}

void loop() {
    if ( !Debounce.running() ) {
        // Taster alle 20ms einlesen ( zum Entprellen )
        Debounce.setTime(20);
        taster = !digitalRead(pinT);
    }
    if ( gedrueckt ) {
        if ( !taster )  {
            // Taste losgelassen
            gedrueckt = false;
            if ( TasterTimer.running() ) { 
                // 500ms noch nicht abgelaufen, kurzes Drücken, Zündung toggeln
                zuendung = !zuendung;
                digitalWrite(LEDZuendung, zuendung);
            }
            // bei losgelassenem Taster, den Anlasser grundsätzlich ausschalten
            digitalWrite(LEDAnlasser, LOW);
        } else if (!TasterTimer.running() && zuendung ) {
            // 500ms sind abgelaufen, Taster it noch gedrückt
            digitalWrite(LEDAnlasser, HIGH);
        }    

    } else if ( taster ) { // Taster wurde gedrückt
        TasterTimer.setTime(500);   // Zeit aufziehen
        gedrueckt = true;
    }
}

Edit: noch eine kleine Optimierung ( eigentlich nur ‘Schönheit’ :wink: )