#include <LiquidCrystal.h>
#include <HTTPClient.h>
#include <Ethernet.h> // Agregamos la librería Ethernet
// Pin Definitions
#define RXD2 4
#define TXD2 2
const int buttonPin = 13;
const int newButtonPin = 12; // Botón para controlar el pin 12 (Botón de apertura de cerradura)
// Ethernet MAC Address
byte mac[] = {0x00, 0x80, 0xA3, 0xFB, 0x0D, 0x81}; // Dirección MAC de Lantronix Ethernet
// LCD Pin Definitions
const int rs = 22, en = 23, d4 = 5, d5 = 18, d6 = 19, d7 = 21;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String qrCode = "";
void setup() {
pinMode(buttonPin, OUTPUT);
digitalWrite(buttonPin, LOW);
pinMode(newButtonPin, INPUT_PULLUP); // Configura el botón de salida (pin 12) con resistencia pull-up interna
lcd.begin(16, 2);
lcd.print("CONTROL DE ACCESO");
delay(4000);
Serial.begin(115200);
Serial.println("Se inicio el esp32");
lcd.setCursor(0, 1);
lcd.print("Se inicio el esp32!");
delay(3000);
lcd.clear();
// Inicializamos la comunicación serial con el hardware lector de QR en el puerto serial 2
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
if (!Serial2) {
Serial.println("Invalid SoftwareSerial pin configuration, check config");
while (1) {
delay(1000);
}
}
Serial.println("Se inicio el puertoqr");
Serial2.println("Se inicio el puertoqr");
// Inicializamos la conexión Ethernet de Lantronix con IP dinámica
Ethernet.begin(mac);
delay(2000);
Serial.println("Conexión Ethernet iniciada");
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("ESCANEAR QR");
lcd.setCursor(0, 1);
lcd.print("PUERTA BLOQUEADA");
// Verifica si el nuevo botón fue presionado y cambia el estado del pin 12
if (digitalRead(newButtonPin) == LOW) {
digitalWrite(buttonPin, HIGH); // Activa el control del relé o dispositivo externo
delay(5000); // Mantener el estado alto durante 5 segundos
digitalWrite(buttonPin, LOW); // Desactiva el control del relé o dispositivo externo
}
if (Serial2.available() > 0) {
qrCode = "";
while (Serial2.available() > 0) {
qrCode += (char)Serial2.read();
delay(2);
}
Serial.println("Código QR leído: " + qrCode);
acceso1(qrCode);
}
}
void scrollText(int row, String message, int delayTime, int lcdColumns) {
for (int i = 0; i < lcdColumns; i++) {
message = " " + message;
}
message = message + " ";
for (int pos = 0; pos < message.length(); pos++) {
lcd.setCursor(0, row);
lcd.print(message.substring(pos, pos + lcdColumns));
delay(delayTime);
}
}
void acceso1(String tarjeta) {
HTTPClient http;
// Aquí no necesitamos una dirección URL completa, ya que Lantronix manejará la comunicación Ethernet
//http.begin("/");
http.begin(tarjeta); // Aquí la URL está definida por el parámetro "tarjeta" que trae la URL inserta en el código QR
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int codigo_respuesta = http.GET();
if (codigo_respuesta == 200) {
String cuerpo_respuesta = http.getString();
if (cuerpo_respuesta == "ACCCESO PERMITIDO") {
lcd.setCursor(0, 0);
lcd.print("PUERTA ABIERTA");
digitalWrite(buttonPin, HIGH); // Activa el control del relé o dispositivo externo
delay(5000); // Esperar un tiempo con la puerta abierta
digitalWrite(buttonPin, LOW); // Desactiva el control del relé o dispositivo externo
}
scrollText(1, cuerpo_respuesta, 175, 16);
} else {
scrollText(0, "ACCESO DENEGADO", 175, 16);
scrollText(1, "CODIGO INVALIDO O FUERA DE HORARIO", 175, 16);
delay(5000);
}
http.end();
}