ESP32 amb sensor de moviment PIR amb interrupcions i temporitzadors - Arduino IDE

Esp32 Amb Sensor De Moviment Pir Amb Interrupcions I Temporitzadors Arduino Ide



ESP32 és una placa de microcontrolador basada en IoT que es pot utilitzar per connectar, controlar i llegir diferents sensors. PIR o sensor de moviment és un dels dispositius que podem connectar amb ESP32 per detectar el moviment d'un objecte en el rang de sensor de moviment mitjançant ESP32.

Abans de començar a connectar ESP32 amb sensor PIR hem de saber com funcionen les interrupcions i com llegir-les i gestionar-les a ESP32. A continuació, hem d'entendre el concepte bàsic de la funció delay() i millis() a la programació ESP32.







Parlem detalladament del funcionament de PIR amb ESP32.



Aquí teniu el contingut d'aquest article:



  1. Què són les interrupcions
  • Temporitzadors a la programació ESP32
  • Sensor PIR d'interfície amb ESP32

    1: Què són les interrupcions

    La majoria dels esdeveniments que succeeixen a la programació ESP32 s'executen de manera seqüencial, el que significa l'execució de codi línia per línia. Per gestionar i controlar els esdeveniments que no s'han d'executar durant l'execució seqüencial del codi an Interrupcions s'utilitzen.





    Per exemple, si volem executar una tasca determinada quan es produeix un esdeveniment especial, o es dóna un senyal d'activació als pins digitals del microcontrolador, utilitzem interrupció.


    Amb la interrupció, no necessitem comprovar contínuament l'estat digital del pin d'entrada de l'ESP32. Quan es produeix una interrupció, el processador atura el programa principal i s'anomena una nova funció que es coneix com ISR ( Rutina de servei d'interrupció ). Això ISR La funció gestiona la interrupció causada després de tornar al programa principal i començar a executar-lo. Un dels exemples d'ISR és Sensor de moviment PIR quin genera una interrupció quan es detecta moviment .



    1.1: interromp els pins a l'ESP32

    Una interrupció externa o de maquinari pot ser causada per qualsevol mòdul de maquinari, com ara un sensor tàctil o un polsador. Les interrupcions tàctils es produeixen quan es detecta un toc als pins ESP32 o també es pot utilitzar una interrupció GPIO quan es prem una tecla o un polsador.

    En aquest article activarem una interrupció quan es detecti el moviment mitjançant el sensor PIR amb ESP32.

    Gairebé tots els pins GPIO excepte els 6 pins SPI integrats que solen venir al 36 La versió -pin de la placa ESP32 no es pot utilitzar amb el propòsit d'interrompre la trucada. Per tant, per rebre la interrupció externa, es mostren els pins ressaltats en color morat que es poden utilitzar a ESP32:

    Aquesta imatge és d'un ESP32 de 30 pins.

    1.2: trucada a una interrupció a ESP32

    Per utilitzar la interrupció a ESP32 podem trucar attachInterrupt() funció.

    Aquesta funció accepta els tres arguments següents:

      • Pin GPIO
      • Funció a executar
      • Mode
    attachInterrupt ( digitalPinToInterrupt ( GPIO ) , funció , mode ) ;


    1: GPIO pin és el primer argument anomenat dins de attachInterrupt() funció. Per exemple, per utilitzar el pin digital 12 com a font d'interrupció, podem anomenar-lo utilitzant digitalPinToInterrupt(12) funció.

    2: Funció a executar és el programa que s'executa cada vegada que s'arriba a la interrupció o s'activa per una font externa o interna. Pot ser fent parpellejar un LED o activar una alarma d'incendi.

    3: Mode és el tercer i últim argument que necessita la funció d'interrupció. Descriu quan activar la interrupció. A continuació es mostren els modes que es poden utilitzar:

      • Baix: Activa la interrupció cada vegada que el pin GPIO definit és baix.
      • Alt: Activa la interrupció cada vegada que el pin GPIO definit és alt.
      • Canvi: Activa la interrupció cada vegada que el pin GPIO canvia el seu valor d'alt a baix o viceversa.
      • Caiguda: És el mode per activar una interrupció quan un determinat pin comença a caure d'un estat alt a un estat baix.
      • Aixecant: És la manera d'activar una interrupció quan un determinat pin comença a pujar d'estat baix a alt.

    Avui farem servir Aixecant-se mode com a tercer argument per a la funció d'interrupció sempre que el sensor PIR detecti el LED d'interrupció o el sensor s'il·luminarà perquè passa d'estat baix a alt.

    2: Temporitzadors a la programació ESP32

    Els temporitzadors en la programació de microcontroladors tenen un paper important per executar instruccions per a un període de temporitzador específic o en un moment específic de temps.

    Dues funcions principals que s'utilitzen habitualment per activar la sortida són retard() i mil·lisos () . La diferència entre ambdues com a funció delay() atura la resta del programa un cop comença a executar-se, mentre que millis() s'executa durant el període de temps definit i després el programa torna a les funcions principals.

    Aquí farem servir un LED amb sensor PIR i no volem encendre-lo contínuament després que s'activa una interrupció. Utilitzarem la funció millis() que ens permetrà enlluernar-la durant un temps definit i després tornarem al programa original un cop passat aquesta marca de temps.

    2.1: Funció delay().

    La funció delay() és bastant senzilla, només pren un argument Senyora de tipus de dades llarg sense signar. Aquest argument representa el temps en mil·lisegons que volem aturar el programa fins que es mou a la línia següent.

    Per exemple, la funció següent aturarà el programa per 1 seg .

    retard ( 1000 )


    delay() és una mena de funció de bloqueig per a la programació de microcontroladors. delay() bloqueja la resta del codi per executar-se fins que els temps d'aquesta funció en particular no s'acabin. Si volem executar diverses instruccions, hem d'evitar l'ús de funcions de retard, en lloc d'utilitzar mòduls RTC de temporitzadors externs o millis.

    2.2: funció millis().

    La funció millis() retorna el nombre de mil·lisegons passats des que la placa ESP32 va començar a executar el programa actual. Escrivint unes quantes línies de codi podem calcular fàcilment el temps actual en qualsevol instància mentre executem el codi ESP32.

    millis s'utilitza àmpliament quan necessitem executar diverses tasques sense bloquejar la resta del codi. Aquí teniu la sintaxi de la funció millis utilitzada per calcular quant de temps ha passat perquè puguem executar una instrucció específica.

    si ( currentMillis - anteriorMillis > = interval ) {
    previousMillis = currentMillis;
    }


    Aquest codi resta el millis() anterior del millis() actual si el temps restant és igual a definir l'interval que s'executarà una instrucció específica. Suposem que volem parpellejar un LED durant 10 segons. Després de cada 5 minuts podem establir l'interval de temps igual a 5 minuts (300000ms). El codi comprovarà l'interval cada vegada que el codi s'executi, una vegada que arribi, parpellejarà el LED durant 10 segons.

    Nota: Aquí farem servir la funció millis() per connectar ESP32 amb sensor PIR. La raó principal d'utilitzar milli i no delay és que la funció millis() no bloqueja el codi com ho va fer la funció delay(). Així, un cop el PIR detecti moviment, es generarà una interrupció. L'ús de la funció d'interrupció millis() activarà el LED durant un temps definit després d'això, si el moviment s'atura, la funció millis() es restablirà i esperarà la següent interrupció.

    En cas que si utilitzem la funció delay(), bloquejarà completament el codi i qualsevol interrupció causada no serà llegida per ESP32, provocant un fracàs del projecte.

    3: Interfície de sensor PIR amb ESP32

    Aquí utilitzarem la funció millis() al codi IDE d'Arduino perquè volem activar el LED cada vegada que el sensor PIR detecti algun moviment. Aquest LED s'il·luminarà durant un temps determinat després d'això tornarà a les condicions normals.

    Aquí teniu una llista dels components que serem requerits:

      • Placa de desenvolupament ESP32
      • Sensor de moviment PIR (HC-SR501)
      • LED
      • Resistència de 330 ohms
      • Cables de connexió
      • Tauler

    Esquemàtic per al sensor PIR amb ESP32:


    Les connexions de pins de l'ESP32 amb el sensor PIR són:

    ESP32 Sensor PIR
    vine Vcc
    GPIO13 FORA
    GND GND

    3.1: Sensor de moviment PIR (HC-SR501)

    PIR és l'acrònim de sensor infrarojo passiu . Utilitza un parell de sensors piroelèctrics que detecten la calor al voltant del seu entorn. Tots dos sensors piroelèctrics es troben l'un darrere l'altre i quan un objecte entra dins del seu rang, un canvi en l'energia tèrmica o la diferència de senyal entre ambdós sensors fa que la sortida del sensor PIR sigui BAIX. Una vegada que el pin de sortida del PIR vagi BAIX, podem establir una instrucció específica per executar-la.


    A continuació es mostren les característiques del sensor PIR:

      • La sensibilitat es pot establir en funció de la ubicació del projecte (com ara detectar el moviment del ratolí o de la fulla).
      • El sensor PIR es pot configurar durant quant de temps detecta un objecte.
      • Àmpliament utilitzat en alarmes de seguretat domèstica i altres aplicacions de detecció de moviments tèrmiques.

    3.2: Pinout HC-SR501

    PIR HC-SR501 ve amb tres pins. Dos d'ells són pins d'alimentació per a Vcc i GND i un és el pin de sortida per al senyal de disparador.


    A continuació es mostra la descripció dels pins del sensor PIR:

    Pin Nom Descripció
    1 Vcc Pin d'entrada per al sensor Connectar-se a ESP32 Vin Pin
    2 FORA Sortida del sensor
    3 GND Sensor GND

    3.3: Codi

    Ara, per programar ESP32, escriviu el codi donat a l'editor Arduino IDE i pengeu-lo a ESP32.

    #definir tempsSegons 10
    const int led = 4 ; /* PIN GPIO 4 definit per LED */
    const int PIR_Out = 13 ; /* Pin GPIO 13 per PIR fora */
    Unsigned long Current_Time = mil·lisos ( ) ; /* variable definida per emmagatzemar valors en milis */
    llarg sense signar Previous_Trig = 0 ;
    booleà Starting_Time = fals ;
    void IRAM_ATTR detecta el moviment ( ) { /* comprovar per moviment */
    Serial.println ( 'MOVIMENT DETECTAT' ) ;
    digitalWrite ( led, ALTA ) ; /* Enceneu el LED si condició és veritat */
    Hora_inici = veritat ;
    Previous_Trig = mil·lisos ( ) ;
    }
    configuració de buit ( ) {
    Serial.begin ( 115200 ) ; /* velocitat de transmissió per comunicació en sèrie */
     mode pin ( PIR_Out, INPUT_PULLUP ) ; /* S'ha definit el mode de sensor de moviment PIR */
    /* PIR està configurat en Mode AUJENT, conjunt pin del sensor de moviment com sortida */
    attachInterrupt ( digitalPinToInterrupt ( PIR_Fora ) , detectaMoviment, ALÇANT ) ;
     mode pin ( led, SORTIDA ) ; /* conjunt LED a BAIX */
    digitalWrite ( led, BAIX ) ;
    }
    bucle buit ( ) {
    Current_Time = mil·lisos ( ) ; /* emmagatzema el corrent temps */
    si ( Hora_inici && ( Current_Time - Previous_Trig > ( tempsSegons * 1000 ) ) ) { /* Interval de temps després quin El LED s'apagarà */
    Serial.println ( 'MOVIMENT ATURAT' ) ; /* S'ha aturat el moviment d'impressió si no s'ha detectat cap moviment */
    digitalWrite ( led, BAIX ) ; /* Estableix el LED a BAIX si condició és fals */
    Hora_inici = fals ;
    }
    }


    El codi va començar definint pins GPIO per a la sortida LED i PIR. A continuació, hem creat tres variables diferents que ajudaran a encendre el LED quan es detecti moviment.

    Aquestes tres variables són Current_Time, Previous_Trig, i Hora_inici. Aquestes variables emmagatzemaran l'hora actual, l'hora en què es detecta el moviment i el temporitzador després de detectar el moviment.

    A la part de configuració primer, hem definit la velocitat en baudis sèrie per a la comunicació. Seguidament utilitzant pinMode() configureu el sensor de moviment PIR com a INPUT PULLUP. Per configurar la interrupció PIR attachInterrupt() es descriu. Es descriu GPIO 13 per detectar moviments en mode RISING.

    A continuació, a la part de loop() del codi, utilitzant la funció millis() vam encendre i apagar el LED quan s'aconsegueix un disparador.

    3.4: Sortida

    A la secció de sortida podem veure que l'objecte està fora de l'abast del sensor PIR, de manera que el LED està girat OFF .


    Ara el moviment detectat pel LED del sensor PIR es girarà ON per 10 sec després d'això, si no es detecta cap moviment, es mantindrà OFF fins que es rep el següent disparador.


    El monitor sèrie de l'IDE d'Arduino mostra la següent sortida.

    Conclusió

    Un sensor PIR amb ESP32 pot ajudar a detectar el moviment dels objectes que passen pel seu abast. Utilitzant la funció d'interrupció a la programació ESP32, podem activar una resposta en algun pin GPIO específic. Quan es detecti un canvi, s'activarà la funció d'interrupció i s'encendrà un LED.