Esptop 10 con sensore di movimento PIR usando interrupt e timer - Arduino IDE

Esptop 10 con sensore di movimento PIR usando interrupt e timer - Arduino IDE

ESP32 è una scheda microcontrollore basata su IoT che può essere utilizzata per interfacciarsi, controllare e leggere diversi sensori. Il sensore PIR o di movimento è uno dei dispositivi con cui possiamo interfacciarsi con ESP32 per rilevare il movimento di un oggetto nell'intervallo del sensore di movimento usando ESP32.

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

Discutiamo in dettaglio il funzionamento di PIR con ESP32.

Ecco il contenuto di questo articolo:

  1. Cosa sono interrupt
    • 1.1: interrompe i pin in ESP32
    • 1.2: come chiamare un interrupt in ESP32
  2. Timer nella programmazione ESP32
    • 2.1: ritardo ()
    • 2.2: funzione millis ()
  3. Sensore PIR di interfaccia con ESP32
    • 3.1: Sensore di movimento PIR (HC-SR501)
    • 3.2: Pinout HC-SR501
    • 3.3: codice
    • 3.4: output

1: cosa sono interrupt

La maggior parte degli eventi che si verificano nella programmazione ESP32 eseguono sequenzialmente, il che significa esecuzione di riga del codice. Per gestire e controllare gli eventi che non devono essere eseguiti durante l'esecuzione sequenziale del codice e Interruzioni 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 interrupt.


Con l'interruzione non abbiamo bisogno di controllare continuamente lo stato digitale del pin di input ESP32. Quando si verifica un interrupt, il processore interrompe il programma principale e viene chiamata una nuova funzione che è nota come ISR (Routine di servizio di interruzione). Questo Isr La funzione gestisce l'interrupt causato dopo quel ritorno al programma principale e inizia a eseguirlo. Uno degli esempi di ISR ​​è Sensore di movimento PIR Quale genera un interrupt una volta rilevato il movimento.

1: interrompe i pin in ESP32

Un interrupt esterno o hardware può essere causato da qualsiasi modulo hardware come sensore touch o pulsante. Gli interrupt del tocco si verificano quando viene rilevato un tocco in pin ESP32 o interrupt GPIO può anche essere utilizzato quando viene premuto un tasto o un pulsante.

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

Quasi tutti i pin GPIO tranne 6 pin integrati SPI che di solito si presentano nel 36-La versione pin della scheda ESP32 non può essere utilizzata ai fini dell'interruzione. Pertanto, per ricevere i seguenti interrupt esterni sono i pin evidenziati nel colore viola che si possono usare in ESP32:

Questa immagine è di un ESP32 da 30 pin.

2: chiamare un interrupt in ESP32

Per usare l'interrupt in ESP32 possiamo chiamare AttachInterrupt () funzione.

Questa funzione accetta i seguenti tre argomenti:

    • PIN GPIO
    • Funzione da eseguire
    • Modalità
AttachInterrupt (DigitalPInTerUpt (GPIO), funzione, modalità);


1: GPIO Pin è il primo argomento chiamato all'interno del AttachInterrupt () funzione. Ad esempio, per utilizzare il pin digitale 12 come fonte di interrupt possiamo chiamarlo usando DigitalPintoInterrupt (12) funzione.

2: funzione da eseguire è il programma eseguito ogni volta una volta raggiunto l'interrupt o attivato da una sorgente esterna o interna. Può essere lampeggiante un LED o trasformare un allarme antincendio.

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

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

Oggi useremo In aumento Modalità come terzo argomento per la funzione di interruzione ogni volta che il sensore PIR rileva il LED o il sensore di interrupt si illuminerà perché va da uno stato basso a alto.

2: timer nella programmazione ESP32

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

Due funzioni principali comunemente usate per attivare l'output sono ritardo() E millis (). La differenza tra entrambi come la funzione delay () interrompe il resto del programma una volta che inizia l'esecuzione mentre Millis () funziona per il periodo di tempo definito, quindi il programma risale alle funzioni principali.

Qui useremo un LED con sensore PIR e non vogliamo brillarlo continuamente dopo un trigger di interrupt. Useremo la funzione Millis () che ci consente di brillante per un po 'di tempo definito e poi tornerebbe al programma originale una volta che il timestamp passa.

1: ritardo ()

La funzione delay () è piuttosto semplice, ci vuole solo un argomento che è SM di tipo di dati lunghi non firmati. Questo argomento rappresenta il tempo in millisecondi che vogliamo mettere in pausa il programma fino a quando non si sposta alla riga successiva.

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

ritardo (1000)


Delay () è una sorta di funzione di blocco per la programmazione dei microcontrollori. Delay () blocca il resto del codice da eseguire fino a quando questo particolare funzione di funzione non completa. Se vogliamo eseguire più istruzioni, dovremmo evitare di utilizzare le funzioni di ritardo invece possiamo utilizzare Millis o moduli RTC del timer esterno.

2: funzione millis ()

La funzione Millis () restituisce il numero di millisecondi passati da quando la scheda ESP32 ha iniziato a eseguire il programma corrente. Scrivendo alcune righe di codice possiamo facilmente calcolare l'ora attuale in qualsiasi istanza durante l'esecuzione del codice ESP32.

Millis è ampiamente utilizzato dove dobbiamo eseguire più attività senza bloccare il resto del codice. Ecco la sintassi della funzione Millis utilizzata per calcolare quanto tempo è passato in modo da poter eseguire un'istruzione specifica.

if (CurrentMillis - PrecedentiMillis> = intervallo)
PrecedentiMillis = CurrentMillis;


Questo codice sottrae il precedente Millis () da Current Milis () se il tempo sottratto è uguale a definire l'intervallo che verrà eseguita un'istruzione specifica. Diciamo che vogliamo battere le palpebre per 10 secondi. Dopo ogni 5 minuti possiamo impostare l'intervallo di tempo pari a 5 minuti (300000 ms). Il codice verificherà l'intervallo ogni volta che il codice viene eseguito, una volta raggiunto il LED per 10 secondi.

Nota: Qui useremo la funzione Milis () per l'interfaccia ESP32 con sensore PIR. Il motivo principale alla base dell'utilizzo di Milli e non in ritardo è che la funzione Milis () non blocca il codice come la funzione Delay (). Quindi una volta che il PIR rileva il movimento verrà generato un interrupt. L'uso della funzione interrupt millis () attiverà il LED per il tempo definito dopo che se il movimento viene interrotto la funzione Milis () ripristinerà e attende il prossimo interrupt.

Nel caso in cui se usassimo la funzione delay () bloccherà completamente il codice e qualsiasi interrupt causato non verrà letto da ESP32 con conseguente fallimento del progetto.

3: Sensore PIR interfacciante con ESP32

Qui useremo la funzione Milis () nel codice IDE Arduino perché vogliamo attivare il LED ogni volta che il sensore PIR rileva alcuni movimenti. Questo LED brillerà per un periodo prestabilito dopo che tornerà alle condizioni normali.

Ecco un elenco di componenti che saremo richiesti:

    • ESP32 Development Board
    • Sensore di movimento PIR (HC-SR501)
    • GUIDATO
    • Resistenza da 330 ohm
    • Collegamento dei fili
    • Breadboard

Schema per il sensore PIR con ESP32:


Collegamenti PIN di ESP32 con sensore PIR è:

ESP32 Sensore PIR
Vin VCC
GPIO13 FUORI
GND GND

1: Sensore di movimento PIR (HC-SR501)

PIR è un acronimo per sensore a infrarossi passiva. Utilizza una coppia di sensori piroelettrici che rilevano il calore intorno ai suoi dintorni. Entrambi questi sensori piroelettrici mentono uno dopo l'altro e quando un oggetto entra nel loro intervallo un cambiamento nell'energia termica o la differenza del segnale tra entrambi questi sensori fa sì che la uscita del sensore PIR sia bassa. Una volta che il pin PIR si abbassa, possiamo impostare un'istruzione specifica per essere eseguita.


Di seguito sono riportate le caratteristiche del sensore PIR:

    • La sensibilità può essere impostata a seconda della posizione del progetto (come rilevare il movimento del topo 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 basato su termico.

2: Pinout HC-SR501

PIR HC-SR501 viene fornito con tre pin. Due di loro 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 Connetti al pin Vin ESP32
2 FUORI Output del sensore
3 GND Sensore GND

3: codice

Ora per programmare ESP32 Scrivi il codice dato in Arduino IDE Editor e caricalo su ESP32.

#Define TimesEconds 10
const int LED = 4; /*Pin gpiio 4 definito per LED*/
const int pir_out = 13; /*PIN GPIO 13 per PIR OUT*/
non firmato long current_time = millis (); /*variabile definita per l'archiviazione dei valori di millis*/
non firmato long precedente_trig = 0;
booleano start_time = false;
void iram_atts rilectsMovement () /*controlla il movimento* /
Seriale.println ("motion rilevato");
DigitalWrite (LED, High); /*Attiva il led se la condizione è vera*/
Avviamento_time = true;
Precedente_trig = millis ();

void setup ()
Seriale.Inizia (115200); /*Tasso di baud per comunicazione seriale*/
pinMode (pir_out, input_pullup); /*Modalità sensore di movimento PIR definito*/
/*PIR è configurato in modalità aumento, impostare il pin del sensore di movimento come output*/
AttachInterrupt (DigitalpInTerrupt (PIR_OUT), rilevare, in aumento);
pinMode (LED, output); /*set ha portato a basso*/
DigitalWrite (LED, basso);

void loop ()
Current_time = millis (); /*Memorizza l'ora corrente*/
if (starting_time && (current_time - precedenti_trig> (tempesconds*1000))) /*intervallo di tempo dopo il quale il LED spegne* /
Seriale.println ("motion ferted"); /*Stampa il movimento interrotto se nessun movimento rilevato*/
DigitalWrite (LED, basso); /*Imposta LED a bassa se la condizione è falsa*/
Avviamento_time = false;


Il codice avviato definendo i pin GPIO per l'output LED e PIR. Successivamente, abbiamo creato tre diverse variabili che aiuteranno a attivare il LED quando viene rilevato il movimento.

Queste tre variabili sono Current_time, precedente_trig, E Tempo di partenza. Queste variabili memorizzano il tempo corrente, il tempo in cui viene rilevato il movimento e il timer dopo il rilevamento del movimento.

Nella parte di configurazione prima, abbiamo definito il tasso di baud seriale per la comunicazione. Poi usando pinMode () Imposta il sensore di movimento PIR come pullup di ingresso. Per impostare l'interrupt PIR AttachInterrupt () è descritto. GPIO 13 è descritto per rilevare il movimento sulla modalità in aumento.

Successivamente in loop () parte del codice, usando la funzione Millis () abbiamo attivato e spento il LED quando viene raggiunto un trigger.

4: output

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


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


Il seguente output è mostrato dal monitor seriale in Arduino IDE.

Conclusione

Un sensore PIR con ESP32 può aiutare a rilevare il movimento degli oggetti che attraversano la sua gamma. Usando la funzione di interruzione nella programmazione ESP32 possiamo attivare una risposta su un pin GPIO specifico. Quando viene rilevata la modifica, la funzione di interruzione verrà attivata e si accende un LED.