ESP32 - Knop

De knop is een basisonderdeel en wordt veel gebruikt in diverse ESP32-projecten. Het is niet zo simpel als het lijkt (vanwege mechanische en fysieke eigenschappen). Beginners kunnen hier veel problemen mee ondervinden. Deze tutorial maakt het eenvoudig voor beginners. Laten we beginnen!

※ Notiz:

Voordat we verder gaan met de knop, willen we twee veelvoorkomende fouten benoemen die nieuwelingen vaak tegenkomen:

  1. Het probleem van de "floating input" (zwevende invoer):
    • Symptoom: Bij het aansluiten van een knop op een ESP32 input pin, is de status van de input pin willekeurig en komt niet overeen met de knopstatus (ingedrukt of niet).
    • Oorzaak: Er wordt GEEN pull-down of pull-up weerstand gebruikt op de knop pin.
    • Oplossing: ⇒ Gebruik een pull-down of pull-up weerstand op de input pin. Dit wordt later verder uitgelegd in deze tutorial.
  • Het "chattering"-fenomeen (contactbounce)
    • Symptoom: De code op de ESP32 leest de knopstatus en detecteert het indrukken door statusveranderingen te monitoren (HIGH naar LOW, of LOW naar HIGH). Als de knop slechts éénmaal wordt ingedrukt, detecteert de code meerdere drukken in plaats van één.
    • Oorzaak: Door mechanische en fysieke eigenschappen wordt de input pin meerdere keren snel afgewisseld tussen LOW en HIGH bij één enkele druk.
    • Oplossing: ⇒ Debounce (ontkoppeling). Dit wordt uitgelegd in de ESP32 - Button - Debounce tutorial.

    Het chattering-fenomeen veroorzaakt alleen problemen in bepaalde toepassingen waar het exacte aantal drukken gedetecteerd moet worden. In sommige toepassingen is dit onschadelijk.

    Hardware Benodigdheden

    1×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
    1×USB-kabel Type-C
    1×Breadboard-montage knop met dop
    1×Breadboard-montage knop kit
    1×Paneelmontage drukknop
    1×Drukknopmodule
    1×Breadboard (experimenteerprint)
    1×Jumper wires (verbindingsdraden)
    1×(Optioneel) DC stroomaansluiting
    1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
    1×(Aanbevolen) Breakout Expansion Board for ESP32
    1×(Aanbevolen) Stromsplitter voor ESP32

    Of u kunt de volgende kits kopen:

    1×DIYables Sensorkit (30 sensoren/displays)
    1×DIYables Sensorkit (18 sensoren/displays)
    Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

    Over de Knop

    De drukknop, ook wel pushbutton, tactile button of momentary switch genoemd, is een schakelaar die sluit zolang deze wordt ingedrukt en opent wanneer deze wordt losgelaten. Er zijn verschillende typen drukknoppen die grofweg in twee groepen worden ingedeeld:

    • PCB-montage drukknoppen (geschikt voor breadboard-montage)
    • Paneelmontage drukknoppen
    ESP32 Push button

    Knop Pinout

    Een PCB-montage knop heeft gewoonlijk vier pins die intern in paren zijn verbonden.

    Button Pinout

    We hoeven slechts twee van de vier pins te gebruiken, die NIET in hetzelfde interne paar verbonden zijn. Er zijn dus vier mogelijke bedradingmethodes met de knop (zie afbeelding hieronder)

    How To Use Button

    Door de symmetrie worden deze vier methodes eigenlijk twee werkbare manieren. Voor de rest van deze tutorial gebruiken we twee pinnen: Pin A en Pin B die niet met elkaar verbonden zijn.

    Waarom heeft een knop vier pinnen terwijl we er maar twee nodig hebben?

    ⇒ De knop ontvangt druk van de gebruiker. Om de knop stevig en stabiel op de PCB te bevestigen, zijn er vier pinnen die de druk opvangen.

    Een paneelmontage knop heeft meestal twee pinnen.

    two-pin push button Pinout
    image source: diyables.io

    De drukknopmodule bevat een ingebouwde pull-down weerstand die ervoor zorgt dat de output LOW blijft wanneer de knop niet is ingedrukt. De module heeft drie pinnen:

    • GND: Sluit deze pin aan op de aarde (ground).
    • VCC: Sluit deze pin aan op een 3.3V voeding.
    • OUT: Sluit deze pin aan op een digitale input van de ESP32.

    Met deze configuratie geeft de module LOW uit wanneer de knop los is en HIGH wanneer de knop is ingedrukt.

    Hoe de Knop Werkt

    • Als de knop wordt ingedrukt, is pin A verbonden met pin B.
    • Als de knop NIET is ingedrukt, zijn pin A en pin B niet verbonden.
    How Button Works

    ESP32 - Knop

    Een pin van de knop wordt aangesloten op een digitale inputpin van de ESP32. De andere pin wordt aangesloten op VCC of GND. Door de status van de inputpin te lezen, kan de code afleiden of de knop is ingedrukt of niet.

    Inputstatus en Indrukstatus

    De relatie tussen de inputpinstatus en het indrukken van de knop hangt af van hoe de knop op de ESP32 is aangesloten en hoe de ESP32 pin is ingesteld. Er zijn twee manieren om een knop met de ESP32 te gebruiken:

    1. Eén knop pin is verbonden met een digitale input van de ESP32, de andere pin is verbonden met VCC:
      • Er MOET een pull-down weerstand worden gebruikt.
      • Als de knop wordt ingedrukt, is de ESP32 pin status HIGH. Anders is de status LOW.
  • Eén knop pin is verbonden met een digitale input van de ESP32, de andere pin is verbonden met GND:
    • Er MOET een pull-up weerstand worden gebruikt.
    • Als de knop wordt ingedrukt, is de ESP32 pin status LOW. Anders is de status HIGH.

    ※ Notiz:

    Als geen pull-down of pull-up weerstand wordt gebruikt, is de input pin status willekeurig HIGH of LOW (onstabiel, niet vast) wanneer de knop niet is ingedrukt. Dit wordt het “floating input probleem” genoemd en veroorzaakt storingen.

    Om het eenvoudig te houden voor beginners, beveelt deze tutorial sterk aan een interne pull-up weerstand van de ESP32 pin te gebruiken. Er is dan geen externe weerstand nodig. Dit bespaart hardware en vereenvoudigt het bedradingdiagram.

    Bedradingsdiagram tussen Knop en ESP32

    • Bedradingsdiagram tussen ESP32 en PCB-montage knop
    ESP32 Button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    • Bedradingsdiagram tussen ESP32 en paneelmontage knop
    ESP32 two-pin push button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    Hoe Programmeer je een Knop

    • Initialiseert de ESP32 pin als een interne pull-up input met behulp van de functie pinMode(). Bijvoorbeeld pin GPIO21:
    pinMode(21, INPUT_PULLUP); // configureer GPIO21 als input en activeer de interne pull-up weerstand
    • Leest de status van de input pin met behulp van de functie digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Notiz:

    Er zijn twee veelgebruikte scenario's:

    • Het eerste scenario: Als de input HIGH is, doe iets. Als de input LOW is, doe iets anders.
    • Het tweede scenario: Als de input van LOW naar HIGH verandert, doe iets. Als de input van HIGH naar LOW verandert, doe iets anders.

    Afhankelijk van de toepassing wordt één van deze scenario's gebruikt. Bijvoorbeeld voor het aansturen van een LED met een knop:

    • Als u de LED AAN wilt zetten wanneer de knop wordt ingedrukt en UIT wilt zetten wanneer de knop niet is ingedrukt, gebruikt u het eerste scenario.
    • Als u de LED wilt aan- of uitzetten telkens wanneer de knop wordt ingedrukt (toggle), gebruikt u het tweede scenario.

    Onderstaand voorbeeld laat zien hoe u een statusverandering van LOW naar HIGH detecteert:

    #define BUTTON_PIN 21 // GPIO21 pin verbonden met de knop // Variabelen die veranderen: int lastState = HIGH; // vorige toestand van de input pin int currentState; // huidige waarde van de input pin void setup() { Serial.begin(9600); // initialiseert de knop pin als pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // lees de status van de knop: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("De status veranderde van LOW naar HIGH"); // sla de vorige status op lastState = currentState; }

    ESP32 Code

    Snelle Stappen

    • Als u voor het eerst ESP32 gebruikt, bekijk dan hoe u de omgeving voor ESP32 instelt in Arduino IDE.
    • Maak de bedrading zoals op bovenstaande afbeelding.
    • Verbind de ESP32 met uw pc via een micro USB-kabel.
    • Open Arduino IDE op uw pc.
    • Selecteer het juiste ESP32 board (bijv. ESP32 Dev Module) en de COM-poort.
    • Kopieer onderstaande code en plak deze in Arduino IDE.
    #define BUTTON_PIN 21 // GIOP21 pin connected to button void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Compileer en upload de code naar het ESP32 board door op de knop Upload te klikken in Arduino IDE.
    How to upload ESP32 code on Arduino IDE
    • Open de Seriële Monitor in Arduino IDE.
    How to open serial monitor on Arduino IDE
    • Druk de knop meerdere keren in en laat los.
    • Bekijk het resultaat in de Seriële Monitor. Het ziet er ongeveer zo uit:
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1 staat voor HIGH, 0 voor LOW.

    Regels-voor-regels Code-uitleg

    De bovenstaande ESP32 code bevat regelcommentaar. Lees de opmerkingen in de code voor uitleg!

    ESP32 Code Aanpassen

    Laten we de code aanpassen om druk- en loslaatgebeurtenissen te detecteren.

    Snelle Stappen

    /* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-button */ #define BUTTON_PIN 21 // GIOP21 pin connected to button // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if (lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Compileer en upload de code naar het ESP32 board door op de knop Upload te klikken in Arduino IDE.
    Arduino IDE Upload Code
    • Open de Seriële Monitor in Arduino IDE.
    How to open serial monitor on Arduino IDE
    • Druk de knop in en laat vervolgens los.
    • Bekijk het resultaat in de Seriële Monitor, het zal ongeveer zo zijn:
    COM6
    Send
    De knop is ingedrukt De knop is losgelaten
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Notiz:

    • De Seriële Monitor kan meerdere “ingedrukt” en “losgelaten” berichten weergeven, ook al hebt u de knop maar één keer ingedrukt en weer losgelaten. Dit is normaal gedrag van de knop en wordt het “chattering”-fenomeen genoemd. In sommige toepassingen is het nodig dit te elimineren. Meer informatie vindt u in de tutorial ESP32 - Button Debounce.
    • Voor een eenvoudige aanpak, vooral bij meerdere knoppen, hebben we een bibliotheek genaamd ezButton gemaakt. U kunt hier meer over ezButton lezen.
    • Voor de knopmodule gebruikt u pinMode(BUTTON_PIN, INPUT). Deze geeft LOW wanneer niet ingedrukt en HIGH wanneer ingedrukt.

    Video Tutorial

    We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

    Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en praktische tips.

    Aanvullende Kennis

    Wanneer moet u wel en niet een pull-down/pull-up weerstand gebruiken?
    • MOET: Als een sensor twee toestanden heeft: gesloten en open, heeft deze een pull-up of pull-down weerstand nodig om deze toestanden als LOW en HIGH te krijgen. Bijvoorbeeld, drukknoppen, schakelaars, magneetcontact (deursensor)...
    • MOET NIET: Als een sensor twee spanningsniveaus (LOW en HIGH) rechtstreeks uitvoert, is geen pull-up of pull-down weerstand nodig. Bijvoorbeeld, bewegingssensor, touch sensor...

    Taalverwijzingen

    ※ ONZE BERICHTEN

    • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!