PIR-Bewegungsmelder mit ESP32 oder ESP8266 für Alexa: HC-SR501, HC-SR505, AM312

In diesem Abschnitt bauen wir einen PIR-Bewegungsmelder mit ESP32, ESP8266 oder Raspberry Pi Pico W und zeigen anschließend die Bewegungsänderungen über Alexa oder SmartThings an.

Voraussetzungen :

  1. ESP32, ESP8266 oder Raspberry Pi Pico W x 1.
  2. HC-SR501, HC-SR505, Mini AM312, HC-SR312 x 1.
  3. Jumperkabel.
PIR Betriebsspannung Verzögerungszeit Sperrzeit Auslösung Reichweite
HC-SR312 2,7-12V 2 Sekunden 2 Sekunden Wiederholbar 3-5 Meter
HC-SR505 4,5-20V 2 Sekunden 2 Sekunden Wiederholbar 3 Meter
HC-SR501 4,5-20V Einstellbar Einstellbar Einstellbar 3 Meter bis 7 Meter

HC-SR501 vs. HC-SR505 vs. AM312 (HC-SR312): Welches Modul wählen?

Der HC-SR312 ist das Mini-PIR-Modul rund um den AM312-Sensor, die beiden Namen bezeichnen also dasselbe Bauteil.

Alle drei haben die gleichen drei Pins: VCC, OUT und GND. Die Pin-Reihenfolge unterscheidet sich je Modul, prüfe daher vor der Verdrahtung die Beschriftung auf der Platine. Für alle funktioniert der gleiche Code.

Kurze Einführung zu PIR-Bewegungsmeldern

Passive Infrarot (PIR) Bewegungsmelder erkennen die Anwesenheit von Menschen oder Tieren, indem sie Änderungen der Infrarotstrahlung messen. PIR-Sensoren funktionieren, indem sie die Infrarotstrahlung erfassen, die alle Objekte mit einer Temperatur über dem absoluten Nullpunkt abgeben. Bewegt sich eine Person oder ein Tier in den Erfassungsbereich eines PIR-Sensors, registriert der Sensor eine Änderung der Infrarotstrahlung und löst einen Alarm oder eine andere Ausgabe aus. PIR-Sensoren sind eine vielseitige und kostengünstige Möglichkeit, Bewegung zu erkennen. Sie sind einfach zu nutzen und lassen sich an verschiedensten Orten einbauen.

Der Ausgang des PIR-Bewegungsmelders ist:

Für genaue Messungen solltest du abwarten, bis sich der PIR-Sensor richtig kalibriert hat; das dauert normalerweise 10 bis 60 Sekunden nach dem Einschalten.

Der HC-SR501 hat einstellbare Konfigurationen:

Sinric Pro esp8266 HC-SR501

Empfindlichkeitseinstellung
Zeitverzögerungseinstellung
Jumper-Einstellung

Beispiel: Die Verzögerungszeit des Bewegungsmelders ist auf 3 Sekunden eingestellt, aber er kann für etwa 6 Sekunden nach einer erkannten Bewegung keine weitere Bewegung erkennen.

Sinric Pro esp8266 PIR Single Trigger Mode

Beispiel: Die Verzögerungszeit beträgt 3 Sekunden. Nach einer erkannten Bewegung beginnt die Verzögerungszeit erneut. Nach Ablauf der Verzögerungszeit ist die Erkennung jedoch weiterhin für 3 Sekunden blockiert. Diese 3-sekündige Verzögerung lässt dem Sensor Zeit, sich zu „erholen“, bevor er wieder Bewegungen erkennt.

Sinric Pro esp8266 PIR Multiple Trigger Mode

Verdrahtung

Sinric Pro esp8266 PIR wiring

MCU PIR Pin
ESP32 16
ESP8266 5 (D1)
Pico W GP5

Lass uns prüfen, ob der Bewegungsmelder korrekt verdrahtet ist und funktioniert.

#if defined(ESP8266)
  #define SENSOR_PIN        D1
#elif defined(ESP32) 
  #define SENSOR_PIN        26
#elif (ARDUINO_ARCH_RP2040)
  #define SENSOR_PIN        5
#endif

int newState;
int oldState;

void setup() {
  Serial.begin(9600);
  pinMode(SENSOR_PIN, INPUT);
  
  Serial.printf("Wait 10 secs for the PIR sensor to calibrate properly\r\n");
  delay(1000 * 10);
  oldState = digitalRead(SENSOR_PIN); // read the starting state
}

void loop() {
  newState = digitalRead(SENSOR_PIN); // read current state

  if(oldState != newState) {
    if (newState == HIGH) {
      Serial.println("Movement detected!");
    } else {
      Serial.println("Movement not detected!");
    }
    oldState = newState;
  }  
   delay(100);
}

Diesen Code auf GitHub Gist ansehen

Der Serial Monitor der Arduino IDE zeigt die Bewegungserkennungen so an:

Schritt 1 : Neues Gerät in Sinric Pro anlegen

Sinric Pro create device alexa

Sinric Pro motion sensor device notifications

Hier kannst du die Schwellenwerte festlegen, um eine Push-Benachrichtigung über die Sinric Pro App zu erhalten, wenn tagsüber (Daytime) oder nachts (Nighttime) eine Bewegung erkannt wird. Mit der Retrigger Time legst du die Verzögerung zwischen den Push-Benachrichtigungen fest.

Sinric Pro copy device id

Schritt 2 : Mit Sinric Pro verbinden

Schritt 2.1 Sinric Pro Bibliothek installieren

Sinric Pro install SinricPro library

Du kannst den Code generieren über die Funktion Zero Code oder ihn selbst schreiben. Wenn du keine Programmiererfahrung hast, empfehlen wir die Zero Code Funktion im Portal zu nutzen, um den Code zu erzeugen, herunterzuladen und zu flashen.

2.2 Vollständiger Code

// Uncomment the following line to enable serial debug output
//#define ENABLE_DEBUG

#ifdef ENABLE_DEBUG
  #define DEBUG_ESP_PORT Serial
  #define NODEBUG_WEBSOCKETS
  #define NDEBUG
#endif 

#include <Arduino.h>
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
#elif defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
  #include <WiFi.h>
#endif

#include "SinricPro.h"
#include "SinricProMotionsensor.h" 

#define WIFI_SSID         ""   // Your WiFI SSID name 
#define WIFI_PASS         ""   // Your WiFi Password.
#define APP_KEY           ""   // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" (Get it from Portal -> Secrets)
#define APP_SECRET        ""   // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" (Get it from Portal -> Secrets)
#define MOTION_SENSOR_ID  ""   // Should look like "5dc1564130xxxxxxxxxxxxxx" (Get it from Portal -> Devices)
#define BAUD_RATE         115200              // Change baudrate to your need (used for serial monitor)
 
#if defined(ESP8266)
  #define SENSOR_PIN        D1
#elif defined(ESP32) 
  #define SENSOR_PIN        26
#elif (ARDUINO_ARCH_RP2040)
  #define SENSOR_PIN        5
#endif 

int newState;
int oldState;

void handleMotionSensor() {
  newState = digitalRead(SENSOR_PIN); // read current state

  if(oldState != newState) {
    if (newState == HIGH) {
      Serial.println("Movement detected!");
    } else {
      Serial.println("Movement not detected!");
    }

    // newState == true (HIGH) : if motion has been detected 
    // newState == false (LOW): if no motion has been detected

    SinricProMotionsensor &myMotionsensor = SinricPro[MOTION_SENSOR_ID]; // get motion sensor device
    myMotionsensor.sendMotionEvent(newState);

    oldState = newState;
  }
}


// setup function for WiFi connection
void setupWiFi() {
  Serial.printf("\r\n[Wifi]: Connecting");

  #if defined(ESP8266)
    WiFi.setSleepMode(WIFI_NONE_SLEEP); 
    WiFi.setAutoReconnect(true);
  #elif defined(ESP32)
    WiFi.setSleep(false); 
    WiFi.setAutoReconnect(true);
  #endif

  WiFi.begin(WIFI_SSID, WIFI_PASS); 

  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf(".");
    delay(250);
  }
  IPAddress localIP = WiFi.localIP();
  Serial.printf("connected!\r\n[WiFi]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}
 
// setup function for SinricPro
void setupSinricPro() {
  // add device to SinricPro
  SinricProMotionsensor &mySensor = SinricPro[MOTION_SENSOR_ID];
   
  // setup SinricPro
  SinricPro.onConnected([](){ Serial.printf("Connected to SinricPro\r\n"); }); 
  SinricPro.onDisconnected([](){ Serial.printf("Disconnected from SinricPro\r\n"); });
  //SinricPro.restoreDeviceStates(true); // Uncomment to restore the last known state from the server.
  SinricPro.begin(APP_KEY, APP_SECRET);  
}

void setupMotionSensor() {
  pinMode(SENSOR_PIN, INPUT);
  Serial.printf("Wait 10 secs for the PIR sensor to calibrate properly\r\n");
  delay(1000 * 10);  
}

// main setup function
void setup() {
  Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n");
  
  setupMotionSensor();
  setupWiFi();
  setupSinricPro();
}

void loop() {
  SinricPro.handle();
  handleMotionSensor();
}

Diesen Code auf GitHub Gist ansehen

Jetzt solltest du die Bewegungen über Alexa, SmartThings ansehen können

Sinric Pro motions via Alexa, SmartThings

über das Portal

Sinric Pro Portal motion sensor

Bitte beachte, dass Google Home nicht unterstützt wird.

Fehlerbehebung

  1. Weitere Informationen findest du auf unserer Seite Fehlerbehebung.

Verwandte Tutorials

Dieses Dokument ist Open Source. Hast du einen Tippfehler gefunden? Erstelle bitte ein Issue