#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <HTTPClient.h>
#define SS_PIN 5
#define RST_PIN 22
#define TRIG 14
#define ECHO 12
#define SERVO_PIN 13
#define LED_G 26
#define LED_R 27
#define BUZZER 25
MFRC522 rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo barrier;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* apiURL = "https://httpbin.org/post";
float toll = 50.0;
float balance = 100.0;
void setup() {
Serial.begin(115200);
SPI.begin();
rfid.PCD_Init();
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
barrier.attach(SERVO_PIN);
barrier.write(0);
lcd.init();
lcd.backlight();
lcd.print("Welcome to Toll");
delay(1500);
lcd.clear();
lcd.print("Connecting WiFi");
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.clear();
lcd.print("Ready");
}
long getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
long dist = duration * 0.034 / 2;
return dist;
}
String getUID() {
String uid="";
for(byte i=0;i<rfid.uid.size;i++){
if(rfid.uid.uidByte[i] < 0x10) uid += "0";
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
return uid;
}
bool chargePayment(String uid) {
if(balance >= toll) {
balance -= toll;
return true;
} else {
return false;
}
}
void openGate() {
digitalWrite(LED_G, HIGH);
barrier.write(90);
lcd.clear();
lcd.print("Gate Open");
delay(5000);
barrier.write(0);
digitalWrite(LED_G, LOW);
lcd.clear();
lcd.print("Gate Closed");
delay(1000);
}
void deny() {
digitalWrite(LED_R, HIGH);
tone(BUZZER, 400, 1500);
lcd.clear();
lcd.print("Low Balance");
lcd.setCursor(0,1);
lcd.print("Recharge Req");
delay(2000);
digitalWrite(LED_R, LOW);
}
void loop() {
long dist = getDistance();
if(dist < 10) {
lcd.clear();
lcd.print("Vehicle Detected");
delay(500);
lcd.clear();
lcd.print("Scan FASTag");
while(!rfid.PICC_IsNewCardPresent() ||
!rfid.PICC_ReadCardSerial()) {
delay(100);
}
String uid = getUID();
Serial.println(uid);
tone(BUZZER, 1000, 100);
lcd.clear();
lcd.print("Processing...");
delay(1000);
bool paid = chargePayment(uid);
if(paid) {
lcd.clear();
lcd.print("Paid Rs 50");
lcd.setCursor(0,1);
lcd.print("Bal:" + String(balance));
delay(2000);
openGate();
} else {
deny();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
lcd.clear();
lcd.print("Waiting Vehicle");
}
delay(200);
}