ESP32 su PIR judesio jutikliu naudojant pertraukimus ir laikmačius – Arduino IDE

Esp32 Su Pir Judesio Jutikliu Naudojant Pertraukimus Ir Laikmacius Arduino Ide



ESP32 yra IoT pagrįsta mikrovaldiklio plokštė, kurią galima naudoti įvairiems jutikliams susieti, valdyti ir nuskaityti. PIR arba judesio jutiklis yra vienas iš įrenginių, kuriuos galime susieti su ESP32, kad aptiktų objekto judėjimą judesio jutiklio diapazone naudojant ESP32.

Prieš pradėdami ESP32 sąsają su PIR jutikliu, turime žinoti, kaip veikia pertraukimai ir kaip juos nuskaityti bei tvarkyti ESP32. Toliau turime suprasti pagrindinę uždelsimo () ir millis () funkcijų koncepciją ESP32 programavime.







Išsamiai aptarkime PIR veikimą su ESP32.



Štai šio straipsnio turinys:



  1. Kas yra pertraukimai
  • ESP32 programavimo laikmačiai
  • Sąsaja PIR jutiklis su ESP32

    1: Kas yra pertraukimai

    Dauguma ESP32 programavimo įvykių vyksta nuosekliai, o tai reiškia, kad kodas vykdomas eilute po eilutės. Norėdami tvarkyti ir valdyti įvykius, kurių nereikia vykdyti nuosekliai vykdant kodą Pertraukia yra naudojami.





    Pavyzdžiui, jei norime atlikti tam tikrą užduotį, kai įvyksta koks nors ypatingas įvykis, arba įjungimo signalas yra duodamas skaitmeniniams mikrovaldiklio kontaktams, mes naudojame pertraukimą.


    Su pertraukimu mums nereikia nuolat tikrinti ESP32 įvesties kaiščio skaitmeninės būsenos. Kai įvyksta pertraukimas, procesorius sustabdo pagrindinę programą ir iškviečiama nauja funkcija, kuri žinoma kaip ISR ( Nutraukite aptarnavimo rutiną ). Tai ISR funkcija apdoroja po to sukeltą pertraukimą grįžti į pagrindinę programą ir pradėti ją vykdyti. Vienas iš ISR pavyzdžių yra PIR judesio jutiklis kurios generuoja pertraukimą, kai aptinkamas judesys .



    1.1: pertraukia ESP32 kaiščius

    Išorinį arba aparatinės įrangos pertrūkį gali sukelti bet kuris aparatūros modulis, pvz., jutiklinis jutiklis arba mygtukas. Prisilietimo pertraukimai įvyksta, kai aptinkamas prisilietimas prie ESP32 kaiščių arba GPIO pertraukimas taip pat gali būti naudojamas, kai paspaudžiamas klavišas arba mygtukas.

    Šiame straipsnyje mes suaktyvinsime pertraukimą, kai judesys aptinkamas naudojant PIR jutiklį su ESP32.

    Beveik visi GPIO kaiščiai, išskyrus 6 integruotus SPI kaiščius, kurie paprastai būna 36 ESP32 plokštės PIN versija negali būti naudojama skambučiams nutraukti. Taigi, norėdami gauti išorinį pertraukimą, ESP32 galite naudoti šiuos kaiščius, paryškintus purpurine spalva:

    Šis vaizdas yra 30 kontaktų ESP32.

    1.2: ESP32 pertraukimo iškvietimas

    Norėdami naudoti pertraukimą ESP32, galime skambinti attachInterrupt() funkcija.

    Ši funkcija priima šiuos tris argumentus:

      • GPIO kaištis
      • Funkcija, kurią reikia atlikti
      • Režimas
    attachInterrupt ( digitalPinToInterrupt ( GPIO ) , funkcija , režimas ) ;


    1: GPIO pin yra pirmasis argumentas, vadinamas viduje attachInterrupt() funkcija. Pavyzdžiui, norėdami naudoti skaitmeninį kaištį 12 kaip pertraukimo šaltinį, galime jį vadinti naudodami digitalPinToInterrupt (12) funkcija.

    2: Funkcija Vykdytina yra programa, vykdoma kiekvieną kartą, kai pertraukimą pasiekia arba suaktyvina išorinis ar vidinis šaltinis. Tai gali mirksėti šviesos diodas arba įjungti gaisro signalizaciją.

    3: režimas yra trečiasis ir paskutinis argumentas, kurio reikia pertraukimo funkcijai. Jame aprašoma, kada suaktyvinti pertraukimą. Galima naudoti šiuos režimus:

      • Žemas: Suaktyvinkite pertraukimą kiekvieną kartą, kai nustatytas GPIO kaištis yra žemas.
      • Aukštas: Suaktyvinkite pertraukimą kiekvieną kartą, kai nustatytas GPIO kaištis yra aukštas.
      • Keisti: Suaktyvinkite pertraukimą kiekvieną kartą, kai GPIO kaištis pakeičia savo vertę iš didelės į žemą arba atvirkščiai.
      • Kritimas: Tai režimas, įjungiantis pertraukimą, kai tam tikras kaištis pradeda kristi iš aukštos būsenos į žemą.
      • Kyla: Tai režimas, suaktyvinantis pertraukimą, kai tam tikras kaištis pradeda kilti iš žemos būsenos į aukštą.

    Šiandien mes naudosime Kylantis režimas kaip trečiasis pertraukimo funkcijos argumentas, kai PIR jutiklis aptinka pertraukimo šviesos diodą arba jutiklis užsidegs, nes iš žemos būsenos pereina į aukštą.

    2: ESP32 programavimo laikmačiai

    Laikmačiai programuojant mikrovaldiklius atlieka svarbų vaidmenį vykdant instrukcijas tam tikram laikmačio laikotarpiui arba tam tikru laiku.

    Dvi pagrindinės funkcijos, dažniausiai naudojamos išėjimui paleisti, yra uždelsimas() ir milis () . Skirtumas tarp jų, nes funkcija delay() sustabdo likusią programos dalį, kai tik ji pradeda vykdyti, o milis() veikia tam tikrą laikotarpį, tada programa grįžta į pagrindines funkcijas.

    Čia mes naudosime šviesos diodą su PIR jutikliu ir nenorime, kad jis nuolat švytėtų po pertraukos. Mes naudosime funkciją millis (), kuri leidžia mums tam tikrą nustatytą laiką švytėti, o po to vėl grįžtama prie pradinės programos, kai praeina laiko žyma.

    2.1: uždelsimo () funkcija

    delay() funkcija yra gana paprasta, jai reikia tik vieno argumento, kuris yra ms nepasirašyto ilgo duomenų tipo. Šis argumentas parodo laiką milisekundėmis, per kurį norime pristabdyti programą, kol ji pereis į kitą eilutę.

    Pavyzdžiui, ši funkcija sustabdys programą 1 sekundė .

    uždelsimas ( 1000 )


    delay () yra tam tikra mikrovaldiklių programavimo blokavimo funkcija. delay () blokuoja likusią kodo dalį, kad ji būtų vykdoma tol, kol šios konkrečios funkcijos laikas nebus baigtas. Jei norime vykdyti kelias instrukcijas, turėtume vengti naudoti delsos funkcijas, o ne naudoti milis arba išorinius RTC laikmačio modulius.

    2.2: misis() Funkcija

    Funkcija millis() grąžina milisekundžių skaičių, praėjusį nuo to laiko, kai ESP32 plokštė pradėjo vykdyti dabartinę programą. Rašydami kelias kodo eilutes galime lengvai apskaičiuoti esamą laiką bet kuriuo atveju, kai paleisime ESP32 kodą.

    millis yra plačiai naudojamas ten, kur turime vykdyti kelias užduotis neužblokuojant likusio kodo. Čia yra funkcijos millis sintaksė, naudojama apskaičiuojant, kiek laiko praėjo, kad galėtume vykdyti konkrečią komandą.

    jeigu ( dabartinisMillis - ankstesnisMillis > = intervalas ) {
    previousMillis = dabartinisMillis;
    }


    Šis kodas atima ankstesnį milis() iš dabartinio milis(), jei atimtas laikas yra lygus intervalui, kuriam bus vykdoma konkreti instrukcija, apibrėžti. Tarkime, kad norime mirksėti šviesos diodu 10 sekundžių. Kas 5 minutes galime nustatyti laiko intervalą, lygų 5 minutėms (300000ms). Kodas tikrins intervalą kiekvieną kartą, kai kodas bus paleistas, o pasiekęs LED mirksės 10 sekundžių.

    Pastaba: Čia mes naudosime funkciją millis () ESP32 sąsajai su PIR jutikliu. Pagrindinė priežastis, kodėl naudojama mili, o ne delsa, yra ta, kad funkcija millis() neblokuoja kodo, kaip tai darė funkcija delay(). Taigi, kai PIR aptinka judesį, bus sugeneruotas pertraukimas. Naudojant pertraukimo funkciją millis() įjungs šviesos diodą tam tikrą laiką, po kurio, jei judėjimas bus sustabdytas, mils() funkcija bus nustatyta iš naujo ir lauks kito pertraukimo.

    Jei naudojome funkciją delay (), tai visiškai užblokuos kodą ir ESP32 neperskaitys jokių sukeltų pertraukų, dėl kurių projektas suges.

    3: PIR jutiklio sąsaja su ESP32

    Čia mes naudosime funkciją millis () Arduino IDE kode, nes norime suaktyvinti LED kiekvieną kartą, kai PIR jutiklis aptinka tam tikrą judėjimą. Šis šviesos diodas užsidegs tam tikrą laiką, po to grįš į normalią būseną.

    Čia yra komponentų, kurių mums reikės, sąrašas:

      • ESP32 kūrimo plokštė
      • PIR judesio jutiklis (HC-SR501)
      • LED
      • 330 omų rezistorius
      • Jungiamieji laidai
      • Bandomoji Lenta

    Schema PIR jutikliui su ESP32:


    ESP32 su PIR jutikliu kaiščių jungtys yra:

    ESP32 PIR jutiklis
    ateiti Vcc
    GPIO13 OUT
    GND GND

    3.1: PIR judesio jutiklis (HC-SR501)

    PIR yra akronimas pasyvus infraraudonųjų spindulių jutiklis . Jis naudoja porą piroelektrinių jutiklių, kurie aptinka šilumą aplink jį. Abu šie piroelektriniai jutikliai yra vienas po kito, o kai objektas patenka į jų diapazoną, pasikeitus šilumos energijai arba signalų skirtumui tarp abiejų šių jutiklių, PIR jutiklio išvestis yra MAŽA. Kai PIR išvesties kaištis tampa LOW, galime nustatyti konkrečią vykdymo instrukciją.


    Toliau pateikiamos PIR jutiklio charakteristikos:

      • Jautrumą galima nustatyti atsižvelgiant į projekto vietą (pvz., pelės ar lapų judėjimo jutimą).
      • PIR jutiklis gali būti nustatytas, kiek laiko jis aptiks objektą.
      • Plačiai naudojamas namų apsaugos signalizacijose ir kitose šiluminio judėjimo aptikimo programose.

    3.2: Smeigtukas HC-SR501

    PIR HC-SR501 yra su trimis kaiščiais. Du iš jų yra Vcc ir GND maitinimo kaiščiai, o vienas yra suveikimo signalo išvesties kaištis.


    Toliau pateikiamas PIR jutiklio kaiščių aprašymas:

    Smeigtukas vardas apibūdinimas
    1 Vcc Jutiklio įvesties kaištis Prijunkite prie ESP32 Vin kaiščio
    du OUT Jutiklio išvestis
    3 GND Jutiklis GND

    3.3: Kodas

    Dabar, norėdami užprogramuoti ESP32, parašykite nurodytą kodą Arduino IDE redaktoriuje ir įkelkite jį į ESP32.

    #define timeSeconds 10
    const int led = 4 ; /* GPIO PIN kodas 4 apibrėžta dėl LED */
    const int PIR_Out = 13 ; /* GPIO kaištis 13 dėl PIR išeina */
    nepasirašytas ilgas Dabartinis_laikas = mili ( ) ; /* apibrėžtas kintamasis dėl saugoti mili reikšmes */
    nepasirašytas ilgas Ankstesnis_Trig = 0 ;
    loginis pradžios_laikas = klaidinga ;
    negalioja IRAM_ATTR aptinka judesį ( ) { /* patikrinti dėl judesį */
    Serial.println ( „JUDESIS NUSTATYTAS“ ) ;
    skaitmeninis rašymas ( led, AUKŠTAS ) ; /* Įjunkite LED jeigu sąlyga yra tiesa */
    Starting_Time = tiesa ;
    Ankstesnis_Trig = mil ( ) ;
    }
    tuščias nustatymas ( ) {
    Serialas.begin ( 115 200 ) ; /* sparta dėl serijinis ryšys */
     pinMode ( PIR_Out, INPUT_PULLUP ) ; /* Nustatytas PIR judesio jutiklio režimas */
    /* PIR sukonfigūruotas in KELIMO režimas, rinkinys judesio jutiklio kaištis kaip išvestis */
    attachInterrupt ( digitalPinToInterrupt ( PIR_Out ) , aptinka judesį, KĖLIMAS ) ;
     pinMode ( led, IŠVESTIS ) ; /* rinkinys LED iki LOW */
    skaitmeninis rašymas ( veda, LOW ) ;
    }
    tuščia kilpa ( ) {
    Dabartinis_laikas = mili ( ) ; /* saugoti srovę laikas */
    jeigu ( Starting_Time && ( Dabartinis_laikas – Ankstesnis_Trig > ( laikasSekundės * 1000 ) ) ) { /* Laiko intervalas po kurios LED išsijungs */
    Serial.println ( „JUDĖJIMAS SUSTABDYTA“ ) ; /* Spausdinamas judesys sustabdytas jeigu judesio neaptikta */
    skaitmeninis rašymas ( veda, LOW ) ; /* Nustatykite šviesos diodą į LOW jeigu sąlyga yra klaidinga */
    Pradžios_laikas = klaidinga ;
    }
    }


    Kodas prasidėjo apibrėžiant GPIO kaiščius LED ir PIR išėjimui. Tada sukūrėme tris skirtingus kintamuosius, kurie padės įjungti šviesos diodą, kai aptinkamas judesys.

    Šie trys kintamieji yra Dabartinis_laikas, Ankstesnis_Trig, ir Starting_Time. Šie kintamieji išsaugos dabartinį laiką, laiką, kada aptiktas judesys, ir laikmatį po judesio aptikimo.

    Pirmiausia sąrankos dalyje apibrėžėme ryšio nuoseklųjį perdavimo spartą. Kitas naudojimas pinMode () nustatykite PIR judesio jutiklį kaip INPUT PULLUP. Norėdami nustatyti PIR pertraukimą attachInterrupt() yra aprašyta. GPIO 13 aprašytas, kad aptiktų judėjimą KĖLIMO režimu.

    Toliau ciklo () kodo dalyje, naudodami funkciją millis () įjungėme ir išjungėme šviesos diodą, kai pasiekiamas trigeris.

    3.4: Išvestis

    Išvesties skyriuje matome, kad objektas yra už PIR jutiklio diapazono, todėl LED yra pasuktas IŠJUNGTA .


    Dabar PIR jutiklio šviesos diodas aptiktas judesys pasisuks ĮJUNGTA dėl 10 sek po to, jei judesio neaptiks, jis išliks IŠJUNGTA kol bus gautas kitas trigeris.


    Šią išvestį rodo serijinis monitorius Arduino IDE.

    Išvada

    PIR jutiklis su ESP32 gali padėti aptikti objektų, einančių per jo diapazoną, judėjimą. Naudodami ESP32 programavimo pertraukimo funkciją, galime suaktyvinti atsaką tam tikrame GPIO kaištyje. Aptikus pakeitimą, įsijungs pertraukimo funkcija ir įsijungs šviesos diodas.