diff --git a/RFID-Transponder-Code/RFID-Transponder-Source.ino b/RFID-Transponder-Code/RFID-Transponder-Source.ino new file mode 100644 index 0000000..290e4de --- /dev/null +++ b/RFID-Transponder-Code/RFID-Transponder-Source.ino @@ -0,0 +1,234 @@ +#include "ST25DVSensor.h" +#include +#include + +#if defined(ARDUINO_B_L4S5I_IOT01A) + #define GPO_PIN PE4 + #define LPD_PIN PE2 + #define SDA_PIN PB11 + #define SCL_PIN PB10 + #define WireNFC MyWire + TwoWire MyWire(SDA_PIN, SCL_PIN); + ST25DV st25dv(12, -1, &MyWire); +#else + #define DEV_I2C Wire + ST25DV st25dv(12, -1, &DEV_I2C); +#endif +String last_read; +bool cleared = false; +const int chipSelect = 7; + +void beep(int pitch, int duration, int loudness){ + tone(24, pitch, loudness); + delay(duration); + noTone(24); + delay(10); +} + +void clearFile(const char* filename) { + if (SD.begin(chipSelect)) { + // Open the file in write mode without appending + File myFile = SD.open(filename, FILE_WRITE | O_TRUNC); + + if (myFile) { + myFile.close(); + Serial.println("File cleared!"); + } + } +} + +void printLine(){ + for(int i = 0; i < 50; i++){ + Serial.print('-'); + } + Serial.println(); +} + +void printStart(){ + Serial.println(F(" ╔═══╦═══╦══╦═══╗")); + Serial.println(F(" ║╔═╗║╔══╩╣╠╩╗╔╗║")); + Serial.println(F(" ║╚═╝║╚══╗║║─║║║║")); + Serial.println(F(" ║╔╗╔╣╔══╝║║─║║║║")); + Serial.println(F(" ║║║╚╣║──╔╣╠╦╝╚╝║")); + Serial.println(F(" ╚╝╚═╩╝──╚══╩═══╝")); + printLine(); + Serial.println(F("By Ruben Schoonbaert")); + Serial.println(F("Written 29/12/2023")); + printLine(); + delay(1000); + Serial.println(F("COMMANDS:")); + Serial.println(F("$printFile -> prints all records on the SD card")); + Serial.println(F("$clearFile -> clears all records on the SD card")); + Serial.println(F("$clearRFID -> removes last entry from RFID tag")); + Serial.println(F("$addRecord -> Adds new record to SD & RFID Tag")); + Serial.println(F("$testBuzzer -> Tests integrated piezo buzzer")); + Serial.println(F("$testLED -> Tests integrated LED")); + printLine(); +} + +void printFile(const char* filename) { + if (SD.begin(chipSelect)) { + // Open the file in read mode + File myFile = SD.open(filename, FILE_READ); + printLine(); + Serial.println(F(" Printing SD-Card content ")); + printLine(); + if (myFile) { + while (myFile.available()) { + Serial.write(myFile.read()); + } + + myFile.close(); + printLine(); + } else { + Serial.println(F("Error opening file for reading.")); + digitalWrite(25, HIGH); + } + } +} + +bool isDuplicate(const char* filename, const String& newString) { + File file = SD.open(filename); + if (file) { + while (file.available()) { + String line = file.readStringUntil('\n'); + line.trim(); + if (line.equals(newString)) { + file.close(); + return true; // Duplicate found + } + } + file.close(); + } + return false; // No duplicate found +} + +void addRecord(String record){ + const char uri_write_protocol[] = URI_ID_0x01_STRING; + if(st25dv.writeURI(uri_write_protocol, record, "")) { + Serial.println(F("Write to RFID Tag failed!")); + digitalWrite(25, HIGH); + while(1); + } else { + if(record != "!ignore"){ + Serial.print(F("Written : \"")); + Serial.print(record); + Serial.print(F("\" to RFID tag succesfully")); + Serial.println(); + } + } +} + +void setup() { + Serial.begin(9600); + pinMode(24, OUTPUT); + pinMode(25, OUTPUT); + digitalWrite(25, HIGH); + printStart(); + // The wire instance used can be omitted in case you use default Wire instance + if(st25dv.begin() == 0) { + Serial.println(F("System Init done!")); + beep(2000, 100, 50); + } else { + Serial.println("System Init failed!"); + digitalWrite(25, HIGH); + while(1); + } + delay(500); + digitalWrite(25, LOW); +} + +void loop() { + String uri_read; + if (Serial.available() > 0) { + String command = Serial.readStringUntil('\n'); + command.trim(); + + if (command.equals("$clearFile")) { + clearFile("records.txt"); + cleared = true; + beep(2000, 100, 50); + return; + } else if (command.equals("$printFile")){ + beep(2000, 100, 50); + printFile("records.txt"); + } else if (command.startsWith("$addRecord ")) { + // Extract the record from the command + String recordToAdd = command.substring(11); + // Add the record to the file + addRecord(recordToAdd); + } else if (command.equals("$clearRFID")){ + addRecord("!ignore"); + Serial.println(F("Cleared RFID")); + beep(2000, 100, 50); + } else if (command.equals("$testLED")){ + bool state = false; + for(int i = 0; i<10; i++){ + digitalWrite(25, state); + state = !state; + delay(100); + } + } + else if (command.equals("$testBuzzer")){ + int melody[] = {262, 330, 392, 523, 392, 330, 262, 196, 262}; + for (int i = 0; i < sizeof(melody) / sizeof(melody[0]); i++) { + delay(10); + beep(melody[i], 200, 100); + } + + } else { + Serial.println("unrecognised command!"); + beep(500, 500, 500); + } + } + + if(st25dv.readURI(&uri_read)) { + Serial.println("Read failed!"); + digitalWrite(25, HIGH); + while(1); + } + if(uri_read != last_read){ + if (SD.begin(chipSelect)) { + if(uri_read.startsWith("www.")){ + uri_read = uri_read.substring(4); + } + else if(uri_read.startsWith("http://www.")){ + uri_read = uri_read.substring(11); + } + else if(uri_read.startsWith("http://")){ + uri_read = uri_read.substring(7); + } + else if(uri_read.startsWith("https://")){ + uri_read = uri_read.substring(8); + } + if(uri_read != "!ignore"){ + // Check if the last line of the file is the same as the string + if (!isDuplicate("records.txt", uri_read)) { + if(!cleared){ + Serial.print(F("New record detected = ")); + } else { + Serial.print(F("current RFID record = ")); + } + cleared = false; + Serial.print(uri_read); + Serial.println(); + + File myFile = SD.open("records.txt", FILE_WRITE); + if (myFile) { + // Write to the file + myFile.println(uri_read); + // Close the file + myFile.close(); + delay(100); + beep(800, 100, 50); + delay(10); + beep(1000, 100, 50); + } + } + } + last_read = uri_read; + } + } + delay(500); + digitalWrite(25, LOW); +}