HOLA A TODA LA COMUNIDAD!
NECESITO UNA GRAN AYUDA! ME ARMÉ UNA ALARMA CASERA CON DISPLAY LCD DE 16 X 2, UN SENSOR PIR Y UN TECLADO MATRICIAL 4 X 4. LA ALARMA SE ACTIVA Y SE DESACTIVA CON CLAVE, FUNCIONA DE MARAVILLA SÓLO CON EL SENSOR PIR; EL PROBLEMA SURGE CUANDO UTILIZO UN SENSOR INFRAROJO PORQUE LA ALARMA SE ACTIVA PERO CUANDO EMPIEZA A FUNCIONAR NO ME DEJA DESACTIVARLA. ALGUIEN ME PUEDE AYUDAR CÓMO PUEDO SOLUCIONAR ESTE PROBLEMA? LES PASO EL CÓDIGO QUE UTILICÉ:
#include <Wire.h>
#include <LiquidCrystal.h> //Arduino Playground - LiquidCrystal Library
#include <Keypad.h> //Arduino Playground - Keypad Library
#include <Password.h> //Arduino Playground - Password Library
//int sensor = A0;
int passwd_pos = 7;
Password password = Password("1234");
LiquidCrystal lcd(5, 4, 3, 2, 1, 0);
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] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const int pirPin = A0; //entrada analógica sensor de movimiento PIR
const int Relay = A1; //entrada analógica buzzer
const int ledrojo = A2; //entrada analógica led rojo
const int ledverde = A3;//entrada analógica led verde
const int ledError = 50;
const int timeDelay = 30000; //tiempo para salir de la casa
int alarmStatus = 0; //estado de la alarma
int alarmActive = 0; //activación de alarma
void setup(){
lcd.begin(16,2);
pinMode(Relay, OUTPUT);
//pinMode(sensor, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledrojo, OUTPUT);
pinMode(ledverde, OUTPUT);
keypad.addEventListener(keypadEvent);
lcd.setCursor(0,0);
lcd.print("Alarma Domiciliaria");
lcd.setCursor(0,1);
lcd.print("TechnicalService");
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hola");
lcd.setCursor(0,1);
lcd.print("Edgardo David");
delay(2000);
digitalWrite(ledverde, HIGH);
displayCodeBlock();
}
void loop(){
keypad.getKey();
if (alarmActive == 1){
//if (digitalRead(sensor) == HIGH){
if (digitalRead(pirPin) == HIGH){
alarmTriggered();
}
}
}
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
if (passwd_pos - 15 >= 5){
return ;
}
lcd.setCursor((passwd_pos++),0);
switch (eKey){
case '#':
passwd_pos = 7;
checkPassword();
break;
case '':
password.reset();
passwd_pos = 7;
break;
default:
password.append(eKey);
lcd.print("");
}
}
}
void alarmTriggered(){
password.reset();
alarmStatus = 0;
digitalWrite(Relay, HIGH);
digitalWrite(ledrojo, HIGH);
digitalWrite(ledverde, LOW);
lcd.clear();
displayCodeUnBlock(); //modified
StrokeLight();{
}
}
void StrokeLight(){
for (int i=0; i<=10; i++){
if(i%2){
digitalWrite(ledrojo, HIGH);
}
else{
digitalWrite(ledrojo, LOW);
}
delay(ledError);
}
for (int i=0; i<=10; i++){
if(i%2){
digitalWrite(ledverde, HIGH);
}
else{
digitalWrite(ledverde, LOW);
}
delay(ledError);
}
digitalWrite(ledrojo, HIGH);
delay(100);
}
void checkPassword(){
if (password.evaluate()){
if(alarmActive == 0 && alarmStatus == 0){
activate();
}
else if( alarmActive == 1 || alarmStatus == 1){
deactivate();
}
}
else{
invalidCode();
}
}
void invalidCode(){
digitalWrite(ledverde, LOW);
password.reset();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Clave Incorrecta");
ledInvalid();
}
void ledInvalid(){
for (int i=0; i<=10; i++){
if(i%2){
digitalWrite(ledrojo, HIGH);
}
else{
digitalWrite(ledrojo, LOW);
}
delay(ledError);
}
if(alarmActive == 0 && alarmStatus == 0){
digitalWrite(Relay, LOW);
digitalWrite(ledverde, HIGH);
digitalWrite(ledrojo, LOW);
delay(200);
displayCodeBlock();
}
else if( alarmActive == 1 || alarmStatus == 1){
digitalWrite(Relay, HIGH);
digitalWrite(ledrojo, HIGH);
digitalWrite(ledverde, LOW);
delay(200);
}
}
void activate(){
alarmActive = 1;
password.reset();
digitalWrite(ledverde, LOW);
digitalWrite(ledrojo, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema Activado");
delay(timeDelay);
lcd.setCursor(0,1);
}
void deactivate(){
alarmStatus = 0;
alarmActive = 0;
password.reset();
digitalWrite(Relay, LOW);
digitalWrite(ledverde, HIGH);
digitalWrite(ledrojo, LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Desactivado");
delay(1000);
displayCodeBlock();
}
void displayCodeUnBlock(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Clave:");
lcd.setCursor(0,1);
lcd.print("Desactivar");
}
void displayCodeBlock(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Clave:");
lcd.setCursor(0,1);
lcd.print("Activar");
}