You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
6.6 KiB
C++

#include "ST25DVSensor.h"
#include <SPI.h>
#include <SD.h>
#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 <record> -> 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);
}