Alarma de sensor de movimiento

Buenos días , tardes o noches, necesito ayuda con un tema , tengo que realizar un proyecto que consiste en hacer una alarma de sensor de movimiento, que esta compuesta por :

Arduino uno R3
Sensor Pir
Teclado Marcial 4x4
Pantalla LCD 16x2
Led rojo
resistencia de 220 Ω
y un piezo

El cual tiene los siguientes errores

  1. ingreso la contraseña esta tarda el surgir efecto o en apagar la alarma y en algunos caso ni siquiera la apaga

  2. los mensajes que tienen que aparecer en la pantalla LCD se entrelazan y pierde3 sentido

he aquí el código


#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(13,12,5,4,3,2);
int frec=1000; //potencia en HZ del buzzer
int lectura=0; //variable para la lectura del sensor de movimiento
const byte ROWS = 4;
const byte COLS = 4;
char tecla;
int teclasIngresadas=0, intentos=0, intentosR=5;
char* contrasena="1234";
int x=0;
boolean alarmaActivada;

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,1};
byte colPins[COLS] = {0,A0,A1,A2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
	pinMode(8,OUTPUT); //buzzer
	pinMode(7,INPUT); //sensor
  	pinMode(6,OUTPUT); //led externo
  	lcd.begin(16, 2); //iniciar LCD con 16 caracteres en dos líneas
}
void loop(){
  lectura=digitalRead(7);
  if (lectura==HIGH && intentos!=5){ //si detecta movimiento
    lcd.setCursor(0,0); //pararse en la primera línea del display
    lcd.print("ALARMA ACTIVADA "); //mensaje a imprimir en LCD
    lcd.setCursor(0,1); //pararse en la segunda línea del display
    lcd.print("INGRESE EL PIN ."); //mensaje a imprimir en LCD
    tone(8, frec); //buzzing
    digitalWrite(6, HIGH);
    x=0;//esta línea nos permite tan solo ingresar CONTRASEÑA cuando el sensor deja de detectar movimiento.
  	alarmaActivada=true;
  }
    tecla=customKeypad.getKey(); //obtiene digitos desde keypad
  if(tecla){
  	teclasIngresadas++;
  }
  if(tecla==contrasena[x]){ //si coincide digito a digito
     x++; //aumentamos x: cuantas veces coincide el pin con los digitos que ingresa el usuario (de menor a mayor)
     lcd.setCursor(0,12);
     lcd.print("INTRUSO");
  }
  if (x==4 || alarmaActivada==false) {//coinciden los 4 digitos
    digitalWrite(6, LOW); //dejar apagado led externo
    	noTone(8); //dejar apagado buzzer
    	lcd.setCursor(0,0); //pararse en la primera línea del display
    	lcd.print("   TODO EN ORDEN    "); //mensaje a imprimir en LCD
    	lcd.setCursor(0,1); //pararse en la segunda línea del display
    	lcd.print(" CASA SEGURA "); //mensaje a imprimir en LCD
    	alarmaActivada=false;
    	x=0;
    	teclasIngresadas=0;
    	intentosR=5;
    	intentos=0;
    }
  if(teclasIngresadas==4 && teclasIngresadas!=0 && x!=4 && alarmaActivada==true){
    lcd.setCursor(0,0); //pararse en la primera línea del display
    lcd.print("ERROR DE PIN "); //mensaje a imprimir en LCD
    lcd.setCursor(0,1); //pararse en la primera línea del display
    lcd.print(intentosR-1);
    lcd.print(" INTENTOS FALLIDOS ");//mensaje a imprimir en LCD
    intentos++;
    if(x!=4)
    intentosR--;
   	teclasIngresadas=0;
  }
  if(intentos==5){
    tone(8, frec);
    lcd.setCursor(0,0); //pararse en la primera línea del display
    lcd.print("ALARMA ACTIVADA!"); //mensaje a imprimir en LCD
    lcd.setCursor(0,1); //pararse en la primera línea del display
    lcd.print("SE LLAMA AL FBI!");//mensaje a imprimir en LCD
    digitalWrite(6, HIGH);
    delay(700);
    digitalWrite(6, LOW);
    delay(700);
    lectura==LOW;
    x=5;
    teclasIngresadas=5;
  }	
}

```[/code]


(  Y por si necesitan  una visión mas clara del problema  aquí les dejo el enlace de mi circuito

https://www.tinkercad.com/things/0aS1F9wBWr9-copy-of-alarma-con-censor-de-movimiento-proyecto-4ta-unidad/editel?sharecode=dL544E9RmbiqUif6Zc7Fsw9FAw8gg2jEWhrUvZjsvRo  )

Por favor podrían i ayudarme o indicarme cual es mi error 

Gracias por su atención feliz día

Hola @gusman_7,
por favor publique su código en etiquetas </>.

RV mineirin

Perdón no entiendo a que se refiere, soy nuevo aqui y en arduino

Lee las Normas del foro, por favor.

Saludos

Moderador:
Por favor, lee las Normas del foro y edita tu código usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>



#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(13,12,5,4,3,2);
int frec=1000; //potencia en HZ del buzzer
int lectura=0; //variable para la lectura del sensor de movimiento
const byte ROWS = 4;
const byte COLS = 4;
char tecla;
int teclasIngresadas=0, intentos=0, intentosR=5;
char* contrasena="1234";
int x=0;
boolean alarmaActivada;

char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {11,10,9,1};
byte colPins[COLS] = {0,A0,A1,A2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
pinMode(8,OUTPUT); //buzzer
pinMode(7,INPUT); //sensor
pinMode(6,OUTPUT); //led externo
lcd.begin(16, 2); //iniciar LCD con 16 caracteres en dos líneas
}
void loop(){
lectura=digitalRead(7);
if (lectura==HIGH && intentos!=5){ //si detecta movimiento
lcd.setCursor(0,0); //pararse en la primera línea del display
lcd.print("ALARMA ACTIVADA "); //mensaje a imprimir en LCD
lcd.setCursor(0,1); //pararse en la segunda línea del display
lcd.print("INGRESE EL PIN ."); //mensaje a imprimir en LCD
tone(8, frec); //buzzing
digitalWrite(6, HIGH);
x=0;//esta línea nos permite tan solo ingresar CONTRASEÑA cuando el sensor deja de detectar movimiento.
alarmaActivada=true;
}
tecla=customKeypad.getKey(); //obtiene digitos desde keypad
if(tecla){
teclasIngresadas++;
}
if(tecla==contrasena){ //si coincide digito a digito
x++; //aumentamos x: cuantas veces coincide el pin con los digitos que ingresa el usuario (de menor a mayor)
lcd.setCursor(0,12);
lcd.print("INTRUSO");
}
if (x==4 || alarmaActivada==false) {//coinciden los 4 digitos
digitalWrite(6, LOW); //dejar apagado led externo
noTone(8); //dejar apagado buzzer
lcd.setCursor(0,0); //pararse en la primera línea del display
lcd.print(" TODO EN ORDEN "); //mensaje a imprimir en LCD
lcd.setCursor(0,1); //pararse en la segunda línea del display
lcd.print(" CASA SEGURA "); //mensaje a imprimir en LCD
alarmaActivada=false;
x=0;
teclasIngresadas=0;
intentosR=5;
intentos=0;
}
if(teclasIngresadas==4 && teclasIngresadas!=0 && x!=4 && alarmaActivada==true){
lcd.setCursor(0,0); //pararse en la primera línea del display
lcd.print("ERROR DE PIN "); //mensaje a imprimir en LCD
lcd.setCursor(0,1); //pararse en la primera línea del display
lcd.print(intentosR-1);
lcd.print(" INTENTOS FALLIDOS ");//mensaje a imprimir en LCD
intentos++;
if(x!=4)
intentosR--;
teclasIngresadas=0;
}
if(intentos==5){
tone(8, frec);
lcd.setCursor(0,0); //pararse en la primera línea del display
lcd.print("ALARMA ACTIVADA!"); //mensaje a imprimir en LCD
lcd.setCursor(0,1); //pararse en la primera línea del display
lcd.print("SE LLAMA AL FBI!");//mensaje a imprimir en LCD
digitalWrite(6, HIGH);
delay(700);
digitalWrite(6, LOW);
delay(700);
lectura==LOW;
x=5;
teclasIngresadas=5;
}
}

De esa manera es apropiado ?

Si, así es como corresponde. :wink:

Te marco 2 detalles que veo pero sin profundizar demasiado en el código.

Usas los pines 0 y 1 para el keypad, el tema es que esos pines son los que usa el puerto serial y tienen conectada la interfaz USB, por lo tanto puedes tener resultados impredecibles.

Otro es el tema de lo que imprimes en el display.
Te conviene que las cadenas tengan todas 16 caracteres rellenando con espacios la que sean más cortas, así evitas que te queden los "restos" de la impresión anterior.
Por ejemplo, si imprimes "INTRUSO_________" o "____INTRUSO_____" evitas que pudiese quedar algo como "INTRUSO EL PIN ." (pongo "_" por espacio)

Saludos

Muchas gracias por su ayuda y tiempo

saludos