ESP32 mit PIR-Bewegungssensor mit Interrupts und Timern – Arduino IDE

Esp32 Mit Pir Bewegungssensor Mit Interrupts Und Timern Arduino Ide



ESP32 ist ein IoT-basiertes Mikrocontroller-Board, mit dem verschiedene Sensoren verbunden, gesteuert und gelesen werden können. PIR oder Bewegungssensor ist eines der Geräte, die wir mit ESP32 verbinden können, um die Bewegung eines Objekts im Bereich des Bewegungssensors mit ESP32 zu erkennen.

Bevor wir beginnen, ESP32 mit dem PIR-Sensor zu verbinden, müssen wir wissen, wie Interrupts funktionieren und wie sie in ESP32 gelesen und behandelt werden. Als nächstes müssen wir das Kernkonzept der Funktionen delay() und millis() in der ESP32-Programmierung verstehen.







Lassen Sie uns die Funktionsweise von PIR mit ESP32 im Detail besprechen.



Hier ist der Inhalt für diesen Artikel:



  1. Was sind Unterbrechungen
  • Timer in der ESP32-Programmierung
  • PIR-Sensor mit ESP32 verbinden

    1: Was sind Interrupts?

    Die meisten Ereignisse, die bei der ESP32-Programmierung auftreten, werden sequentiell ausgeführt, was bedeutet, dass Code Zeile für Zeile ausgeführt wird. Zum Behandeln und Steuern der Ereignisse, die während der sequentiellen Ausführung von Code nicht ausgeführt werden müssen Unterbricht werden verwendet.





    Wenn wir beispielsweise eine bestimmte Aufgabe ausführen möchten, wenn ein besonderes Ereignis eintritt oder ein Triggersignal an digitale Pins des Mikrocontrollers gegeben wird, verwenden wir Interrupt.


    Bei einer Unterbrechung müssen wir den digitalen Zustand des ESP32-Eingangspins nicht ständig überprüfen. Wenn ein Interrupt auftritt, hält der Prozessor das Hauptprogramm an und eine neue Funktion wird aufgerufen, die als ISR bekannt ist ( Dienstroutine unterbrechen ). Dies ISR Funktion behandelt den Interrupt, der danach verursacht wird, kehren Sie zum Hauptprogramm zurück und beginnen Sie mit der Ausführung. Eines der Beispiele für ISR ist PIR-Bewegungssensor die erzeugt einen Interrupt, sobald eine Bewegung erkannt wird .



    1.1: Unterbricht Pins in ESP32

    Ein externer oder Hardware-Interrupt kann durch jedes Hardwaremodul wie Berührungssensor oder Drucktaster verursacht werden. Berührungsunterbrechungen treten auf, wenn eine Berührung an ESP32-Pins erkannt wird, oder GPIO-Unterbrechungen können auch verwendet werden, wenn eine Taste oder ein Druckknopf gedrückt wird.

    In diesem Artikel lösen wir einen Interrupt aus, wenn die Bewegung mit dem PIR-Sensor mit ESP32 erkannt wird.

    Fast alle GPIO-Pins mit Ausnahme von 6 SPI-integrierten Pins, die normalerweise im 36 -Pin-Version der ESP32-Karte kann nicht für Interrupt-Aufrufe verwendet werden. Um den externen Interrupt zu erhalten, sind die folgenden Pins violett hervorgehoben, die man in ESP32 verwenden kann:

    Dieses Bild zeigt einen 30-poligen ESP32.

    1.2: Aufruf eines Interrupts in ESP32

    Für die Verwendung von Interrupt in ESP32 können wir anrufen AttachInterrupt() Funktion.

    Diese Funktion akzeptiert die folgenden drei Argumente:

      • GPIO-Pin
      • Auszuführende Funktion
      • Modus
    AttachInterrupt ( digitalPinToInterrupt ( GPIO ) , Funktion , Modus ) ;


    1: GPIO pin ist das erste Argument, das innerhalb von aufgerufen wird AttachInterrupt() Funktion. Um beispielsweise den digitalen Pin 12 als Interrupt-Quelle zu verwenden, können wir dies als using bezeichnen digitalPinToInterrupt(12) Funktion.

    2: Funktion auszuführen ist das Programm, das jedes Mal ausgeführt wird, wenn der Interrupt erreicht oder durch eine externe oder interne Quelle ausgelöst wird. Es kann entweder eine LED blinken oder einen Feueralarm auslösen.

    3: Modus ist das dritte und letzte Argument, das die Interrupt-Funktion benötigt. Es beschreibt, wann der Interrupt ausgelöst werden soll. Folgende Modi können verwendet werden:

      • Niedrig: Lösen Sie den Interrupt jedes Mal aus, wenn der definierte GPIO-Pin niedrig ist.
      • Hoch: Lösen Sie den Interrupt jedes Mal aus, wenn der definierte GPIO-Pin hoch ist.
      • Veränderung: Trigger-Interrupt jedes Mal, wenn der GPIO-Pin seinen Wert von High auf Low oder umgekehrt ändert.
      • Fallen: Es ist der Modus, um einen Interrupt auszulösen, wenn ein bestimmter Pin beginnt, vom High-Zustand auf Low zu fallen.
      • Steigend: Es ist der Modus, um einen Interrupt auszulösen, wenn ein bestimmter Pin beginnt, vom Low-Zustand auf High zu steigen.

    Heute werden wir verwenden Steigend Modus als drittes Argument für die Interrupt-Funktion, wenn der PIR-Sensor erkennt, dass die Interrupt-LED oder der Sensor aufleuchtet, weil er vom Low-Zustand auf High wechselt.

    2: Timer in der ESP32-Programmierung

    Zeitgeber in der Mikrocontroller-Programmierung spielen eine bedeutende Rolle für die Ausführung von Anweisungen für eine bestimmte Zeitgeberperiode oder zu einem bestimmten Zeitpunkt.

    Zwei Hauptfunktionen, die üblicherweise zum Auslösen des Ausgangs verwendet werden, sind Verzögerung() und millis() . Der Unterschied zwischen beiden als delay()-Funktion stoppt den Rest des Programms, sobald es mit der Ausführung beginnt, während millis() für den definierten Zeitraum läuft, dann kehrt das Programm zu den Hauptfunktionen zurück.

    Hier verwenden wir eine LED mit PIR-Sensor und möchten sie nicht kontinuierlich leuchten lassen, nachdem ein Interrupt ausgelöst wurde. Wir werden die Funktion millis () verwenden, die es uns ermöglicht, sie für eine bestimmte Zeit zu leuchten und dann wieder zum ursprünglichen Programm zurückzukehren, sobald dieser Zeitstempel verstrichen ist.

    2.1: delay() Funktion

    Die delay () -Funktion ist ziemlich einfach, sie benötigt nur ein Argument, nämlich Frau vom vorzeichenlosen langen Datentyp. Dieses Argument stellt die Zeit in Millisekunden dar, für die wir das Programm anhalten möchten, bis es zur nächsten Zeile wechselt.

    Beispielsweise stoppt die folgende Funktion das Programm für 1 Sek .

    Verzögerung ( 1000 )


    delay() ist eine Art Sperrfunktion für die Programmierung von Mikrocontrollern. delay() blockiert die Ausführung des restlichen Codes, bis diese bestimmten Funktionszeiten nicht abgeschlossen sind. Wenn wir mehrere Anweisungen ausführen möchten, sollten wir die Verwendung von Verzögerungsfunktionen vermeiden, stattdessen können wir Millis oder externe Timer-RTC-Module verwenden.

    2.2: Funktion millis()

    Die Funktion millis () gibt die Anzahl der Millisekunden zurück, die vergangen sind, seit die ESP32-Karte mit der Ausführung des aktuellen Programms begonnen hat. Indem wir ein paar Codezeilen schreiben, können wir die aktuelle Zeit zu jedem Zeitpunkt leicht berechnen, während der ESP32-Code ausgeführt wird.

    Millis wird häufig dort verwendet, wo wir mehrere Aufgaben ausführen müssen, ohne den Rest des Codes zu blockieren. Hier ist die Syntax der Millis-Funktion, die zum Berechnen der verstrichenen Zeit verwendet wird, damit wir eine bestimmte Anweisung ausführen können.

    wenn ( aktuelleMillis - vorherigeMillis > = Intervall ) {
    vorherigeMillis = aktuelleMillis;
    }


    Dieser Code subtrahiert die vorherige millis() von der aktuellen millis(), wenn die subtrahierte Zeit gleich ist, um das Intervall zu definieren, in dem eine bestimmte Anweisung ausgeführt wird. Nehmen wir an, wir möchten eine LED 10 Sekunden lang blinken lassen. Nach jeweils 5 Minuten können wir das Zeitintervall auf 5 Minuten (300000 ms) einstellen. Der Code prüft jedes Mal, wenn der Code ausgeführt wird, auf das Intervall. Sobald er erreicht ist, blinkt die LED 10 Sekunden lang.

    Notiz: Hier verwenden wir die Funktion millis () für die Verbindung von ESP32 mit dem PIR-Sensor. Der Hauptgrund für die Verwendung von milli und nicht delay ist, dass die Funktion millis() den Code nicht blockiert, wie es die Funktion delay() tat. Sobald der PIR also eine Bewegung erkennt, wird ein Interrupt generiert. Die Verwendung der Funktion interrupt millis() löst die LED für eine definierte Zeit danach aus, wenn die Bewegung gestoppt wird, wird die Funktion millis() zurückgesetzt und wartet auf den nächsten Interrupt.

    Falls wir die Funktion delay() verwendet haben, wird der Code vollständig blockiert und jeder verursachte Interrupt wird von ESP32 nicht gelesen, was zum Scheitern des Projekts führt.

    3: PIR-Sensor mit ESP32 verbinden

    Hier verwenden wir die Funktion millis () im Arduino IDE-Code, da wir die LED jedes Mal auslösen möchten, wenn der PIR-Sensor eine Bewegung erkennt. Diese LED leuchtet für eine bestimmte Zeit, danach kehrt sie in den Normalzustand zurück.

    Hier ist eine Liste der Komponenten, die wir benötigen:

      • ESP32-Entwicklungsboard
      • PIR-Bewegungssensor (HC-SR501)
      • LED
      • 330 Ohm Widerstand
      • Verbindungsdrähte
      • Brotschneidebrett

    Schema für PIR-Sensor mit ESP32:


    Pin-Anschlüsse von ESP32 mit PIR-Sensor sind:

    ESP32 PIR-Sensor
    Kommen Sie Vcc
    GPIO13 AUS
    Masse Masse

    3.1: PIR-Bewegungssensor (HC-SR501)

    PIR ist ein Akronym für passiver Infrarotsensor . Es verwendet ein Paar pyroelektrischer Sensoren, die die Wärme in seiner Umgebung erkennen. Diese beiden pyroelektrischen Sensoren liegen hintereinander und wenn ein Objekt in ihren Bereich kommt, führt eine Änderung der Wärmeenergie oder die Signaldifferenz zwischen diesen beiden Sensoren dazu, dass der Ausgang des PIR-Sensors LOW ist. Sobald der PIR-Out-Pin auf LOW geht, können wir eine bestimmte Anweisung zur Ausführung einstellen.


    Im Folgenden sind die Eigenschaften des PIR-Sensors aufgeführt:

      • Die Empfindlichkeit kann abhängig vom Standort des Projekts eingestellt werden (z. B. Erkennen von Maus- oder Blattbewegungen).
      • Der PIR-Sensor kann so eingestellt werden, wie lange er ein Objekt erkennt.
      • Weit verbreitet in Haussicherheitsalarmen und anderen thermischen Bewegungserkennungsanwendungen.

    3.2: Pinbelegung HC-SR501

    PIR HC-SR501 wird mit drei Stiften geliefert. Zwei davon sind Power-Pins für Vcc und GND und einer ist der Ausgangspin für das Triggersignal.


    Im Folgenden finden Sie die Beschreibung der PIR-Sensorstifte:

    Stift Name Beschreibung
    1 Vcc Eingangsstift für Sensor Verbinden mit ESP32 Vin Pin
    zwei AUS Sensorausgang
    3 Masse Sensormasse

    3.3: Code

    Um nun ESP32 zu programmieren, schreiben Sie den angegebenen Code in den Arduino IDE-Editor und laden Sie ihn auf ESP32 hoch.

    #definiere ZeitSekunden 10
    const int led = 4 ; /* GPIO-PIN 4 definiert zum LED */
    const int PIR_Out = 13 ; /* GPIO-Pin 13 zum PIR aus */
    unsigned long Current_Time = millis ( ) ; /* Variable definiert zum Speichern von Millis-Werten */
    unsigned long Previous_Trig = 0 ;
    boolesch Starting_Time = FALSCH ;
    void IRAM_ATTR erkennt Bewegung ( ) { /* überprüfen zum Bewegung */
    Serial.println ( „BEWEGUNG ERKANNT“ ) ;
    digitalWrite ( geführt, HOCH ) ; /* LED einschalten wenn Zustand ist Stimmt */
    Startzeit = Stimmt ;
    Previous_Trig = Millisekunden ( ) ;
    }
    ungültige Einrichtung ( ) {
    Serial.begin ( 115200 ) ; /* Baudrate zum Serielle Kommunikation */
     pinMode ( PIR_Out, INPUT_PULLUP ) ; /* PIR-Bewegungssensormodus definiert */
    /* PIR ist konfiguriert in RISING-Modus, einstellen Stift für Bewegungssensor wie Ausgang */
    AttachInterrupt ( digitalPinToInterrupt ( PIR_Aus ) , erkennt Bewegung, STEIGT ) ;
     pinMode ( geführt, AUSGANG ) ; /* einstellen LED auf LOW */
    digitalWrite ( geführt, NIEDRIG ) ;
    }
    Leere Schleife ( ) {
    Aktuelle_Zeit = Millisekunden ( ) ; /* Strom speichern Zeit */
    wenn ( Anfangszeit && ( Current_Time - Previous_Trig > ( ZeitSekunden * 1000 ) ) ) { /* Zeitintervall nach die Die LED erlischt */
    Serial.println ( 'BEWEGUNG GESTOPPT' ) ; /* Druckbewegung gestoppt wenn keine Bewegung erkannt */
    digitalWrite ( geführt, NIEDRIG ) ; /* LED auf LOW stellen wenn Zustand ist FALSCH */
    Startzeit = FALSCH ;
    }
    }


    Der Code begann mit der Definition von GPIO-Pins für LED- und PIR-Ausgang. Als nächstes haben wir drei verschiedene Variablen erstellt, die helfen, die LED einzuschalten, wenn eine Bewegung erkannt wird.

    Diese drei Variablen sind Current_Time, Previous_Trig, und Anfangszeit. Diese Variablen speichern die aktuelle Zeit, die Zeit, zu der eine Bewegung erkannt wird, und den Timer, nachdem die Bewegung erkannt wurde.

    Im Einrichtungsteil haben wir zuerst die serielle Baudrate für die Kommunikation definiert. Als nächstes verwenden pinMode() Stellen Sie den PIR-Bewegungssensor als INPUT PULLUP ein. Zum Einstellen des PIR-Interrupts AttachInterrupt() wird beschrieben. GPIO 13 wird beschrieben, um Bewegungen im RISING-Modus zu erkennen.

    Als nächstes im loop()-Teil des Codes haben wir mit der millis()-Funktion die LED ein- und ausgeschaltet, wenn ein Trigger erreicht wird.

    3.4: Ausgabe

    Im Ausgabebereich können wir sehen, dass das Objekt außerhalb der Reichweite des PIR-Sensors liegt, also die LED Wird gedreht AUS .


    Jetzt dreht sich die von der PIR-Sensor-LED erkannte Bewegung AN zum 10 Sek Danach bleibt es, wenn keine Bewegung erkannt wird AUS bis der nächste Trigger empfangen wird.


    Die folgende Ausgabe wird vom seriellen Monitor in Arduino IDE angezeigt.

    Fazit

    Ein PIR-Sensor mit ESP32 kann helfen, die Bewegung von Objekten zu erkennen, die seinen Bereich passieren. Mit der Interrupt-Funktion in der ESP32-Programmierung können wir eine Antwort an einem bestimmten GPIO-Pin auslösen. Wenn eine Änderung erkannt wird, wird die Interrupt-Funktion ausgelöst und eine LED leuchtet auf.