ESP32 koos PIR-liikumisanduriga, kasutades katkestusi ja taimereid – Arduino IDE

Esp32 Koos Pir Liikumisanduriga Kasutades Katkestusi Ja Taimereid Arduino Ide



ESP32 on IoT-põhine mikrokontrolleri plaat, mida saab kasutada erinevate andurite liidestamiseks, juhtimiseks ja lugemiseks. PIR ehk liikumisandur on üks seadmetest, mida saame ESP32-ga liidestada, et tuvastada ESP32 abil liikumisanduri vahemikus olevate objektide liikumist.

Enne ESP32 liidestamist PIR-anduriga peame teadma, kuidas katkestused töötavad ning kuidas neid ESP32-s lugeda ja käsitleda. Järgmisena peame mõistma funktsioonide delay() ja millis() põhikontseptsiooni ESP32 programmeerimises.







Räägime üksikasjalikult PIR-i toimimisest ESP32-ga.



Siin on selle artikli sisu:



  1. Mis on katkestused
  • Taimerid ESP32 programmeerimises
  • Liides PIR andur ESP32-ga

    1: Mis on katkestused

    Enamik ESP32 programmeerimises juhtuvatest sündmustest jooksevad järjestikku, mis tähendab koodi rida-realt täitmist. Sündmuste haldamiseks ja juhtimiseks, mida ei pea koodi järjestikuse täitmise ajal käivitama Katkestab kasutatakse.





    Näiteks kui tahame mingi erilise sündmuse toimumisel sooritada teatud ülesande või kui mikrokontrolleri digitaalsetele kontaktidele antakse trigersignaal, kasutame katkestamist.


    Katkestuse korral ei pea me ESP32 sisendviigu digitaalset olekut pidevalt kontrollima. Katkestuse korral peatab protsessor põhiprogrammi ja kutsutakse välja uus funktsioon, mida tuntakse kui ISR ​​( Katkesta teenuserutiin ). See ISR funktsioon käsitleb pärast seda tekkinud katkestust naaseb põhiprogrammi ja alustab selle täitmist. Üks ISR-i näidetest on PIR liikumisandur mis genereerib katkestuse, kui liikumine on tuvastatud .



    1.1: katkestab ESP32 kontaktid

    Välise või riistvaralise katkestuse võib põhjustada mis tahes riistvaramoodul, näiteks puuteandur või surunupp. Puutekatkestused tekivad siis, kui ESP32 kontaktidel tuvastatakse puudutus või GPIO katkestust saab kasutada ka klahvi või surunupu vajutamisel.

    Selles artiklis käivitame katkestuse, kui liikumine tuvastatakse ESP32-ga PIR-anduri abil.

    Peaaegu kõik GPIO tihvtid, välja arvatud 6 SPI integreeritud tihvti, mis tavaliselt tulevad 36 ESP32 plaadi pin-versiooni ei saa kasutada helistamise katkestamiseks. Niisiis, välise katkestuse vastuvõtmiseks on ESP32-s kasutatavad lilla värviga esile tõstetud kontaktid:

    See pilt on 30 kontaktiga ESP32.

    1.2: ESP32 katkestuse helistamine

    Katkestuse kasutamiseks ESP32-s saame helistada attachInterrupt() funktsiooni.

    See funktsioon aktsepteerib järgmisi kolme argumenti:

      • GPIO pin
      • Täidetav funktsioon
      • Režiim
    manustada Katkestus ( digitalPinToInterrupt ( GPIO ) , funktsiooni , režiim ) ;


    1: GPIO pin on esimene argument, mida nimetatakse sees attachInterrupt() funktsiooni. Näiteks digitaalse viigu 12 kasutamiseks katkestusallikana võime seda nimetada kasutades digitalPinToInterrupt(12) funktsiooni.

    2: Funktsioon käivitatav on programm, mis käivitatakse iga kord, kui katkestuseni jõuab või selle käivitab väline või sisemine allikas. See võib olla LED-tule vilkumine või tulekahjusignalisatsiooni sisselülitamine.

    3: režiim on kolmas ja viimane argument, mida katkestusfunktsioon vajab. See kirjeldab, millal katkestus käivitada. Kasutada saab järgmisi režiime:

      • Madal: Käivitage katkestus iga kord, kui määratletud GPIO viik on madal.
      • Kõrge: Käivitage katkestus iga kord, kui määratletud GPIO viik on kõrge.
      • Muuda: Käivitage katkestus iga kord, kui GPIO viik muudab oma väärtust kõrgest madalaks või vastupidi.
      • Kukkumine: See on režiim, mis käivitab katkestuse, kui teatud kontakt hakkab langema kõrgest olekust madalasse.
      • Tõuseb: See on režiim, mis käivitab katkestuse, kui teatud viik hakkab tõusma madalast olekust kõrgele.

    Täna hakkame kasutama Tõuseb režiim on katkestusfunktsiooni kolmas argument, kui PIR-andur tuvastab katkestuse LED-i või anduri süttib, kuna see läheb madalast olekust kõrgeks.

    2: taimerid ESP32 programmeerimisel

    Taimerid mikrokontrolleri programmeerimisel mängivad olulist rolli käskude täitmisel teatud taimeri perioodi või konkreetse aja jooksul.

    Kaks peamist funktsiooni, mida tavaliselt väljundi käivitamiseks kasutatakse, on viivitus () ja millis() . Nende kahe erinevus funktsioonina delay() peatab ülejäänud programmi, kui see hakkab täitma, samal ajal kui millis() töötab määratud aja jooksul, seejärel naaseb programm põhifunktsioonide juurde.

    Siin kasutame PIR-anduriga LED-i ja me ei taha seda pärast katkestuse käivitamist pidevalt helendama. Me kasutame funktsiooni millis(), mis võimaldab meil seda teatud aja jooksul helendutada ja naaseb seejärel uuesti algse programmi juurde, kui ajatempel on möödas.

    2.1: delay() funktsioon

    Funktsioon delay() on üsna lihtne, see võtab vaid ühe argumendi, mis on Prl allkirjastamata pika andmetüübiga. See argument tähistab aega millisekundites, mille jooksul tahame programmi peatada, kuni see liigub järgmisele reale.

    Näiteks järgmine funktsioon peatab programmi 1 sek .

    viivitus ( 1000 )


    delay() on teatud tüüpi blokeerimisfunktsioon mikrokontrollerite programmeerimiseks. delay() blokeerib ülejäänud koodi täitmiseks seni, kuni see konkreetne funktsioon ei lõpe. Kui tahame täita mitut käsku, peaksime vältima viivitusfunktsioonide kasutamist, selle asemel saame kasutada millis- või välistaimeri RTC-mooduleid.

    2.2: millis() funktsioon

    Funktsioon millis() tagastab millisekundite arvu, mis on möödunud ajast, mil ESP32 plaat käivitas praeguse programmi. Kirjutades mõne koodirea, saame ESP32 koodi käitamise ajal hõlpsalt arvutada praeguse aja igal juhul.

    millis on laialdaselt kasutusel, kui peame täitma mitut ülesannet ilma ülejäänud koodi blokeerimata. Siin on millis-funktsiooni süntaks, mida kasutatakse konkreetse käsu täitmiseks kulunud aja arvutamiseks.

    kui ( praeguneMillis - eelmineMillis > = intervall ) {
    eelmineMillis = praeguneMillis;
    }


    See kood lahutab praegusest millis()-st eelmise millis(), kui lahutatud aeg on võrdne konkreetse käsu täitmise intervalliga. Oletame, et tahame LED-tuli 10 sekundit vilkuda. Iga 5 minuti järel saame määrata ajavahemikuks 5 minutit (300 000 ms). Kood kontrollib intervalli iga kord, kui kood töötab, kui see jõuab, vilgub LED 10 sekundit.

    Märge: Siin kasutame ESP32 liidestamiseks PIR-anduriga funktsiooni millis(). Milli, mitte viivituse kasutamise peamine põhjus on see, et funktsioon millis () ei blokeeri koodi nagu funktsioon delay (). Nii et kui PIR tuvastab liikumise, genereeritakse katkestus. Funktsiooni katkestamine millis() käivitab LED-i määratud aja jooksul, pärast mida, kui liikumine on peatatud, lähtestatakse millis() funktsioon ja oodatakse järgmist katkestust.

    Juhul, kui kasutasime funktsiooni delay(), blokeerib see koodi täielikult ja ESP32 ei loe ühtegi põhjustatud katkestust, mille tulemuseks on projekti ebaõnnestumine.

    3: PIR-anduri liidestamine ESP32-ga

    Siin kasutame Arduino IDE koodis funktsiooni millis (), kuna tahame LED-i käivitada iga kord, kui PIR-andur tuvastab liikumise. See LED põleb määratud aja pärast seda naaseb normaalsesse olekusse.

    Siin on nimekiri komponentidest, mida me vajame:

      • ESP32 arendusplaat
      • PIR liikumisandur (HC-SR501)
      • LED
      • 330 oomi takisti
      • Ühendusjuhtmed
      • Leivalaud

    Skemaatiline ESP32-ga PIR-anduri jaoks:


    PIR-anduriga ESP32 kontaktid on järgmised:

    ESP32 PIR andur
    tule Vcc
    GPIO13 VÄLJAS
    GND GND

    3.1: PIR-i liikumisandur (HC-SR501)

    PIR on akronüüm passiivne infrapunaandur . See kasutab paari püroelektrilisi andureid, mis tuvastavad ümbritseva ümbruse kuumuse. Mõlemad püroelektrilised andurid asuvad üksteise järel ja kui objekt satub nende levialasse, põhjustab soojusenergia muutus või signaalide erinevus mõlema anduri vahel PIR-anduri väljundi MADALSEKS. Kui PIR-väljundi tihvt langeb LOW-le, saame seadistada täitmiseks konkreetse käsu.


    PIR-anduri omadused on järgmised:

      • Tundlikkust saab määrata sõltuvalt projekti asukohast (nt hiire või lehtede liikumise tuvastamine).
      • PIR-andurit saab määrata, kui kaua see objekti tuvastab.
      • Laialdaselt kasutatav koduvalvesignalisatsioonides ja muudes soojuspõhistes liikumise tuvastamise rakendustes.

    3.2: Pinout HC-SR501

    PIR HC-SR501 on varustatud kolme kontaktiga. Kaks neist on Vcc ja GND toiteviigud ning üks on käivitussignaali väljundviik.


    Järgmine on PIR-anduri tihvtide kirjeldus:

    Pin Nimi Kirjeldus
    1 Vcc Anduri sisendviik Ühendage ESP32 Vin Pin-iga
    kaks VÄLJAS Anduri väljund
    3 GND Andur GND

    3.3: Kood

    Nüüd ESP32 programmeerimiseks kirjutage antud kood Arduino IDE redaktorisse ja laadige see ESP32-sse.

    #define timeSeconds 10
    const int led = 4 ; /* GPIO PIN-kood 4 määratletud jaoks LED */
    const int PIR_Out = 13 ; /* GPIO pin 13 jaoks PIR väljas */
    märgita pikk Praegune_aeg = millis ( ) ; /* muutuja määratletud jaoks millisväärtuste salvestamine */
    allkirjastamata pikk Previous_Trig = 0 ;
    tõeväärtus Algusaeg = vale ;
    tühine IRAM_ATTR tuvastab liikumise ( ) { /* Kontrollima jaoks liikumine */
    Serial.println ( 'LIIKUMINE TUVASTATUD' ) ;
    digitalWrite ( led, HIGH ) ; /* Lülitage LED SISSE kui tingimus on tõsi */
    Algusaeg = tõsi ;
    Eelmine_Trig = millis ( ) ;
    }
    tühine seadistus ( ) {
    Serial.begin ( 115 200 ) ; /* edastuskiirus jaoks jadaside */
     pinMode ( PIR_Väljas, INPUT_PULLUP ) ; /* Määratletud PIR liikumisanduri režiim */
    /* PIR on konfigureeritud sisse RISING režiim, seatud liikumisanduri tihvt nagu väljund */
    manustada Katkestus ( digitalPinToInterrupt ( PIR_Out ) , tuvastab Liikumise, TÕUSMINE ) ;
     pinMode ( led, VÄLJUND ) ; /* seatud LED olekusse LOW */
    digitalWrite ( juhitud, LOW ) ;
    }
    tühi silmus ( ) {
    Praegune_aeg = millides ( ) ; /* salvestada voolu aega */
    kui ( Algusaeg && ( Praegune_aeg – eelmine_trig > ( aegSekundid * 1000 ) ) ) { /* Ajavahemik pärast mis LED kustub */
    Serial.println ( 'LIIKUMINE PEATUD' ) ; /* Prindib liikumist peatatud kui liikumist ei tuvastatud */
    digitalWrite ( juhitud, LOW ) ; /* Seadke LED asendile LOW kui tingimus on vale */
    Algusaeg = vale ;
    }
    }


    Kood algas LED- ja PIR-väljundi GPIO-pistikute määratlemisega. Järgmisena lõime kolm erinevat muutujat, mis aitavad liikumise tuvastamisel LED-i sisse lülitada.

    Need kolm muutujat on Praegune_aeg, eelmine_trig, ja Algusaeg. Need muutujad salvestavad praeguse kellaaja, liikumise tuvastamise aja ja taimeri pärast liikumise tuvastamist.

    Esmalt seadistusosas määratlesime side jaoks jadaedastuskiiruse. Järgmine kasutamine pinMode() määrake PIR-liikumisandur olekuks INPUT PULLUP. PIR-i katkestuse seadistamiseks attachInterrupt() on kirjeldatud. GPIO 13 on kirjeldatud liikumise tuvastamiseks režiimis RISING.

    Järgmisena lülitasime koodi loop() osas funktsiooni millis() abil sisse ja välja LED-i, kui päästik on saavutatud.

    3.4: Väljund

    Väljundiosas näeme, et objekt on PIR-anduri levialast väljas, seega LED on pööratud VÄLJAS .


    Nüüd lülitub PIR-anduri LED-i tuvastatud liikumine sisse PEAL jaoks 10 sek pärast seda, kui liikumist ei tuvastata, jääb see alles VÄLJAS kuni järgmise päästikuni.


    Järgmist väljundit näitab Arduino IDE jadamonitor.

    Järeldus

    ESP32-ga PIR-andur võib aidata tuvastada selle ulatust läbivate objektide liikumist. Kasutades ESP32 programmeerimise katkestusfunktsiooni, saame käivitada vastuse mõnel konkreetsel GPIO-viiul. Kui muutus tuvastatakse, käivitub katkestusfunktsioon ja LED lülitub sisse.