/*
{
"gadgets": {
"unique_gadget_id_1": {
"name": "Gadget 1",
"place_of_origin": "Location 1",
"permission_status": true
},
"unique_gadget_id_2": {
"name": "Gadget 2",
"place_of_origin": "Location 2",
"permission_status": false
},
// Add more gadgets as needed
}
}
{
"rules": {
".read": false,
".write": false,
"gadgets": {
".read": true,
".write": "auth != null"
}
}
}
*/
/* 1. Define connection and data*/
#define led1 15
#define led2 13
#define testPin 26
#define buzzer 4
#define SS 5
#define RST 27
#define API_KEY "AIzaSyC5D5X5l9wHkfJDSGw6O-qfw_BwDp5ON94"
#define DATABASE_URL "https://stolen-gadget-default-rtdb.firebaseio.com/stolen-gadget"
#define USER_EMAIL "USER_EMAIL"
#define USER_PASSWORD "USER_PASSWORD"
/* 1. include important library */
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include <FirebaseESP32.h>
#include <addons/TokenHelper.h>
/* 1. Define the WiFi credentials */
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define API_KEY "AIzaSyC5D5X5l9wHkfJDSGw6O-qfw_BwDp5ON94"
#define DATABASE_URL "https://stolen-gadget-default-rtdb.firebaseio.com/stolen-gadget"
#define USER_EMAIL "[email protected]"
#define USER_PASSWORD "stolengadget001@2024"
MFRC522 scanner(SS,RST);
/* constructing our objects */
LiquidCrystal_I2C lcd(0x27,20,4);
// Define Firebase Data object
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
//to hold data
char name[20];
char permission[10];
char phone[20];
char location[20];
char root[]="/stolen-gadget/";
unsigned int i=0;
char sampleTag[4][15] = {"78-HG-88-45","78-HG-88-44","ME-76-GH-4R","ME-76-GH-4R"};
void setup()
{
lcd.init();
lcd.backlight();
loadingdisplay();
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(testPin, INPUT_PULLUP);
digitalWrite(buzzer,LOW);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
Serial.begin(115200);
SPI.begin();
scanner.PCD_Init();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);
config.api_key = API_KEY;
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
config.database_url = DATABASE_URL;
/* Assign the callback function for the long running token generation task */
config.token_status_callback = tokenStatusCallback; // see addons/TokenHelper.h
Firebase.begin(&config, &auth);
// Comment or pass false value when WiFi reconnection will control by your code or third party library
Firebase.reconnectWiFi(true);
Firebase.setDoubleDigits(5);
}
uint8_t p=0;
void loop()
{
homedisplay();
if(digitalRead(testPin)==LOW)
{
delay(500);
if(readData(root,sampleTag[p]));
{
if(permission=="false")
{
alert_display();
Alert(5);
}
}
p++;
if(p>=4)
{
p=0;
}
lcd.clear();
}
}
char* scangadget()
{
if (scanner.PICC_IsNewCardPresent() && scanner.PICC_ReadCardSerial())
{
String uidStr = "";
for (byte i = 0; i < scanner.uid.size; i++)
{
uidStr += String(scanner.uid.uidByte[i] < 0x10 ? "0" : "");
uidStr += String(scanner.uid.uidByte[i], HEX);
}
// Convert UID to char array
char uidCharArray[uidStr.length() + 1];
uidStr.toCharArray(uidCharArray, uidStr.length() + 1);
// Print the UID
Serial.print("UID: ");
Serial.println(uidCharArray);
delay(1000);
return uidCharArray;
}
else{ return nullptr;}
}
void loadingdisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INDOOR GADGET THEFT");
lcd.setCursor(0,1);
lcd.print("*DETECTION & ALERT*");
lcd.setCursor(0,2);
lcd.print(" SYSTEM INITIALIZE ");
lcd.setCursor(0,3);
lcd.print("PLEASE WAIT");
for(int k=11;k<20;k++)
{
lcd.setCursor(k,3);
lcd.print(".");
delay(500);
}
}
void homedisplay()
{
lcd.setCursor(0,0);
lcd.print("INDOOR GADGETS THEFT");
lcd.setCursor(0,1);
lcd.print("DETECTION & ALERTING");
lcd.setCursor(0,2);
lcd.print(">OPERATION ACTIVATED");
lcd.setCursor(0,3);
lcd.print("--------<OO>--------");
}
void alert_display()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("GADGET LOST DETECTED");
lcd.setCursor(0,1);
lcd.print("NAME:");
lcd.setCursor(5,1);
lcd.print(name);
lcd.setCursor(0,2);
lcd.print("FROM:");
lcd.setCursor(5,2);
lcd.print(location);
lcd.setCursor(1,2);
lcd.setCursor(0,3);
lcd.print("--------<!!>--------");
}
void Alert(uint8_t num)
{
for(num;num>0;num--)
{
digitalWrite(buzzer,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
delay(1000);
}
}
bool readData(char rootnode[], char childnode[])
{
char fbpath[strlen(rootnode)+strlen(childnode)+1];
strcat(strcpy(fbpath,rootnode),childnode);
if(Firebase.ready() && Firebase.getJSON(fbdo,fbpath))
{
if(fbdo.dataType()!="json")
{
Serial.printf("datatype not json it is %s\n",fbdo.dataType());
return LOW;
}
const char *jsonData = fbdo.to<const char *>();
extractValues(jsonData, name, permission, phone, location,4);
printf("Name: %s\n", name);
printf("Permission: %s\n", permission);
printf("Phone: %s\n", phone);
printf("Location: %s\n", location);
return HIGH;
}
else
{
Serial.printf("error found: %s \n",fbdo.errorReason().c_str());
return LOW;
}
}
uint8_t extractValues(const char *jsonData, char *name, char *permission, char *phone, char *location,uint8_t num)
{
// Use sscanf to extract values based on the JSON format
uint8_t numExtracted = sscanf(jsonData, "{\"location\":\"%[^\"]\",\"name\":\"%[^\"]\",\"permission\":\"%[^\"]\",\"phone\":\"%[^\"]\"}", location, name, permission, phone);
Serial.printf("%hhu out of %hhu data are extracted successfully",numExtracted,num);
return numExtracted;
}