Cerradura protegida con clave
Proyecto

Cerradura protegida con clave
En esta actividad utilizaremos la placa NodeMCU para controlar una cerradura electrónica. podremos introducir una clave numérica manualmente ayudándonos de un teclado matricial o bien desde una APP por Bluetooth. Si la clave introducida es correcta se activa la cerradura. La clave se podrá configurar manualmente o desde la APP y se almacenará en la memoria flash interna del ESP32 para que se mantenga almacenada entre apagados de la placa. La APP podemos hacerla en APP Inventor que es de uso gratuito y de programación por bloques. Para llevar a cabo este ejercicio necesitarás el siguiente material:

Ejemplo de uso del Keypad
#include <Keypad.h> // Librería para usar el Keypad (Keypad by Mark Stanley, Alexander Brevig)
const byte FILAS = 4; // Número de filas del teclado
const byte COLUMNAS = 3; // Número de columnas del teclado
// Creamos una matriz con la posición de las teclas del keypad
char teclas[FILAS][COLUMNAS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte pinesFiles[FILAS] = {5, 4, 3, 2}; // Pines de conexión de las filas del keypad
byte pinesColumnas[COLUMNAS] = {8, 7, 6}; // Pines de conexión de las columnas del keypad
// Crear instancia del objeto Keypad
Keypad keypad = Keypad(makeKeymap(teclas), pinesFiles, pinesColumnas, FILAS, COLUMNAS);
void setup() {}
void loop() {
// Obtenemos la tecla pulsada en el keypad
char key = keypad.getKey();
}
Solución en C/C++
// Incluir librerías necesarias
#include <BluetoothSerial.h>
#include <Keypad.h>
#include <Preferences.h>
// Definir pines de conexión en valores constantes
#define LEDROJO 17
#define LEDVERDE 16
#define LEDAZUL 4
#define RELE 25
// Definir matriz con los valores de los pulsadores del Keypad
const byte numero_filas = 4;
const byte numero_columnas = 4;
char teclas[numero_filas][numero_columnas] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Definir arrays con los pines de las filas y las columnas
byte pines_filas[numero_filas] = { 19, 18, 5, 15 };
byte pines_columnas[numero_columnas] = { 26, 27, 14, 12 };
// Creamos una instancia de los objetos necesarios
BluetoothSerial bluetooth;
Preferences memoria;
Keypad teclado = Keypad(
makeKeymap(teclas),
pines_filas,
pines_columnas,
numero_filas,
numero_columnas
);
makeKeymap(teclas),
pines_filas,
pines_columnas,
numero_filas,
numero_columnas
);
// Variable para gestionar lectura y clave de acceso
const char clave_admin[5] = "1234";
String clave_guardada = "";
bool modo_configuracion = false;
void setup() {
// Inicialización del monitor serial
Serial.begin(9600);
// Inicialización del serial bluetooth
bluetooth.begin("ESP32");
// Configurar GPIO como salidas
pinMode(LEDROJO, OUTPUT);
pinMode(LEDVERDE, OUTPUT);
pinMode(LEDAZUL, OUTPUT);
pinMode(RELE, OUTPUT);
// Establecer estado por defecto de las salidas
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
digitalWrite(RELE, HIGH);
// Inicializar memoria flash y obtener clave de acceso
memoria.begin("memoria");
clave_guardada = memoria.getString("clave", "0000");
memoria.end();
Serial.print("Dispositivo arrancado con clave: ");
Serial.println(clave_guardada);
}
void loop() {
// Variable para guardar la clave introducida
int indice = 0;
char clave_introducida[4];
bool introduciendo_clave = true;
// Introducir clave
while(introduciendo_clave) {
// Obtenemos tecla pulsada
char tecla = teclado.getKey();
// Guardamos la tecla pulsada
if(tecla && !bluetooth.available()) {
// Mostramos la tecla por monitor serial
Serial.print("Pulsada la tecla: ");
Serial.println(tecla);
// Indicamos que se ha detectado la pulsación con el LED
digitalWrite(LEDROJO, HIGH);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
delay(100);
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
// Guardamos la tecla detectada
clave_introducida[indice] = tecla;
indice++;
}
// Comprobamos la entrada desde Bluetooth
if(bluetooth.available()) {
// Obtenemos la clave desde Bluetooth
char caracter_entrante;
while(bluetooth.available()) {
caracter_entrante = bluetooth.read();
if(caracter_entrante != '\n') {
// Mostramos la tecla por monitor serial
Serial.print("Recibida la tecla: ");
Serial.println(caracter_entrante);
// Indicamos que se ha detectado la pulsación con el LED
digitalWrite(LEDROJO, HIGH);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
delay(100);
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
// Guardamos la tecla en la variable de la clave
clave_introducida[indice] = caracter_entrante;
indice++;
}
}
}
if(indice > 3)
break;
}
// Mostramos la clave introducida
Serial.print("Clave introducida: ");
Serial.println(clave_introducida);
Serial.println();
// Si estamos en modo configuración guardamos la clave introducida
if(modo_configuracion) {
Serial.println("Guardando clave nueva...");
// Inicializar memoria flash y guardar clave de acceso
memoria.begin("memoria");
memoria.putString("clave", String(clave_introducida));
memoria.end();
clave_guardada = clave_introducida;
modo_configuracion = false;
}
// Comprobamos que la clave introducida sea la de configuración
if(strcmp(clave_introducida, clave_admin) == 0) {
// Indicamos que estamos en modo configuración con el LED en blanco
digitalWrite(LEDROJO, HIGH);
digitalWrite(LEDVERDE, HIGH);
digitalWrite(LEDAZUL, HIGH);
modo_configuracion = true;
}
if(!modo_configuracion) {
// Comprobamos la clave introducida si es correcta
if(strcmp(clave_introducida, clave_guardada.c_str()) == 0) {
// Activamos el rele durante unos segundos
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, HIGH);
digitalWrite(LEDAZUL, LOW);
digitalWrite(RELE, LOW);
delay(2000);
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
digitalWrite(RELE, HIGH);
} else {
// Indicamos clave incorrecta con el LED en Rojo
digitalWrite(LEDROJO, HIGH);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, LOW);
delay(1000);
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDAZUL, HIGH);
}
}
}
| Vistas | |
|---|---|
| 0 | Número de vistas |
| 0 | Vistas de miembros |
| 0 | Vistas públicas |
| Acciones | |
|---|---|
| 0 | Gustos |
| 0 | No me gusta |
| 0 | Comentarios |
Compartir por correo
Por favor iniciar sesión para compartir esto webpage por correo.

