• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
zamek szyfrowy z EEPROM
#1
Witam. Może komuś potrzebny jest programik do obsługi zamka szyfrowego, oparty na klawiaturze matrycowej 4x4, którą można kupić już za ok 4 zł.?
Rozwiązanie umożliwia dynamiczną zmianę kodu wejścia w dowolnym momencie.
Czyli w wolnym tłumaczeniu zawsze możesz zmienić swój kod dostępu.

 Dane o kodzie są odczytywane z pamięci EEPROM. Programik możesz dowolnie zmodyfikować, np. zmienić ilość znaków dla szyfru czy kod administratora. (to już tylko po ponownej rekompilacji - dla bezpieczeństwa lepiej jest nie trzymać tego na na EEPROM).
W jakieś 3 godziny dłubania w kodzie udało się stworzyć dość fajny projekcik. Program korzysta za standardowej biblioteki EEPROM oraz z biblioteki Keypad, którą znajdziesz w załączniku :-)
Bibliotekę keypad.zip trzeba ściągnąć na dysk i potem zaimportować do IDE Arduino za pomocą opcji:
Szkic->Dołącz bibliotekę->Dodaj bibliotekę.zip ... i wskazać plik keypad.zip. 

Programik komunikuje się szeregowo TX-RX na Serialu dla zakumania o co aktualnie chodzi, oraz wydaje komunikaty dźwiękowe o swoim stanie. Po kilku minutach zabawy sami zorientujemy się po wydawanych dźwiękach o co biega i Serial nie będzie już nam potrzebny :-)
Jak działa?
-> po wpisaniu prawidłowego kodu - wystawia 1 na pinie 11, czyli otwiera zamek na 3 sek. ( można zmienić w kodzie)
-> po wpisaniu specjalnego kodu administratora ( patrz listing) możesz zmienić szyfr na inny, kod zapisywany jest w EEPROM i jest nieulotny. Po zaniku zasilania dalej jest pamiętany.

Całość do testów nie wymaga lutowania, tylko kabelki ze starter kita + buzzer + ew. sterownik elektrozaczepu -zamka ( dla testów możesz tam wrzucić LED-a, koniecznie z rezystorem :-) i po zmontowaniu, skompilowaniu i załadowaniu do Arduino działa natychmiast :-).
Staram się prezentując kod szczegółowo komentować co robi dana linia programu, więc myślę, że nie powinno być problemu ze zrozumieniem, co autor miał na myśli :-) Czas na kod:

Kod:
// --- zamek szyfrowy ... by wojtek@warcaby.lh.pl --------------
/* OPIS:
------------------------------------------------------------
- Klawiatura numeryczna 4X4 połączona do pinów 2-9 Arduino
- Pin 10 do połączenia BUZERA
- Pin 11 - wyjście sterujące zamkiem
- szyfr 5-cio znakowy
- zmiana szyfru po wpisaniu kombinacji: *7#AC ( lub innej dowolnej
5-cio znakowej - patrz w programie )
- do konfiguracji i sprawdzenia działania połacz Serial Terminal (kabel USB)
---------------------------------------------------------- */
#include <Keypad.h>
#include<EEPROM.h>
// --- zmiennie ------------------------------------------
const byte wiersze= 4; //ilość wierszy
const byte kolumny= 4; //ilość kolumn
//definicja klawiszy (identycznie jak na klawiaturze)
char mapaklawiszy[wiersze][kolumny]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte wiersze_piny[wiersze] = {9,8,7,6}; // wiersze 0-3
byte kolumny_piny[kolumny]= {5,4,3,2}; // kolumny 0-3
int pamiec[5]; // pamięc wciśniętych klawiszy - 5 znaków
volatile int szyfr=0; // szyfr=0 -> brak szyfr=1 jest aktywny
volatile int l=0; // zmienna pomocnicza, licznik znaków
volatile int result=0; // rezultat porównania ciągu 5-ciu znaków
int mykey[5]; // taklica wciśnietych znaków
// poniżej definicja obiektu klasy Keypad
Keypad myKeypad= Keypad(makeKeymap(mapaklawiszy), wiersze_piny, kolumny_piny,
wiersze, kolumny);
// --- funkcje programu: ---------------------------------
void warning_0()  // sygnały dźwiekowe dla poprawnego kodu
 {
   digitalWrite(10,1);delay(600);digitalWrite(10,0);delay(30);
   warning_1();
 }
// -------------------------------------------------------
void warning_1() // sygnały dźwiekowe dla błędnego kodu
 {
   digitalWrite(10,1);delay(30);digitalWrite(10,0);delay(30);
 }
// -------------------------------------------------------  
void odczyt_EEPROM() // funkcja sprawdza obecnośc szyfru w pamięci EEPROM
 {
  for (int i=0;i<5;i++) {pamiec[i]=EEPROM.read(i);}
  if(pamiec[0]!=255 && pamiec[1]!=255 && pamiec[2]!=255 && pamiec[3]!=255
  && pamiec[4]!=255) szyfr=1; else szyfr=0;
  // jeśli jest KOD to szyfr =1 else szyfr =0
 }
// -------------------------------------------------------  
void fnowy_kod() // funkcja ustawia nową kombinację dla szyfru
 {
  for(int i=0;i<5;i++)EEPROM.write(i,255); //kasowanie EEPROM
  Serial.println("Skasowano stary kod dostepu");
  Serial.print("Wprowadz nowy KOD dostepu: ");
  while(l<5)
    {
    char keypressed = myKeypad.getKey();
    if (keypressed != NO_KEY)
      {
      EEPROM.write(l,keypressed);l++; // zapis pojedynczego znaku
      Serial.print(keypressed);warning_1(); // komunikacja po RS
      }
    }
  for(int k=0;k<3;k++){
  warning_1();warning_1();warning_1();warning_1();warning_1();delay(300);}
  Serial.println(" ---> Kod dostepu zapisany");l=0;
 }
// ---------------------------------------------------------
void dostep() // funkcja sterująca zamkiem
 {
  Serial.print("Wprowadz KOD dostepu: ");
  while(l<5)
    {
    char keypressed = myKeypad.getKey();
    if (keypressed != NO_KEY)
      {
      mykey[l]=keypressed;l++;Serial.print(keypressed);warning_1();
      }
    }
  if( mykey[0]==pamiec[0] && mykey[1]==pamiec[1] && mykey[2]==pamiec[2]
  && mykey[3]==pamiec[3] && mykey[4]==pamiec[4] )
    {
    warning_1();warning_1();
    Serial.println(" OK ---> OTWIERAM ZAMEK na 3 sekundy !!!");
    digitalWrite(11,HIGH);delay(3000);digitalWrite(11,LOW);
    // otwieram zamek na 3 sek
    }
  else // sprawdzamy czy wybrano specjalny kod do zmiany szyfru
    {
      result++;
      if(mykey[0]=='*' && mykey[1]=='7' && mykey[2]=='#' && mykey[3]=='A'
      && mykey[4]=='C' )
        {
        // *7#AC
        for(int k=0;k<3;k++){
        warning_1();warning_1();warning_1();warning_1();warning_1();
        delay(300);}
        Serial.println(" ");
        Serial.print("Wykryto polecenie zmiany kodu dostepu...");
        Serial.println(" wykonuje procedure zmiany kodu");
        delay(500);l=0;fnowy_kod();
        }
      else result++;
    }
  if(result>1){ Serial.println(" ---> Kod NIEPRAWIDLOWY");
  warning_0();delay(500);result=0;}
  l=0;
 }
//-------------------------------------------------------
void setup()
{
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  digitalWrite(10,0);
  digitalWrite(11,0);
  Serial.begin(9600);
  Serial.flush();
}
//--------------------------------------------------------
void loop()
{
  odczyt_EEPROM();delay(30);
  if(szyfr==0)fnowy_kod();else dostep();
}
// =========== KONIEC ====================================
...i to by było na tyle
Wszelkie uwagi, sugestie i propozycje mile widziane :-)
Pozdrawiam


Załączone pliki
.zip   keypad.zip (Rozmiar: 18.54 KB / Pobrań: 22)
 
Odpowiedź
#2
Dziękuję za kod, mam bazę do zamka, dodam tylko RFID i będzie komplet.
 
Odpowiedź
#3
(19-01-2016, 09:07)zbyszek78 napisał(a): Dziękuję za kod, mam bazę do zamka, dodam tylko RFID i będzie komplet.

Dzień Dobry,
Jestem nowy w temacie Arduino i próbuję właśnie "złożyć" dwa kody w jeden. Kod RFID i kod Keypada, ale ciągle mam problemy Dodgy , mogę prosić o udostępnienie kodu którego Pan użył? Big Grin W sensie zamek na pin wraz z RFID

Pozdrawiam
 
Odpowiedź
#4
(19-01-2016, 08:37)wojtekizk napisał(a): Wszelkie uwagi, sugestie i propozycje mile widziane :-)
Marny ten program. Kod otwarcia nie jest zabezpieczony przez CRC i nie ma podwójnej kopii danych w EEPROM.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości