Sensor de movimiento PIR con ESP32 o ESP8266 para Alexa: HC-SR501, HC-SR505, AM312

En esta sección veremos cómo crear un sensor de movimiento PIR con ESP32, ESP8266 o Raspberry Pi Pico W y cómo ver después los cambios de movimiento a través de Alexa o SmartThings.

Requisitos previos :

  1. ESP32, ESP8266 o Raspberry Pi Pico W x 1.
  2. HC-SR501, HC-SR505, Mini AM312, HC-SR312 x 1.
  3. Cables puente.
PIR Tensión de trabajo Tiempo de retardo Tiempo de bloqueo Activación Distancia
HC-SR312 2,7-12V 2 segundos 2 segundos Repetible 3-5 metros
HC-SR505 4,5-20V 2 segundos 2 segundos Repetible 3 metros
HC-SR501 4,5-20V Ajustable Ajustable Ajustable 3 a 7 metros

HC-SR501 vs HC-SR505 vs AM312 (HC-SR312): ¿cuál elegir?

El HC-SR312 es el módulo PIR mini construido alrededor del sensor AM312, así que los dos nombres se refieren a la misma pieza.

Los tres tienen los mismos tres pines: VCC, OUT y GND. El orden de los pines es distinto en cada módulo, así que revisa las etiquetas de la placa antes de cablear. El mismo código funciona para los tres.

Introducción rápida a los sensores de movimiento PIR

Los sensores de movimiento de infrarrojo pasivo (PIR) detectan la presencia de personas o animales midiendo cambios en la radiación infrarroja. Los sensores PIR funcionan detectando la radiación infrarroja emitida por todos los objetos con una temperatura por encima del cero absoluto. Cuando una persona o animal se mueve dentro del campo de visión de un sensor PIR, el sensor detecta un cambio en la cantidad de radiación infrarroja y activa una alarma u otra salida. Los sensores PIR son una forma versátil y económica de detectar movimiento. Son fáciles de usar y se pueden instalar en una gran variedad de ubicaciones.

La salida del sensor de movimiento PIR es:

Para obtener mediciones precisas, espera a que el sensor PIR se calibre correctamente; esto suele tardar entre 10 y 60 segundos después de encenderlo.

El HC-SR501 tiene configuraciones ajustables:

Sinric Pro esp8266 HC-SR501

Ajuste de sensibilidad
Ajuste del tiempo de retardo
Selección con jumper

Ejemplo: el tiempo de retardo del detector de movimiento está fijado en 3 segundos, pero no puede detectar movimiento durante unos 6 segundos después de detectar un movimiento.

Sinric Pro esp8266 PIR Single Trigger Mode

Ejemplo: el tiempo de retardo es de 3 segundos. Tras detectarse movimiento, el periodo de tiempo de retardo se reinicia. Sin embargo, la detección sigue bloqueada durante 3 segundos después de que expire el tiempo de retardo. Este retardo de 3 segundos permite que el sensor descanse antes de volver a empezar a detectar movimiento.

Sinric Pro esp8266 PIR Multiple Trigger Mode

Cableado

Sinric Pro esp8266 PIR wiring

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

Vamos a comprobar que el sensor de movimiento está bien cableado y funciona.

#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);
}

Ver este código en GitHub Gist

El Monitor Serie de Arduino IDE mostrará las detecciones de movimiento así:

Paso 1 : Crea un nuevo dispositivo en Sinric Pro

Sinric Pro create device alexa

Sinric Pro motion sensor device notifications

Aquí puedes establecer el umbral para recibir una notificación push a través de la app de Sinric Pro cuando se detecte movimiento de Día o de Noche. Usa el Retrigger Time para fijar el retardo entre notificaciones push.

Sinric Pro copy device id

Paso 2 : Conéctate a Sinric Pro

Paso 2.1 Instala la librería Sinric Pro

Sinric Pro install SinricPro library

Puedes generar el código usando la función Zero Code o escribirlo tú mismo. Si no tienes experiencia programando, te recomendamos usar la función Zero Code en el Portal para generar el código, descargarlo y flashearlo.

2.2 Código completo

// 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();
}

Ver este código en GitHub Gist

Ahora deberías poder ver los movimientos a través de Alexa, SmartThings

Sinric Pro motions via Alexa, SmartThings

a través del Portal

Sinric Pro Portal motion sensor

Ten en cuenta que Google Home no es compatible.

Solución de problemas

  1. Consulta nuestra página de Solución de problemas para más detalles.

Tutoriales relacionados

Este documento es de código abierto. ¿Ves un error? Por favor, crea un issue