#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <MFRC522.h>
#include <HTTPSRedirect.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 2 // D4
#define RST_PIN 0 // D3
#define BUZZER 4 // D2
#define PUSH_BUTTON D7 // Button to remove last item
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
MFRC522::StatusCode status;
// WiFi credentials
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
// Google Apps Script Deployment ID
const char *GScriptId = "Your_Google_Script_ID";
// Google Sheets API settings
const char* host = "script.google.com";
const int httpsPort = 443;
String url = String("/macros/s/") + GScriptId + "/exec";
HTTPSRedirect* client = nullptr;
// Store RFID tag data and item prices
struct Item {
String id;
String name;
float price;
};
// List of items and their prices
Item items[] = {
{"A1B2C3D4", "Apple", 1.50},
{"E5F6G7H8", "Milk", 2.00},
{"I9J1K2L3", "Bread", 1.20},
{"M4N5O6P7", "Eggs", 3.50}
};
float total_bill = 0.0;
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(PUSH_BUTTON, INPUT_PULLUP);
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected");
delay(2000);
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
client->setPrintResponseBody(true);
client->setContentTypeHeader("application/json");
for (int i = 0; i < 5; i++) {
if (client->connect(host, httpsPort)) {
Serial.println("Connected to Google Sheets!");
break;
}
Serial.println("Connection failed, retrying...");
delay(2000);
}
delete client;
client = nullptr;
}
void loop() {
if (digitalRead(PUSH_BUTTON) == LOW) {
erasePreviousData();
delay(500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan Item...");
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return;
}
String scannedID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
scannedID += String(mfrc522.uid.uidByte[i], HEX);
}
scannedID.toUpperCase();
Serial.println("Scanned ID: " + scannedID);
bool itemFound = false;
String itemName;
float itemPrice = 0.0;
for (int i = 0; i < sizeof(items) / sizeof(items[0]); i++) {
if (scannedID.equals(items[i].id)) {
itemFound = true;
itemName = items[i].name;
itemPrice = items[i].price;
total_bill += itemPrice;
break;
}
}
if (itemFound) {
Serial.println("Item: " + itemName + " Price: $" + String(itemPrice));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Added: " + itemName);
lcd.setCursor(0, 1);
lcd.print("Total: $" + String(total_bill));
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
String payload = "{\"command\": \"insert_row\", \"values\": \"" + itemName + "," + String(itemPrice) + "," + String(total_bill) + "\"}";
sendDataToGoogle(payload);
} else {
Serial.println("Unknown Item!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Unknown Item!");
delay(2000);
}
delay(3000);
}
void sendDataToGoogle(String payload) {
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
if (client->POST(url, host, payload)) {
Serial.println("Data sent to Google Sheets");
} else {
Serial.println("Error sending data.");
}
delete client;
client = nullptr;
delay(5000);
}
void erasePreviousData() {
Serial.println("Removing last item...");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Removing item...");
String erase_payload = "{\"command\": \"delete_last_row\"}";
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
if (client->POST(url, host, erase_payload)) {
Serial.println("Last item removed.");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Item Removed!");
} else {
Serial.println("Erase failed.");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erase Failed!");
}
delete client;
client = nullptr;
delay(2000);
}