W dzisiejszym artykule przedstawię sposób, jak zbudować dziennik użyć kart RFID przy pomocy Arduino Uno, Ethernet Shield oraz czytnika RFID RC522. Wykorzystamy również technologie webowe, takie jak PHP i mySQL – opisywane w poprzednich artykułach. Układ pozwala na autoryzację z góry określonych kart dostępowych i tylko te karty są rejestrowane w dzienniku. W przykładzie wykorzystałem diody LED, lecz układ można uzupełnić o serwo-mechanizm lub elektrozamek – wtedy będziemy mogli zabezpieczyć drzwi wejściowe, bramę wejściową lub szafkę. Możliwości jest bardzo dużo – od nas zależy, jak wykorzystamy układ.
Poniżej kilka propozycji
- drzwi wejściowe autoryzowane kartą RFID
- szafka przy biurku
- pomieszczenie chronione (nasz warsztat 🙂 )
- brama garażowa
- prosta rejestracja czasu pracy pracowników w firmie
Do budowy dziennika niezbędne są następujące elementy:
- Arduino Uno
- Ethernet Shield
- Czytnik RFID RC522 + karty
- Router, kabel ethernet
- Diody led, rezystory
- Płytka prototypowa, kable połączeniowe
- serwer z obsługą PHP i MySQL
Zasada działania układu:
Po przybliżeniu do czytnika karty RFID sprawdzany jest jej unikalny Uid, następnie jest on porównywalny z numerem który zadeklarowaliśmy na samym początku kodu. Jeżeli numery są takie same, Arduino poprzez http request uruchamia skrypt PHP aktualizujący bazę danych o datę i godzinę użycia karty oraz jej ID. Jeżeli autoryzacja przebiegła pozytywnie, zaświecana jest zielona dioda LED. W przeciwnym wypadku zapala się czerwona dioda. Nic nie stoi na przeszkodzie, aby rejestrować wszystkie użyte karty – nawet te nieautoryzowane (wystarczy zmienić warunek w kodzie). Wszystkie zdarzenia zapisywane są z bazie mySQL a wyświetlane za pomocą prostej strony przygotowanej w PHP i przy pomocy frameworka Bootstrap.
Podłączenie MR-RC522
[notification type=”alert-danger” close=”false” ]Ważne: Ethernet Shield jak również RC522 wykorzystują do komunikacji magistralę SPI. Dlatego ważne jest, aby obydwa moduły podłączyć tak aby „nie gryzły się ze sobą.” [/notification]
Ethernet Shield korzysta z następujących pinów na UNO:
D13, D12, D11 – szyna SPI (D50, D51 i D52 na Arduino Mega)
D10 – slave select dla modułu Ethernet
D4 – slave select dla karty SD
D2 – jeżeli zostanie zlutowany pad na spodniej stronie shielda, wówczas D2 jest połączony z linią INT układu W5100
A0 – detekcja zabezpieczenia zapisu na karcie SD (write protect)
A1 – detekcja obecności karty SD w slocie
Opis działania prostej strony przygotowanej w PHP
Skrypt dziennik.php pobiera z bazy danych dwie kolumny: timeStamp oraz idkarty. Następnie wyświetla je w formie tabeli. Dane sortowane są od najnowszego użycia. Szablon jest w pełni responsywny, dzięki czemu dostosuje się do wyświetlania na każdym urządzeniu.
[notification type=”alert-success” close=”false” ]Cały skrypt wraz z strukturą bazy danych dostępny jest do pobrania tutaj. Wystarczy utworzyć bazę danych, uzupełnić plik połączeniowy z bazą danych oraz wrzucić pliki na serwer z obsługą PHP.[/notification]
Opis plików:
connectDB.php – połączenie z bazą danych
dziennik.php – odczyt danych z bazy w formie tabeli
rfid.php – skrypt aktualizujący bazę poprzez Arduino
dziennikRFID.sql – struktura bazy mySQL:
Widok skryptu:
Sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#include <SPI.h> #include <MFRC522.h> #include <Ethernet.h> byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; EthernetClient client; #define SS_PIN 7 #define RST_PIN 6 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. byte readCard[4]; String rfidUid = ""; String kartaauth1="9bd37725"; // deklaracja autoryzowanej karty void setup() { // disable RFID SPI pinMode(7, OUTPUT); digitalWrite(4, HIGH); // disable w5100 SPI pinMode(10, OUTPUT); digitalWrite(10, HIGH); Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); } SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card Serial.println("Scan PICC to see UID and type..."); pinMode(3, OUTPUT); pinMode(4, OUTPUT); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } for (byte i = 0; i < mfrc522.uid.size; i++) { rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""); rfidUid += String(mfrc522.uid.uidByte[i], HEX); mfrc522.PICC_HaltA(); } Serial.println(rfidUid); if(rfidUid == kartaauth1) { digitalWrite(3,HIGH); digitalWrite(4,LOW); if (client.connect("xxx.xxx.xxxl",80)) { // REPLACE WITH YOUR SERVER ADDRESS client.print("GET /rfid.php?"); client.print("getrfid="); client.print(rfidUid); client.println( " HTTP/1.1"); client.println( "Host: xxx.xxx" ); client.println("Content-Type: application/x-www-form-urlencoded"); client.println( "Connection: close" ); client.println(); client.println(); } if (client.connected()) { client.stop(); // DISCONNECT FROM THE SERVER } } else { digitalWrite(3,LOW); digitalWrite(4,HIGH); } delay(3000); digitalWrite(3,LOW); digitalWrite(4,LOW); rfidUid = ""; } |
Jeżeli będą problemy z instalacją skryptów lub ze zrozumieniem kodu, zapraszam do kontaktu. Bardzo chętnie pomogę i postaram się wyjaśnić niezrozumiałe rzeczy.
Miłego majsterkowania!