Добрый день! Коллеги, нужна Ваша помощь! Суть устройства - охранная сигнализация с кодовым замком. Логика работы: 1. вводится пароль 2. через 7,5 секунд происходит активация системы 3. Идет опрос геркона, если геркон изменил показания запускается счетчик времени для ввода пароля. 4. Если введен правельный код, то система диактивируется. Суть проблемы - ну могу написать счетчик времени для ввода пароля. Прошу Вашей помощи. Код приложил. Код (C++): #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(); } }
Может что-то типа этого подойдёт? Код (C++): unsigned long startCountdownTime; ... startCountdownTime = millis(); while (millis() - startCountdownTime < 7500){ ; }