7. Puerta con Límite de Acceso

En algunas situaciones, como en los estacionamientos, es necesario gestionar la cantidad de vehículos.

Aquí creamos una puerta inteligente: se utiliza un servo como la puerta, y un detector de obstáculos IR se coloca frente a ella; si se detecta un objeto (como un coche), la puerta se abrirá y el número se incrementará en 1. El conteo se muestra con un display de 7 segmentos y también se sube a Blynk Cloud para que puedas verlo de forma remota. Finalmente, Blynk tiene un widget de Interruptor para habilitar o deshabilitar este sistema de puerta inteligente.

Componentes Necesarios

Para este proyecto, necesitamos los siguientes componentes.

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN AL COMPONENTE

ENLACE DE COMPRA

Placa SunFounder R3

BUY

Protoboard

BUY

Módulo ESP8266

BUY

Cables Puente

BUY

Resistencia

BUY

Servo

BUY

Módulo de Evitación de Obstáculos

BUY

Display de 7 Segmentos

BUY

74HC595

BUY

1. Construir el Circuito

Nota

El módulo ESP8266 requiere una alta corriente para proporcionar un entorno operativo estable, así que asegúrate de que la batería de 9V esté conectada.

../_images/wiring_servo_segment.jpg

2. Editar el Tablero de Control

  1. Para registrar el número, crea un Datastream de tipo Virtual Pin en la página de Datastream. Configura el TIPO DE DATO a Integer y el MIN y MAX a 0 y 10.

    ../_images/sp220610_165328.png
  2. Ahora ve a la página de Wed Dashboard, arrastra un widget Switch para configurar su flujo de datos a V0 y un widget Label para configurar su flujo de datos a V8.

    ../_images/sp220610_165548.png

3. Ejecutar el Código

  1. Abre el archivo 7.current_limiting_gate.ino en la ruta 3in1-kit\iot_project\7.current_limiting_gate, o copia este código en Arduino IDE.

  2. Reemplaza el Template ID, Device Name y Auth Token con los tuyos. También necesitas ingresar el ssid y password del WiFi que estás utilizando. Para tutoriales detallados, consulta 1.4 Conectando la placa R3 a Blynk.

  3. Tras seleccionar la placa y puerto correctos, haz clic en el botón Upoad.

  4. Abre el monitor Serial(configura la tasa de baudios a 115200) y espera un aviso como una conexión exitosa.

    ../_images/2_ready.png

    Nota

    Si aparece el mensaje ESP is not responding al conectar, sigue estos pasos.

    • Asegúrate de que la batería de 9V esté conectada.

    • Restablece el módulo ESP8266 conectando el pin RST a GND durante 1 segundo, luego desenchúfalo.

    • Presiona el botón de reset en la placa R3.

    A veces, puede ser necesario repetir la operación anterior 3-5 veces, por favor ten paciencia.

  5. Ahora haz clic en el widget de Control de Botón en Blynk para activar el sistema de puerta inteligente. Si el módulo de evitación de obstáculos IR detecta un obstáculo, la puerta se abrirá y el display de 7 segmentos y el widget de Conteo en Blynk se incrementarán en 1.

    ../_images/sp220610_165548.png
  6. Si quieres usar Blynk en dispositivos móviles, consulta ¿Cómo usar Blynk en dispositivos móviles?.

    ../_images/mobile_gate.jpg

¿Cómo funciona?

La función BLYNK_WRITE(V0) obtiene el estado del widget Switch y lo asigna a la variable doorFlag, que se usará para determinar si el sistema de puerta inteligente está habilitado o no.

BLYNK_WRITE(V0)
{
    doorFlag = param.asInt(); // Enable Gate
}

En el Temporizador de Blynk, doorFlag se evalúa cada segundo y si está habilitado, se ejecuta la función principal de la puerta.

void myTimerEvent()
{
    if (doorFlag)
    {
        channelEntrance();
    }
}

La función principal de la puerta es channelEntrance(). Cuando un objeto se acerca a la puerta (el sensor detecta que hay un obstáculo), el count se incrementa en 1. Escribe count en el flujo de datos V8 de Blynk Cloud y en el display de 7 segmentos del circuito, y abre la puerta. Si el objeto pasa de estar presente a ausente, lo que significa que ha entrado por la puerta, cierra la puerta.

void channelEntrance()
{
    int currentState = digitalRead(irPin); // 0:obstacle 1:no-obstacle
    if (currentState == 0 && lastState == 1) {
        count=(count+1)%10;
        Blynk.virtualWrite(V8, count);
        showNumber(count);
        operateGate(true);
    } else if ((currentState == 1 && lastState == 0)) {
        operateGate(false);
    }
    lastState = currentState;
}

La función showNumber(int num) se usa para que el display de 7 segmentos muestre el valor.

void showNumber(int num)
{
    digitalWrite(STcp, LOW); //ground ST_CP and hold low for as long as you are transmitting
    shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
    digitalWrite(STcp, HIGH); //pull the ST_CPST_CP to save the data
}

La función operateGate(bool openGate) abre lentamente la puerta cuando la referencia es True, y cierra lentamente la puerta cuando la referencia es False.

void operateGate(bool openGate) {
    if (openGate == true)
    {
        // open gate
        while (angle <= 90) {
        angle++;
        myservo.write(angle);
        delay(5);
        }
    } else {
        // close gate
        while (angle >= 0){
        angle--;
        myservo.write(angle);
        delay(5);
        }
    }
}