Ticksy - Smart RFID Bus Ticketing System
Ticksy is an Arduino-based smart ticketing system
Components and supplies
1
16x2 LCD display with I²C interface
1
Arduino Science Kit Physics Lab HU
1
Feetech Mini Servo motor 120 degrees 9g
1
RFID MFRC-522 Module
Apps and platforms
1
VS Code
1
Arduino IDE 2.0 (beta)
Project description
Code
Ticksy - Bus Ticketing System
cpp
.
1#include <SPI.h> 2#include <MFRC522.h> 3#include <Wire.h> 4#include <LiquidCrystal_I2C.h> 5#include <Servo.h> 6 7// Pins 8#define SS_PIN 10 9#define RST_PIN 9 10#define SERVO_PIN 6 11 12// Components 13MFRC522 mfrc522(SS_PIN, RST_PIN); 14LiquidCrystal_I2C lcd(0x27, 16, 2); 15Servo myServo; 16 17// Users data 18#define NUM_USERS 6 19struct User { 20 byte uid[4]; 21 String name; 22 float balance; 23}; 24 25User users[NUM_USERS] = { 26 27}; 28 29void setup() { 30 Serial.begin(9600); 31 SPI.begin(); 32 mfrc522.PCD_Init(); 33 lcd.init(); 34 lcd.backlight(); 35 myServo.attach(SERVO_PIN); 36 myServo.write(0); 37 randomSeed(analogRead(0)); 38 39 // Welcome sequence 40 lcd.clear(); 41 lcd.print("Hello!"); 42 delay(1000); 43 lcd.setCursor(0, 1); 44 lcd.print("Welcome to Bus"); 45 delay(2000); 46 lcd.clear(); 47 lcd.print("Please Tap Your"); 48 lcd.setCursor(0, 1); 49 lcd.print("Card/Keychain"); 50} 51 52void loop() { 53 if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { 54 processRFID(); 55 delay(500); // Debounce 56 } 57} 58 59void processRFID() { 60 int userIndex = findUserIndex(mfrc522.uid.uidByte); 61 62 if (userIndex != -1) { 63 // Valid user - check balance first 64 float fee = random(10, 51); 65 66 if (users[userIndex].balance >= fee) { 67 // Sufficient balance 68 myServo.write(180); // Open gate 69 users[userIndex].balance -= fee; 70 71 // Display 72 lcd.clear(); 73 lcd.print("Hello! "+users[userIndex].name); 74 lcd.setCursor(0, 1); 75 lcd.print("Paid:rs " + String(fee, 2)); 76 delay(1500); 77 lcd.setCursor(0, 1); 78 lcd.print(" Bal:rs " + String(users[userIndex].balance, 2)); 79 80 // Serial output 81 Serial.print(users[userIndex].name + ","); // Name 82 Serial.print(String(fee, 2) + ","); // Fee 83 Serial.print(String(users[userIndex].balance, 2) + ","); // Balance 84 printUID(mfrc522.uid.uidByte); // UID 85 Serial.println(",ACCESS_GRANTED"); 86 delay(1500); 87 lcd.clear(); 88 lcd.setCursor(0,0); 89 lcd.print("Thanks For using"); 90 delay(500); 91 lcd.setCursor(0,1); 92 lcd.print("Our Bus service"); 93 delay(1000); 94 lcd.clear(); 95 lcd.setCursor(0,0); 96 lcd.print("Enjoy your Ride!"); 97 98 delay(2000); 99 myServo.write(0); // Close gate 100 } else { 101 // Insufficient balance 102 lcd.clear(); 103 lcd.print("Not Enough Funds!"); 104 lcd.setCursor(0, 1); 105 lcd.print("Bal:rs " + String(users[userIndex].balance, 2)); 106 107 Serial.print("Insufficient balance for "); 108 printUID(mfrc522.uid.uidByte); 109 Serial.println(" - " + users[userIndex].name); 110 111 delay(2000); 112 } 113 showWelcomeMessage(); // Return to welcome 114 } else { 115 // Invalid 116 lcd.clear(); 117 lcd.print("Invalid Card!"); 118 lcd.setCursor(0, 1); 119 lcd.print("Try Again"); 120 printUID(mfrc522.uid.uidByte); 121 Serial.println(" - Invalid Card!"); 122 delay(1500); 123 showWelcomeMessage(); 124 } 125 mfrc522.PICC_HaltA(); 126} 127 128// Helper functions 129int findUserIndex(byte *uid) { 130 for (int i = 0; i < NUM_USERS; i++) { 131 if (memcmp(uid, users[i].uid, 4) == 0) return i; 132 } 133 return -1; 134} 135 136void printUID(byte *uid) { 137 Serial.print("UID:"); 138 for (byte i = 0; i < 4; i++) { 139 Serial.print(uid[i] < 0x10 ? " 0" : " "); 140 Serial.print(uid[i], HEX); 141 } 142} 143 144void showWelcomeMessage() { 145 lcd.clear(); 146 lcd.print("Please Tap Your"); 147 lcd.setCursor(0, 1); 148 lcd.print("Card/Keychain"); 149}
Downloadable files
Circuit diagram
.
circuit_image.png

rfid logger
to obtain the CSV files directly use this
rfid-logger.py
Comments
Only logged in users can leave comments