Hardware
1 x Arduino Nano
1 x Ethernet W5100
1 x RC522
1-4 x RGB LEDs
1 x Buzzer (Summer)
1 x Platine (universal)
Elektrische Verbindungen (Schaltung)
Ethernet zu Arduino
MO -> Pin 11
MI -> Pin 12
SCK -> Pin 13
SS -> Pin 10
5v -> 5V
GND -> GND
RC522 zu Arduino
MO -> Pin 11
MI -> Pin 12
SCK -> Pin 13
SDA -> Pin 9
5v -> 5V
GND -> GND
RGB-LEDs und Buzzer
Grün -> Pin7
Blau -> Pin 6
Rot -> Pin 5
Buzzer -> Pin 4
!! LEDs brauchen einen Vorwiderstand bitte passend dazu einbauen !!
Stromversorgung
5V -> VIN
GND -> GND
Arduino Code
// RFID 2 Loxone Miniserver // DHCP Version //Bibliotheken die benoetigt werden #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> #include <MFRC522.h> // Definition Befehle #define LED_ON HIGH #define LED_OFF LOW #define BUZZER_ON HIGH #define BUZZER_OFF LOW // Definition Pins #define greenLed 7 // Farbe gruen RGB LED #define blueLed 6 // Farbe blau RGB LED #define redLed 5 // Farbe rot RGB LED #define buzzer 4 // Buzzer/Summer // Definition Pins fuer RC522 #define SS_PIN 9 // SS-Pin fuer RC522 #define RST_PIN 8 //RST-Pin fuer RC522 // MFRC522 Instanz eroeffnen MFRC522 mfrc522(SS_PIN, RST_PIN); // Variablen byte readCard[4]; String uID; // Netzwerk Einstellungen // bei mehr als einem Reader MAC anpassen byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAC }; // UDP Port zum Datenempfang Lox MS -> Arduino unsigned int ARDUPORT = 7003; // IP Lox MS IPAddress MSIP(192, 168, 136, 200); // UDP Port zum Datenversand Arduino -> Lox MS unsigned int MSPORT = 7003; // Daten-Buffer char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // EthernetUDP Instanz um UDP zu senden/empfangen EthernetUDP Udp; // Programm void setup() { Serial.begin(9600); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); pinMode(redLed, OUTPUT); pinMode(buzzer, OUTPUT); digitalWrite(buzzer, BUZZER_OFF); // stellt sicher das digitalWrite(redLed, LED_OFF); digitalWrite(greenLed, LED_OFF); digitalWrite(blueLed, LED_OFF); if (!Ethernet.begin(mac)) Serial.println("DHCP fehlgeschlagen"); else { Serial.println ("Netzwerkdaten"); Serial.println ("---------------"); Serial.print("Arduino MAC: "); Serial.print(mac[0], HEX); Serial.print(":"); Serial.print(mac[1], HEX); Serial.print(":"); Serial.print(mac[2], HEX); Serial.print(":"); Serial.print(mac[3], HEX); Serial.print(":"); Serial.print(mac[4], HEX); Serial.print(":"); Serial.println(mac[5], HEX); Serial.print("Arduino IP: "); Serial.println(Ethernet.localIP()); Serial.print("Arduino UDP Port: "); Serial.println(ARDUPORT); Serial.println ("---------------"); Serial.print ("Miniserver IP: "); Serial.println(MSIP); Serial.print("Miniserver UDP Port: "); Serial.println(MSPORT); Serial.println ("---------------"); } Udp.begin(ARDUPORT); // Start UDP SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 Karte mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); // Setzt Antenne auf max. Empfang } void loop() { // schaut on ein UDP Befehl empfangen wurde checkUDP(); if (!strcmp(packetBuffer, "OK")) { uuid_ok(); } else if (!strcmp(packetBuffer, "NOK")) { uuid_notok(); } else if (!strcmp(packetBuffer, "SAB")) { uuid_lock(); } else { wait_picc(); } // RDIF lesen und Werte bearbeiten if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } int val1 = (mfrc522.uid.uidByte[0]); int val2 = (mfrc522.uid.uidByte[1]); int val3 = (mfrc522.uid.uidByte[2]); int val4 = (mfrc522.uid.uidByte[3]); String valA = String(val1, HEX); String valB = String(val2, HEX); String valC = String(val3, HEX); String valD = String(val4, HEX); uID = valA + valB + valC + valD; Serial.print("RFID-Key: "); Serial.print(uID); Serial.println(); sendUDP(uID); mfrc522.PICC_HaltA(); return; } //empfangene UDP-Befehle auswerten void checkUDP() { // if there's data available, read a packet int packetSize = Udp.parsePacket(); if (packetSize) { // read the packet into packetBufffer Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); } delay(10); } //UDP-Befehl senden void sendUDP(String text) { Udp.beginPacket(MSIP, MSPORT); Udp.print(text); Udp.endPacket(); delay(10); } //RFID PIC OK // LED gruen geht an, Buzze piep einmal kurz (50ms) void uuid_ok() { digitalWrite(blueLed, LED_OFF); digitalWrite(redLed, LED_OFF); digitalWrite(greenLed, LED_ON); digitalWrite(buzzer, BUZZER_ON); delay(50); digitalWrite(buzzer, BUZZER_OFF); delay(1000); for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = 0; } //RFID PIC nicht OK // LED rote geht an, Buzze piep zweimal kurz (50ms) void uuid_notok() { digitalWrite(greenLed, LED_OFF); digitalWrite(blueLed, LED_OFF); digitalWrite(redLed, LED_ON); digitalWrite(buzzer, BUZZER_ON); delay(50); digitalWrite(buzzer, BUZZER_OFF); delay(100); digitalWrite(buzzer, BUZZER_ON); delay(50); digitalWrite(buzzer, BUZZER_OFF); delay(1000); for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = 0; } //Schloss gesperrt // LED rot geht an, Buzze piep dreimal lang (250ms) void uuid_lock() { digitalWrite(greenLed, LED_OFF); digitalWrite(blueLed, LED_OFF); digitalWrite(redLed, LED_ON); digitalWrite(buzzer, BUZZER_ON); delay(250); digitalWrite(buzzer, BUZZER_OFF); delay(50); digitalWrite(buzzer, BUZZER_ON); delay(250); digitalWrite(buzzer, BUZZER_OFF); delay(50); digitalWrite(buzzer, BUZZER_ON); delay(250); digitalWrite(buzzer, BUZZER_OFF); delay(1000); for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = 0; } //Wartet auf RFID PIC //Grundeinstellung blaue LED ist ein und wartet auf PICC void wait_picc() { digitalWrite(greenLed, LED_OFF); digitalWrite(blueLed, LED_ON); digitalWrite(redLed, LED_OFF); }
Wie funktioniert es
Der Reader wartet auf einen RFID-Picc, die Lesebereitschaft wird mit der blauen LED signalisiert.
Wird nun ein Picc aufgelegt liest er diesen aus und sendet ihn per UDP an den MiniServer.
Ist der ausgelesene Key bei einem User hinterlegt sendet der MS per UDP „OK“ an den Arduino zurück.
Ist der Key nicht hinterlegt, also „Unbekannt“ sendet der MS „NOK“ an den Arduino.
Wird 5x hinter einander ein falscher Key (Unbekannt) aufgelegt wird das Schloss gesperrt.
Es muss dann über die Visu wieder freigegeben werden. Die gewünschte Anzahl der Fehlversuche kann im Zähler angepasst werden.
Nötige Anpassungen
Arduino Code
MAC-Adresse (mac)
Port auf den der Arduino hört (ARDUPORT)
IP MiniServer (MSIP)
Port MiniServer (MSPORT)
Loxone
Befehlserkennung für User 1 und 2... und so viel User ihr eben anlegen wollt.
Empfangsport Virtuller-Eingang... Muss gleich MSPORT im Arduino Code sein
Sendeadresse Virtueller Ausgang ... sieht dann so aus "/dev/udp/ARDUIP/ARDUPORT" z.B. "/dev/udp/192.168.1.2/7000
Empfehlung
Wenn euer Router oder DHCP-Server die Möglichkeit hat am besten die vergebene IP-Adresse reservieren lassen.
Bilder
Loxone Datei
Config ist im Anhang
Adruino Library
rfid.zip im Anhang
Kommentar