arduino + klawiatura 4x4 = zamek szyfrowy

Zrobiłeś coś fajnego z wykorzystaniem Arduino? Pochwal się tym!
ODPOWIEDZ
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: wojtekizk » 19 lis 2013, 18:37

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 8 zł.?
Rozwiązanie umożliwia dynamiczną zmianę kodu wejścia w dowolnym momencie. Dane o kodzie są odczytywane z pamięci EEPROM. Programik możesz dowolnie zmodyfikować, np. zmienić ilość znaków dla szyfru czy kod administratora.
W jakieś 2 godziny dłubania w kodzie udało się stworzyć dośc fajny projekcik. Program korzysta za standardowej biblioteki EEPROM oraz z biblioteki keypad, którą znajdziesz w : playground.arduino.cc/Code/Keypad
Bibliotekę keypad.zip trzeba ściągnąć na dysk i potem zaimportować do IDE Arduino za pomocą opcji:
Szkic->Importuj Bibliotekę->Add library ... i wskazać plik keypad.zip Arduino skopiuje bibliotekę do standardowego katalogu: Moje Dokumenty\Arduino\Libraries\'
Programik komunikuje się szeregowo TX-RX na Serialu oraz wydaje komunikaty dźwiękowe o swoim stanie.
-> po wpisaniu prawidłowego kodu - wystawia 1 na pinie 11, czyli otwiera zamek
-> po wpisaniu specjalnego kodu administratora ( patrz listing) możesz zmienić szyfr na inny, kod zapisywany jest w EEPROM i jest nieulotny.
Całość nie wymaga lutowania, tylko kabelki ze starter kita + buzzer + ew. sterownik elektrozaczepu (zamka) i po zmontowaniu, skompilowaniu i załadowaniu do Arduino działa natychmiast :-) Czas na soft:

Kod: Zaznacz cały

// --- zamek szyfrowy ... by [email protected] --------------
/* 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
Keypad myKeypad= Keypad(makeKeymap(mapaklawiszy), wiersze_piny, kolumny_piny,
 wiersze, kolumny); 
// definicja obiektu klasy Keypad
// --- funkcje programu: --------------------------------- 
void warning_0() 
  {
    digitalWrite(10,1);delay(600);digitalWrite(10,0);delay(30);
    warning_1();
  } // bipper dla OK
void warning_1() 
  {
    digitalWrite(10,1);delay(30);digitalWrite(10,0);delay(30);
  } // bipper dla wrong code
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 
     } 
   // sprawdzamy czy wybrano specjalny kod do zmiany szyfru 
   else 
     {
       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 ====================================
Ostatnio zmieniony 17 lut 2014, 13:52 przez wojtekizk, łącznie zmieniany 3 razy.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: hyena » 29 lis 2013, 00:34

Witam, jestem raczkujący w programowaniu AVR ale ten program mnie zaskoczył swoją wartością dydaktyczną. Niestety kompilator w Eclipse znalazł błąd. W tej chwili jestem w pracy i nie mam Eclipsa ale chodzi o te miejsce które jest zakomentowane w okienku Arduino. Nie wiem czemu się przyczepił bo się nie zanam. Chodzi o instrukcje "waring_1();" Co ciekawe w Arduino nie widzi problemu ale w Eclipsie ciągle podkreśla mi tą linię. Chciałem zapytać czy nie da się wstwić kodu jakoś bardziej elegancko, ponieważ dla nowicjusza wygląd jest ważny, aby uzyskać czytelność a zarazem łatwiejsze zrozumienie.
zrzut_ekranu.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: wojtekizk » 29 lis 2013, 07:46

Cześc.. odpowiem kol. MrLewerence, Twój fragment kodu:
{
{'1', '2', '3', 'F1', 'F5},
{'4', '5', '6', 'F2', 'F6},
{'7', '8', '9', 'F3', 'F7'},
{'*', '0', '#', 'F4', 'F8}
};
...tymczasem w samej bibliotece Keypad w pliku keypad.h czytamy:
char getKey(); - deklaracja funkcji - czyli funkcja pobierająca wciśnięty znak zwraca zmienną typu char, więc pojedynczy znak.
Po drugie sama deklaracja konstruktora klasy Keypad:
Keypad(char *userKeymap, byte *row, byte *col, byte numRows, byte numCols);
Mamy tu : char *userKeymap - czyli tablicę pojedynczych znaków.
Funkcja getKey() nie zwróci Ci F1 czy F3 itd. Musisz zdefiniować klawiaturkę jak pojedyncze znaki. Nie ma znaczenia że wciskasz np. F3, w programie musisz "umówić" się z kompilatorem że F3 na przykład to będzie A, F4 to B itd. Jak na klawiaturze wciśniesz F4 to program będzie sobie myślał, że wcisnąłeś np. D. Czyli np:

{'1', '2', '3', A', 'B'},
{'4', '5', '6', 'C', 'D'},
{'7', '8', '9', 'E', 'F'},
{'*', '0', '#', 'G', 'H'}
... musi działać, tyle ze np. Serial zwróci Ci A zamiast F1
Pozdrawiam
Ostatnio zmieniony 29 lis 2013, 10:05 przez wojtekizk, łącznie zmieniany 2 razy.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: wojtekizk » 29 lis 2013, 08:22

Sorki...Jeszcze dorzucę swoje 3 grosze do postu MrLewerence:
Zadałem sobie pytanie dlaczego sam kompilator nie wywalił błędu już przy próbie napisania 'F2' podczas definiowania klawiatury??? Przecież zmiennej typu char przypisujemy 2 znaki zamiast jednego !!! Inny kompilator nie przeoczył by tego, przynajmniej wystawił by warninga...Na szczęście nasz kompilator także go wystawił. Inna sprawa że obsłużył już jakoś dziwnie...
Odpowiedzią jest tzw. "rzutowanie typów", czyli mówiąc oględnie kompilator jak napotkał zmienną typu
*char (w naszym przykładzie napis 2, lub 3 znakowy, bo przecież trzecim znakiem jest tu znak pusty), w miejscu gdzie spodziewał się char, to sam niejawnie zamienił ją na char, czyli obciął do jednego znaku.
Czyli wszystko pięknie, napisano 'F2' i jak czytam w Twoim programie MrLewerence zwrócił Ci w każdym przypadku F.
Też fajnie ... tyle że nie dało mi to spokoju ... zwrócił pierwszy znak z ciągu np. F2... OK
...ale spróbujcie wykonać na próbę taki programik:

Kod: Zaznacz cały

char x= 'F2';
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(x);
}
Jak myślicie co zobaczymy na Serialu???
Cóż myślę, że każdy z nas może mieć albo '2' albo 'F' ... w każdym razie u mnie jest '2', a z tego co pisze MrLewerence jemu wychodzi w programie 'F'. Czemu mam inaczej?, być może korzystamy z różnych wersji kompilatora, być może ja mam innego debuggera, bo gdzieś do patha wkradł się zapis z Borlanda czy Javy, który każe odwoływać się do innego kompilatora, lub każe korzystać z innych opcji kompilatora przy składaniu w manifeście wszystkiego do "kupy"... Nie wiem, w każdym razie jeśli tak jest, to nie jest dobrze.
Podejrzewam, że nawet twórcy kompilatora nie spodziewali się takiej reakcji. Można by to uznać jako błąd prawda?, czy też nie?.. Sam nie wiem trzeba by zapytać ekspertów od czystego C, nie C++. Poza tym nie wiem co na to norma ANSI, nie zgłębiałem tego tematu. Może ktoś odpowie. W sumie i tak możemy dziękować bogu, że tylu zdolnych ludzi za darmochę zajmuje się rozbudową i konserwacją projektu ARDUINO.
Pozdrawiam
Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: hyena » 11 sty 2014, 13:24

Zameczek pięknie działa jak marzenie, ale jest ale. Chcę sterować dwoma przyciskami niezależnie od reszty. Potrzebne mi są żeby otworzyć rygiel od wewnątrz. Czyli dwa przyciski i servo. Nie mam ogólnie pomysłu jak to zrealizować, chyba będzie potrzebne przerwanie tylko nie bardzo wiem jak to się je. Niby coś tam czytałem ale nie bardzo rozumiem.(Angielski bardzo miernie, niestety) Może przerwanie nie jest konieczne i może się da w jakiś sposób zrealizować programowo. Proszę o jakieś sugestię, podpowiedzi, wskazówki. Przyciskami steruję przy pomocy bibloteki "Button.h"
w taki sposób;

Kod: Zaznacz cały

if(Open.isPressed()) {
        servo_lock();
      }
      if(Close.isPressed()) {
        servo_unlock();    
Chyba łatwiej się nie da. Jak dla mnie bajka. Oczywiście to działa jak jest w pętli "while(1)" Po prostu nie mam pojęcia jak wymusić inaczej działanie.

@ Sprawa załatwiona znalazłem rozwiązanie. Dzięki za pomoc i sugestie. Wiem że zamek to ogólnie nie zbyt ciekwy temat i jest małe zainteresowanie. Ale zawsze ktoś coś może zasugerować (choć by sam twórca pomysłu). Na marginesie dodam że rozwiązanie problemu było tu na foum majstrkowo. Wiem, wiem nikt nie lubi hyeny. :))
bio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 7 paź 2014, 01:16

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: bio » 25 cze 2015, 22:21

Czy ktoś mógł by mi pomóc ... potrzebuje dodać funkcję zerowania sekwencji wpisywania kodu ... tj. jesli ktoś zrobi przerwę na ok 2.sek to jest reset oczekiwania na kod i trzeba wpisać cały od nowa.. bardzo pilne ...z góry dziękuje
Jabbadabbadahat
Młodszy majsterkowicz
Posty: 35
Rejestracja: 12 lis 2015, 16:23

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Jabbadabbadahat » 15 sty 2016, 12:09

Czy ktoś wie gdzie dostać tanio zworę elektromagnetyczną?
Arduino
Majsterkowicz
Posty: 56
Rejestracja: 18 sty 2016, 22:23

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Arduino » 21 sty 2016, 18:48

Kiedyś zrobiłem coś podobnego i załączyłem to do szafki z zamkiem. Nieszczęśliwym trafem odłączyło się zasilanie z baterii i musiałem rozebrać szafkę. ;)
Arduino
Majsterkowicz
Posty: 56
Rejestracja: 18 sty 2016, 22:23

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Arduino » 21 sty 2016, 18:49

Jabbadabbadahat pisze:Czy ktoś wie gdzie dostać tanio zworę elektromagnetyczną?
Najlepiej na allegro.
erdmann
Młodszy majsterkowicz
Posty: 2
Rejestracja: 11 wrz 2016, 16:50

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: erdmann » 11 wrz 2016, 23:03

witam czy do ww kodu mogę podłączyć taką klawiaturę TTP229-BSF opis http://forum.arduino.cc/index.php?topic ... msg2252580
erdmann
Młodszy majsterkowicz
Posty: 2
Rejestracja: 11 wrz 2016, 16:50

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: erdmann » 12 wrz 2016, 15:13

Tak ale czy można sterować takim zamkiem jedynie przez i2c ( SCL i SC0 ) tylko 4 kable SCL, SC0, GND i VCC
Organ18
Młodszy majsterkowicz
Posty: 9
Rejestracja: 15 lis 2016, 13:07

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Organ18 » 18 lis 2016, 16:01

Cześć wam potrzebuje pomocy bo nie miałem jeszcze okazji używać EEPROM , tutaj jeden z naszych kolegów podał sketcha odnośnie że po wpisaniu kodu otwiera się zamek . A ja potrzebuje takiej pomocy że oprócz otwierania po wpisaniu kodu pin , EEPROME zapisywało dane z klawiatury jak kalkulator czyli dodawanie i odejmowanie np. guzik A będzie + , B będzie - , a C będzie zapisz tylko jak to zrobić że oprócz przypisania funkcji do klawiszy EEPROM zapamiętywał też " nazwijmy to proste działania "
Awatar użytkownika
ethanak
Złota rączka
Posty: 755
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: ethanak » 18 lis 2016, 16:09

Jakbyś to na jakiś normalny język przetłumaczył (proponuję polski, bo na tym forum jest dość popularny) to może by kto pomógł... na razie nie bardzo wiem o co Ci tak naprawdę chodzi.
Podaj przykład co wprowadzasz z klawiatury i jak ma system zareagować.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
Marhef
Złota rączka
Posty: 1079
Rejestracja: 18 lis 2011, 02:18

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Marhef » 18 lis 2016, 16:25

Kolego @Organ18, załóż nowy wątek, doklejanie się do innych nie jest dobrą praktyką.
Funkcja do zapisu do pamięci EEPROM to EEPROM.write(miejsce_w_pamieci , wartosc);
Resztę podpowiedzi, jak już założysz nowy wątek
Organ18
Młodszy majsterkowicz
Posty: 9
Rejestracja: 15 lis 2016, 13:07

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Organ18 » 18 lis 2016, 17:50

Jak poruszałem w innym wątku temat mojego projektu to niedostałem konkretnej pomocy dlatego tu się podłączyłem bo jest to dla mojego projektu po części rozwiązanie. Mówiąc po krótce dla dzieciaka od mojej znajomej buduje kase fiskalną jako skarbonka i ten program klawiatury i zamka szyfrowego mogę go wykorzystać że Klawiatura posłuży do wpisania kodu PIN , a jako ten zamek będzie serwo które otwiera szuflade z kasą . Ale brakuje mi jednej kwestii , mianowicie jak zrobić że wkładane pieniądze do skarbonki lub wyjmowane będą zapamiętane w eeprom. Przykład dzieciak wkłada 5 zł do skarbonki klika 5 ( i klawisz A jako dodaj) no i klikając klawisz C ( zapisuje w eeprom) że skarbonka ma 5 zł i w tym momencie otwiera się szuflada na kasę , a innego dnia chce włożyć 10 zł to znów klika 10A i system zapamiętuje że jest 15 zł w skarbonce itd. a klawisz B będzie jako odejmowanie . Dlatego pytałem jak zrobić że takie nazwijmy to operacje przeprowadzane na klawiaturze czyli dodawanie lub odejmowanie EEPROM zapisze . Chyba że macie inny pomysł jak zrobić program który te Dodawanie lub Odejmowanie nie utraci po mimo braku prądu bo elektrownia wyłączy lub dziecko wyciągnie wtyczkę myślałem o karcie SD ale na innym wątku podpowiedzieli odnośnie EEPROM z którym nie ukrywam mam problem .
Awatar użytkownika
ethanak
Złota rączka
Posty: 755
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: ethanak » 18 lis 2016, 19:14

Krapi pisze: już mnie idea Arduino zaczyna cholernie drażnić - w 2 dni każdy chce budować zaawansowane urządzenia, ale żeby przeczytać choćby jedną stronę o programowaniu czy elektronice to "nieee... inni zrobią to za mnie" :/
Widzisz - bo Arduino jest tak jak z wódką. Każdy może kupić... a problemy zaczynają się, jak już kupi ;)
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Organ18
Młodszy majsterkowicz
Posty: 9
Rejestracja: 15 lis 2016, 13:07

Re: arduino + klawiatura 4x4 = zamek szyfrowy

Post autor: Organ18 » 18 lis 2016, 19:52

Krapi jak napisałem sam program odnośnie sygnalizaora dla samochodów jak i przejścia dla pieszych , okazało się że po wgraniu na sygnalizatorze samochodowym zamiast zaświecić się Czerwone z pomarańczowy od razu z czerwonego wskakiwało mi na zielone . Zapytałem kilka osób o co w tym chodzi skoro mam stan wysoki na pomarańczowym a się nie zapala , oczywiście zamiast mi pomóc kazali poczytać jak się programuje diody inni że mam w całym sketchu zamiast delay używać millis i tak wyglądała pomoc doszedłem do tego sam że na samym końcu skeczu brakowało mi delay . Większość tak podchodzi że mają wiedzę i zamiast pomóc bo inny nie rozumie to wolą napisać że mam sobie poczytać kurs . A co do twoich słów nie oczekuje jak to sugerujesz ty gotowego sketchu tylko pytam jak zapisać bo czytam o tym eeprom i nadal dla mnie to czarna magia .
ODPOWIEDZ

Strony partnerskie: