Proyecto 28 Puerta Inteligente

1. Descripción

La puerta inteligente es un sistema de estacionamiento inteligente que integra MCU y sensor ultrasónico, el cual controla automáticamente la puerta según la distancia de los vehículos, para así controlar mejor el acceso de los autos.

Cuando se alcanza cierta distancia, la MCU recibe la señal del sensor y estima la distancia mediante la intensidad de la señal. Si el auto se está acercando o alejando, la MCU abrirá o cerrará la puerta mediante un servo.

2. Diagrama de Flujo

3. Diagrama de Conexiones

4. Código de Prueba

/*
  keyestudio ESP32 Inventor Learning Kit  
  Project 28 Intelligent Gate
  http://www.keyestudio.com
*/
#define servo_pin  25
int distance = 0; //Define una variable para recibir la distancia
int EchoPin = 14; //Conectar pin Echo a IO14
int TrigPin = 13; //Conectar pin Trig a IO13

//Programa de medición ultrasónica
float checkdistance() { //Adquirir distancia
  //mantener un nivel bajo corto para asegurar un pulso alto claro:
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  //Disparar el sensor con un pulso alto de 10us o más
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  //Leer la señal del sensor: un pulso de nivel alto
  //La duración se detecta desde el envío del comando "ping" hasta la recepción del eco (unidad: us).
  float distance = pulseIn(EchoPin, HIGH) / 58.00;  //Convertir a distancia
  delay(10);
  return distance;
}

//Programa de rotación del servo
void Set_Angle(int angle_val) //Función de impulso
{ 
  int pulsewidth = map(angle_val, 0, 180, 500, 2500); //Mapear ángulo a ancho de pulso
  for (int i = 0; i < 10; i++) { //Emitir algunos pulsos más
    digitalWrite(servo_pin, HIGH);//Poner el nivel del pin del servo en alto
    delayMicroseconds(pulsewidth);//Número de microsegundos del ancho de pulso
    digitalWrite(servo_pin, LOW);//Bajar el nivel del pin del servo
    delay(20 - pulsewidth / 1000);  //Agregar el paréntesis
  }
} 

void setup() 
{
  // coloca tu código de configuración aquí, para que se ejecute una vez:
  pinMode(servo_pin,OUTPUT);
  pinMode(TrigPin, OUTPUT);//Configurar pin Trig como salida
  pinMode(EchoPin, INPUT);  //Configurar pin Echo como entrada
}

void loop() 
{
  // coloca tu código principal aquí, para que se ejecute repetidamente:
 distance = checkdistance();
 Serial.println();
  if(distance < 30)
  {
    Set_Angle(180);
    delay(5000);//Esperar 5s   
  }
  if(distance > 30)
  {
    Set_Angle(0);
  }
}

5. Resultado de la Prueba

Después de conectar el cableado y subir el código, el servo girará a 180° durante 5s si la distancia detectada es menor a 30cm. Por el contrario, el servo girará a 0°.