Go Down

Topic: Alarma seguridad (Read 2235 times) previous topic - next topic

OrnyTorrynKo

Buenas, quiero integrar en un proyecto una alarma de seguridad de barrera laser y control numerico, he buscado muchos proyectos de alarmas y ninguno se adecua al mio. La idea que tengo es un interruptor con el cual me pide un numero de pin por teclado numérico, una vez introducido espera 10 segundos y enciende un laser y activa el sistema. Cuando el laser es cortado espera 15 segundos para introducir la clave, si introduce la clave apaga el sistema y se puede apagar el interruptor, si no se introduce la clave suena la alarma hasta si introducir la clave. Esa es mi idea de proyecto para la alarma y no encuentro nada parecido.

El codigo que tenia en principio no funciona nada por lo que no lo pongo aqui.

Gracias!

surbyte

Quote
es un interruptor con el cual me pide un numero de pin por teclado numérico, una vez introducido espera 10 segundos y enciende un laser y activa el sistema.
Cuando hablas de laser a que te refieres? Una barrera IR o algo que corta?

OrnyTorrynKo

Correcto, una barrera de corte con un laser y una LDR

Estebanquiable

Hola tendrías que leer un  poco:

1- Ejemplos de manejo de teclado matricial con Arduino.
2- Como el Señor moderador (que por suerte nos corrige siempre  ;) ) puso que barrera vas a
   usar?. Especificaciones del fabricante si tiene contacto de salida seco (un relé N/A N/C mejor).
3- Que tipo de display pensás en usar? Si se comunica vía I2C o directamente vas a usar las patas del arduino para controlarlo. Google como siempre.
4- Como usar delay en Arduino y seguramente después de buscar en Google ver videos en Youtube vas a solucionarlo o las dudas que tengas sean más concretas.

Saludos y espero que te funque.

OrnyTorrynKo

Todo eso lo tengo bastante claro.
Voy a usar un simple laser con una LDR, cuando la resistencia sea menor de X se abra cortado el laser y cuando sea mayor el laser estará dando en la LDR. El problema que encuentro es la hora de usar un flanco de subida u otras opciones, que se me enciende el LED antes de hacer el corte.
Code: [Select]
#include <LCD5110_Graph.h>
#include <Keypad.h>

int valorLDR;
int led=13;
int interruptor=8;
int laser=12;
int pinLDR=A7;
bool activa=false;
bool estAct=true;
bool estAnt=true;
int contador=0;
int pin,numero,salida;

LCD5110 myGLCD(28,27,26,24,25);
extern unsigned char MediumNumbers[];
extern unsigned char BigNumbers[];
extern unsigned char SmallFont[];
extern unsigned char TinyFont[];
int contrast = 60;
int inv=0;

const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas

byte Pins_Filas[] = {47, 46, 45, 44};  //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = { 43, 42, 41, 40};   // Pines Arduino a los que contamos las columnas.
char Teclas [ Filas ][ Cols ] =
{
  {'D','C','B','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

int key1,key2,key3,key4;

void setup(){
  Serial.begin(9600);
    myGLCD.InitLCD(contrast);
  pinMode(interruptor,INPUT);
  pinMode(led,OUTPUT);
  pinMode(laser,OUTPUT);
}


void loop(){
  valorLDR=analogRead(pinLDR);
//  Serial.print("activa ");
//  Serial.println(activa);
//  Serial.print("contador: ");
//  Serial.println(contador);
  //INTRODUCIMOS DOS CONDICIONES
 
  if(digitalRead(interruptor)==HIGH){
do{
  if(numero==0){
  myGLCD.setFont(SmallFont);
  myGLCD.print("INTRODUCE PIN",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.update();
  key1=Teclado.getKey();
  if(key1){ 
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),9,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),24,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),46,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==3){
  key4=Teclado.getKey();
  if(key4){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key4-48),61,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    pin=(((key1-48)*1000)+((key2-48)*100)+((key3-48)*10)+(key4-48));
    if(pin==1234){
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("CORRECTO",CENTER,20);
    myGLCD.update();
    key1,key2,key3,key4=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    salida++;
    numero=0;
    delay(10000); //retardo activacion
    activa=true;
    }
    else{
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("PIN INCORRECTO",CENTER,20);
    myGLCD.update();
    key1,key2,key3,key4=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    numero=0;
    }
  }
  }while(salida==0 && numero!=0);


   if(activa==true){
    digitalWrite(laser,HIGH);
    delay(500);
    if(valorLDR>700){
     estAct=true;
    }
    if(valorLDR<700){
      estAct=false;
     
    }
    if(estAct==true && estAnt==false){
      digitalWrite(led,HIGH);
     
    }
    estAnt=estAct;
//    if(valorLDR>700 && corte==true){
//      digitalWrite(led,HIGH);
//    }
   }
   Serial.println(valorLDR);
   Serial.println(estAct);
   Serial.println(estAnt);
   Serial.println();
   delay(1000);
//    activa=true;}
//   if(digitalRead(interruptor)==LOW && activa==true && contador==0){
//    activa==false;
//    digitalWrite(laser,LOW);
//    digitalWrite(led,LOW);
//  }
//    while(activa==true){   
//    digitalWrite(laser,HIGH);
//    if(valorLDR<700){
//      do{
//        delay(1000);
//        contador++;
//        Serial.println(contador);
//      }while(digitalRead(interruptor)==HIGH || contador!=10);
//    }
//
//    if(contador==10){
//      digitalWrite(led,HIGH);
//    }
    }
//   
  }

   
 


con este codigo no me funciona a la hora de cuando tengo que leer la LDR y encender el LED al realizar el corte

OrnyTorrynKo

Solucionada esa parte!
Code: [Select]
if(activa==true){
    digitalWrite(laser,HIGH);
    delay(100);
    valorLDR=analogRead(pinLDR);
    if(valorLDR>700 && corte==false){
      corte=false;
      //digitalWrite(led,LOW);
    }
    if(valorLDR<400 && corte==false){
      //digitalWrite(led,LOW);
      corte=true;
    }
    if(valorLDR>700 && corte==true){
      digitalWrite(led,HIGH);
    }
   }


Pero necesito en lugar de encender el Led como viene en el codigo que me inicie un contador (no hace falta mostrarlo), dentro de ese tiempo del contador, 10segundos por ejemplo, si introduzco el codigo desactivo la alarma y si no introduzo el codigo en ese tiempo se enciende el led

Estebanquiable

Crea un void(); para el LDR encendido con una variable que sume uno dentro del void y un void con el LDR apagado poniendo esa variable a 0 y dentro del void LDR encendido le pones un if que cuando esa variable llegue al tiempo que querés dispare.

OrnyTorrynKo

Esto es lo que he conseguido de momento, es una funcion de otras muchas, como se puede ver lo ultimo, en esta solo quiero que entre solo cuando la alarma este activada y una vez activada siga haciendo todas las demas funciones, mientras la alarma no este activa no es necesario entrar en esta pero si que nunca deje de ejecutar las otras. Necesito alguna idea de como conseguir esto.

Code: [Select]
void control_alarma(){
 if(digitalRead(intAlarma)==HIGH && alarmaON==false){
do{
  if(numero==0){
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("INTRODUCE PIN",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.update();
  key1=Teclado.getKey();
  if(key1){ 
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),9,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),24,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),46,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==3){
  key4=Teclado.getKey();
  if(key4){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key4-48),61,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    pin=(((key1-48)*1000)+((key2-48)*100)+((key3-48)*10)+(key4-48));
    if(pin==1234){
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("CORRECTO",CENTER,20);
    myGLCD.update();
    key1,key2,key3,key4=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    salida++;
    numero=0;
    delay(5000); //retardo activacion
    alarmaON=true;
    }
    else{
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("PIN INCORRECTO",CENTER,20);
    myGLCD.update();
    key1,key2,key3,key4=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    numero=0;
    }
  }
  }while(salida==0 && numero!=0);
  }

   if(alarmaON==true){
    digitalWrite(laser,HIGH);
    delay(100);
    valorLDR=analogRead(pinLDR);
    if(valorLDR>700 && corte==false){
      corte=false;
    }
    if(valorLDR<400 && corte==false){
      corte=true;
    }
    if(valorLDR>700 && corte==true){
      activa=true;
      corte=false;
    }
   }

   if(alarmaON==true && activa==false){
    myGLCD.setFont(SmallFont);
    myGLCD.print("ALARMA ACTIVA",CENTER,20);
    myGLCD.update();
   }

  if(activa==true){
    digitalWrite(ledAla,HIGH);
   
    do{
    if(numero==0){
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("INTRUSO",CENTER,5);
    myGLCD.drawLine(0,13,83,13);
    myGLCD.update();
    key1=Teclado.getKey();
    if(key1){ 
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key1-48),9,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==1){
    key2=Teclado.getKey();
    if(key2){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key2-48),24,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==2){
    key3=Teclado.getKey();
    if(key3){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key3-48),46,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==3){
    key4=Teclado.getKey();
    if(key4){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key4-48),61,20);
    myGLCD.update();
    numero++;  }
    }
    if(Teclado.getKey()=='*'){
      pin=(((key1-48)*1000)+((key2-48)*100)+((key3-48)*10)+(key4-48));
      if(pin==1234){
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("CORRECTO",CENTER,20);
      myGLCD.update();
      key1,key2,key3,key4=0;
      delay(1500);
      myGLCD.clrScr();
      myGLCD.update();
      salida++;
      numero=0;
      digitalWrite(ledAla,LOW);
      activa=false;
      corte=false;
      }
      else{
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("PIN INCORRECTO",CENTER,20);
      myGLCD.update();
      key1,key2,key3,key4=0;
      delay(1500);
      myGLCD.clrScr();
      myGLCD.update();
      numero=0;
      }
    }
    }while(salida==0 && numero!=0);
  }

   if(digitalRead(intAlarma)==LOW & alarmaON==true){
    digitalWrite(ledAla,HIGH);
    do{
    if(numero==0){
    myGLCD.setFont(SmallFont);
    myGLCD.print("INTRUSO",CENTER,5);
    myGLCD.drawLine(0,13,83,13);
    myGLCD.update();
    key1=Teclado.getKey();
    if(key1){ 
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key1-48),9,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==1){
    key2=Teclado.getKey();
    if(key2){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key2-48),24,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==2){
    key3=Teclado.getKey();
    if(key3){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key3-48),46,20);
    myGLCD.update();
    numero++;  }
    }
    if(numero==3){
    key4=Teclado.getKey();
    if(key4){
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumI((key4-48),61,20);
    myGLCD.update();
    numero++;  }
    }
    if(Teclado.getKey()=='*'){
      pin=(((key1-48)*1000)+((key2-48)*100)+((key3-48)*10)+(key4-48));
      if(pin==1234){
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("CORRECTO",CENTER,20);
      myGLCD.update();
      key1,key2,key3,key4=0;
      delay(1500);
      myGLCD.clrScr();
      myGLCD.update();
      salida++;
      numero=0;
      digitalWrite(ledAla,LOW);
      digitalWrite(laser,LOW);
      alarmaON=false;
      }
      else{
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("PIN INCORRECTO",CENTER,20);
      myGLCD.update();
      key1,key2,key3,key4=0;
      delay(1500);
      myGLCD.clrScr();
      myGLCD.update();
      numero=0;
      }
    }
    }while(salida==0 && numero!=0);
   }   
  }
//////////////////////////////////////////
void loop(){
control_pantalla();
control_ventilador();
control_luces();
control_humedad();
control_alarma();

Estebanquiable

Medio que me perdí  :)  :) . Pero un problema que veo yo es que estás usando unos retardos (delay) muy grandes esto lo que te genera es que por esos tiempos el Arduino se queda esperando sin hacer nada (leer el LDR por ejemplo), yo buscaría de leer un poco la función millis() o el uso de interrupciones para no perder paralelismo en el programa. De todas formas quizás ya lo leíste.

Saludos

genobraker

De seguro esta información te puede ser útil, con el método de la función millis puedes contar los segundos que quieras para realizar una u otra acción!.

http://www.educachip.com/razones-no-usar-funcion-delay-en-arduino/

Go Up