Сигнализация с кодовым замком

MadAirMan
Offline
Зарегистрирован: 24.12.2012

Добрый день!

Коллеги, нужна Ваша помощь!

Суть устройства - охранная сигнализация с кодовым замком.

Логика работы:

1. вводится пароль

2. через 7,5 секунд происходит активация системы 

3. Идет опрос геркона, если геркон изменил показания запускается счетчик времени для ввода пароля.

4. Если введен правельный код, то  система диактивируется.

Суть проблемы - ну могу написать счетчик времени для ввода пароля.

Прошу Вашей помощи.

Код приложил.

#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip

int greenLed = 10; //зеленый диод
int redLed = 9;  //красный диод
int gerkonPin = 11; //геркон дверь
int spikerPin = 12; //пьеза
int alarmStatus = 0; //флаг работающей сигнализации
int alarmActive = 0; //флаг активации системы
boolean gerkonState = 0;// состояние геркона
int buttonState = 0; 
int N = 0;

Password password = Password( "1234" );

const byte ROWS = 4; // Four rows
const byte COLS = 3; //  columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = { 2,3,4,5 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 6,7,8 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.


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

void setup(){
  pinMode(greenLed, OUTPUT); //задаем режим работы пинов
  pinMode(redLed, OUTPUT);
  pinMode(spikerPin, OUTPUT);
  pinMode(gerkonPin, INPUT);
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}

void loop(){
  keypad.getKey();
  /*if (alarmStatus == 1 ){      
      alarmTriggered();       
   }*/
   
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
	Serial.print("Pressed: ");
	Serial.println(eKey);
	switch (eKey){
	  case '*': 
		checkPassword(); 
	  break;
	  case '#': 
		password.reset(); 
	  break;
	  default: 
		password.append(eKey);
     }
  }
}

void alarmTriggered(){
	digitalWrite(spikerPin, HIGH);
	digitalWrite(redLed, HIGH);
	digitalWrite(greenLed, HIGH);
		
}

void checkPassword(){ // To check if PIN is corrected, if not, retry!
  if (password.evaluate())
  {  
    if(alarmActive == 0 && alarmStatus == 0)    {	
		activate();		
		}      
    } 
    else if( alarmActive == 1 || alarmStatus == 1) {
      buttonState = 1;			
    }
  }   
 

void activate(){	
	if(alarmStatus == 0){		
		digitalWrite(redLed, HIGH);
		digitalWrite(greenLed, LOW);
		delay(5000);	
		alarmStatus = 1;
		alarmActive = 1;		
		password.reset();
		Serial.println("SYSTEM ACTIVATED");
		Serial.print(gerkonState);		
		check();		
	}
	//else{
    //deactivate();   // if PIN not corrected, run "deactivate" loop
  //}
}

void deactivate(){
	digitalWrite(redLed, LOW);
	digitalWrite(greenLed, HIGH);
    digitalWrite(spikerPin, LOW);
	alarmStatus = 0;
	alarmActive = 0;		
	password.reset();
	Serial.println("SYSTEM DEACTIVATED");
	Serial.print(alarmStatus);
	Serial.print(alarmActive);
	Serial.println(digitalRead(gerkonPin));
}

void check(){	
	while(gerkonState < 1){
		gerkonState = digitalRead(gerkonPin);			
		keypad.getKey();
	}
	if (gerkonState = 1){
		for (int i=0; i <= 5; i++){ // 7,5 секунды на нажатие на ввод пароля 		
		keypad.getKey();}			
			if (buttonState == HIGH) { // отслеживаем свой — чужой 				
				N=N+1; 
			} 
		} 	
		if (N > 0) { // самое главное 
			deactivate(); // не включаем сирену 
		} else { 
			alarmTriggered();
		}
	}

 

MadAirMan
Offline
Зарегистрирован: 24.12.2012

Коллеги, ни кто подсказать не может?

toc
Offline
Зарегистрирован: 09.02.2013

1.по проблеме посмотрите пример blinkWithoutDelay
2.распишите логику отдельно и подробнее для
- режима "охрана включена"
- режима "охрана выключена"
- всех возможных переходов между режимами
3.в код не вчитывался. Если введён неверный пароль, reset не вызывается, а надо, кажется.