demonstrational RFID key reader with TCP/IP connectivity

Dependencies:   HTTPClient MFRC522 WIZnet_Library mbed

Revision:
0:220ded71d645
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Aug 08 09:46:41 2018 +0000
@@ -0,0 +1,289 @@
+#include "mbed.h" // this need older version of mbed library 
+#include "MFRC522.h"
+#include "WIZnetInterface.h"
+#include "HTTPClient.h"
+ 
+#define USE_W5100
+#define ST_NUCLEO
+ 
+//MFRC522 SPI interface
+#define SPI_MOSI    PB_5
+#define SPI_MISO    PB_4
+#define SPI_SCLK    PB_3
+#define SPI_CS      PA_10
+#define MF_RESET    PA_2
+
+//Ethernet
+#define SPI_MOSI_ETH    PA_7
+#define SPI_MISO_ETH    PA_6
+#define SPI_SCLK_ETH    PA_5
+#define SPI_CS_ETH      PB_6
+#define RESET_ETH       PB_2
+
+//LEDS
+#define LED_RED PA_12
+#define LED_GREEN PB_12
+#define LED_ORANGE PA_11
+
+//Buzzer
+#define BUZZER PC_8
+
+//Electronic LOCK
+#define LOCK PC_6
+
+DigitalOut LedRed(LED_RED);
+DigitalOut LedGreen(LED_GREEN);
+DigitalOut LedOrange(LED_ORANGE);
+
+DigitalIn config_button(PC_13);
+
+DigitalOut Lock(LOCK);
+
+PwmOut buzzer(BUZZER);
+
+const char * IP_Addr = "192.168.0.2";
+const char * IP_Subnet = "255.255.255.0";
+const char * IP_Gateway = "192.168.0.1";
+unsigned char MAC_Addr[6] = {
+    0x90,
+    0xA2,
+    0xDA,
+    0x0F,
+    0x5B,
+    0x83
+};
+
+unsigned char zone_uid;
+
+Serial pc(PA_0, PA_1);
+MFRC522 RfChip(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET);
+WIZnetInterface ethernet(SPI_MOSI_ETH, SPI_MISO_ETH, SPI_SCLK_ETH, SPI_CS_ETH, RESET_ETH);
+
+void buzzer_stop() {
+    buzzer.write(0);
+}
+
+Timeout buzzer_timeout;
+
+I2C eeprom(PB_9, PB_8);
+
+int main(void) {
+    pc.puts("Unit start\n\r");
+
+    eeprom.start();
+    eeprom.write(0b10100000); //Control byte b1=0;b2=0;WRITE
+    eeprom.write(128); // Address    
+
+    wait(0.5);
+
+    eeprom.start();
+    eeprom.write(0b10100001); //Control byte b1=0;b2=0;READ
+
+    int zone_uid = eeprom.read(0);
+
+    eeprom.stop();
+
+    if (!config_button) {
+        pc.printf("Old zone: %d\n\r", zone_uid);
+
+        pc.puts("Send new zone uid in format ddd_\n\r");
+
+        int i = 0;
+        char in , buffer[12];
+        int new_uid = 1;
+
+        in = pc.getc();
+        while ( in != '_') {
+            buffer[i++] = in ;
+            if (i == 12) {
+                break;
+            } in = pc.getc();
+        }
+        buffer[i] = 0;
+
+        pc.printf("Income string: %s\n\r", buffer);
+
+        new_uid = strtol(buffer, NULL, 10);
+
+        if (new_uid > 0 && new_uid < 256) {
+            eeprom.start();
+            eeprom.write(0b10100000); //Control byte b1=0;b2=0;WRITE
+            eeprom.write(128); // Address
+            eeprom.write((char) new_uid);
+            eeprom.stop();
+
+            zone_uid = new_uid;
+        } else {
+            pc.puts("Error\n\r");
+        }
+    }
+
+    pc.printf("Current zone: %d\n\r", zone_uid);
+
+    char card_uid[20];
+    uint8_t i;
+
+    buzzer.period_us(250);
+
+    //Init sequence
+    for (i = 0; i < 4; i++) {
+        if ((i % 2) == 0) {
+            buzzer.write(0.5f);
+        } else {
+            buzzer.write(0);
+        }
+
+        switch (i) {
+            case 0:
+                {
+                    LedRed = 1;
+                    break;
+                }
+            case 1:
+                {
+                    LedRed = 0;
+                    LedGreen = 1;
+                    break;
+                }
+            case 2:
+                {
+                    LedGreen = 0;
+                    LedOrange = 1;
+                    break;
+                }
+            case 3:
+                {
+                    LedOrange = 0;
+                    break;
+                }
+        }
+
+        wait(0.25f);
+    }
+    buzzer.write(0);
+
+    //Init ethernet    
+    int ret = ethernet.init(MAC_Addr, IP_Addr, IP_Subnet, IP_Gateway);
+    if (ret == 0) {
+        //pc.printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress());
+        ret = ethernet.connect();
+        if (ret == 0) {
+            pc.printf("Initialized / MAC: %s, IP: %s, MASK: %s, GW: %s\r\n",
+                ethernet.getMACAddress(), ethernet.getIPAddress(),
+                ethernet.getNetworkMask(), ethernet.getGateway());
+        } else {
+            pc.printf("Error ethernet.connect() - ret = %d\r\n", ret);
+            while (1) {
+                LedRed = !LedRed;
+                wait(0.25f);
+            }
+        }
+    } else {
+        pc.printf("Error ethernet.init() - ret = %d\r\n", ret);
+        while (1) {
+            LedRed = !LedRed;
+            wait(0.25f);
+        }
+    }
+
+    // Init. RC522 Chip
+    RfChip.PCD_Init();
+
+    //MAIN
+    while (true) {
+        LedRed = 1;
+        LedGreen = 0;
+        LedOrange = 0;
+
+        // Look for new cards
+        if (!RfChip.PICC_IsNewCardPresent()) {
+            wait_ms(250);
+            continue;
+        }
+
+        // Select one of the cards
+        if (!RfChip.PICC_ReadCardSerial()) {
+            wait_ms(250);
+            continue;
+        }
+
+        LedRed = 0;
+        LedOrange = 1;
+        /*
+        buzzer.write(0.5f);
+        buzzer_timeout.attach(&buzzer_stop, 0.25f);
+        */
+
+        // Print Card UID
+        pc.printf("Card UID: ");
+
+
+        for (i = 0; i < sizeof(card_uid); i++) {
+            card_uid[i] = 0;
+        }
+
+        for (i = 0; i < RfChip.uid.size; i++) {
+            sprintf(card_uid, "%s%X02", card_uid, RfChip.uid.uidByte[i]);
+        }
+
+        pc.puts(card_uid);
+        pc.printf(" end\n\r");
+
+
+        //Send to server to authorize
+        char str[512];
+        char get_msg[512];
+        HTTPClient http;
+
+        sprintf(get_msg, "http://192.168.0.1:8080/card.php?card_uid=%s&zone_uid=%d", card_uid, zone_uid);
+
+        pc.printf("msg : %s\r\n", get_msg);
+        ret = http.get(get_msg, str, sizeof(str));
+        if (!ret) {
+            pc.printf("\r\nREQUEST SUCCESS - read %d characters\n\r", strlen(str));
+            pc.printf("Result: %s\n\r", str);
+        } else {
+            pc.printf("Error - ret = %d - HTTP return code = %d\n\r", ret, http.getHTTPResponseCode());
+        }
+
+        //check server response
+        LedOrange = 0;
+        LedRed = 0;
+
+        if (strcmp(str, "PERMITTED") == 0) {
+            Lock = 1;
+            LedGreen = 1;
+
+            buzzer.write(0.5f);
+            buzzer_timeout.attach( & buzzer_stop, 0.5f);
+            wait(3);
+
+            Lock = 0;
+        } else if (strcmp(str, "DENIED") == 0) {
+            buzzer.write(0.5f);
+            for (i = 0; i < 6; i++) {
+                LedRed = !LedRed;
+                wait(0.25f);
+            }
+        } else {
+            for (i = 0; i < 6; i++) {
+                LedOrange = !LedOrange;
+                LedRed = !LedRed;
+
+                if (LedRed.read() == 1) {
+                    buzzer.write(0.5f);
+                } else {
+                    buzzer.write(0);
+                }
+                wait(0.25f);
+            }
+        }
+
+        LedRed = 0;
+        LedGreen = 0;
+        LedOrange = 0;
+        buzzer.write(0);
+        wait(0.5);
+    }
+
+}
\ No newline at end of file