/*#include <ESP32Servo.h>
#include <Wire.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Inicializar pantalla de 20x4
Servo servo;
RTC_DS3231 rtc; // Asegúrate de que tienes este RTC conectado
#define pirPin 2
#define buzzerPin 4
#define btnPin 14
#define ledAllowed 17
#define ledDenied 16
#define servoPin 15
boolean pirState = false;
boolean isAllowed = false;
boolean firstAccess = true; // Variable para marcar el primer acceso
unsigned long lastTimeBtnStateChanged = millis();
unsigned long debounce = 50;
byte lastBtnState = 0;
// Definir la estructura RFIDCard
struct RFIDCard {
String id;
String name;
};
// Arreglo de tarjetas predefinidas
RFIDCard cards[] = {
{"123456", "John Doe"},
{"654321", "Jane Smith"},
{"112233", "Alice Johnson"},
{"445566", "Bob Brown"},
{"778899", "Charlie Davis"},
{"998877", "Eva Wilson"},
{"334455", "George Clark"},
{"223344", "Hannah Lee"},
{"556677", "Isabella King"}
};
const int numCards = sizeof(cards) / sizeof(cards[0]);
// Variables para guardar el estado anterior
String previousDateTime = "";
// Función para sonido del buzzer al permitir acceso
void buzzerBeep() {
tone(buzzerPin, 4000, 100);
delay(100);
noTone(buzzerPin);
delay(100);
}
// Función para sonido del buzzer al denegar acceso
void buzzerBeepNO() {
tone(buzzerPin, 300, 100);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 300, 100);
delay(100);
}
// Función para simular el nivel de batería
float getBatteryLevel() {
int sensorValue = analogRead(34); // Leer voltaje de la batería en GPIO 34
float voltage = sensorValue * (3.3 / 4095.0) * 2; // Conversión a voltaje, considerando divisor de voltaje
return voltage;
}
// Función para determinar si la batería es alta o baja
String obtenerEstadoBateria(float voltage) {
if (voltage > 3.7) {
return "Alta";
} else {
return "Baja";
}
}
// Función para obtener el porcentaje de batería
float obtenerPorcentajeBateria(float voltage) {
float porcentaje = (voltage / 4.2) * 100; // Suponiendo que 4.2V es el máximo
if (porcentaje > 100) {
porcentaje = 100; // Limitar al 100%
} else if (porcentaje < 0) {
porcentaje = 0; // Limitar al 0%
}
return porcentaje;
}
void setup() {
Serial.begin(115200);
pinMode(btnPin, INPUT);
pinMode(ledAllowed, OUTPUT);
pinMode(ledDenied, OUTPUT);
pinMode(buzzerPin, OUTPUT);
servo.attach(servoPin, 500, 2400);
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
Serial.println("No se encontró el RTC");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("Sistema de control de acceso listo");
// Mostrar "Batería" al iniciar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bateria:");
// Inicializa el servo en cerrado
servo.write(0); // Cerrado en 0 grados
delay(2000); // Esperar 2 segundos
}
void loop() {
byte btnState = digitalRead(btnPin);
if (btnState == HIGH && (millis() - lastTimeBtnStateChanged > debounce)) {
lastTimeBtnStateChanged = millis();
// Simular la lectura de batería
float batteryVoltage = getBatteryLevel();
String batteryStatus = obtenerEstadoBateria(batteryVoltage);
float batteryPercentage = obtenerPorcentajeBateria(batteryVoltage);
String cardId = "123456"; // Este sería el ID de la tarjeta leída
isAllowed = false;
for (int i = 0; i < numCards; i++) {
if (cards[i].id == cardId) {
isAllowed = true;
break;
}
}
if (isAllowed) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso Permitido");
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus);
digitalWrite(ledAllowed, HIGH);
buzzerBeep();
// Secuencia para abrir y cerrar el servo para acceso permitido
servo.write(90); // Abrir el servo (posición de 90 grados)
delay(3000); // Esperar 3 segundos para simular el paso de la persona
servo.write(0); // Cerrar el servo (posición de 0 grados)
delay(2000);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso Denegado");
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus);
digitalWrite(ledDenied, HIGH);
buzzerBeepNO();
}
delay(2000);
digitalWrite(ledAllowed, LOW);
digitalWrite(ledDenied, LOW);
// Mostrar el estado actual de la batería y la fecha después del acceso
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" "); // Línea vacía
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus); // Mostrar batería
lcd.setCursor(0, 2);
lcd.print(" "); // Línea vacía
lcd.setCursor(0, 3);
// Obtener la fecha y hora del RTC
DateTime now = rtc.now();
String currentDateTime = String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + " " +
String(now.hour()) + ":" + String(now.minute());
lcd.print(currentDateTime); // Mostrar la fecha
}
// Obtener la fecha y hora del RTC y mostrarla si ha cambiado
DateTime now = rtc.now();
String currentDateTime = String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + " " +
String(now.hour()) + ":" + String(now.minute());
if (currentDateTime != previousDateTime) {
lcd.setCursor(0, 3); // Línea 4
lcd.print(currentDateTime);
previousDateTime = currentDateTime; // Actualizar el estado anterior
}
delay(1000); // Actualizar cada segundo
}
*/
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Inicializar pantalla de 20x4
Servo servo;
RTC_DS3231 rtc; // Asegúrate de que tienes este RTC conectado
#define pirPin 2
#define buzzerPin 4
#define btnPin 14
#define ledAllowed 17
#define ledDenied 16
#define servoPin 15
boolean pirState = false;
boolean isAllowed = false;
boolean firstAccess = true; // Variable para marcar el primer acceso
unsigned long lastTimeBtnStateChanged = millis();
unsigned long debounce = 50;
byte lastBtnState = 0;
// Definir la estructura RFIDCard
struct RFIDCard {
String id;
String name;
};
// Arreglo de tarjetas predefinidas
RFIDCard cards[] = {
{"123456", "John Doe"},
{"654321", "Jane Smith"},
{"112233", "Alice Johnson"},
{"445566", "Bob Brown"},
{"778899", "Charlie Davis"},
{"998877", "Eva Wilson"},
{"334455", "George Clark"},
{"223344", "Hannah Lee"},
{"556677", "Isabella King"}
};
const int numCards = sizeof(cards) / sizeof(cards[0]);
// Variables para guardar el estado anterior
String previousDateTime = "";
// Función para sonido del buzzer al permitir acceso
void buzzerBeep() {
tone(buzzerPin, 4000, 100);
delay(100);
noTone(buzzerPin);
delay(100);
}
// Función para sonido del buzzer al denegar acceso
void buzzerBeepNO() {
tone(buzzerPin, 300, 100);
delay(100);
noTone(buzzerPin);
delay(100);
tone(buzzerPin, 300, 100);
delay(100);
}
// Función para simular el nivel de batería
float getBatteryLevel() {
int sensorValue = analogRead(34); // Leer voltaje de la batería en GPIO 34
float voltage = sensorValue * (3.3 / 4095.0) * 2; // Conversión a voltaje, considerando divisor de voltaje
return voltage;
}
// Función para determinar si la batería es alta o baja
String obtenerEstadoBateria(float voltage) {
if (voltage > 3.7) {
return "Alta";
} else {
return "Baja";
}
}
// Función para obtener el porcentaje de batería
float obtenerPorcentajeBateria(float voltage) {
float porcentaje = (voltage / 4.2) * 100; // Suponiendo que 4.2V es el máximo
if (porcentaje > 100) {
porcentaje = 100; // Limitar al 100%
} else if (porcentaje < 0) {
porcentaje = 0; // Limitar al 0%
}
return porcentaje;
}
void setup() {
Serial.begin(115200);
pinMode(btnPin, INPUT);
pinMode(ledAllowed, OUTPUT);
pinMode(ledDenied, OUTPUT);
pinMode(buzzerPin, OUTPUT);
servo.attach(servoPin, 500, 2400); // Configura el servo en el rango correcto
servo.write(0); // Inicia el servo en 0 grados (cerrado)
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
Serial.println("No se encontró el RTC");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("Sistema de control de acceso listo");
// Mostrar "Batería" al iniciar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bateria:");
}
void loop() {
byte btnState = digitalRead(btnPin);
if (btnState == HIGH && (millis() - lastTimeBtnStateChanged > debounce)) {
lastTimeBtnStateChanged = millis();
// Simular la lectura de batería
float batteryVoltage = getBatteryLevel();
String batteryStatus = obtenerEstadoBateria(batteryVoltage);
float batteryPercentage = obtenerPorcentajeBateria(batteryVoltage);
String cardId = "123456"; // Este sería el ID de la tarjeta leída
isAllowed = false;
for (int i = 0; i < numCards; i++) {
if (cards[i].id == cardId) {
isAllowed = true;
break;
}
}
if (isAllowed) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso Permitido");
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus);
digitalWrite(ledAllowed, HIGH);
buzzerBeep();
servo.write(0); // Abre el servo a 0 grados
delay(5000); // Espera 5 segundos
servo.write(90); // Vuelve a 90 grados
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso Denegado");
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus);
digitalWrite(ledDenied, HIGH);
buzzerBeepNO();
}
delay(2000);
digitalWrite(ledAllowed, LOW);
digitalWrite(ledDenied, LOW);
// Mostrar el estado actual de la batería y la fecha después del acceso
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" "); // Línea vacía
lcd.setCursor(0, 1);
lcd.print("Bateria: " + String(batteryPercentage, 1) + "% " + batteryStatus); // Mostrar batería
lcd.setCursor(0, 2);
lcd.print(" "); // Línea vacía
lcd.setCursor(0, 3);
// Obtener la fecha y hora del RTC
DateTime now = rtc.now();
String currentDateTime = String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + " " +
String(now.hour()) + ":" + String(now.minute());
lcd.print(currentDateTime); // Mostrar la fecha
}
// Obtener la fecha y hora del RTC y mostrarla si ha cambiado
DateTime now = rtc.now();
String currentDateTime = String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + " " +
String(now.hour()) + ":" + String(now.minute());
if (currentDateTime != previousDateTime) {
lcd.setCursor(0, 3); // Línea 4
lcd.print(currentDateTime);
previousDateTime = currentDateTime; // Actualizar el estado anterior
}
delay(1000); // Actualizar cada segundo
}