матричная клавиатура для калитки нужна помощь
- Войдите на сайт для отправки комментариев
Чт, 09/06/2016 - 22:45
Доброго всем дня для многих не новость что можно подключить матричную клавиатуру к ардуино и с помощью реле открывать замок на калитке и я взял из интернета почти готовый скетч подправил его под свои цели и сейчас он работает но вот вопрос в мониторе порта при вводе первый раз кода 2405 пишется Success и соответсвенно реле срабатывает и через 5 секунд выключается но при вводе второй раз этот же код 2405 в мониторе порта пишет уже Wrong и соответсвенно ничего не происходит и только третий раз опять срабатывет реле где у меня ошибка что реле срабатывает через раз при вводе пароля.
заранее спасибо за ответ
#include <Password.h>
#include <Keypad.h>
Password password = Password("2405"); // password
int dlugosc = 4; // length of the password
int ledRed = 11;
int ledGreen = 12;
int buzzer = 13;
int relay = 10;
int ilosc; // number of clicks
const byte ROWS = 4; // rows
const byte COLS = 3; // cols
char keys[ROWS][COLS] =
{
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {2,3,4,5};
byte colPins[COLS] = {6,7,8};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
Serial.begin(9600);
keypad.addEventListener(keypadEvent);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
digitalWrite(relay, HIGH);
}
void loop()
{
keypad.getKey();
}
void keypadEvent(KeypadEvent eKey)
{
switch (keypad.getState())
{
case PRESSED:
int i;
for( i = 1; i <= 1; i++ )
{
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
delay(50);
}
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey)
{
/*
case '#':
break;
case '*':
break;
*/
default:
ilosc=ilosc+1;
password.append(eKey);
}
//Serial.println(ilosc);
}
if(ilosc == dlugosc)
{
delay(250);
checkPassword();
ilosc = 0;
}
}
void checkPassword()
{
if (password.evaluate())
{
int i;
for( i = 1; i <= 2; i++ )
{
digitalWrite(buzzer, HIGH);
delay(70);
digitalWrite(buzzer, LOW);
delay(70);
}
ilosc = 0;
Serial.println("Success");
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
digitalWrite(relay, LOW);
delay (5000);
digitalWrite(ledGreen, LOW);
digitalWrite(relay, HIGH);
digitalWrite(ledRed, HIGH);
}
else
{
int i;
for( i = 1; i <= 1; i++ )
{
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
ilosc = 0;
password.reset();
Serial.println("Wrong");
digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, HIGH);
digitalWrite(relay, HIGH);
}
}
Добавьте password.reset() перед закрывающей скобкой в строке 123 (т.е. вставьте строчку
в строку 122, и будет щастье.
З.Ы. А ещё лучше - в строку 112.
СПАСИБО помогло всего то надо было одну строку добавить. Но на этом мои головоломки не закончились нужна помощь ещё в одном моменте в этот скетч который ук меня получился я хотел бы добавить ещё чтоб реле открывалось и с пульта на 433мгц. имею скетч на работу реле попытался их объеденить но при заливке скетча в мониторе порта радиосигнал не проходит в чём может быть причина. выкладывю скетч работы реле с пульта и втрой скетч как я попытался их объеденить
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); int relay = 10; //Реле будет тут int analogData=0; //тут будут храниться данные с АЦП пин 0 int ledstate=0; //переменная состояния вкл-выкл void setup() { Serial.begin(9600); mySwitch.enableReceive(0); // приемник на pin 2 (DATA) pinMode(relay7, OUTPUT); digitalWrite(relay7, LOW); } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("error code"); // Ошибка приемка кода } else { Serial.print("code good"); // Принял код Serial.print( mySwitch.getReceivedValue() ); } if (mySwitch.getReceivedValue() == 7688384) { // 6133332 - код Включения1 digitalWrite(relay, HIGH); } if (mySwitch.getReceivedValue() == 7688204) { // 6133392 - код выключения1 digitalWrite(relay, LOW); mySwitch.resetAvailable(); } } }а вот объеденённый
#include <Password.h> #include <Keypad.h> #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); Password password = Password("2405"); // password int dlugosc = 4; // length of the password int ledRed = 11; int ledGreen = 12; int buzzer = 13; int relay = 10; int analogData=0; //тут будут храниться данные с АЦП пин 0 int ledstate=0; //переменная состояния вкл-выкл int ilosc; // number of clicks const byte ROWS = 4; // rows const byte COLS = 3; // cols char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = {9,3,4,5}; byte colPins[COLS] = {6,7,8}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { Serial.begin(9600); mySwitch.enableReceive(0); // приемник на pin 2 (DATA) keypad.addEventListener(keypadEvent); pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(relay, OUTPUT); digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); digitalWrite(relay, HIGH); } void loop() { keypad.getKey(); } void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: int i; for( i = 1; i <= 1; i++ ) { digitalWrite(buzzer, HIGH); delay(50); digitalWrite(buzzer, LOW); delay(50); } Serial.print("Pressed: "); Serial.println(eKey); switch (eKey) { /* case '#': break; case '*': break; */ default: ilosc=ilosc+1; password.append(eKey); } //Serial.println(ilosc); } if(ilosc == dlugosc) { delay(250); checkPassword(); ilosc = 0; } } void checkPassword() { if (password.evaluate()) { int i; for( i = 1; i <= 2; i++ ) { digitalWrite(buzzer, HIGH); delay(70); digitalWrite(buzzer, LOW); delay(70); } ilosc = 0; password.reset(); Serial.println("Success"); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); digitalWrite(relay, LOW); delay (5000); digitalWrite(ledGreen, LOW); digitalWrite(relay, HIGH); digitalWrite(ledRed, HIGH); } else { int i; for( i = 1; i <= 1; i++ ) { digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); delay(200); } ilosc = 0; password.reset(); Serial.println("Wrong"); digitalWrite(ledGreen, LOW); digitalWrite(ledRed, HIGH); digitalWrite(relay, HIGH); { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("error code"); // Ошибка приемка кода } else { Serial.print("code good"); // Принял код Serial.print( mySwitch.getReceivedValue() ); } if (mySwitch.getReceivedValue() == 7688384) { // 6133332 - код Включения1 digitalWrite(relay, HIGH); } if (mySwitch.getReceivedValue() == 7688204) { // 6133392 - код выключения1 digitalWrite(relay, LOW); mySwitch.resetAvailable(); } } } } }поменял местами от клавиатуры пин2 на пин 9 а вместо него поставил радиоприёмник