воскресенье, 4 августа 2013 г.

Кодовый замок с экраном и динамиком

Попробовал побаловаться с клавиатурой купленной по случаю и лежавшей и ждавшей другого удобного случая. Вот недавно звёзды сошлись и получился кодовый замок (это первое что приходит в голову при виде такой клавки). По ходу пригодилась и казалось бы вполне бесполезная, в силу своей прожорливости, библиотека по проигрыванию звука на Arduino - PlaySound. Так что кодовый замок с динамиком:


Клаву я подпаял на половину платы PlugDIO, как раз хорошо подошла - 7 выводов клавы на 7 портов BlockDuino, и притыкнул в первый слот, т.е. в порта D0-D6:
Так же подпаял на CleClo:Proto транзисторный ключ для управления динамиком:


Кстати, тут же запланировал оформить в виде отдельной платки CleClo:Speaker.
Ну и для отображения информации подключил BlockLCD0802_IC, который управляется по протоколу I²C. И еще подключил светодиод, вернее платку CleClo:LED, для имитации работы дверного магнитного (или какого еще там) замка. Подключил к PlugDIO.
Все вместе выглядит вот так:
Код:

Код под спойлером:

//http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Password.h>
//http://www.arduino.cc/playground/uploads/Code/Keypad.zip
#include <Keypad.h> 
#include <Wire.h> 
#include <lib_BlockLCD0802_IC.h>
#include <util/delay.h>
//http://cyber-place.ru/attachment.php?attachmentid=563&stc=1&d=1350904070
#include <PlaySound.h>

#include "traffi.h"
#include "hi.h"
#include "timeout.h"
#include "click.h"

Password password = Password( "1234" );

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

byte rowPins[ROWS] = { 0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6}; //connect to the column pinouts of the keypad

lib_BlockLCD0802_IC lcd(0x3F,8,2); 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const byte ledPin = 13; 

void setup(){
  lcd.init();
  lcd.backlight();
  lcd.print("ВведиКод");
  lcd.setCursor(0, 1);
  pinMode(ledPin, OUTPUT);      // pin for Relay
  digitalWrite(ledPin, LOW);   // sets the LED on
}
  
void loop(){
  char key = keypad.getKey();
  
  if (key != NO_KEY){
    keypadEvent(key);
  }
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (eKey){
    case '*':
        guessPassword();
        break;
    
    case '#': 
        PlaySound::startPlayback((uint8_t *)click,  click_length);
        passReset();
        break;
        
    default: 
        PlaySound::startPlayback((uint8_t *)traffi,  traffi_length);
 password.append(eKey);
        lcd.write('*');
  }
}

void guessPassword(){
 if (password.evaluate()){
          PlaySound::startPlayback((uint8_t *)hi,  hi_length);
         digitalWrite(ledPin,HIGH);
          lcd.setCursor(0, 1);
          lcd.print("Проходи!");
          delay(3000);
          passReset();
          digitalWrite(ledPin,LOW);
          PlaySound::startPlayback((uint8_t *)click,  click_length);
          
 }else{
          PlaySound::startPlayback((uint8_t *)timeout,  timeout_length);
          lcd.setCursor(0, 1);
          lcd.print(" ОШИБКА");
          delay(3000);
          passReset();
 }
}
void passReset(){
        password.reset();
        lcd.setCursor(0, 1);
        lcd.print("         ");
        lcd.setCursor(0, 1);
}
Ссылки:


Видео отчет:


Update: Есть еще вариант кодового замка попроще - без клавы и экрана, но на четырех переменных резисторах: Кодовый замок на 4х резисторах - DoorLock with 4 pot
Update2: И еще один замочек появился - ввод с одного резистора, отображение кода на четырехзначном семисегментном дисплее Сейфовый кодовый замок с семисегментным дисплеем - SafeLock with 1 pot and 7Seg display