#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Definir los pines para los LEDs y el buzzer
const int pinLedVerde = 25;
const int pinLedRojo = 26;
const int pinBuzzer = 27;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Configuración del keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {19, 18, 5, 17};
byte colPins[COLS] = {16, 4, 0, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Buffer para almacenar el código ingresado
String codigoIngresado = "";
void setup() {
// Inicializar los pines de salida
pinMode(pinLedVerde, OUTPUT);
pinMode(pinLedRojo, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
// Inicializar el LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Conectando WIFI");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Conectando a Internet...");
delay(500);
}
Serial.println("Conectado a Internet");
lcd.clear();
lcd.print("WIFI Conectado");
delay(2000);
lcd.setCursor(0, 0);
lcd.print("Esperando codigo...");
}
void loop() {
char key = keypad.getKey();
if (key) {
// Si se presiona una tecla, agregarla al buffer
codigoIngresado += key;
// Mostrar el código a medida que se ingresa
lcd.setCursor(0, 1);
lcd.print(codigoIngresado);
// Si se completaron 6 dígitos, verificar el código
if (codigoIngresado.length() == 6) {
verifyCode();
codigoIngresado = ""; // Limpiar el buffer para el próximo intento
lcd.setCursor(0, 1);
lcd.print(" "); // Limpiar la segunda línea del LCD
lcd.setCursor(0, 0);
lcd.print("Esperando codigo...");
}
}
}
void verifyCode() {
if (WiFi.status() == WL_CONNECTED) {
lcd.setCursor(0, 0);
lcd.print("Comprobando... ");
HTTPClient http;
http.begin("https://crispy-space-broccoli-7wgvvw7xq743rq7x-5000.app.github.dev/get-codes"); // Ajusta esto a tu endpoint
http.addHeader("X-Api-Key", "DFVN9746WGRHFNB9AW4O8TBUGRVJ"); // Añade la clave de API en la cabecera
int httpCode = http.GET();
if (httpCode == 200) { // Verifica si la respuesta del servidor es OK
String payload = http.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
// Verifica si el código ingresado está en la respuesta JSON como una clave
if (doc.containsKey(codigoIngresado)) {
JsonObject codeDetails = doc[codigoIngresado];
int codigoId = codeDetails["id"];
updateCodeUsage(codigoId);
digitalWrite(pinLedVerde, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(codigoIngresado + " valido");
lcd.setCursor(0, 1);
lcd.print("Acceso concedido");
delay(5000); // Espera 5 segundos
digitalWrite(pinLedVerde, LOW);
} else {
digitalWrite(pinLedRojo, HIGH);
tone(pinBuzzer, 1000); // Emite un sonido con el buzzer a 1000 Hz
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(codigoIngresado + " invalido");
lcd.setCursor(0, 1);
lcd.print("Acceso denegado");
delay(1500); // Espera 1.5 segundos
noTone(pinBuzzer); // Detiene el sonido del buzzer
digitalWrite(pinLedRojo, LOW);
}
} else if (httpCode == 401) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso no autorizado");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error HTTP: " + String(httpCode));
}
http.end(); // Cierra la conexión
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi no conectado");
}
}
void updateCodeUsage(int codigoId) {
HTTPClient http;
// Asegúrate de reemplazar la URL base con la URL real de tu servidor
String updateEndpoint = "https://crispy-space-broccoli-7wgvvw7xq743rq7x-5000.app.github.dev/update-code-usage/" + String(codigoId);
http.begin(updateEndpoint);
http.addHeader("X-Api-Key", "DFVN9746WGRHFNB9AW4O8TBUGRVJ");
http.addHeader("Content-Type", "application/json");
int httpCode = http.POST(""); // Envía una solicitud POST vacía
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload); // Opcional: imprime la respuesta para depuración
} else {
Serial.println("Error en la solicitud POST: " + String(httpCode)); // Opcional: manejo de errores
}
http.end(); // Cierra la conexión
}