#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <Servo.h>
Servo servo1;
Servo servo2;
#define PUSHBUTTON 2
#define IR_A1 6
#define IR_A2 5
#define IR_B1 4
#define IR_B2 3
#define servo1Pin 8
#define servo2Pin 7
#define LDR_ANALOG A0
#define LED_WHITE A1
#define LED_RED A2
#define LED_GREEN A3
int servo1pos = 180;
int servo2pos = 180;
int entrance;
int passage1;
int exitexit;
int passage2;
const int slots = 30;
int slotleft = slots;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
void setup() {
Serial.begin(9600);
Serial.println("Hello World");
SPI.begin();
mfrc522.PCD_Init();
pinMode(PUSHBUTTON, INPUT_PULLUP);
pinMode(IR_A1, INPUT_PULLUP);
pinMode(IR_A2, INPUT_PULLUP);
pinMode(IR_B1, INPUT_PULLUP);
pinMode(IR_B2, INPUT_PULLUP);
pinMode(LED_WHITE, OUTPUT);
digitalWrite(LED_WHITE, LOW);
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_RED, LOW);
pinMode(LED_GREEN, OUTPUT);
digitalWrite(LED_GREEN, LOW);
servo1.attach(servo1Pin);
servo1.write(servo1pos);
servo2.attach(servo2Pin);
servo2.write(servo2pos);
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
lcd.setCursor(0, 0);
lcd.print(F(" ARDUINO! "));
lcd.setCursor(0, 1);
lcd.print(F(" PARKING SYSTEM "));
delay(2000);
lcd.clear();
}
void loop() {
static unsigned long timer1 = millis();
static unsigned long timer2 = millis();
int analogValue = analogRead(LDR_ANALOG);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
if (lux < 50) digitalWrite(LED_WHITE, HIGH);
else digitalWrite(LED_WHITE, LOW);
///////////////////////////////////////////////////////////////////////////////////
int frg = digitalRead(IR_A1) == 0 && digitalRead(IR_A2) == 1 && entrance == 0 && slotleft > 0;
if (RFID(frg)) {
entrance = 1;
passage1 = 0;
while (servo1pos > 90) {
servo1pos--;
servo1.write(servo1pos);
delay(5);
}
}
if (digitalRead(IR_A2) == 0 && entrance == 1) passage1 = 1;
if (digitalRead(IR_A2) == 1 && entrance == 1 && passage1 == 1) {
if (millis() - timer1 > 1000) {
passage1 = 0;
entrance = 0;
while (servo1pos < 180) {
servo1pos++;
servo1.write(servo1pos);
delay(5);
}
slotleft -= 1;
}
} else timer1 = millis();
///////////////////////////////////////////////////////////////////////////////////
if (digitalRead(IR_B1) == 0 && digitalRead(IR_B2) == 1 && exitexit == 0) {
exitexit = 1;
passage2 = 0;
while (servo2pos > 90) {
servo2pos--;
servo2.write(servo2pos);
delay(5);
}
}
if (digitalRead(IR_B2) == 0 && exitexit == 1) passage2 = 1;
if (digitalRead(IR_B2) == 1 && exitexit == 1 && passage2 == 1) {
if (millis() - timer2 > 1000) {
passage2 = 0;
exitexit = 0;
while (servo2pos < 180) {
servo2pos++;
servo2.write(servo2pos);
delay(5);
}
slotleft += 1;
}
} else timer2 = millis();
///////////////////////////////////////////////////////////////////////////////////
correction();
lcd.setCursor(0, 1);
if (slotleft > 0) {
lcd.print(F("Slot Left: "));
lcd.print(slotleft);
lcd.print(" ");
} else {
lcd.println(F("Parkhouse full "));
}
if (entrance == 1 || slotleft == 0) {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
}
}
void correction() {
static unsigned long timer = millis();
if (digitalRead(PUSHBUTTON)) timer = millis();
if (millis() - timer > 500) {
timer = millis();
slotleft++;
if (slotleft > slots) slotleft = 0;
}
if (slotleft > slots) slotleft = slots;
if (slotleft < 0) slotleft = 0;
}
int RFID(int frg) {
static int i = 0;
static unsigned long timer1 = millis();
static unsigned long timer2 = millis();
if (frg) i = 0;
else {
if (millis() - timer1 > 500) {
timer1 = millis();
lcd.setCursor(i, 0);
if (i == 0) lcd.print(F("* "));
else lcd.print(F("*"));
i++;
if (i > 15) i = 0;
}
return 0;
}
if (millis() - timer2 < 1000) return 0;
if (!mfrc522.PICC_IsNewCardPresent()) {
lcd.setCursor(0, 0);
lcd.print(F("scan card... "));
return 0;
}
// Select one of the cards
if (!mfrc522.PICC_ReadCardSerial()) {
lcd.setCursor(0, 0);
lcd.print(F("scan card... "));
return 0;
}
// Get the UID from the scanned card and format it as a String
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
content.trim();
Serial.println(content);
// Check the UID
if (content == "01 02 03 04") {
lcd.setCursor(0, 0);
lcd.print(F("ACCESS GRANTED! "));
return 1;
}
if (content == "FA 7E 2F 80") {
lcd.setCursor(0, 0);
lcd.print(F("ACCESS GRANTED! "));
return 1;
}
lcd.setCursor(0, 0);
lcd.print(F("ACCESS DENIED! "));
timer2 = millis();
return 0;
}
Loading
mfrc522
mfrc522