#include #include #include #include #include #define SS_PIN 10 #define RST_PIN 9 #define servoEntree 5 #define servoSortie 3 String UID = "AE E6 DA 6F"; MFRC522 rfid(SS_PIN, RST_PIN); Servo barriere1; Servo barriere2; LiquidCrystal_I2C lcd(0x27, 16, 2); int IR1 = 4; int IR2 = 6; bool carEntering = false; bool carExiting = false; int placesLibres = 3; // compteur de places void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); pinMode(IR1, INPUT); pinMode(IR2, INPUT); barriere1.attach(servoEntree); barriere2.attach(servoSortie); barriere1.write(100); barriere2.write(100); lcd.setCursor(0, 0); lcd.print(" ARDUINO "); lcd.setCursor(0, 1); lcd.print(" PARKING SYSTEM "); delay(3000); lcd.clear(); SPI.begin(); rfid.PCD_Init(); Serial.println("Systeme pret."); updateDisplay(); } void loop() { // --- ENTREE --- if (digitalRead(IR1) == LOW && !carEntering && !carExiting) { carEntering = true; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Car Detected!"); delay(1000); if (placesLibres <= 0) { // Parking plein lcd.clear(); lcd.setCursor(0, 0); lcd.print(" PARKING FULL "); lcd.setCursor(0, 1); lcd.print(" Desole :( "); delay(3000); } else { int pass = rfunc(); if (pass == 1) { placesLibres--; Serial.print("Places restantes : "); Serial.println(placesLibres); smoothOpen(barriere1); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Gate Opened!"); delay(10000); smoothClose(barriere1); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Gate Closed!"); delay(1500); } } carEntering = false; updateDisplay(); } // --- SORTIE --- if (digitalRead(IR2) == LOW && !carExiting && !carEntering) { carExiting = true; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Car Exiting..."); smoothOpen(barriere2); delay(10000); smoothClose(barriere2); if (placesLibres < 3) { placesLibres++; Serial.print("Places restantes : "); Serial.println(placesLibres); } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Gate Closed!"); delay(1500); carExiting = false; updateDisplay(); } } void updateDisplay() { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" WELCOME! "); lcd.setCursor(0, 1); lcd.print("Places : "); lcd.print(placesLibres); lcd.print("/3"); } void smoothOpen(Servo &s) { for (int pos = 100; pos >= 0; pos--) { s.write(pos); delay(10); } } void smoothClose(Servo &s) { for (int pos = 0; pos <= 100; pos++) { s.write(pos); delay(10); } } int rfunc() { lcd.clear(); lcd.setCursor(4, 0); lcd.print("Welcome!"); lcd.setCursor(1, 1); lcd.print("Put your card"); unsigned long t = millis(); while (true) { if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) break; if (millis() - t > 10000) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Timeout..."); delay(1500); return 0; } delay(300); } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Scanning"); String ID = ""; for (byte i = 0; i < rfid.uid.size; i++) { lcd.print("."); ID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ")); ID.concat(String(rfid.uid.uidByte[i], HEX)); delay(300); } ID.toUpperCase(); Serial.print("Badge scanne : "); Serial.println(ID.substring(1)); if (ID.substring(1) == UID) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Allowed."); delay(1500); return 1; } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wrong card!"); Serial.println("Acces refuse."); delay(1500); return 0; } }