ESP32 con sensore di movimento PIR che utilizza interruzioni e timer - Arduino IDE

Esp32 Con Sensore Di Movimento Pir Che Utilizza Interruzioni E Timer Arduino Ide



ESP32 è una scheda microcontrollore basata su IoT che può essere utilizzata per interfacciare, controllare e leggere diversi sensori. PIR o sensore di movimento è uno dei dispositivi che possiamo interfacciare con ESP32 per rilevare il movimento di un oggetto nel raggio del sensore di movimento utilizzando ESP32.

Prima di iniziare a interfacciare ESP32 con il sensore PIR, dobbiamo sapere come funzionano gli interrupt e come leggerli e gestirli in ESP32. Successivamente dobbiamo comprendere il concetto di base della funzione delay() e millis() nella programmazione ESP32.







Discutiamo in dettaglio il funzionamento del PIR con ESP32.



Ecco il contenuto di questo articolo:



  1. Cosa sono gli interrupt
  • Timer nella programmazione ESP32
  • Interfacciamento del sensore PIR con ESP32

    1: Cosa sono gli interrupt

    La maggior parte degli eventi che si verificano nella programmazione ESP32 vengono eseguiti in sequenza, il che significa esecuzione riga per riga del codice. Per gestire e controllare gli eventi che non devono essere eseguiti durante l'esecuzione sequenziale del codice an Interrompe sono usati.





    Ad esempio, se vogliamo eseguire un determinato compito quando si verifica un evento speciale o viene dato un segnale di trigger ai pin digitali del microcontrollore, utilizziamo l'interrupt.


    Con l'interruzione non è necessario controllare continuamente lo stato digitale del pin di ingresso ESP32. Quando si verifica un'interruzione, il processore interrompe il programma principale e viene chiamata una nuova funzione nota come ISR ( Interrompere la routine del servizio ). Questo PVR La funzione gestisce l'interruzione causata dopo che ritorna al programma principale e avvia l'esecuzione. Uno degli esempi di ISR ​​è Sensore di movimento PIR quale genera un interrupt quando viene rilevato un movimento .



    1.1: Interrompe i pin in ESP32

    Un'interruzione esterna o hardware può essere causata da qualsiasi modulo hardware come un sensore tattile o un pulsante. Le interruzioni del tocco si verificano quando viene rilevato un tocco sui pin ESP32 o l'interruzione GPIO può essere utilizzata anche quando viene premuto un tasto o un pulsante.

    In questo articolo attiveremo un interrupt quando viene rilevato il movimento utilizzando il sensore PIR con ESP32.

    Quasi tutti i pin GPIO tranne i 6 pin integrati SPI che di solito sono disponibili nel 36 La versione -pin della scheda ESP32 non può essere utilizzata ai fini della chiamata di interrupt. Quindi, per ricevere l'interrupt esterno che segue sono i pin evidenziati in colore viola che si possono usare in ESP32:

    Questa immagine è di un ESP32 a 30 pin.

    1.2: Chiamare un interrupt in ESP32

    Per utilizzare l'interrupt in ESP32 possiamo chiamare collegainterruzione() funzione.

    Questa funzione accetta i seguenti tre argomenti:

      • Perno GPIO
      • Funzione da eseguire
      • Modalità
    attachInterrupt ( digitalPinToInterrupt ( GPIO ) , funzione , modalità ) ;


    1: GPIO pin è il primo argomento chiamato all'interno del file collegainterruzione() funzione. Ad esempio, per utilizzare il pin digitale 12 come sorgente di interrupt possiamo chiamarlo using digitalPinToInterrupt(12) funzione.

    2: Funzione da eseguire è il programma eseguito ogni volta che l'interrupt viene raggiunto o attivato da una sorgente esterna o interna. Può far lampeggiare un LED o accendere un allarme antincendio.

    3: Modalità è il terzo e ultimo argomento di cui ha bisogno la funzione di interrupt. Descrive quando attivare l'interrupt. Di seguito le modalità utilizzabili:

      • Basso: Attiva l'interruzione ogni volta che il pin GPIO definito è basso.
      • Alto: Attiva l'interruzione ogni volta che il pin GPIO definito è alto.
      • Modificare: Attiva l'interrupt ogni volta che il pin GPIO cambia il suo valore da alto a basso o viceversa.
      • Cadente: È la modalità per attivare un'interruzione quando un determinato pin inizia a cadere dallo stato alto a quello basso.
      • In aumento: È la modalità per attivare un interrupt quando un determinato pin inizia a salire dallo stato basso ad alto.

    Oggi useremo In aumento mode come terzo argomento per la funzione di interruzione ogni volta che il sensore PIR rileva il LED di interruzione o il sensore si accenderà perché passa dallo stato basso ad alto.

    2: Timer nella programmazione ESP32

    I timer nella programmazione del microcontrollore svolgono un ruolo significativo per l'esecuzione di istruzioni per un periodo di timer specifico o in un'istanza di tempo specifica.

    Due funzioni principali comunemente utilizzate per attivare l'uscita sono ritardo() e milli() . La differenza tra entrambi poiché la funzione delay() interrompe il resto del programma una volta che inizia l'esecuzione mentre millis() viene eseguito per il periodo di tempo definito, quindi il programma torna alle funzioni principali.

    Qui useremo un LED con sensore PIR e non vogliamo che si illumini continuamente dopo l'attivazione di un'interruzione. Useremo la funzione millis () che ci consente di illuminarlo per un tempo definito e poi di nuovo tornare al programma originale una volta trascorso il timestamp.

    2.1: Funzione delay()

    La funzione delay () è piuttosto semplice, richiede solo un argomento che è SM di tipo di dati lungo senza segno. Questo argomento rappresenta il tempo in millisecondi in cui vogliamo mettere in pausa il programma finché non passa alla riga successiva.

    Ad esempio, la seguente funzione interromperà il programma per 1 secondo .

    ritardo ( 1000 )


    delay() è una sorta di funzione di blocco per la programmazione dei microcontrollori. delay() blocca l'esecuzione del resto del codice fino a quando i tempi di questa particolare funzione non vengono completati. Se vogliamo eseguire più istruzioni, dovremmo evitare di utilizzare funzioni di ritardo, invece possiamo utilizzare millis o moduli RTC timer esterni.

    2.2: Funzione millis()

    La funzione millis() restituisce il numero di millisecondi trascorsi da quando la scheda ESP32 ha avviato l'esecuzione del programma corrente. Scrivendo poche righe di codice possiamo facilmente calcolare l'ora presente in qualsiasi istanza durante l'esecuzione del codice ESP32.

    millis è ampiamente utilizzato dove è necessario eseguire più attività senza bloccare il resto del codice. Ecco la sintassi della funzione millis utilizzata per calcolare quanto tempo è trascorso in modo da poter eseguire una specifica istruzione.

    Se ( attualeMillis - precedenteMillis > = intervallo ) {
    precedenteMillis = attualeMillis;
    }


    Questo codice sottrae il millis() precedente dal millis() corrente se il tempo sottratto equivale a definire l'intervallo in cui verrà eseguita un'istruzione specifica. Supponiamo di voler far lampeggiare un LED per 10 sec. Dopo ogni 5 minuti possiamo impostare l'intervallo di tempo pari a 5 minuti (300000ms). Il codice controllerà l'intervallo ogni volta che il codice viene eseguito, una volta raggiunto il LED lampeggerà per 10 sec.

    Nota: Qui useremo la funzione millis() per interfacciare ESP32 con il sensore PIR. Il motivo principale per cui si utilizza milli e non delay è che la funzione millis() non blocca il codice come ha fatto la funzione delay(). Quindi, una volta che il PIR rileva il movimento, verrà generato un interrupt. L'uso della funzione di interruzione millis() attiverà il LED per un tempo definito dopodiché, se il movimento viene interrotto, la funzione millis() si ripristinerà e attenderà l'interruzione successiva.

    Nel caso in cui usiamo la funzione delay() bloccherà completamente il codice e qualsiasi interruzione causata non verrà letta da ESP32 con conseguente fallimento del progetto.

    3: interfacciamento del sensore PIR con ESP32

    Qui useremo la funzione millis() nel codice IDE di Arduino perché vogliamo attivare il LED ogni volta che il sensore PIR rileva un movimento. Questo LED si illuminerà per un tempo prestabilito dopodiché tornerà alla condizione normale.

    Ecco un elenco dei componenti che ci verranno richiesti:

      • Scheda di sviluppo ESP32
      • Sensore di movimento PIR (HC-SR501)
      • PORTATO
      • Resistenza da 330 Ohm
      • Fili di collegamento
      • Tagliere

    schematico per sensore PIR con ESP32:


    Le connessioni dei pin di ESP32 con sensore PIR sono:

    ESP32 Sensore PIR
    venire Vcc
    GPIO13 FUORI
    GND GND

    3.1: Sensore di movimento PIR (HC-SR501)

    PIR è l'acronimo di sensore infrarosso passivo . Utilizza una coppia di sensori piroelettrici che rilevano il calore intorno all'ambiente circostante. Entrambi questi sensori piroelettrici si trovano uno dopo l'altro e quando un oggetto entra nel loro raggio, un cambiamento nell'energia termica o la differenza di segnale tra entrambi questi sensori fa sì che l'uscita del sensore PIR sia BASSA. Una volta che il pin PIR out diventa BASSO, possiamo impostare un'istruzione specifica da eseguire.


    Di seguito sono riportate le caratteristiche del sensore PIR:

      • La sensibilità può essere impostata in base alla posizione del progetto (come il rilevamento del movimento del mouse o delle foglie).
      • Il sensore PIR può essere impostato per quanto tempo rileva un oggetto.
      • Ampiamente utilizzato negli allarmi di sicurezza domestica e in altre applicazioni di rilevamento del movimento basate sulla temperatura.

    3.2: Piedinatura HC-SR501

    PIR HC-SR501 viene fornito con tre pin. Due di questi sono pin di alimentazione per Vcc e GND e uno è il pin di uscita per il segnale di trigger.


    Di seguito è riportata la descrizione dei pin del sensore PIR:

    Spillo Nome Descrizione
    1 Vcc Pin di ingresso per sensore Collegare a ESP32 Vin Pin
    Due FUORI Uscita sensore
    3 GND Sensore GND

    3.3: Codice

    Ora per programmare ESP32 scrivi il codice dato nell'editor IDE di Arduino e caricalo su ESP32.

    #define tempoSecondi 10
    const int led = 4 ; /* PIN GPIO 4 definito per PORTATO */
    const int PIR_Out = 13 ; /* Perno GPIO 13 per PIR fuori */
    unsigned long Current_Time = millis ( ) ; /* variabile definita per memorizzazione di valori in millis */
    lungo senza segno Previous_Trig = 0 ;
    booleano Starting_Time = falso ;
    void IRAM_ATTR rileva il movimento ( ) { /* dai un'occhiata per movimento */
    Serial.println ( 'MOVIMENTO RILEVATO' ) ;
    digitalWrite ( led, ALTO ) ; /* Accendi il LED Se condizione è VERO */
    Ora_di_inizio = VERO ;
    Previous_Trig = millis ( ) ;
    }
    configurazione nulla ( ) {
    Inizio.seriale ( 115200 ) ; /* velocità di trasmissione per comunicazione seriale */
     pinMode ( PIR_Out, INPUT_PULLUP ) ; /* Modalità sensore di movimento PIR definita */
    /* PIR è configurato in modalità SALITA, impostare perno del sensore di movimento come produzione */
    attachInterrupt ( digitalPinToInterrupt ( PIR_Out ) , rilevaMovimento, ALZATA ) ;
     pinMode ( led, USCITA ) ; /* impostare LED su BASSO */
    digitalWrite ( led, BASSO ) ;
    }
    anello vuoto ( ) {
    Current_Time = millis ( ) ; /* memorizzare corrente volta */
    Se ( Tempo di partenza && ( Current_Time - Previous_Trig > ( tempoSecondi * 1000 ) ) ) { /* Intervallo di tempo dopo quale Il LED si spegnerà */
    Serial.println ( 'MOZIONE INTERROTTA' ) ; /* Movimento di stampa interrotto Se nessun movimento rilevato */
    digitalWrite ( led, BASSO ) ; /* Impostare il LED su BASSO Se condizione è falso */
    Ora_di_inizio = falso ;
    }
    }


    Il codice è iniziato definendo i pin GPIO per l'uscita LED e PIR. Successivamente, abbiamo creato tre diverse variabili che aiuteranno ad accendere il LED quando viene rilevato un movimento.

    Queste tre variabili sono Current_Time, Previous_Trig, e Tempo di partenza. Queste variabili memorizzeranno l'ora corrente, l'ora in cui viene rilevato il movimento e il timer dopo il rilevamento del movimento.

    Nella parte di configurazione, per prima cosa, abbiamo definito il baud rate seriale per la comunicazione. Prossimo utilizzo pinMode() impostare il sensore di movimento PIR come INPUT PULLUP. Per impostare l'interruzione PIR collegainterruzione() è descritto. GPIO 13 è descritto per rilevare il movimento in modalità RISING.

    Successivamente nella parte loop() del codice, utilizzando la funzione millis() abbiamo acceso e spento il LED quando viene raggiunto un trigger.

    3.4: Uscita

    Nella sezione di output possiamo vedere che l'oggetto è fuori portata del sensore PIR, quindi il PORTATO è girato SPENTO .


    Ora il movimento rilevato dal LED del sensore PIR si accenderà SU per 10 sec dopodiché, se non viene rilevato alcun movimento, rimarrà SPENTO fino a quando non viene ricevuto il trigger successivo.


    L'output seguente è mostrato dal monitor seriale nell'IDE di Arduino.

    Conclusione

    Un sensore PIR con ESP32 può aiutare a rilevare il movimento di oggetti che passano attraverso il suo raggio d'azione. Utilizzando la funzione di interruzione nella programmazione ESP32 possiamo attivare una risposta su un pin GPIO specifico. Quando viene rilevato un cambiamento, la funzione di interruzione verrà attivata e un LED si accenderà.