#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
HTTPClient http;
Servo servo;
// Datos para la conexión wifi
#define ssid "Wokwi-GUEST"
#define password ""
//Url a la api donde subiremos el uuid
#define apiUrl "https://6532f899-586a-454e-ab9e-1f89e78767e5-00-6ynbn5jm5uy1.picard.replit.dev:3001/register"
//Pines a utilizar
#define pirPin 2
#define buzzerPin 4
#define btnPin 14
#define ledAllowed 17
#define ledDenied 16
#define servoPin 15
boolean pirState = false;
boolean isAllowed = false;
unsigned long lastTimeBtnStateChanged = millis();
unsigned long debounce = 50;
byte lastBtnState = 0;
void setup() {
//Inicializar el serial
Serial.begin(115200);
//Modo de los pines
pinMode(btnPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledAllowed, OUTPUT);
pinMode(ledDenied, OUTPUT);
pinMode(buzzerPin, OUTPUT);
//Inicializar el servomotor
servo.attach(servoPin, 500, 2400);
//Inicializar la lcd
lcd.begin();
lcd.backlight();
//Iniciar la conexion a la red wifi
Serial.println("Conectando a la red...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Conectado");
Serial.print("Direccion IP asignada: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // Verificar si existe la conexión wifi
if (isAllowed) { // Verificar al inicio del bucle si el identificador del bucle pasado es valido
if (digitalRead(pirPin) == HIGH) { //Verificar si el sensor detecta movimiento
if (!pirState) { // Condicion para evitar que se ejecute mas de una vez el mensaje
Serial.println("Persona pasando");
pirState = true;
}
} else {
if (pirState) { // Verificar si ya no se detecta movimiento
servo.write(90); //Mover el servomotor para cerrar el paso
delay(15); // Esperar el movimiento del servomotor
lcd.clear(); // Limpiar el mensaje anterior del lcd
digitalWrite(ledAllowed, LOW); // Apagar el led
Serial.println("Persona entró");
// Regresar el estado a falso para el siguiente bucle
pirState = false;
isAllowed = false;
}
}
} else {
if (millis() - lastTimeBtnStateChanged > debounce) { // Verificar el tiempo entre pulsaciones del boton para elvitar el "bounce"
byte btnState = digitalRead(btnPin); // Definir el estado actual del boton
if (btnState != lastBtnState) { // Verificar que el estado actual y el pasado no sea el mismo
lastTimeBtnStateChanged = millis(); // Actualizar la ultima vez que el estado del boton cambio
lastBtnState = btnState; // Actualizar el ultimo estado del boton
if (btnState == LOW) {
Serial.println("Enviando informacion al servidor");
const char* uuid = "abfu575Cgh"; //Definir el uuid para simular el funcionamiento del rfid
http.begin(apiUrl); // Iniciar la conexión con la api
http.addHeader("uuid", uuid); // Agregar el identificador en los headers del post (Tambien se puede enviar en el body)
int httpCode = http.POST("Nuevo intento de ingreso"); // Enviar la petición con el uuid y almacenar la respuesta del servidor
Serial.print("HTTP Code: ");
if (httpCode == 200) {
Serial.print(httpCode);
Serial.println(" UID Valido");
isAllowed = true; // Permitir el paso para el siguiente bucle
lcd.print("Acceso Permitido"); // Mostrar el mensaje en el lcd
digitalWrite(ledAllowed, HIGH); // Encender el led
servo.write(0); // Mover el servomotor para permitir el paso
delay(15); // Esperar el movimiento del servomotor
// Activar el buzzer durante 1 segundo
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
} else {
Serial.print(httpCode);
Serial.println(" UID No encontrado");
lcd.print("Acceso Denegado"); // Mostrar el mensaje en el lcd
// Activar el buzzer y el led durante 1 segundo
digitalWrite(ledDenied, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(2000);
digitalWrite(ledDenied, LOW);
digitalWrite(buzzerPin, LOW);
lcd.clear();
}
}
}
}
}
}
}