demonstrational RFID key reader with TCP/IP connectivity

Dependencies:   HTTPClient MFRC522 WIZnet_Library mbed

Committer:
Vektor
Date:
Wed Aug 08 09:46:41 2018 +0000
Revision:
0:220ded71d645
Init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vektor 0:220ded71d645 1 #include "mbed.h" // this need older version of mbed library
Vektor 0:220ded71d645 2 #include "MFRC522.h"
Vektor 0:220ded71d645 3 #include "WIZnetInterface.h"
Vektor 0:220ded71d645 4 #include "HTTPClient.h"
Vektor 0:220ded71d645 5
Vektor 0:220ded71d645 6 #define USE_W5100
Vektor 0:220ded71d645 7 #define ST_NUCLEO
Vektor 0:220ded71d645 8
Vektor 0:220ded71d645 9 //MFRC522 SPI interface
Vektor 0:220ded71d645 10 #define SPI_MOSI PB_5
Vektor 0:220ded71d645 11 #define SPI_MISO PB_4
Vektor 0:220ded71d645 12 #define SPI_SCLK PB_3
Vektor 0:220ded71d645 13 #define SPI_CS PA_10
Vektor 0:220ded71d645 14 #define MF_RESET PA_2
Vektor 0:220ded71d645 15
Vektor 0:220ded71d645 16 //Ethernet
Vektor 0:220ded71d645 17 #define SPI_MOSI_ETH PA_7
Vektor 0:220ded71d645 18 #define SPI_MISO_ETH PA_6
Vektor 0:220ded71d645 19 #define SPI_SCLK_ETH PA_5
Vektor 0:220ded71d645 20 #define SPI_CS_ETH PB_6
Vektor 0:220ded71d645 21 #define RESET_ETH PB_2
Vektor 0:220ded71d645 22
Vektor 0:220ded71d645 23 //LEDS
Vektor 0:220ded71d645 24 #define LED_RED PA_12
Vektor 0:220ded71d645 25 #define LED_GREEN PB_12
Vektor 0:220ded71d645 26 #define LED_ORANGE PA_11
Vektor 0:220ded71d645 27
Vektor 0:220ded71d645 28 //Buzzer
Vektor 0:220ded71d645 29 #define BUZZER PC_8
Vektor 0:220ded71d645 30
Vektor 0:220ded71d645 31 //Electronic LOCK
Vektor 0:220ded71d645 32 #define LOCK PC_6
Vektor 0:220ded71d645 33
Vektor 0:220ded71d645 34 DigitalOut LedRed(LED_RED);
Vektor 0:220ded71d645 35 DigitalOut LedGreen(LED_GREEN);
Vektor 0:220ded71d645 36 DigitalOut LedOrange(LED_ORANGE);
Vektor 0:220ded71d645 37
Vektor 0:220ded71d645 38 DigitalIn config_button(PC_13);
Vektor 0:220ded71d645 39
Vektor 0:220ded71d645 40 DigitalOut Lock(LOCK);
Vektor 0:220ded71d645 41
Vektor 0:220ded71d645 42 PwmOut buzzer(BUZZER);
Vektor 0:220ded71d645 43
Vektor 0:220ded71d645 44 const char * IP_Addr = "192.168.0.2";
Vektor 0:220ded71d645 45 const char * IP_Subnet = "255.255.255.0";
Vektor 0:220ded71d645 46 const char * IP_Gateway = "192.168.0.1";
Vektor 0:220ded71d645 47 unsigned char MAC_Addr[6] = {
Vektor 0:220ded71d645 48 0x90,
Vektor 0:220ded71d645 49 0xA2,
Vektor 0:220ded71d645 50 0xDA,
Vektor 0:220ded71d645 51 0x0F,
Vektor 0:220ded71d645 52 0x5B,
Vektor 0:220ded71d645 53 0x83
Vektor 0:220ded71d645 54 };
Vektor 0:220ded71d645 55
Vektor 0:220ded71d645 56 unsigned char zone_uid;
Vektor 0:220ded71d645 57
Vektor 0:220ded71d645 58 Serial pc(PA_0, PA_1);
Vektor 0:220ded71d645 59 MFRC522 RfChip(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET);
Vektor 0:220ded71d645 60 WIZnetInterface ethernet(SPI_MOSI_ETH, SPI_MISO_ETH, SPI_SCLK_ETH, SPI_CS_ETH, RESET_ETH);
Vektor 0:220ded71d645 61
Vektor 0:220ded71d645 62 void buzzer_stop() {
Vektor 0:220ded71d645 63 buzzer.write(0);
Vektor 0:220ded71d645 64 }
Vektor 0:220ded71d645 65
Vektor 0:220ded71d645 66 Timeout buzzer_timeout;
Vektor 0:220ded71d645 67
Vektor 0:220ded71d645 68 I2C eeprom(PB_9, PB_8);
Vektor 0:220ded71d645 69
Vektor 0:220ded71d645 70 int main(void) {
Vektor 0:220ded71d645 71 pc.puts("Unit start\n\r");
Vektor 0:220ded71d645 72
Vektor 0:220ded71d645 73 eeprom.start();
Vektor 0:220ded71d645 74 eeprom.write(0b10100000); //Control byte b1=0;b2=0;WRITE
Vektor 0:220ded71d645 75 eeprom.write(128); // Address
Vektor 0:220ded71d645 76
Vektor 0:220ded71d645 77 wait(0.5);
Vektor 0:220ded71d645 78
Vektor 0:220ded71d645 79 eeprom.start();
Vektor 0:220ded71d645 80 eeprom.write(0b10100001); //Control byte b1=0;b2=0;READ
Vektor 0:220ded71d645 81
Vektor 0:220ded71d645 82 int zone_uid = eeprom.read(0);
Vektor 0:220ded71d645 83
Vektor 0:220ded71d645 84 eeprom.stop();
Vektor 0:220ded71d645 85
Vektor 0:220ded71d645 86 if (!config_button) {
Vektor 0:220ded71d645 87 pc.printf("Old zone: %d\n\r", zone_uid);
Vektor 0:220ded71d645 88
Vektor 0:220ded71d645 89 pc.puts("Send new zone uid in format ddd_\n\r");
Vektor 0:220ded71d645 90
Vektor 0:220ded71d645 91 int i = 0;
Vektor 0:220ded71d645 92 char in , buffer[12];
Vektor 0:220ded71d645 93 int new_uid = 1;
Vektor 0:220ded71d645 94
Vektor 0:220ded71d645 95 in = pc.getc();
Vektor 0:220ded71d645 96 while ( in != '_') {
Vektor 0:220ded71d645 97 buffer[i++] = in ;
Vektor 0:220ded71d645 98 if (i == 12) {
Vektor 0:220ded71d645 99 break;
Vektor 0:220ded71d645 100 } in = pc.getc();
Vektor 0:220ded71d645 101 }
Vektor 0:220ded71d645 102 buffer[i] = 0;
Vektor 0:220ded71d645 103
Vektor 0:220ded71d645 104 pc.printf("Income string: %s\n\r", buffer);
Vektor 0:220ded71d645 105
Vektor 0:220ded71d645 106 new_uid = strtol(buffer, NULL, 10);
Vektor 0:220ded71d645 107
Vektor 0:220ded71d645 108 if (new_uid > 0 && new_uid < 256) {
Vektor 0:220ded71d645 109 eeprom.start();
Vektor 0:220ded71d645 110 eeprom.write(0b10100000); //Control byte b1=0;b2=0;WRITE
Vektor 0:220ded71d645 111 eeprom.write(128); // Address
Vektor 0:220ded71d645 112 eeprom.write((char) new_uid);
Vektor 0:220ded71d645 113 eeprom.stop();
Vektor 0:220ded71d645 114
Vektor 0:220ded71d645 115 zone_uid = new_uid;
Vektor 0:220ded71d645 116 } else {
Vektor 0:220ded71d645 117 pc.puts("Error\n\r");
Vektor 0:220ded71d645 118 }
Vektor 0:220ded71d645 119 }
Vektor 0:220ded71d645 120
Vektor 0:220ded71d645 121 pc.printf("Current zone: %d\n\r", zone_uid);
Vektor 0:220ded71d645 122
Vektor 0:220ded71d645 123 char card_uid[20];
Vektor 0:220ded71d645 124 uint8_t i;
Vektor 0:220ded71d645 125
Vektor 0:220ded71d645 126 buzzer.period_us(250);
Vektor 0:220ded71d645 127
Vektor 0:220ded71d645 128 //Init sequence
Vektor 0:220ded71d645 129 for (i = 0; i < 4; i++) {
Vektor 0:220ded71d645 130 if ((i % 2) == 0) {
Vektor 0:220ded71d645 131 buzzer.write(0.5f);
Vektor 0:220ded71d645 132 } else {
Vektor 0:220ded71d645 133 buzzer.write(0);
Vektor 0:220ded71d645 134 }
Vektor 0:220ded71d645 135
Vektor 0:220ded71d645 136 switch (i) {
Vektor 0:220ded71d645 137 case 0:
Vektor 0:220ded71d645 138 {
Vektor 0:220ded71d645 139 LedRed = 1;
Vektor 0:220ded71d645 140 break;
Vektor 0:220ded71d645 141 }
Vektor 0:220ded71d645 142 case 1:
Vektor 0:220ded71d645 143 {
Vektor 0:220ded71d645 144 LedRed = 0;
Vektor 0:220ded71d645 145 LedGreen = 1;
Vektor 0:220ded71d645 146 break;
Vektor 0:220ded71d645 147 }
Vektor 0:220ded71d645 148 case 2:
Vektor 0:220ded71d645 149 {
Vektor 0:220ded71d645 150 LedGreen = 0;
Vektor 0:220ded71d645 151 LedOrange = 1;
Vektor 0:220ded71d645 152 break;
Vektor 0:220ded71d645 153 }
Vektor 0:220ded71d645 154 case 3:
Vektor 0:220ded71d645 155 {
Vektor 0:220ded71d645 156 LedOrange = 0;
Vektor 0:220ded71d645 157 break;
Vektor 0:220ded71d645 158 }
Vektor 0:220ded71d645 159 }
Vektor 0:220ded71d645 160
Vektor 0:220ded71d645 161 wait(0.25f);
Vektor 0:220ded71d645 162 }
Vektor 0:220ded71d645 163 buzzer.write(0);
Vektor 0:220ded71d645 164
Vektor 0:220ded71d645 165 //Init ethernet
Vektor 0:220ded71d645 166 int ret = ethernet.init(MAC_Addr, IP_Addr, IP_Subnet, IP_Gateway);
Vektor 0:220ded71d645 167 if (ret == 0) {
Vektor 0:220ded71d645 168 //pc.printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress());
Vektor 0:220ded71d645 169 ret = ethernet.connect();
Vektor 0:220ded71d645 170 if (ret == 0) {
Vektor 0:220ded71d645 171 pc.printf("Initialized / MAC: %s, IP: %s, MASK: %s, GW: %s\r\n",
Vektor 0:220ded71d645 172 ethernet.getMACAddress(), ethernet.getIPAddress(),
Vektor 0:220ded71d645 173 ethernet.getNetworkMask(), ethernet.getGateway());
Vektor 0:220ded71d645 174 } else {
Vektor 0:220ded71d645 175 pc.printf("Error ethernet.connect() - ret = %d\r\n", ret);
Vektor 0:220ded71d645 176 while (1) {
Vektor 0:220ded71d645 177 LedRed = !LedRed;
Vektor 0:220ded71d645 178 wait(0.25f);
Vektor 0:220ded71d645 179 }
Vektor 0:220ded71d645 180 }
Vektor 0:220ded71d645 181 } else {
Vektor 0:220ded71d645 182 pc.printf("Error ethernet.init() - ret = %d\r\n", ret);
Vektor 0:220ded71d645 183 while (1) {
Vektor 0:220ded71d645 184 LedRed = !LedRed;
Vektor 0:220ded71d645 185 wait(0.25f);
Vektor 0:220ded71d645 186 }
Vektor 0:220ded71d645 187 }
Vektor 0:220ded71d645 188
Vektor 0:220ded71d645 189 // Init. RC522 Chip
Vektor 0:220ded71d645 190 RfChip.PCD_Init();
Vektor 0:220ded71d645 191
Vektor 0:220ded71d645 192 //MAIN
Vektor 0:220ded71d645 193 while (true) {
Vektor 0:220ded71d645 194 LedRed = 1;
Vektor 0:220ded71d645 195 LedGreen = 0;
Vektor 0:220ded71d645 196 LedOrange = 0;
Vektor 0:220ded71d645 197
Vektor 0:220ded71d645 198 // Look for new cards
Vektor 0:220ded71d645 199 if (!RfChip.PICC_IsNewCardPresent()) {
Vektor 0:220ded71d645 200 wait_ms(250);
Vektor 0:220ded71d645 201 continue;
Vektor 0:220ded71d645 202 }
Vektor 0:220ded71d645 203
Vektor 0:220ded71d645 204 // Select one of the cards
Vektor 0:220ded71d645 205 if (!RfChip.PICC_ReadCardSerial()) {
Vektor 0:220ded71d645 206 wait_ms(250);
Vektor 0:220ded71d645 207 continue;
Vektor 0:220ded71d645 208 }
Vektor 0:220ded71d645 209
Vektor 0:220ded71d645 210 LedRed = 0;
Vektor 0:220ded71d645 211 LedOrange = 1;
Vektor 0:220ded71d645 212 /*
Vektor 0:220ded71d645 213 buzzer.write(0.5f);
Vektor 0:220ded71d645 214 buzzer_timeout.attach(&buzzer_stop, 0.25f);
Vektor 0:220ded71d645 215 */
Vektor 0:220ded71d645 216
Vektor 0:220ded71d645 217 // Print Card UID
Vektor 0:220ded71d645 218 pc.printf("Card UID: ");
Vektor 0:220ded71d645 219
Vektor 0:220ded71d645 220
Vektor 0:220ded71d645 221 for (i = 0; i < sizeof(card_uid); i++) {
Vektor 0:220ded71d645 222 card_uid[i] = 0;
Vektor 0:220ded71d645 223 }
Vektor 0:220ded71d645 224
Vektor 0:220ded71d645 225 for (i = 0; i < RfChip.uid.size; i++) {
Vektor 0:220ded71d645 226 sprintf(card_uid, "%s%X02", card_uid, RfChip.uid.uidByte[i]);
Vektor 0:220ded71d645 227 }
Vektor 0:220ded71d645 228
Vektor 0:220ded71d645 229 pc.puts(card_uid);
Vektor 0:220ded71d645 230 pc.printf(" end\n\r");
Vektor 0:220ded71d645 231
Vektor 0:220ded71d645 232
Vektor 0:220ded71d645 233 //Send to server to authorize
Vektor 0:220ded71d645 234 char str[512];
Vektor 0:220ded71d645 235 char get_msg[512];
Vektor 0:220ded71d645 236 HTTPClient http;
Vektor 0:220ded71d645 237
Vektor 0:220ded71d645 238 sprintf(get_msg, "http://192.168.0.1:8080/card.php?card_uid=%s&zone_uid=%d", card_uid, zone_uid);
Vektor 0:220ded71d645 239
Vektor 0:220ded71d645 240 pc.printf("msg : %s\r\n", get_msg);
Vektor 0:220ded71d645 241 ret = http.get(get_msg, str, sizeof(str));
Vektor 0:220ded71d645 242 if (!ret) {
Vektor 0:220ded71d645 243 pc.printf("\r\nREQUEST SUCCESS - read %d characters\n\r", strlen(str));
Vektor 0:220ded71d645 244 pc.printf("Result: %s\n\r", str);
Vektor 0:220ded71d645 245 } else {
Vektor 0:220ded71d645 246 pc.printf("Error - ret = %d - HTTP return code = %d\n\r", ret, http.getHTTPResponseCode());
Vektor 0:220ded71d645 247 }
Vektor 0:220ded71d645 248
Vektor 0:220ded71d645 249 //check server response
Vektor 0:220ded71d645 250 LedOrange = 0;
Vektor 0:220ded71d645 251 LedRed = 0;
Vektor 0:220ded71d645 252
Vektor 0:220ded71d645 253 if (strcmp(str, "PERMITTED") == 0) {
Vektor 0:220ded71d645 254 Lock = 1;
Vektor 0:220ded71d645 255 LedGreen = 1;
Vektor 0:220ded71d645 256
Vektor 0:220ded71d645 257 buzzer.write(0.5f);
Vektor 0:220ded71d645 258 buzzer_timeout.attach( & buzzer_stop, 0.5f);
Vektor 0:220ded71d645 259 wait(3);
Vektor 0:220ded71d645 260
Vektor 0:220ded71d645 261 Lock = 0;
Vektor 0:220ded71d645 262 } else if (strcmp(str, "DENIED") == 0) {
Vektor 0:220ded71d645 263 buzzer.write(0.5f);
Vektor 0:220ded71d645 264 for (i = 0; i < 6; i++) {
Vektor 0:220ded71d645 265 LedRed = !LedRed;
Vektor 0:220ded71d645 266 wait(0.25f);
Vektor 0:220ded71d645 267 }
Vektor 0:220ded71d645 268 } else {
Vektor 0:220ded71d645 269 for (i = 0; i < 6; i++) {
Vektor 0:220ded71d645 270 LedOrange = !LedOrange;
Vektor 0:220ded71d645 271 LedRed = !LedRed;
Vektor 0:220ded71d645 272
Vektor 0:220ded71d645 273 if (LedRed.read() == 1) {
Vektor 0:220ded71d645 274 buzzer.write(0.5f);
Vektor 0:220ded71d645 275 } else {
Vektor 0:220ded71d645 276 buzzer.write(0);
Vektor 0:220ded71d645 277 }
Vektor 0:220ded71d645 278 wait(0.25f);
Vektor 0:220ded71d645 279 }
Vektor 0:220ded71d645 280 }
Vektor 0:220ded71d645 281
Vektor 0:220ded71d645 282 LedRed = 0;
Vektor 0:220ded71d645 283 LedGreen = 0;
Vektor 0:220ded71d645 284 LedOrange = 0;
Vektor 0:220ded71d645 285 buzzer.write(0);
Vektor 0:220ded71d645 286 wait(0.5);
Vektor 0:220ded71d645 287 }
Vektor 0:220ded71d645 288
Vektor 0:220ded71d645 289 }