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:


#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] = {5432}; // Pines de conexión de las filas del keypad
byte pinesColumnas[COLUMNAS] = {876}; // 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();

}
// 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
);

// 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);

        }

    }

}





Puedes descargar el proyecto de APP Inventor (.aia) en el siguiente icono:

Puedes descargar el .apk de la APP pinchando en el siguiente icono:

Vistas
0 Número de vistas
0 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.