#include <Arduino.h>
#include <EEPROM.h>
// Define las filas y las columnas del teclado
const int rowPins[4] = { 19, 18, 5, 17 };
const int colPins[4] = { 16, 4, 2, 15 };
// Define los pines de los LEDs y el botón
const int ledPin = 14;
const int adminLedPin = 13;
const int buttonPin = 12; // Pin del botón
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
#define CODE_LENGTH 3
#define MAX_CODES 3
const String adminCode = "834";
const String doctorCodes[3] = {"123", "234", "345"};
int pos = 50; // Dirección inicial de escritura en EEPROM
String lastUser = ""; // Almacena el nombre del último usuario
// Función para escribir una cadena en EEPROM
void escribirStringEnEEPROM(String cadena, int direccion) {
int longitudCadena = cadena.length();
for (int i = 0; i < longitudCadena; i++) {
EEPROM.write(direccion + i, cadena[i]);
}
EEPROM.write(direccion + longitudCadena, '\0');
EEPROM.commit();
}
// Función para leer una cadena de EEPROM
String leerStringDeEEPROM(int direccion) {
String cadena = "";
char caracter = EEPROM.read(direccion);
int i = 0;
while (caracter != '\0' && i < 100) {
cadena += caracter;
i++;
caracter = EEPROM.read(direccion + i);
}
return cadena;
}
void setup() {
Serial.begin(9600);
EEPROM.begin(512);
// Configura las filas como salidas
for (int row = 0; row < 4; row++) {
pinMode(rowPins[row], OUTPUT);
digitalWrite(rowPins[row], HIGH);
}
// Configura las columnas como entradas con pullup
for (int col = 0; col < 4; col++) {
pinMode(colPins[col], INPUT_PULLUP);
}
// pines
pinMode(ledPin, OUTPUT);
pinMode(adminLedPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(ledPin, HIGH);
}
char getKeypadKey() {
for (int row = 0; row < 4; row++) {
digitalWrite(rowPins[row], LOW);
for (int col = 0; col < 4; col++) {
if (digitalRead(colPins[col]) == LOW) {
while (digitalRead(colPins[col]) == LOW);
digitalWrite(rowPins[row], HIGH);
return keys[row][col];
}
}
digitalWrite(rowPins[row], HIGH);
}
return '\0';
}
String readKeypad() {
String input;
char key;
while (true) {
key = getKeypadKey();
if (key != '\0') {
if (key == '#') {
break;
} else if (key >= '0' && key <= '9' && input.length() < CODE_LENGTH) {
input += key;
Serial.print(key);
}
}
}
Serial.println();
return input;
}
void adminAccess() {
Serial.println("Acceso concedido al administrador.");
analogWrite(adminLedPin, 255); // Enciende el LED al 100% de brillo
lastUser = "Administrador";
}
void doctorAccess() {
Serial.println("Acceso concedido a un médico.");
analogWrite(adminLedPin, 128); // Enciende el LED al 50% de brillo
lastUser = "Doctor";
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
Serial.print("Último usuario: ");
Serial.println(lastUser);
delay(1000);
return;
}
Serial.println("Ingrese el código de acceso (3 dígitos) seguido de #: ");
String accessCode = readKeypad();
if (accessCode == adminCode) {
adminAccess();
} else if (accessCode == doctorCodes[0] || accessCode == doctorCodes[1] || accessCode == doctorCodes[2]) {
doctorAccess();
} else {
Serial.println("Código inválido, intente de nuevo.");
digitalWrite(ledPin, HIGH);
analogWrite(adminLedPin, LOW);
return;
}
digitalWrite(ledPin, LOW);
escribirStringEnEEPROM(accessCode, pos);
pos += CODE_LENGTH + 1;
if(pos >= (MAX_CODES * (CODE_LENGTH + 1))) {
pos = 0;
}
Serial.println("Códigos almacenados:");
for (int i = 0; i < MAX_CODES; i++) {
String storedCode = leerStringDeEEPROM(i * (CODE_LENGTH + 1));
if (storedCode.length() > 0) {
Serial.println(storedCode);
}
}
delay(1000);
}