матричная клавиатура для калитки нужна помощь

artemon25
Offline
Зарегистрирован: 25.12.2015

Доброго всем дня для многих не новость что можно подключить матричную клавиатуру к ардуино и с помощью реле открывать замок на калитке и я взял из интернета почти готовый скетч подправил его под свои цели и сейчас он работает но вот вопрос в мониторе порта при вводе первый раз кода 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); 
  } 
 
  }
 
 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Добавьте password.reset() перед закрывающей скобкой в строке 123 (т.е. вставьте строчку 

password.reset();

в строку 122, и будет щастье.

З.Ы. А ещё лучше - в строку 112.

artemon25
Offline
Зарегистрирован: 25.12.2015

СПАСИБО помогло всего то надо было одну строку добавить. Но на этом мои головоломки не закончились нужна помощь ещё в одном моменте в этот скетч который ук меня получился я хотел бы добавить ещё чтоб реле открывалось и с пульта на 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 а вместо него поставил радиоприёмник