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++
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);
|
|
}
|