Les 8

Push button

Benodigdheden

Schakeling

Maak deze schakeling na.

drukknop
Code

static const int buttonPin = 12;                    // drukknop pin
int buttonStatePrevious = LOW;                      // vorige staat van de drukknop

unsigned long minButtonLongPressDuration = 3000;    // Tijd in milliseconden totdat van "lang drukken" kan worden gesproken
unsigned long buttonLongPressMillis;                // tijdstip in ms waarop knop is ingedrukt
bool buttonStateLongPress = false;                  // is knop lang ingedrukt

const int intervalButton = 50;                      // Tijd in milliseconden tussen het uitlezen van de drukknop
unsigned long previousButtonMillis;                 // Tijdstip van laatste uitlezing staat drukknop

unsigned long buttonPressDuration;                  // Tijd dat drukknop is ingedrukt in ms

//// ALGEMEEN ////

unsigned long currentMillis;          // Variabele voor het aantal milliseconden sinds de Arduino is gestart

void setup() {
    Serial.begin(9600);                 // stel de seriƫle monitor in

    pinMode(buttonPin, INPUT);          // stel buttonPin in als invoer
    Serial.println("Druk knop in");

}

// Functie voor het uitlezen van de drukknop
void readButtonState() {

    // Als het tijdsverschil met de vorige uitlezing groter is dan intervalButton
    if(currentMillis - previousButtonMillis > intervalButton) {
    
    // Lees de digitale waarde van de drukknop (LOW/HIGH)
    int buttonState = digitalRead(buttonPin);    

    // Als de knop is ingedrukt EN
    // De knop was eerder nog niet ingedrukt EN 
    // Als er geen meting loopt voor het bepalen of de knop lang is ingedrukt
    if (buttonState == HIGH && buttonStatePrevious == LOW && !buttonStateLongPress) {
        buttonLongPressMillis = currentMillis;
        buttonStatePrevious = HIGH;
        Serial.println("Knop ingedrukt");
    }

    // Bereken hoe lang de knop al is ingedrukt
    buttonPressDuration = currentMillis - buttonLongPressMillis;

    // Als de knop is ingedrukt EN
    // Als er geen meting loopt voor het bepalen of de knop lang is ingedrukt EN
    // Als de tijd dat de knop is ingedrukt groter of gelijk aan de minimale tijd die nodig is voor een lang ingedrukte knop
    if (buttonState == HIGH && !buttonStateLongPress && buttonPressDuration >= minButtonLongPressDuration) {
        buttonStateLongPress = true;
        Serial.println("Knop lang ingedrukt");
    }
        
    // Als de knop wordt losgelaten EN
    // Als de knop eerder was ingedrukt
    if (buttonState == LOW && buttonStatePrevious == HIGH) {
        buttonStatePrevious = LOW;
        buttonStateLongPress = false;
        Serial.println("Knop losgelaten");

        // Als er geen meting loopt voor het bepalen of de knop lang is ingedrukt EN
        // Als de tijd dat de knop is ingedrukt kleiner is dan de minimale tijd die nodig is voor een lang ingedrukte knop
        // Note: In de video staat:
        //       if (!buttonStateLongPress && buttonPressDuration < minButtonLongPressDuration) {
        //       omdat buttonStateLongPress op regel 75 op FALSE wordt gezet, is !buttonStateLongPress altijd TRUE
        //       dit kan dus worden weggehaald.
        if (buttonPressDuration < minButtonLongPressDuration) {
        Serial.println("Knop kort ingedrukt");
        }
    }
    
    // sla het huidige tijdstip op in previousButtonMillis
    previousButtonMillis = currentMillis;

    }

}

void loop() {

    currentMillis = millis();    // sla de huidige tijd op
    readButtonState();           // lees de drukknop uit
    
}