martes, 21 de octubre de 2025

presentacion

 

🎤 PROYECTO: SAFETY BOX – Caja fuerte electrónica con Arduino


👥 Presentación del equipo

Buenos días, somos el grupo Phantom Technology y hoy les presentamos nuestro proyecto titulado “Safety Box”, una caja fuerte electrónica controlada con Arduino y un teclado 4x4.
Nuestro objetivo fue crear un sistema de seguridad inteligente, económico y funcional, aplicando nuestros conocimientos de electrónica y programación.


💭 Motivación del proyecto

Decidimos desarrollar esta caja fuerte porque queríamos combinar la robótica con un propósito práctico y real: proteger objetos personales o materiales escolares.
Además, queríamos demostrar que con herramientas accesibles como el Arduino, se pueden construir sistemas útiles que promuevan la innovación, el aprendizaje y la creatividad.


⚙️ Descripción general del proyecto

“Safety Box” es una caja fuerte digital controlada por un teclado 4x4 y un servomotor.
El sistema permite ingresar una contraseña; si el código es correcto, el servo se activa y la caja se abre.
Si el código es incorrecto, se enciende un LED amarillo y la caja permanece cerrada.
Todo esto controlado desde el Arduino, que interpreta cada tecla y ejecuta las acciones según la programación.


🧩 Componentes utilizados

Componente

Función

Arduino Uno

Controla toda la lógica del sistema y coordina las señales.

Teclado 4x4

Permite ingresar la contraseña numérica.

Servo motor SG90

Simula la apertura y cierre del mecanismo de la caja.

LED verde

Indica acceso correcto (caja abierta).

LED amarillo

Indica error en la contraseña (caja bloqueada).

Protoboard y cables

Permiten realizar las conexiones sin soldadura.


🎯 Objetivo general

Diseñar y programar una caja fuerte electrónica que permita la apertura solo mediante un código correcto, demostrando conocimientos de electrónica y lógica de control con Arduino.

🔹 Objetivos específicos

  • Aplicar programación estructurada para gestionar una contraseña.
  • Usar componentes electrónicos básicos en un sistema de seguridad.
  • Aprender de los errores de montaje y codificación para optimizar el diseño.
  • Demostrar cómo un sistema simple puede cumplir una función práctica.

💡 Funcionamiento

Al encender el sistema, el Arduino muestra en el monitor serial el mensaje “Ingresa el código”.
El usuario digita los números en el teclado:

·         Si el código ingresado es correcto (en nuestro caso “2707”), el servo gira 90° y la caja se abre.

·         Si es incorrecto, se enciende el LED amarillo y el sistema indica “Código incorrecto”.
Luego de tres segundos, el servo regresa a su posición inicial y la caja vuelve a quedar cerrada.


👨💻 CÓDIGO EXPLICADO

#include <Keypad.h>

#include <Servo.h>

 

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] = {9, 8, 7, 6};

byte colPins[COLS] = {5, 4, 3, 2};

 

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

Servo miServo;

 

// Configuración

const String PASSWORD = "123";

String buffer = "";

 

const int SERVO_PIN = 10;

const int LED_VERDE = 11;

const int LED_ROJO = 12;

const int ANGULO_ABIERTO = 90;

const int ANGULO_CERRADO = 0;

 

void setup() {

  Serial.begin(9600);

  miServo.attach(SERVO_PIN);

  miServo.write(ANGULO_CERRADO);

 

  pinMode(LED_VERDE, OUTPUT);

  pinMode(LED_ROJO, OUTPUT);

 

  digitalWrite(LED_VERDE, LOW);

  digitalWrite(LED_ROJO, LOW);

 

  Serial.println("Listo. Ingresa la contraseña y presiona # para confirmar.");

}

 

void loop() {

  char key = keypad.getKey();

 

  if (key) {

    if (key == '#') {

      Serial.println();

      comprobarPassword();

    } else if (key == '*') {

      buffer = "";

      miServo.write(ANGULO_CERRADO);

      digitalWrite(LED_VERDE, LOW);

      digitalWrite(LED_ROJO, LOW);

      Serial.println("\nReiniciado. Servo a 0.");

    } else if (key == 'D') {

      if (buffer.length() > 0) {

        buffer.remove(buffer.length() - 1);

      }

      Serial.print("\rEntrada: ");

      for (unsigned int i = 0; i < buffer.length(); i++) Serial.print('*');

    } else {

      buffer += key;

      Serial.print('*');

    }

  }

}

 

void comprobarPassword() {

  Serial.print("Comprobando... ");

  if (buffer == PASSWORD) {

    Serial.println("OK");

    abrirServo();

  } else {

    Serial.println("INCORRECTA");

    falloPassword();

  }

  buffer = "";

}

 

void abrirServo() {

  miServo.write(ANGULO_ABIERTO);

  digitalWrite(LED_VERDE, HIGH);

  digitalWrite(LED_ROJO, LOW);

  Serial.println("Servo movido a 90° y LED verde encendido.");

 

  // Si quieres que se cierre solo después de unos segundos, descomenta:

  // delay(5000);

  // miServo.write(ANGULO_CERRADO);

  // digitalWrite(LED_VERDE, LOW);

}

 

void falloPassword() {

  digitalWrite(LED_VERDE, LOW);

  digitalWrite(LED_ROJO, HIGH);

  Serial.println("LED rojo encendido (contraseña incorrecta).");

 

  // Parpadeo rápido para enfatizar el error

  for (int i = 0; i < 3; i++) {

    digitalWrite(LED_ROJO, HIGH);

    delay(200);

    digitalWrite(LED_ROJO, LOW);

    delay(200);

  }

}


🔍 EXPLICACIÓN DEL CÓDIGO

Este código está escrito en C++, el lenguaje base de Arduino, y representa un excelente ejemplo de programación estructurada y sistemas embebidos.
Su función es controlar la apertura y cierre de una caja fuerte electrónica a través de un teclado matricial, dos LEDs y un servomotor.

El programa se basa en un ciclo continuo de lectura y respuesta a las acciones del usuario, lo que lo convierte en un sistema reactivo e interactivo.
Cada parte del código cumple un propósito específico, combinando lógica digital, control de hardware y retroalimentación visual.


⚙️ Tipo de programación

Este proyecto utiliza programación estructurada e imperativa, lo que significa que las instrucciones se ejecutan paso a paso siguiendo una lógica ordenada.
Además, al usar objetos de librerías como Servo y Keypad, también implementa conceptos de programación orientada a objetos.

💡 En resumen:

·         Imperativa: le indica al microcontrolador exactamente qué hacer y en qué orden.

·         Estructurada: separa las tareas en bloques lógicos como funciones (setup(), loop(), abrirServo()...).

·         Reactiva: responde constantemente a las entradas del teclado.

·         Orientada a objetos (parcialmente): usa objetos como miServo y keypad para controlar hardware.


🧩 Estructuras principales del programa

Estructura

Función dentro del código

Ejemplo

Variables y constantes

Guardan datos fijos o temporales (pines, contraseña, ángulos)

const String PASSWORD = "123";

Condicionales (if / else)

Deciden si la contraseña es correcta o incorrecta

if (buffer == PASSWORD)

Funciones

Organizan el código en tareas específicas

comprobarPassword(), abrirServo(), falloPassword()

Bucle repetitivo (loop)

Mantiene el sistema activo para siempre

void loop() { ... }

Repetición controlada (for)

Genera parpadeo del LED rojo en caso de error

for (int i = 0; i < 3; i++)

Objetos

Representan componentes físicos (servo, teclado)

Servo miServo;, Keypad keypad;

Arreglos y matrices

Organizan las teclas del teclado 4x4

char keys[ROWS][COLS] = {...};


🧱 Explicación paso a paso del código

1️ Inclusión de librerías

#include <Keypad.h>
#include <Servo.h>

Estas librerías agregan funcionalidades específicas:

·         Keypad.h permite leer teclas del teclado matricial 4x4.

·         Servo.h controla el movimiento del servomotor.

Ambas librerías se basan en clases y métodos, lo que aplica principios de orientación a objetos.


2️ Declaración del teclado

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = { ... };
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Aquí se define la estructura física del teclado:

·         Se crea una matriz bidimensional con los caracteres de cada tecla.

·         Se asignan los pines del Arduino a las filas y columnas.

·         Luego, se inicializa el objeto keypad con esta información.

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

3️ Configuración de pines y componentes

const int SERVO_PIN = 10;
const int LED_VERDE = 11;
const int LED_ROJO = 12;

Estas líneas definen los pines que usará el Arduino para conectar el servo y los LEDs.
Los #define o const se utilizan para dar nombres simbólicos a valores que no cambiarán.


4️ Función setup()

void setup() {
  Serial.begin(9600);
  miServo.attach(SERVO_PIN);
  miServo.write(ANGULO_CERRADO);
  pinMode(LED_VERDE, OUTPUT);
  pinMode(LED_ROJO, OUTPUT);
}

Esta parte del programa se ejecuta una sola vez al encender la placa:

·         Inicializa la comunicación serial.

·         Conecta el servo a su pin y lo deja cerrado.

·         Configura los LEDs como salidas.

·         Muestra un mensaje de inicio en el monitor serial.

👉 Esta función cumple la fase de inicialización del sistema.


5️ Función loop()

void loop() {
  char key = keypad.getKey();
  if (key) {
    ...
  }
}

Este es el corazón del programa.
El bucle loop() se ejecuta constantemente, verificando si una tecla fue presionada.
Si detecta una entrada, analiza qué tipo de tecla fue y ejecuta la acción correspondiente:

·         # → confirma y verifica la contraseña.

·         * → reinicia todo y apaga los LEDs.

·         D → borra el último carácter ingresado.

·         Números → se agregan al buffer (se muestran como “*” en la consola).

Aquí se aplican estructuras condicionales y secuenciales para manejar los posibles eventos.


6️ Función comprobarPassword()

void comprobarPassword() {
  if (buffer == PASSWORD) {
    abrirServo();
  } else {
    falloPassword();
  }
}

Compara la contraseña digitada con la almacenada en la variable PASSWORD.
Si coincide, abre el servo; si no, ejecuta la rutina de error.

📘 Esta parte usa estructuras condicionales anidadas para evaluar resultados.


7️ Función abrirServo()

void abrirServo() {
  miServo.write(ANGULO_ABIERTO);
  digitalWrite(LED_VERDE, HIGH);
  digitalWrite(LED_ROJO, LOW);
}

Mueve el servo a 90°, lo que representa la apertura de la caja, y enciende el LED verde.
También puede cerrarse automáticamente si se descomenta el delay() y el servo.write(0).

💡 Aquí se controla directamente el hardware desde el software, lo que es el núcleo de los sistemas embebidos.


8️ Función falloPassword()

void falloPassword() {
  digitalWrite(LED_VERDE, LOW);
  digitalWrite(LED_ROJO, HIGH);
  for (int i = 0; i < 3; i++) {
    digitalWrite(LED_ROJO, HIGH);
    delay(200);
    digitalWrite(LED_ROJO, LOW);
    delay(200);
  }
}

Enciende el LED rojo y hace que parpadee tres veces, indicando error.
Usa una estructura repetitiva “for” que se ejecuta tres veces con pausas controladas por delay().


🧠 Estructuras de programación utilizadas

Tipo

Descripción

Ejemplo

Secuencial

Instrucciones ejecutadas una tras otra.

digitalWrite(LED_ROJO, HIGH); delay(200);

Condicional

Toma decisiones según la lógica del programa.

if (buffer == PASSWORD)

Repetitiva

Ejecuta un bloque varias veces.

for (int i = 0; i < 3; i++)

Modular

Divide el programa en funciones.

setup(), loop(), abrirServo()

Orientada a objetos

Controla el hardware mediante clases.

Servo miServo; Keypad keypad;

Eventos (interactiva)

Reacciona a acciones del usuario.

char key = keypad.getKey();


🌱 Aprendizaje técnico y sostenible

El desarrollo de este código fortalece competencias en:

·         Lógica de control y flujo, aplicando condiciones y bucles.

·         Uso responsable de recursos electrónicos, reutilizando componentes y reduciendo desperdicio.

·         Trabajo colaborativo, ya que depurar el código exigió pruebas, comunicación y mejora continua.

Con este proyecto, el grupo Phantom Technology demuestra cómo la educación tecnológica y la innovación sostenible pueden integrarse para crear soluciones seguras, accesibles y responsables con el entorno.


⚙️ DIFICULTADES Y ERRORES DURANTE EL PROYECTO

Este proyecto no fue perfecto desde el inicio. Tuvimos varios errores que nos ayudaron a entender mejor cómo funciona Arduino y cómo depurar fallos reales.

1. Error en las conexiones del teclado 4x4:

Al principio conectamos mal los pines de las filas y columnas, lo que provocaba que el Arduino leyera teclas incorrectas.
Lo solucionamos revisando el datasheet del teclado y reorganizando los cables en la protoboard.

2. Servo sin movimiento:

En una prueba, el servo no respondía. El problema fue que compartíamos el mismo pin con otro componente. Cambiamos el pin a uno PWM (pin 10) y funcionó correctamente.

3. Contraseña no reconocida:

Tuvimos errores al comparar la contraseña porque olvidamos incluir la librería Password.h y el código no evaluaba correctamente.
Después de incluirla y reiniciar el monitor serial, el sistema empezó a funcionar.

4. LED encendido permanentemente:

El LED amarillo quedaba encendido después de un intento fallido.
Agregamos la línea
digitalWrite(LED_AMARILLO, LOW) cuando el código era correcto para reiniciar su estado.

5. Fallo de comunicación serial:

En algunos intentos, los mensajes no se veían en el monitor serial.
Descubrimos que era porque no teníamos configurada la velocidad correcta en
Serial.begin(9600) y el monitor serial en la misma velocidad.

Todos estos errores nos enseñaron a diagnosticar problemas reales, usar el multímetro, revisar la lógica del programa y validar cada componente por separado.


🌱 APORTE AL DESARROLLO SOSTENIBLE

Aunque sea un prototipo pequeño, Safety Box está alineado con varios Objetivos de Desarrollo Sostenible (ODS):

📘 ODS 4 – Educación de calidad

Fomenta el aprendizaje práctico, impulsa la educación tecnológica y ayuda a comprender principios de robótica, electrónica y programación.
Enseña a los estudiantes que se aprende más haciendo, fallando y corrigiendo.

⚙️ ODS 9 – Industria, innovación e infraestructura

Promueve la cultura de la innovación y el desarrollo de proyectos tecnológicos accesibles.
Al trabajar con Arduino, se demuestra cómo la tecnología puede ser usada para crear soluciones reales sin necesidad de grandes recursos.

🔋 ODS 12 – Producción y consumo responsables

Los componentes como el Arduino, el teclado y el servo pueden reutilizarse en otros proyectos, lo que evita desperdicio electrónico.
Es un ejemplo de economía circular educativa, donde nada se desecha, solo se transforma.

🧩 ODS 11 – Ciudades y comunidades sostenibles

Este tipo de proyectos puede evolucionar hacia sistemas de seguridad domésticos o escolares sostenibles, accesibles para comunidades con pocos recursos.


💬 Preguntas y respuestas

1. ¿Qué aprendieron con los errores?

Que equivocarse no es perder tiempo. Cada fallo nos ayudó a entender mejor el funcionamiento del Arduino y a pensar de forma lógica y ordenada.

2. ¿Por qué este proyecto es sostenible?

Porque enseña tecnología sin desperdiciar materiales, reutiliza componentes y fomenta la educación práctica.

3. ¿Qué mejorarían?

Agregaríamos una pantalla LCD, un sistema de bloqueo por tiempo después de varios intentos fallidos y una alarma sonora.

4. ¿Qué representa “Safety Box” para ustedes?

Representa aprendizaje, trabajo en equipo y la satisfacción de convertir una idea en algo que realmente funciona.


🧭 Conclusión

“Safety Box” no es solo una caja fuerte, es un proyecto educativo con propósito.
Representa el esfuerzo, la curiosidad y la constancia de nuestro grupo.
Aprendimos a programar, a montar circuitos, a identificar errores y, sobre todo, a entender que la tecnología también puede ser sostenible, accesible y educativa.

“Safety Box” es una muestra de que innovar no significa tener muchos recursos, sino saber aprovechar los que se tienen.

presentacion

  🎤 PROYECTO: SAFETY BOX – Caja fuerte electrónica con Arduino 👥 Presentación del equipo Buenos días, somos el grupo Phantom T...