sábado, 6 de mayo de 2017

Arduino proyecto 12: cerrojo de puerta

Este proyecto trata de hacer tu propio cerrojo secreto para mantener visitas no deseadas lejos de tu espacio. El piezo que usé para reproducir sonidos con un theremin y en proyectos de teclado también se puede usar con un dispositivo de entrada. Cuando se le suministran 5V, el sensor puede detectar vibraciones que pueden ser leídas por las entradas analógicas del Arduino. Necesitarás enchufar una resistencia de mayor capacidad ( como 1 Mega-ohm), como referencia para la toma de tierra para que esto funcione bien.

¿Cerradura de vibración? ¿Cómo? ¿Qué es eso? Una cerradura de vibración es aquella que se abre al detectar una secuencia determinada de golpes. Dicha cerradura puede estar en una caja o en una puerta, por lo que al golpear dicha superficie, la cerradura detectará el impacto y solo se abrirá con la combinación correcta de golpes.

Para realizar este proyecto necesité un interruptor, 3 leds, una resistencia de 10 kiloohmios, otra de 220 ohmios, otro de 1 megohmios, un condensador de 100 uF, un piezo y un servomotor.
No fue difícil crear la interfaz, lo que si fue un poco raro ya que me hice un lío con los leds y el condensador.
El código fue muy largo y bastante difícil, ya que había que tener en cuenta el piezo y el servomotor, y el detector de golpe en la mesa.



Código

#include <Servo.h>

Servo myServo;
const int piezo = A0;
const int switchPin = 2;
const int yellowLed = 3;
const int greenLed = 4;
const int redLed = 5;
int knockVal;
int switchVal;
.
const int quietKnock = 10;
const int loudKnock = 100;
boolean locked = false;
int numberOfKnocks = 0;
void setup(){
 
    myServo.attach(9);
    pinMode(yellowLed, OUTPUT);
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(switchPin, INPUT);
    Serial.begin(9600);
    digitalWrite(greenLed, HIGH);
    myServo.write(0);
    Serial.println("La caja esta desbloqueada!");
 
}//Fin de la función setup.
void loop(){
 
    if(locked == false){
        switchVal = digitalRead(switchPin);
        if(switchVal == HIGH){
            locked = true;
            digitalWrite(greenLed, LOW);
            digitalWrite(redLed, HIGH);
            myServo.write(90);
            Serial.println("La caja esta bloqueada!");
            delay(1000);
        }
    }
    if(locked == true){
        knockVal = analogRead(piezo);
        if(numberOfKnocks < 3 && knockVal > 0){
            if(checkForKnock(knockVal) == true){
                numberOfKnocks++;
            }
            Serial.print("Golpes restantes: ");
            Serial.println(3-numberOfKnocks);
        }
        if(numberOfKnocks >= 3){
            locked = false;
            myServo.write(0);
            delay(20);
            digitalWrite(greenLed, HIGH);
            digitalWrite(redLed, LOW);
            Serial.println("La caja esta desbloqueada");
        }
    }
 
}//Fin de la función loop.
boolean checkForKnock(int value){
    if(value > quietKnock && value < loudKnock){
        digitalWrite(yellowLed, HIGH);
        delay(50);
        digitalWrite(yellowLed, LOW);
        Serial.print("Valor del golpe correcto: ");
        Serial.println(value);
        return true;
    }
    else {
        Serial.print("Valor del golpe incorrecto: ");
        Serial.println(value);
        return false;
    }
 
}//Fin de la funcion checkForKnock.


1 comentario: