Esptop 10 con sensor de movimiento PIR usando interrupciones y temporizadores - Arduino IDE

Esptop 10 con sensor de movimiento PIR usando interrupciones y temporizadores - Arduino IDE

ESP32 es una placa de microcontrolador basada en IoT que se puede usar para interactuar, controlar y leer diferentes sensores. PIR o sensor de movimiento es uno de los dispositivos que podemos interactuar con ESP32 para detectar el movimiento de un objeto en el rango de sensor de movimiento usando ESP32.

Antes de comenzar a interactuar ESP32 con el sensor PIR, debemos saber cómo funcionan las interrupciones y cómo leerlas y manejarlas en ESP32. A continuación, debemos comprender el concepto central de la función de demora () y Millis () en la programación ESP32.

Discutamos el funcionamiento de PIR con ESP32 en detalle.

Aquí está el contenido de este artículo:

  1. ¿Qué son las interrupciones?
    • 1.1: interrumpe los pines en ESP32
    • 1.2: Cómo llamar a una interrupción en ESP32
  2. Temporizadores en la programación ESP32
    • 2.1: función de retraso ()
    • 2.2: función Millis ()
  3. Sensor PIR de interfaz con ESP32
    • 3.1: Sensor de movimiento PIR (HC-SR501)
    • 3.2: Pinout HC-SR501
    • 3.3: código
    • 3.4: salida

1: ¿Qué son las interrupciones?

La mayoría de los eventos que ocurren en la programación ESP32 se ejecutan secuencialmente, lo que significa la ejecución de línea de línea de línea. Para manejar y controlar los eventos que no necesitan ejecutarse durante la ejecución secuencial del código y Interrupciones son usados.

Por ejemplo, si queremos ejecutar una determinada tarea cuando ocurre cualquier evento especial, o se da una señal de activación a los pines digitales del microcontrolador que utilizamos interrupción.


Con la interrupción no necesitamos verificar continuamente el estado digital del pin de entrada ESP32. Cuando se produce una interrupción, el procesador detiene el programa principal y se llama una nueva función que se conoce como ISR (Rutina de servicio de interrupción). Este ISR La función maneja la interrupción causada después de que regrese al programa principal y comience a ejecutarla. Uno de los ejemplos de ISR es Sensor de movimiento de PIR cual genera una interrupción una vez que se detecta el movimiento.

1: interrumpe los pines en ESP32

Una interrupción externa o de hardware puede ser causada por cualquier módulo de hardware, como el sensor táctil o el botón PUSH. Las interrupciones táctil ocurren cuando se detecta un toque en pines ESP32 o la interrupción de GPIO también se puede usar cuando se presiona una llave o botón Push.

En este artículo activaremos una interrupción cuando se detecte el movimiento utilizando el sensor PIR con ESP32.

Casi todos los pines GPIO, excepto 6 pines integrados SPI que generalmente vienen en el 36-La versión PIN de la placa ESP32 no se puede utilizar con el fin de interrumpir. Por lo tanto, para recibir la interrupción externa a continuación son los pines resaltados en color púrpura que uno puede usar en ESP32:

Esta imagen es de un 30 pin ESP32.

2: Llamar a una interrupción en ESP32

Para usar la interrupción en ESP32 podemos llamar Adjuntarinterrupt () función.

Esta función acepta seguir tres argumentos:

    • Pasador de gpio
    • Función a ejecutar
    • Modo
adjuntarinterrupts (digitalpintointerrupt (GPIO), función, modo);


1: GPIO El pin es el primer argumento llamado dentro del Adjuntarinterrupt () función. Por ejemplo, para usar el pin 12 digital como fuente de interrupción, podemos llamarlo usando DigitalPintoInterrupts (12) función.

2: función Para ser ejecutado es el programa ejecutado cada vez una vez que la interrupción es alcanzada o activada por una fuente externa o interna. Puede ser parpadeando un LED o girar una alarma de incendio.

3: modo es el tercer y último argumento que necesita la función de interrupción. Describe cuándo activar la interrupción. Los siguientes son los modos se pueden usar:

    • Bajo: Activar la interrupción cada vez que el pin GPIO definido es bajo.
    • Alto: Activar la interrupción cada vez que el pasador GPIO definido es alto.
    • Cambiar: Interrupción de activación cada vez que el PIN GPIO cambia su valor de alto a bajo o viceversa.
    • Descendente: Es el modo para activar una interrupción cuando un determinado pin comienza a caer de un estado alto a bajo.
    • Creciente: Es el modo para activar una interrupción cuando un determinado PIN comienza a aumentar de bajo estado a alto.

Hoy estaremos usando Creciente El modo como tercer argumento para la función de interrupción siempre que el sensor PIR detecta el LED o el sensor de interrupción se iluminarán porque va de bajo estado a alto.

2: Temporizadores en la programación ESP32

Los temporizadores en la programación de microcontroladores juegan un papel importante para ejecutar instrucciones para un período de temporizador específico o en un caso específico de tiempo.

Dos funciones principales comúnmente utilizadas para activar la salida son demora() y milis (). La diferencia entre ambos como la función de retraso () detiene el resto del programa una vez que comienza a ejecutar mientras Millis () se ejecuta durante el período de tiempo definido, entonces el programa se remonta a las funciones principales.

Aquí usaremos un LED con sensor PIR y no queremos brillarlo continuamente después de que se desencadene una interrupción. Usaremos la función Millis () que nos permite brillarlo durante un tiempo definido y luego volverá al programa original una vez que pase la marca de tiempo.

1: función de retraso ()

La función de demora () es bastante simple, solo se requiere un argumento que es EM del tipo de datos largo sin firmar. Este argumento representa el tiempo en milisegundos que queremos detener el programa hasta que se mueva a la siguiente línea.

Por ejemplo, la siguiente función detendrá el programa para 1 segundo.

retraso (1000)


Delay () es un tipo de función de bloqueo para la programación de microcontroladores. retraso () bloquea el resto del código para ejecutar hasta que esta función en particular los tiempos no se completen. Si queremos ejecutar múltiples instrucciones, debemos evitar usar funciones de retraso en su lugar, podemos usar milis o módulos RTC de temporizador externo.

2: función Millis ()

La función Millis () devuelve el número de milisegundos aprobados desde que la junta ESP32 comenzó a ejecutar el programa actual. Al escribir algunas líneas de código, podemos calcular fácilmente la hora actual en cualquier caso mientras ejecutamos el código ESP32.

Millis se usa ampliamente donde necesitamos ejecutar múltiples tareas sin bloquear el resto del código. Aquí está la sintaxis de la función Millis utilizada para calcular cuánto tiempo pasa para que podamos ejecutar una instrucción específica.

if (currentMillis - anteriorMillis> = interval)
Anteriormillis = CurrentMillis;


Este código resta el milis anterior () de la actual Millis () si el tiempo restado es igual a definir el intervalo se ejecutará una instrucción específica. Digamos que queremos parpadear un LED por 10 segundos. Después de cada 5 minutos, podemos establecer el intervalo de tiempo igual a 5 minutos (300000 ms). El código verificará el intervalo cada vez que se ejecute el código, una vez que alcance, parpadeará el LED durante 10 segundos.

Nota: Aquí usaremos la función Millis () para interfactar ESP32 con el sensor PIR. La razón principal detrás de usar mili y no retrasar es que la función Millis () no bloquea el código como lo hizo la función de retraso (). Entonces, una vez que el PIR detecta el movimiento, se generará una interrupción. El uso de la función Interrupt Millis () activará el LED durante un tiempo definido después de eso si el movimiento se detiene la función Millis () se restablecerá y esperará la próxima interrupción.

En caso de que si usamos la función de retraso (), bloqueará completamente el código y cualquier interrupción causada no será leída por ESP32, lo que resulta en la falla del proyecto.

3: Sensor PIR de interfaz con ESP32

Aquí usaremos la función Millis () en el código IDE Arduino porque queremos activar el LED cada vez que el sensor PIR detecta algo de movimiento. Este LED brillará durante un tiempo establecido después de eso, volverá a la condición normal.

Aquí hay una lista de componentes que seremos requeridos:

    • Junta de Desarrollo ESP32
    • Sensor de movimiento PIR (HC-SR501)
    • CONDUJO
    • Resistencia de 330 ohmios
    • Conectando cables
    • Tablero de circuitos

Esquemático Para el sensor PIR con ESP32:


Las conexiones PIN de ESP32 con el sensor PIR son:

ESP32 Sensor PIR
Empuje VCC
GPIO13 AFUERA
Gnd Gnd

1: Sensor de movimiento PIR (HC-SR501)

PIR es un acrónimo de sensor infrarrojo pasivo. Utiliza un par de sensores piroeléctricos que detectan el calor alrededor de sus alrededores. Ambos sensores piroeléctricos se encuentran uno tras otro y cuando un objeto entra dentro de su rango, un cambio en la energía térmica o la diferencia de señal entre ambos sensores hace que la salida del sensor PIR sea baja. Una vez que el PIN de PIR se baja, podemos establecer una instrucción específica para ejecutar.


Las siguientes son las características del sensor PIR:

    • La sensibilidad se puede establecer dependiendo de la ubicación del proyecto (como la detección del movimiento del mouse o la hoja).
    • El sensor PIR se puede configurar para cuánto tiempo detecta un objeto.
    • Ampliamente utilizado en alarmas de seguridad del hogar y otras aplicaciones de detección de movimiento basadas en térmicas.

2: Pinout HC-SR501

PIR HC-SR501 viene con tres alfileres. Dos de ellos son pines de potencia para VCC y GND y uno es el pin de salida para la señal de activación.


La siguiente es la descripción de PIR Sensor Pins:

Alfiler Nombre Descripción
1 VCC Pin de entrada para el sensor Conectar al pin ESP32 VIN
2 AFUERA Salida del sensor
3 Gnd Sensor GND

3: código

Ahora para programar ESP32 escriba el código dado en el editor de Arduino IDE y lo cargue a ESP32.

#Define Timeseconds 10
const int led = 4; /*GPIO Pin 4 definido para LED*/
const int pir_out = 13; /*GPIO Pin 13 para Pir Out*/
Unsigned Long Current_time = Millis (); /*variable definida para almacenar valores de milis*/
Unsigned Long Anterior_trig = 0;
boolean starting_time = false;
void iram_attr detectSmovement () /*verificar el movimiento* /
De serie.println ("Detectado de movimiento");
DigitalWrite (LED, alto); /*Activar LED si la condición es verdadera*/
Starting_time = true;
Anterior_trig = millis ();

setup () void
De serie.comenzar (115200); /*Tasa de baudios para la comunicación en serie*/
PinMode (PIR_OUT, Input_PullUp); /*Modo del sensor de movimiento PIR definido*/
/*PIR está configurado en modo Rising, configure el pin del sensor de movimiento como salida*/
Adjunteinterrupt (digitalPintointerrupt (PIR_OUT), DetectSmovement, Rising);
PinMode (LED, salida); /*establecer LED a Low*/
DigitalWrite (LED, bajo);

bucle void ()
Current_time = millis (); /*Almacene la hora actual*/
if (start_time && (current_time - anterior_trig> (Timeseconds*1000)))) /*intervalo de tiempo después del cual LED se apagará* /
De serie.println ("Movimiento detenido"); /*Imprime el movimiento detenido si no se detecta el movimiento*/
DigitalWrite (LED, bajo); /*Establecer LED a bajo si la condición es falsa*/
Starting_time = false;


El código iniciado definiendo pines GPIO para la salida LED y PIR. A continuación, creamos tres variables diferentes que ayudarán a activar el LED cuando se detecte el movimiento.

Estas tres variables son Actual_time, anterior_trig, y Tiempo de empezar. Estas variables almacenarán el tiempo actual, el tiempo en el que se detecta el movimiento y el temporizador después de que se detecte el movimiento.

En la parte de configuración primero, definimos la tasa de baudios en serie para la comunicación. Siguiente usando PinMode () Establezca el sensor de movimiento PIR como pullup de entrada. Para establecer la interrupción del PIR Adjuntarinterrupt () es descrito. GPIO 13 se describe para detectar el movimiento en modo ascendente.

Siguiente en la parte bucle () del código, usando la función Millis (), activamos y apagamos el LED cuando se logra un disparador.

4: salida

En la sección de salida podemos ver que el objeto está fuera del alcance del sensor PIR, por lo que el CONDUJO se vuelve APAGADO.


Ahora el movimiento detectado por el LED del sensor PIR girará EN para 10 segundo Después de eso, si no se detecta ningún movimiento, permanecerá APAGADO Hasta que se reciba el siguiente gatillo.


La siguiente salida se muestra mediante el monitor serial en Arduino IDE.

Conclusión

Un sensor PIR con ESP32 puede ayudar a detectar el movimiento de los objetos que pasan por su rango. Usando la función de interrupción en la programación ESP32, podemos activar una respuesta en un pin GPIO específico. Cuando se detecte el cambio, se activará la función de interrupción y se encenderá un LED.