Interrupción externa a traves de Blynk&Esp32

En este ejemplo sencillo vamos a transformar una interrupción externa que originalmente era disparada a traves de un botón conectado a una GPIO, por un botón virtual disparado a traves de Blynk.



BLYNK_WRITE(V20){
   virtualSensor=param.asInt(); 
  }

Este botón escogido es el pin virtual V20 al que hemos asignado la variable entera “int virtualSensor=1;” .La hemos declarado igual a 1 porque vamos a definir el disparo como FALLING, de esta forma el boton widget de la app estara en reposo con valor 1 y al pulsar pasara a valor 0, entonces



attachInterrupt(digitalPinToInterrupt(virtualSensor), isr, FALLING);

Así quedara el lazo principal:

delay(1);  
 Blynk.run();

if (virtualSensor==0){
  Serial.println("Sensor remoto activado ");
  delay(100); 
 
}

  if (trigger   ) { //  decir if (trigger) es igual que if (trigger = true)
           Serial.println("movimiento completo de servo en 10 segundos");
    for (t=0;t<=10;t+=1){
    Serial.println(t);
    delay(1000);
    }
      for (pos15 = 0; pos15 <= 180; pos15 += 1) {
        // in steps of 1 degree
        servo_15.write(pos15);
        delay(28);
      }
      for (pos15 = 180; pos15 >= 0; pos15 -= 1) {
        servo_15.write(pos15);
        delay(28);
      }

      trigger = false;
    }
}

¿Por qué he puesto un delay(1)?. Es necesario para que no se resetee la placa,puesto que el bucle sin disparo no tiene ninguna instrucción para hacer algo,lo que provoca su reset.

He monitorizado a traves del puerto serie el orden de los sucesos desde que se dispara el sensor. Primero nos avisa de que se ha activado el sensor, segundo ,la función iser entra en acción y activo un contador de 10 segundos para a continuación mover un servo su sector maximo de ida y vuelta.

Como toda interrupción, durante el manejo de la misma (esperar 10 seg y mover servo) el resto del void loop() quedará interrumpido, que en nuestro caso se traduce en la interrupción de “Blynk.run()” y su efecto será la desconexión wifi de la placa, pero una vez terminado volvera a conectarse otra vez.

Sketch completo.


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char auth[] = "BTin_YrvjD8lVjNed63pXa1r3btFAV-C";

char ssid[] = "xxxxxx";
char pass[] = "xxxxxxxx";
#include <Servo.h>

Servo servo_15;  // create servo object to control a servo

int pos15;
 
 int virtualSensor=1;

volatile boolean trigger = false;
int t;

void IRAM_ATTR isr() {

  trigger = true;
 
}

 BLYNK_WRITE(V20){
   virtualSensor=param.asInt(); 
  }

void setup() {
  Serial.begin(115200);
  servo_15.attach(15);
  pos15 = 0;
  servo_15.write(pos15);

  
 Blynk.begin(auth, ssid, pass);
attachInterrupt(digitalPinToInterrupt(virtualSensor), isr, FALLING);

}

void loop() {
 delay(1);
 Blynk.run();

if (virtualSensor==0){
  Serial.println("Sensor remoto activado ");
  delay(100); 
 
}

  if (trigger   ) { //  decir if (trigger) es igual que if (trigger = true)
           Serial.println("movimiento completo de servo en 10 segundos");
    for (t=0;t<=10;t+=1){
    Serial.println(t);
    delay(1000);
    }
      for (pos15 = 0; pos15 <= 180; pos15 += 1) {
        // in steps of 1 degree
        servo_15.write(pos15);
        delay(28);
      }
      for (pos15 = 180; pos15 >= 0; pos15 -= 1) {
        servo_15.write(pos15);
        delay(28);
      }

      trigger = false;
    }
}
 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »