├── README.md ├── RFID-speaker-lights-Homie ├── RFID-speaker-lights-Homie.ino └── pitches.h ├── lib └── readme.txt └── platformio.ini /README.md: -------------------------------------------------------------------------------- 1 | #RFID Homie Scanner 2 | 3 | An Internet of LEGO project to understand how the RFID-RC522 scanner works. 4 | 5 | Communication via WiFi & MQTT using Homie.h 6 | * The ID will be sent to the MQTT topic. 7 | * When a success verification occurs, the lights and speaker will be activated. 8 | 9 | ##Hardware 10 | * Wemos D1-mini (ESP8266 12-e) 11 | * RFID-RC522 12 | * x2 LEDs 13 | 14 | ##Network 15 | * WiFi 16 | * MQTT broker 17 | * MQTT server to respond to scanner messages 18 | 19 | 20 | 21 | 22 | ##About 23 | Written by Cory Guynn 24 | 25 | For write-ups and other cool projects, check out the blog: 26 | 27 | www.InternetOfLEGO.com 28 | 29 | 2016 30 | 31 | ##License 32 | MIT 33 | 34 | 35 | -------------------------------------------------------------------------------- /RFID-speaker-lights-Homie/RFID-speaker-lights-Homie.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | /* 4 | * RFID Scanner with audio and lights 5 | * 6 | * Communication via WiFi & MQTT using Homie.h 7 | * The ID will be sent to the MQTT topic. 8 | * When a success verification occurs, the lights and speaker will be activated 9 | * depending on the value. 10 | * 11 | * 12 | * Written by Cory Guynn 13 | * www.InternetOfLEGO.com 14 | * 2016 15 | * 16 | */ 17 | 18 | 19 | // Networking - MQTT using Homie 20 | // https://github.com/marvinroger/homie/tree/master 21 | #include 22 | HomieNode rfidNode("RFID-1", "sensor"); 23 | 24 | // Audio 25 | #include "pitches.h" 26 | 27 | // RFID 28 | #include "MFRC522.h" 29 | #define RST_PIN 15 // RST-PIN for RC522 - RFID - SPI - Modul GPIO15 30 | #define SS_PIN 2 // SDA-PIN for RC522 - RFID - SPI - Modul GPIO2 31 | MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance 32 | 33 | // LEDs and Speaker 34 | const int PIN_RESET = 0; //D3 WeMos ~ This pin will flash WeMos when held low 5s 35 | const int PIN_RED = 16; //D0 WeMos 36 | const int PIN_GREEN = 15; //D8 WeMos 37 | const int PIN_SPEAKER = 5; //D1 WeMos 38 | 39 | // Standard Functions 40 | 41 | void setup() { 42 | Homie.setFirmware("rfid", "1.0.0"); 43 | Homie.registerNode(rfidNode); 44 | Homie.setSetupFunction(setupHandler); 45 | Homie.setLoopFunction(loopHandler); 46 | rfidNode.subscribe("validate", verifyHandler); 47 | Homie.setup(); 48 | } 49 | 50 | void loop() { 51 | // all loop activity is handled by Homie, to ensure connectivity and prevent blocking activity that could disrupt communication 52 | Homie.loop(); 53 | } 54 | 55 | void setupHandler() { 56 | // this replaces the traditional "setup()" to ensure connecitvity and handle OTA 57 | 58 | // RFID and Console 59 | Serial.begin(9600); // Initialize serial communications 60 | SPI.begin(); // Init SPI bus 61 | mfrc522.PCD_Init(); // Init MFRC522 62 | 63 | // sound beep 64 | tone(PIN_SPEAKER,NOTE_C1,250); 65 | delay(50); 66 | tone(PIN_SPEAKER,NOTE_E1,250); 67 | delay(50); 68 | tone(PIN_SPEAKER,NOTE_C1,250); 69 | delay(50); 70 | noTone(PIN_SPEAKER); 71 | 72 | // initialize LEDs 73 | pinMode(PIN_RED, OUTPUT); 74 | pinMode(PIN_GREEN, OUTPUT); 75 | digitalWrite(PIN_RED, HIGH); 76 | digitalWrite(PIN_GREEN, HIGH); 77 | delay(1000); 78 | digitalWrite(PIN_GREEN, LOW); 79 | 80 | 81 | } 82 | 83 | 84 | // Global Timer 85 | unsigned long previousMillis = 0; 86 | int interval = 2000; 87 | 88 | void loopHandler() { 89 | // Look for new RFID cards 90 | if ( ! mfrc522.PICC_IsNewCardPresent()) { 91 | //Serial.print("scanning"); 92 | delay(50); 93 | return; 94 | } 95 | 96 | // scan the cards. Put in a non-blocking delay to avoid duplicate readings 97 | unsigned long currentMillis = millis(); 98 | if (currentMillis - previousMillis >= interval) { 99 | previousMillis = currentMillis; 100 | // do non-blocking thing here 101 | 102 | // Select one of the cards 103 | if ( ! mfrc522.PICC_ReadCardSerial()) { 104 | Serial.print("found card..."); 105 | delay(50); 106 | return; 107 | } 108 | 109 | // Process card 110 | Serial.print(F("Card UID:")); 111 | dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); 112 | } 113 | 114 | } 115 | 116 | 117 | // RFID: dump a byte array as hex values to Serial, then send to validation routine. 118 | void dump_byte_array(byte *buffer, byte bufferSize) { 119 | String uid; 120 | const long interval = 1000; 121 | 122 | for (byte i = 0; i < bufferSize; i++) { 123 | Serial.print(buffer[i] < 0x10 ? " 0" : " "); 124 | Serial.print(buffer[i], HEX); 125 | uid = uid + String(buffer[i], HEX); 126 | } 127 | if(uid){ 128 | validate(uid); 129 | } 130 | } 131 | 132 | // validate card UID by sending to server via MQTT 133 | void validate(String uid){ 134 | Serial.print("validating card: "); 135 | Serial.println(uid); 136 | 137 | // set RFID uid property to be sent via MQTT 138 | Homie.setNodeProperty(rfidNode, "uid", uid, true); 139 | 140 | // Turn both LEDs on 141 | digitalWrite(PIN_RED, HIGH); 142 | digitalWrite(PIN_GREEN, HIGH); 143 | 144 | // play sounds 145 | tone(PIN_SPEAKER,NOTE_D1,50); 146 | delay(20); 147 | tone(PIN_SPEAKER,NOTE_D1,50); 148 | noTone(PIN_SPEAKER); 149 | digitalWrite(PIN_GREEN, LOW); 150 | 151 | } 152 | 153 | // Receive response from server via MQTT 154 | bool verifyHandler(String response) { 155 | Serial.print("verifyHandler "); 156 | Serial.println(response); 157 | tone(PIN_SPEAKER,NOTE_C3,100); 158 | digitalWrite(PIN_RED, LOW); 159 | digitalWrite(PIN_GREEN, LOW); 160 | delay(250); 161 | if (response == "granted") { 162 | Serial.println("card accepted"); 163 | Homie.setNodeProperty(rfidNode, "validate", "granted", true); 164 | digitalWrite(PIN_GREEN, HIGH); 165 | tone(PIN_SPEAKER,NOTE_C3,250); 166 | delay(250); 167 | tone(PIN_SPEAKER,NOTE_C4,500); 168 | noTone(PIN_SPEAKER); 169 | delay(1000); 170 | digitalWrite(PIN_GREEN, LOW); 171 | } else if (response == "denied") { 172 | Serial.print("card denied"); 173 | Homie.setNodeProperty(rfidNode, "validate", "denied", true); 174 | digitalWrite(PIN_RED, HIGH); 175 | tone(PIN_SPEAKER,NOTE_C3,250); 176 | delay(250); 177 | digitalWrite(PIN_RED, LOW); 178 | tone(PIN_SPEAKER,NOTE_G2,500); 179 | delay(250); 180 | noTone(PIN_SPEAKER); 181 | digitalWrite(PIN_RED, HIGH); 182 | delay(1000); 183 | } else { 184 | digitalWrite(PIN_RED, HIGH); 185 | Serial.println("unexpected response: "); 186 | Homie.setNodeProperty(rfidNode, "validate", "unexpected", true); 187 | Serial.print(response); 188 | tone(PIN_SPEAKER,NOTE_A2,500); 189 | delay(250); 190 | digitalWrite(PIN_RED, LOW); 191 | tone(PIN_SPEAKER,NOTE_A2,500); 192 | return false; 193 | } 194 | digitalWrite(PIN_RED, HIGH); 195 | return true; 196 | } 197 | -------------------------------------------------------------------------------- /RFID-speaker-lights-Homie/pitches.h: -------------------------------------------------------------------------------- 1 | /************************************************* 2 | * Public Constants 3 | *************************************************/ 4 | 5 | #define NOTE_B0 31 6 | #define NOTE_C1 33 7 | #define NOTE_CS1 35 8 | #define NOTE_D1 37 9 | #define NOTE_DS1 39 10 | #define NOTE_E1 41 11 | #define NOTE_F1 44 12 | #define NOTE_FS1 46 13 | #define NOTE_G1 49 14 | #define NOTE_GS1 52 15 | #define NOTE_A1 55 16 | #define NOTE_AS1 58 17 | #define NOTE_B1 62 18 | #define NOTE_C2 65 19 | #define NOTE_CS2 69 20 | #define NOTE_D2 73 21 | #define NOTE_DS2 78 22 | #define NOTE_E2 82 23 | #define NOTE_F2 87 24 | #define NOTE_FS2 93 25 | #define NOTE_G2 98 26 | #define NOTE_GS2 104 27 | #define NOTE_A2 110 28 | #define NOTE_AS2 117 29 | #define NOTE_B2 123 30 | #define NOTE_C3 131 31 | #define NOTE_CS3 139 32 | #define NOTE_D3 147 33 | #define NOTE_DS3 156 34 | #define NOTE_E3 165 35 | #define NOTE_F3 175 36 | #define NOTE_FS3 185 37 | #define NOTE_G3 196 38 | #define NOTE_GS3 208 39 | #define NOTE_A3 220 40 | #define NOTE_AS3 233 41 | #define NOTE_B3 247 42 | #define NOTE_C4 262 43 | #define NOTE_CS4 277 44 | #define NOTE_D4 294 45 | #define NOTE_DS4 311 46 | #define NOTE_E4 330 47 | #define NOTE_F4 349 48 | #define NOTE_FS4 370 49 | #define NOTE_G4 392 50 | #define NOTE_GS4 415 51 | #define NOTE_A4 440 52 | #define NOTE_AS4 466 53 | #define NOTE_B4 494 54 | #define NOTE_C5 523 55 | #define NOTE_CS5 554 56 | #define NOTE_D5 587 57 | #define NOTE_DS5 622 58 | #define NOTE_E5 659 59 | #define NOTE_F5 698 60 | #define NOTE_FS5 740 61 | #define NOTE_G5 784 62 | #define NOTE_GS5 831 63 | #define NOTE_A5 880 64 | #define NOTE_AS5 932 65 | #define NOTE_B5 988 66 | #define NOTE_C6 1047 67 | #define NOTE_CS6 1109 68 | #define NOTE_D6 1175 69 | #define NOTE_DS6 1245 70 | #define NOTE_E6 1319 71 | #define NOTE_F6 1397 72 | #define NOTE_FS6 1480 73 | #define NOTE_G6 1568 74 | #define NOTE_GS6 1661 75 | #define NOTE_A6 1760 76 | #define NOTE_AS6 1865 77 | #define NOTE_B6 1976 78 | #define NOTE_C7 2093 79 | #define NOTE_CS7 2217 80 | #define NOTE_D7 2349 81 | #define NOTE_DS7 2489 82 | #define NOTE_E7 2637 83 | #define NOTE_F7 2794 84 | #define NOTE_FS7 2960 85 | #define NOTE_G7 3136 86 | #define NOTE_GS7 3322 87 | #define NOTE_A7 3520 88 | #define NOTE_AS7 3729 89 | #define NOTE_B7 3951 90 | #define NOTE_C8 4186 91 | #define NOTE_CS8 4435 92 | #define NOTE_D8 4699 93 | #define NOTE_DS8 4978 94 | -------------------------------------------------------------------------------- /lib/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for the project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link to executable file. 4 | 5 | The source code of each library should be placed in separate directory, like 6 | "lib/private_lib/[here are source files]". 7 | 8 | For example, see how can be organized `Foo` and `Bar` libraries: 9 | 10 | |--lib 11 | | |--Bar 12 | | | |--docs 13 | | | |--examples 14 | | | |--src 15 | | | |- Bar.c 16 | | | |- Bar.h 17 | | |--Foo 18 | | | |- Foo.c 19 | | | |- Foo.h 20 | | |- readme.txt --> THIS FILE 21 | |- platformio.ini 22 | |--src 23 | |- main.c 24 | 25 | Then in `src/main.c` you should use: 26 | 27 | #include 28 | #include 29 | 30 | // rest H/C/CPP code 31 | 32 | PlatformIO will find your libraries automatically, configure preprocessor's 33 | include paths and build them. 34 | 35 | See additional options for PlatformIO Library Dependency Finder `lib_*`: 36 | 37 | http://docs.platformio.org/en/latest/projectconf.html#lib-install 38 | 39 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | # 2 | # Project Configuration File 3 | # 4 | # A detailed documentation with the EXAMPLES is located here: 5 | # http://docs.platformio.org/en/latest/projectconf.html 6 | # 7 | 8 | # A sign `#` at the beginning of the line indicates a comment 9 | # Comment lines are ignored. 10 | 11 | # Simple and base environment 12 | # [env:mybaseenv] 13 | # platform = %INSTALLED_PLATFORM_NAME_HERE% 14 | # framework = 15 | # board = 16 | # 17 | # Automatic targets - enable auto-uploading 18 | # targets = upload 19 | 20 | [env:d1_mini] 21 | platform=espressif 22 | framework=arduino 23 | board=d1_mini 24 | 25 | [platformio] 26 | src_dir=RFID-speaker-lights-Homie 27 | lib_dir=~/Documents/Arduino/Libraries 28 | --------------------------------------------------------------------------------