El desarrollo de sistemas de control de acceso que garanticen seguridad y comodidad es fundamental en la actualidad. Aprende a construir un sistema de control de acceso en tiempo real utilizando la placa ESP8266 o Arduino, junto con Firebase como base de datos en tiempo real. Este sistema emplea la tecnología de Identificación por Radiofrecuencia (RFID), lo que permite gestionar accesos sin necesidad de tocar chapas o puertas, ideal para evitar el contacto directo y promover la higiene.
¿Qué es el Control de Acceso RFID con ESP8266?
El sistema de control de acceso RFID (Identificación por Radiofrecuencia) con ESP8266 o NodeMCU es una solución IoT que permite la autenticación sin contacto. Utilizando el módulo RFID-RC522, es posible leer tarjetas o llaveros RFID que actúan como claves de acceso. El ESP8266, conectado a una base de datos en tiempo real de Firebase, puede activar o desactivar un relé que controle un electroimán, un pasador electromagnético, o incluso una carga eléctrica como un bombillo.
Ventajas de Implementar un Sistema de Acceso RFID
- Sin contacto: Ideal para evitar la propagación de gérmenes y asegurar mayor higiene.
- Acceso en tiempo real: La conexión con Firebase permite actualizaciones instantáneas y control remoto.
- Versatilidad: Puede utilizarse en aplicaciones residenciales, oficinas, almacenes y más.
- Fácil de escalar: Firebase facilita la gestión de múltiples usuarios y registros.
- ESP8266 (NodeMCU) o Arduino
- Módulo RFID-RC522
- Tarjetas o llaveros RFID
- Relé de 5V
- Electroimán o cerradura eléctrica
- Protoboard y cables de conexión
- Cuenta en Firebase
- Editor de código (Arduino IDE)
CÓDIGO ESP8266 RFID Y FIREBASE
/*
PINOUT:
RC522 MODULE Uno/Nano MEGA ESP8266
SDA D10 D9 D8
SCK D13 D52 D5
MOSI D11 D51 D7
MISO D12 D50 D6
IRQ N/A N/A N/A
GND GND GND GND
RST A0 D8 D1
3.3V 3.3V 3.3V 3.3V
*/
#include "FirebaseESP8266.h"
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <RFID.h>
// database and Wifi connection
#define FIREBASE_HOST "your-host"
#define FIREBASE_AUTH "your-key"
#define WIFI_SSID "your-wifi"
#define WIFI_PASSWORD "your-pass-wifi"
//Define FirebaseESP8266 data object
FirebaseData firebaseData;
FirebaseJson json;
void printResult(FirebaseData &data);
String path = "/usersTest";
#define SDA_DIO 15
#define RESET_DIO 5
RFID RC522(SDA_DIO, RESET_DIO);
int LedRojo=0;
int LedVerde=4;
int Rele=16;
byte pos= 0;
int readData;
void setup()
{
Serial.begin(9600);
// connect to wifi and firebase.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
Firebase.enableClassicRequest(firebaseData, true);
/* Enable the SPI interface */
SPI.begin();
/* Initialise the RFID reader */
RC522.init();
pinMode(LedRojo, OUTPUT); //Inicializacion de pines
pinMode(LedVerde, OUTPUT);
pinMode(Rele, OUTPUT);
digitalWrite(LedRojo, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(Rele, LOW);
}
void loop()
{
if (RC522.isCard()) /* Card Exist? */
{
RC522.readCardSerial(); /* Get serial number Card*/
Serial.println();
Serial.println("---RC522.serNum----");
//imprimir codigo de tarjeta
for(int i=0;i<5;i++)
{
Serial.println(RC522.serNum[i],DEC);
//Serial.println(RC522.serNum[i],HEX); //Card in Hexadecimal
}
Serial.println("-------");
Serial.println();
//----------------------------------------------
if(checkAuthorization(RC522.serNum))
{
Serial.println("Acceso: Autorizado");
digitalWrite(LedRojo, LOW);
digitalWrite(LedVerde, HIGH);
digitalWrite(Rele, HIGH);
delay(2000);
digitalWrite(LedRojo, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(Rele, LOW);
}
else
{
Serial.println("Acceso: Denegado");
digitalWrite(LedRojo, HIGH);
digitalWrite(LedVerde, LOW);
digitalWrite(Rele, LOW);
delay(2000);
digitalWrite(LedRojo, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(Rele, LOW);
}
Serial.println();
Serial.println();
}
delay(10);
}
bool checkAuthorization(byte* data) //Verify Access
{
//Serial.println();
//Serial.println("---data READ----");
//Serial.println();
for(int i=0;i<5;i++)
{
Firebase.getInt(firebaseData, path + "/key"+i);
//Serial.println(firebaseData.intData());
if (firebaseData.intData() != data[i]) return false;
delay(10);
}
return true;
/*Serial.println("----JSON---");
Serial.println();
if (Firebase.getJSON(firebaseData, "/"))
{
//Success, then try to read the JSON payload value
Serial.println(firebaseData.jsonString());
}
else
{
//Failed to get JSON data at defined database path, print out the error reason
Serial.println(firebaseData.errorReason());
}
Serial.println("-------");
Serial.println();
*/
}
Configuración del Proyecto
1. Conexión de Hardware
Conecta el módulo RFID-RC522 al ESP8266:
- Pin SDA al D2 (GPIO4)
- Pin SCK al D5 (GPIO14)
- Pin MOSI al D7 (GPIO13)
- Pin MISO al D6 (GPIO12)
- Pin IRQ sin conexión
- Pin GND a tierra y VCC a 3.3V
- Conecta el relé al ESP8266 y al electroimán:
- Pin de señal del relé a un GPIO (por ejemplo, GPIO5)
- VCC y GND del relé a la alimentación
2. Configuración de Firebase
Crea un proyecto en Firebase Console.
Activa la base de datos en tiempo real y configura las reglas para permitir la lectura y escritura.
Obtén la URL del proyecto y la clave de autenticación.
3. Programación del ESP8266
Escribe el código para conectar el ESP8266 a WiFi, leer los datos del RFID y comunicarse con Firebase. Instala las librerías necesarias como Firebase ESP8266 y MFRC522 en el Arduino IDE.
Ejemplo de código:
#include <ESP8266WiFi.h>
#include <FirebaseESP8266.h>
#include <MFRC522.h>
#define WIFI_SSID "TuRedWiFi"
#define WIFI_PASSWORD "TuContraseñaWiFi"
#define FIREBASE_HOST "TuProyecto.firebaseio.com"
#define FIREBASE_AUTH "TuClaveFirebase"
#define RST_PIN D1
#define SS_PIN D2
MFRC522 mfrc522(SS_PIN, RST_PIN);
FirebaseData firebaseData;
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
String uid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
uid.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println("UID leído: " + uid);
Firebase.setString(firebaseData, "/access", uid);
// Lógica para activar relé si UID es válido
delay(2000);
}
}
Personalización y Mejoras
- Interfaz web: Integra una página web sencilla para gestionar los accesos y usuarios autorizados.
- Notificaciones en tiempo real: Configura alertas por correo electrónico o SMS al detectar un acceso.
- Seguridad: Implementa reglas de Firebase para proteger los datos.
- Control de acceso en hogares: Agrega una capa de seguridad al hogar.
- Empresas y oficinas: Gestiona quién entra y sale en tiempo real.
- Almacenes y bodegas: Controla el acceso para proteger inventarios.
Como siempre, espero que estos videos e información les sea muy útil, no olvides suscribirte a mi canal en YouTube. Saludos 😎