demonstrational RFID key reader with TCP/IP connectivity
Dependencies: HTTPClient MFRC522 WIZnet_Library mbed
main.cpp@0:220ded71d645, 2018-08-08 (annotated)
- Committer:
- Vektor
- Date:
- Wed Aug 08 09:46:41 2018 +0000
- Revision:
- 0:220ded71d645
Init
Who changed what in which revision?
User | Revision | Line number | New 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 | } |