ESP32 med PIR-bevægelsessensor ved hjælp af interrupts og timere – Arduino IDE

Esp32 Med Pir Bevaegelsessensor Ved Hjaelp Af Interrupts Og Timere Arduino Ide



ESP32 er et IoT-baseret mikrocontrollerkort, som kan bruges til at forbinde, styre og aflæse forskellige sensorer. PIR eller bevægelsessensor er en af ​​de enheder, vi kan forbinde med ESP32 for at registrere bevægelse af et objekt inden for bevægelsessensorens rækkevidde ved hjælp af ESP32.

Før vi begynder at forbinde ESP32 med PIR-sensor, skal vi vide, hvordan interrupts fungerer, og hvordan man læser og håndterer dem i ESP32. Dernæst skal vi forstå kernekonceptet delay() og millis()-funktion i ESP32-programmering.







Lad os diskutere arbejdet med PIR med ESP32 i detaljer.



Her er indholdet til denne artikel:



  1. Hvad er afbrydelser
  • Timere i ESP32 programmering
  • Grænseflade PIR-sensor med ESP32

    1: Hvad er afbrydelser

    De fleste af de begivenheder, der sker i ESP32-programmering, kører sekventielt, hvilket betyder linje for linje udførelse af kode. For at håndtere og kontrollere de hændelser, der ikke behøver at køre under sekventiel udførelse af kode an Afbryder er brugt.





    For eksempel, hvis vi ønsker at udføre en bestemt opgave, når der opstår en speciel begivenhed, eller der gives et triggersignal til mikrocontrollerens digitale ben, bruger vi interrupt.


    Med afbrydelse behøver vi ikke løbende at kontrollere den digitale tilstand af ESP32-indgangsstiften. Når der opstår en afbrydelse, stopper processoren hovedprogrammet, og der kaldes en ny funktion, som er kendt som ISR ( Afbrydelse af servicerutine ). Dette ISR funktion håndterer afbrydelsen, der forårsages efter det, vender tilbage til hovedprogrammet og begynder at udføre det. Et af eksemplerne på ISR er PIR bevægelsessensor hvilken genererer et afbrydelse, når bevægelse detekteres .



    1.1: Afbryder pins i ESP32

    En ekstern eller hardwareafbrydelse kan være forårsaget af ethvert hardwaremodul såsom berøringssensor eller trykknap. Berøringsafbrydelser sker, når en berøring detekteres på ESP32-benene, eller GPIO-afbrydelser kan også bruges, når der trykkes på en tast eller en trykknap.

    I denne artikel vil vi udløse et afbrydelse, når bevægelsen detekteres ved hjælp af PIR-sensoren med ESP32.

    Næsten alle GPIO-benene undtagen 6 SPI integrerede stifter, som normalt kommer i 36 -pin-versionen af ​​ESP32-kortet kan ikke bruges med det formål at afbryde opkald. Så for at modtage den eksterne afbrydelse er følgende stifter fremhævet i lilla farve, man kan bruge i ESP32:

    Dette billede er af en 30 pin ESP32.

    1.2: Opkald til en afbrydelse i ESP32

    For brug af interrupt i ESP32 kan vi ringe attachInterrupt() fungere.

    Denne funktion accepterer følgende tre argumenter:

      • GPIO pin
      • Funktion, der skal udføres
      • Mode
    vedhæft Afbrydelse ( digitalPinToInterrupt ( GPIO ) , fungere , tilstand ) ;


    1: GPIO pin er det første argument kaldet inde i attachInterrupt() fungere. For eksempel at bruge digital pin 12 som en afbrydelseskilde kan vi kalde det at bruge digitalPinToInterrupt(12) fungere.

    2: Funktion der skal udføres er det program, der udføres hver gang, når afbrydelsen er nået eller udløst af en ekstern eller intern kilde. Det kan enten være at blinke en LED eller at tænde en brandalarm.

    3: Mode er det tredje og sidste argument, som afbrydelsesfunktionen har brug for. Den beskriver, hvornår afbrydelsen skal udløses. Følgende tilstande kan bruges:

      • Lav: Udløs afbrydelsen, hver gang den definerede GPIO-pin er lav.
      • Høj: Udløs afbrydelsen, hver gang den definerede GPIO-pin er høj.
      • Lave om: Trigger afbrydelse hver gang GPIO pin ændrer sin værdi fra høj til lav eller omvendt.
      • Falder: Det er tilstanden til at udløse en afbrydelse, når en bestemt pin begynder at falde fra høj tilstand til lav.
      • Stigende: Det er tilstanden til at udløse et interrupt, når en bestemt pin begynder at stige fra lav tilstand til høj.

    I dag skal vi bruge Stigende tilstand som et tredje argument for afbrydelsesfunktionen, hver gang PIR-sensoren registrerer afbrydelses-LED'en eller sensoren vil lyse, fordi den går fra lav tilstand til høj.

    2: Timere i ESP32-programmering

    Timere i mikrocontrollerprogrammering spiller en væsentlig rolle for udførelse af instruktioner for en specifik timerperiode eller på et bestemt tidspunkt.

    To hovedfunktioner, der almindeligvis bruges til at udløse output, er forsinke() og millis() . Forskellen mellem dem begge som delay()-funktion stopper resten af ​​programmet, når det begynder at udføre, mens millis() kører i den definerede tidsperiode, hvorefter programmet går tilbage til hovedfunktionerne.

    Her vil vi bruge en LED med PIR-sensor, og vi ønsker ikke at lyse den konstant efter en afbrydelsesudløsning. Vi vil bruge millis()-funktionen, der giver os mulighed for at gløde den i nogen defineret tid og derefter igen går tilbage til det originale program, når tidsstemplet passerer.

    2.1: delay() Funktion

    delay()-funktionen er ret enkel, den tager kun et argument, som er Frk af usigneret lang datatype. Dette argument repræsenterer den tid i millisekunder, vi ønsker at sætte programmet på pause, indtil det flytter til næste linje.

    For eksempel vil følgende funktion stoppe programmet for 1 sek .

    forsinke ( 1000 )


    delay() er en slags blokeringsfunktion til mikrocontrollers programmering. delay() blokerer resten af ​​koden til at udføre, indtil denne særlige funktionstid ikke er fuldført. Hvis vi ønsker at udføre flere instruktioner, bør vi undgå at bruge forsinkelsesfunktioner i stedet for, vi kan bruge millis eller eksterne timer RTC-moduler.

    2.2: millis() Funktion

    millis()-funktionen returnerer antallet af millisekunder, der er gået, siden ESP32-kortet begyndte at køre det aktuelle program. Ved at skrive et par linjer kode kan vi nemt beregne det nuværende tidspunkt på et hvilket som helst tidspunkt, mens vi kører ESP32-koden.

    millis er meget brugt, hvor vi skal køre flere opgaver uden at blokere resten af ​​koden. Her er syntaksen for millis-funktionen, der bruges til at beregne, hvor lang tid der gik, så vi kan udføre en specifik instruktion.

    hvis ( nuværendeMillis - forrigeMillis > = interval ) {
    forrigeMillis = nuværendeMillis;
    }


    Denne kode trækker den foregående millis() fra nuværende millis(), hvis den subtraherede tid er lig med at definere det interval, en specifik instruktion vil blive udført. Lad os sige, at vi vil blinke en LED i 10 sek. Efter hvert 5. minut kan vi indstille tidsintervallet lig med 5 minutter (300000ms). Koden vil tjekke for intervallet hver gang koden kører, når den når, vil den blinke med LED'en i 10 sek.

    Bemærk: Her vil vi bruge millis()-funktionen til at forbinde ESP32 med PIR-sensor. Hovedårsagen til at bruge milli og ikke delay er, at funktionen millis() ikke blokerer koden, som delay()-funktionen gjorde. Så når først PIR'en detekterer bevægelse, vil der blive genereret en afbrydelse. Brug af interrupt millis()-funktionen vil udløse LED'en i defineret tid, efter at hvis bevægelsen stoppes, vil millis()-funktionen nulstilles og vente på næste interrupt.

    Hvis vi brugte delay()-funktionen, vil den fuldstændig blokere koden, og enhver forårsaget afbrydelse vil ikke blive læst af ESP32, hvilket resulterer i projektfejl.

    3: Grænseflade PIR-sensor med ESP32

    Her vil vi bruge millis()-funktionen i Arduino IDE-kode, fordi vi ønsker at udløse LED hver gang PIR-sensoren registrerer bevægelse. Denne LED lyser i et bestemt tidsrum, hvorefter den vender tilbage til normal tilstand.

    Her er en liste over komponenter, vi skal bruge:

      • ESP32 udviklingstavle
      • PIR bevægelsessensor (HC-SR501)
      • LED
      • 330 Ohm modstand
      • Tilslutningsledninger
      • Brødbræt

    Skematisk til PIR-sensor med ESP32:


    Benforbindelser på ESP32 med PIR-sensor er:

    ESP32 PIR sensor
    komme Vcc
    GPIO13 UD
    GND GND

    3.1: PIR-bevægelsessensor (HC-SR501)

    PIR er et akronym for passiv infrarød sensor . Den bruger et par pyroelektriske sensorer, der registrerer varme omkring omgivelserne. Begge disse pyroelektriske sensorer ligger efter hinanden, og når en genstand kommer inden for deres rækkevidde, får en ændring i varmeenergien eller signalforskellen mellem begge disse sensorer, at PIR-sensorens output er LAVT. Når først PIR ud-pinden bliver LAV, kan vi indstille en specifik instruktion til at udføre.


    Følgende er karakteristika for PIR-sensor:

      • Følsomhed kan indstilles afhængigt af projektets placering (såsom at registrere mus eller bladbevægelser).
      • PIR-sensoren kan indstilles til, hvor længe den detekterer et objekt.
      • Udbredt i hjemmesikkerhedsalarmer og andre termisk baserede bevægelsesdetekteringsapplikationer.

    3.2: Pinout HC-SR501

    PIR HC-SR501 leveres med tre ben. To af dem er strømben til Vcc og GND, og ​​den ene er udgangsbenet til triggersignalet.


    Følgende er beskrivelsen af ​​PIR-sensorstifter:

    Pin Navn Beskrivelse
    1 Vcc Indgangspin for sensor Tilslut til ESP32 Vin Pin
    to UD Sensor udgang
    3 GND Sensor GND

    3.3: Kode

    For nu at programmere ESP32 skal du skrive den givne kode i Arduino IDE editor og uploade den til ESP32.

    #define timeSeconds 10
    const int led = 4 ; /* GPIO PIN 4 defineret til LED */
    const int PIR_Out = 13 ; /* GPIO pin 13 til PIR ud */
    unsigned long Current_Time = millis ( ) ; /* variabel defineret til lagring af millis-værdier */
    unsigned long Previous_Trig = 0 ;
    boolesk starttid = falsk ;
    void IRAM_ATTR registrerer bevægelse ( ) { /* kontrollere til bevægelse */
    Serial.println ( 'BEVÆGELSE OPTAGET' ) ;
    digitalSkriv ( led, HØJ ) ; /* Tænd LED hvis tilstand er rigtigt */
    Starttid = rigtigt ;
    Previous_Trig = millis ( ) ;
    }
    ugyldig opsætning ( ) {
    Serial.begin ( 115200 ) ; /* baudrate til seriel kommunikation */
     pin-tilstand ( PIR_Out, INPUT_PULLUP ) ; /* PIR-bevægelsessensortilstand defineret */
    /* PIR er konfigureret i STIGENDE tilstand, sæt bevægelsessensor pin som produktion */
    vedhæft Afbrydelse ( digitalPinToInterrupt ( PIR_Ud ) , registrerer Bevægelse, STIGENDE ) ;
     pin-tilstand ( led, OUTPUT ) ; /* sæt LED til LAV */
    digitalSkriv ( led, LAV ) ;
    }
    ugyldig løkke ( ) {
    Current_Time = millis ( ) ; /* gemme strøm tid */
    hvis ( Start_Time && ( Current_Time - Previous_Trig > ( timeSeconds * 1000 ) ) ) { /* Tidsinterval efter hvilken LED vil slukke */
    Serial.println ( 'BEVÆGELSE STOPPTET' ) ; /* Udskriver bevægelse stoppet hvis ingen bevægelse registreret */
    digitalSkriv ( led, LAV ) ; /* Indstil LED til LAV hvis tilstand er falsk */
    Starttid = falsk ;
    }
    }


    Koden startede med at definere GPIO-ben til LED- og PIR-output. Dernæst oprettede vi tre forskellige variabler, der vil hjælpe med at tænde LED, når der registreres bevægelse.

    Disse tre variabler er Current_Time, Previous_Trig, og Start_Time. Disse variabler gemmer det aktuelle klokkeslæt, det tidspunkt, hvor bevægelse detekteres, og timeren efter, at bevægelsen er detekteret.

    I opsætningsdelen definerede vi først seriel baudrate for kommunikation. Næste brug pinMode() indstil PIR-bevægelsessensoren som INPUT PULLUP. For at indstille PIR-afbrydelsen attachInterrupt() er beskrevet. GPIO 13 er beskrevet til at registrere bevægelse i RISING-tilstand.

    Næste i loop()-delen af ​​koden, ved hjælp af millis()-funktionen tændte og slukker vi LED'en, når en trigger er opnået.

    3.4: Output

    I outputsektionen kan vi se, at objektet er uden for rækkevidde af PIR-sensoren, så den LED er vendt AF .


    Nu vil den bevægelse, der registreres af PIR-sensorens LED, vende til 10 sek derefter, hvis der ikke registreres nogen bevægelse, forbliver den AF indtil næste trigger modtages.


    Følgende output vises af den serielle skærm i Arduino IDE.

    Konklusion

    En PIR-sensor med ESP32 kan hjælpe med at registrere bevægelse af genstande, der passerer gennem dens rækkevidde. Ved at bruge afbrydelsesfunktionen i ESP32-programmering kan vi udløse et svar på en bestemt GPIO-pin. Når ændringen registreres, vil afbrydelsesfunktionen blive udløst, og en LED vil tænde.