Inhoudsopgave:

ESP32 Capacitieve aanraakinvoer met behulp van "Metallic Hole Plugs" voor knoppen - Ajarnpa
ESP32 Capacitieve aanraakinvoer met behulp van "Metallic Hole Plugs" voor knoppen - Ajarnpa

Video: ESP32 Capacitieve aanraakinvoer met behulp van "Metallic Hole Plugs" voor knoppen - Ajarnpa

Video: ESP32 Capacitieve aanraakinvoer met behulp van
Video: ESP32 Capacitive Touch Sensor Pins with Arduino IDE 2024, Juli-
Anonim
Image
Image
Hardware
Hardware

Toen ik de laatste hand legde aan ontwerpbeslissingen voor een aankomend project op basis van ESP32 WiFi Kit 32 waarvoor invoer met drie knoppen nodig was, was een opvallend probleem dat de WiFi Kit 32 geen enkele mechanische drukknop heeft, maar alleen drie mechanische knoppen voor invoer. De WiFi Kit 32 heeft echter voldoende capacitieve aanraakinvoer, dus ik heb wat tijd besteed aan het monteren van hardware, het schrijven van software en het testen van een invoerontwerp met drie knoppen met behulp van de ESP32 capacitieve aanraakinvoerfunctie en drie 3/8" "metalen gatpluggen" voor toetsen.

Zoals iedereen die heeft geëxperimenteerd met de ESP32 capacitieve aanraakingangen heeft ontdekt, zijn de aanraakingangen zeker luidruchtig genoeg om filtering te vereisen voor betrouwbare invoerdetectie. Om het totale aantal onderdelen voor het komende project tot een minimum te beperken, heb ik vastgesteld dat een eenvoudig, door onderbrekingen aangedreven digitaal filter (meer een "debounce" dan een filter, maar ik dwaal af), in tegenstelling tot het toevoegen van externe filterhardware, de luidruchtige ingangen zou kunnen dempen. En na het testen werd het duidelijk dat de capacitieve ESP32-ingangen, drie 3/8" metalen pluggen en wat digitale "filter"-software inderdaad een betrouwbare ingang met drie knoppen voor het ontwerp zouden bieden.

Dus als u geïnteresseerd bent in het testen van capacitieve invoer met digitale filtering op een ESP32, heb ik de broncode "Buttons.ino" in het Arduino-omgevingsformaat opgenomen, samen met montage- en programmeerinstructies, plus een korte beschrijving van de broncode, voor wat ik ontdekte als een zeer betrouwbare invoer met drie knoppen.

En zoals gewoonlijk ben ik waarschijnlijk een bestand of twee vergeten of wie weet wat nog meer, dus als je vragen hebt, aarzel dan niet om ze te stellen, want ik maak veel fouten.

En een laatste opmerking, ik ontvang geen enkele vergoeding, inclusief maar niet beperkt tot gratis monsters, voor een van de componenten die in dit ontwerp worden gebruikt

Stap 1: hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Het ontwerp maakt gebruik van de volgende hardware:

  • Eén, WiFi-kit 32.
  • Drie, 3/8" metalen pluggen.
  • Drie, 4 "lengtes van 28awg draad.

Om de hardware te monteren, heb ik de volgende stappen uitgevoerd:

  • Gestript en vertind de uiteinden van elke 4 "draadlengte zoals afgebeeld.
  • Soldeerde de eerste draad aan pin 13 van de ESP32 (de TOUCH4, of "T4", ingang).
  • Soldeerde de tweede draad aan pin 12 van de ESP32 (de TOUCH5, of "T5", ingang).
  • Soldeerde de derde draad aan pin 14 van de ESP32 (de TOUCH6 of "T6" ingang).
  • Soldeerde een van elk van de drie 3/8 "metalen gatpluggen aan de vrije uiteinden van de drie draadlengtes.

Stap 2: Software

Software
Software

Het bestand "Buttons.ino" is een Arduino-omgevingsbestand dat de software voor het ontwerp bevat. Naast dit bestand hebt u de grafische bibliotheek "U8g2lib" nodig voor het WiFi Kit32 OLED-scherm (zie https://github.com/olikraus/u8g2/wiki voor meer informatie over deze bibliotheek).

Met de U8g2lib grafische bibliotheek geïnstalleerd in uw Arduino-directory en "Buttons.ino" geladen in de Arduino-omgeving, compileer en download de software in de ESP32.

Eenmaal gedownload en actief, moet de bovenste regel van het scherm "Knoppen" weergeven en de tweede regel van het scherm "1 2 3" als de knopindicatoren. Onder elk van de 1, 2, 3 knopindicatoren staan de ongefilterde aanraakleeswaarden, en onder elk van deze staan de knopdrukindicatoren ("1" voor ingedrukt, "0" voor niet ingedrukt). Zoals te zien is in de video (en zoals langdurig getest is bevestigd), biedt het softwarefilter betrouwbare knopinvoerdetectie zonder valse triggering.

Stap 3: Over de software

De software bevat drie hoofdcodesecties; de Arduino vereiste secties "setup()" en "loop()", en een sectie "Interrupts". De sectie setup() bevat de code die nodig is om OLED te initialiseren en services te onderbreken. De OLED-setupfuncties worden beschreven in de bovenstaande link. De setup-functies van de interruptservice zijn als volgt:

  • "timerLoopSemaphore = xSemaphoreCreateBinary()" creëert een semafoor voor "InterruptService()" (de interruptserviceroutine) om loop() te informeren wanneer het tijd is om een looppass uit te voeren.
  • "timerInterruptService = timerBegin(0, 80, true)" maakt een timer met hardwaretimer 0 met een voorschaal van 80.
  • "timerAttachInterrupt(timerInterruptService, & InterruptService, true)" voegt InterruptService() toe aan de timer.
  • "timerAlarmWrite(timerInterruptService, 1000, true)" stelt de onderbrekingsservicesnelheid in op 1000hz.
  • "timerAlarmEnable(timerInterruptService)" start het timeralarm en onderbreekt dus de service.

Als de installatie is voltooid, wordt loop() ingevoerd en stopt deze onmiddellijk bij de regel:

if(xSemaphoreTake(timerLoopSemaphore, portMAX_DELAY) == pdTRUE), wat betekent dat loop() op dit punt zal wachten tot de semafoor van InterruptService() arriveert. Wanneer de semafoor arriveert, wordt de loop()-code uitgevoerd, waarbij het OLED-scherm wordt bijgewerkt met de knopgegevens en vervolgens terugkeert naar de top om opnieuw te wachten op de volgende semafoor. Met InterruptService() op 1000 Hz en een LOOP_DELAY-waarde van 30, wordt loop() elke 30 ms uitgevoerd, of met een weergave-updatesnelheid van 33,333 hz. Hoewel dit een hogere verversingsfrequentie is dan vereist voor de meeste ESP32-toepassingen, heb ik deze instelling gebruikt om de reactiesnelheid van het filter te illustreren. Ik heb getest en vastgesteld dat de tijd die nodig is om een enkele lus()-passage uit te voeren, 20 ms is.

InterruptService() wordt aangeroepen door de timer die is gemaakt in setup() met een snelheid van 1000 Hz. Wanneer aangeroepen, werkt het twee down-tellers bij, nLoopDelay en nButtonDelay. Wanneer nLoopDelay wordt afgeteld tot nul, stuurt het de semafoor waardoor lus() een enkele doorgang kan uitvoeren en stelt vervolgens nLoopDelay opnieuw in. Wanneer nButtonDelay wordt afgeteld tot nul, wordt deze ook gereset en worden de knop "filters" uitgevoerd.

Elke knopfilter heeft een unieke filterteller (bijv. nButton1Count, nButton2Count en nButton3Count). Zolang de aan de knop toegewezen aanraakinvoerwaarde groter is dan of gelijk is aan de gedefinieerde drempelwaarde (BUTTON_THRESHHOLD), blijft de filterteller die aan de knop en de knop is toegewezen nul. Als de aan de knop toegewezen aanraakinvoerwaarde lager is dan de gedefinieerde drempel, wordt de filterteller die aan de knop is toegewezen elke 20 ms met één verhoogd. Wanneer de filterteller de knopfilterwaarde (BUTTON_FILTER) overschrijdt, wordt de knop als "ingedrukt" beschouwd. Het effect van deze methode is dat er een filter wordt gemaakt dat 80 ms (20 ms nButtonDelay * 4 ms nButtonCountN waarbij N het knopnummer is) continue aanraakinvoerwaarden onder de gedefinieerde drempel vereist om de daadwerkelijk ingedrukte knop te beschouwen. Elke keer dat minder dan 80 ms wordt beschouwd als een "glitch" en wordt afgewezen door het filter.

Gezien deze korte beschrijving, als je vragen hebt, stel ze dan gerust en ik zal mijn best doen om ze te beantwoorden.

Ik hoop dat je ervan genoten hebt!

Stap 4: Het "aanstaande project"

De
De

Het aanstaande project, "Intelligrill® Pro", is een rookmonitor met dubbele temperatuursonde, met:

  • Steinhart-Hart temperatuursondeberekeningen (in tegenstelling tot "opzoektabellen") voor verhoogde nauwkeurigheid.
  • Voorspellende tijd tot voltooiing op sonde 1 met de verhoogde nauwkeurigheid die is afgeleid van de Steinhart-Hart-berekeningen.
  • Een tweede sonde, sonde 2, voor het bewaken van de rokertemperatuur (beperkt tot 32 tot 399 graden).
  • Capacitieve aanraakinvoerbedieningen (zoals in deze Instructable).
  • Op wifi gebaseerde bewaking op afstand (met een vast IP-adres, maakt het mogelijk om de voortgang van de roker overal te volgen waar een internetverbinding beschikbaar is).
  • Uitgebreid temperatuurbereik (opnieuw 32 tot 399 graden).
  • Hoorbare voltooiingsalarmen zowel binnen de Intelligrill®-zender als op de meeste WiFi-compatibele bewakingsapparaten.
  • Temperatuurweergave in graden F of graden C.
  • Tijdnotatie in ofwel UU:MM:SS of UU:MM.
  • Batterijweergave in volt of % opgeladen.
  • En binnenkort, PID-output voor rokers op basis van vijzel.

"Intelligrill® Pro" wordt getest om de meest nauwkeurige, veelzijdige en betrouwbare op HTML gebaseerde Intelligrill® te worden die ik heb ontworpen.

Het wordt nog getest, maar met de maaltijden die het helpt te bereiden tijdens het testen, ben ik meer dan een paar kilo aangekomen.

Nogmaals, ik hoop dat je ervan geniet!

Stap 5: Volgende: ESP32 NTP-temperatuursonde analoge ingang met Steinhart-Hart-correctie

Wees voorbereid om je algebraboeken voor deze af te stoffen.

Aanbevolen: