191 lines
4.0 KiB
C++
191 lines
4.0 KiB
C++
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
#include <Servo.h>
|
|
#include <SPI.h>
|
|
#include <MFRC522.h>
|
|
|
|
#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;
|
|
}
|
|
} |