Passcode Protected Tollbooth
Last updated
Was this helpful?
Last updated
Was this helpful?
When you pull up to a many buildings, the gate only opens if you know the passcode. In this project you will use a 4 by 4 keypad to feed Arduino information. Arduino will keep track of that information and decide whether or not it matches the pre-determined passcode. If it does, it will send signal to a motor driver board and open or close the gate. If not, it will ask for new information.
- 1 L298N Motor Driver Board
- 1 Arduino Uno
- 1 Tollbooth Setup
- 1 4 by 4 keypad
- 1 9V Battery
- Assorted Wire
#include <Keypad.h> //library to simplify accepting input from the keypad
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
#define Password_Length 7
char Data[Password_Length]; // 6 is the number of chars it can hold + the null char = 7
char o_master[Password_Length] = "123456";
char c_master[Password_Length] = "654321";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
// declare the pins for the open/close limit switches
int olim = 11;
int clim = 10;
//declare the pincs for the open/close gate enable pins going to the L298 driver
int ogate = 13;
int cgate = 12;
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
//initialize gate control pins as inputs/outputs
pinMode(olim, INPUT_PULLUP);
pinMode(clim, INPUT_PULLUP);
pinMode(ogate, OUTPUT);
pinMode(cgate, OUTPUT);
initialize();
}
// the main loop of the program
void loop() {
char customKey = customKeypad.getKey();
//only runs when it receives data from the kaypad
if (customKey) {
Serial.print(customKey); //print the current key entry to the serial monitor
Data[data_count] = customKey; //place the key entry in the data array
data_count ++; // move to the next spot in the array
// wait till there are 6 positions filled in the array
if (data_count == Password_Length - 1) {
//compare the array to the open password, if it's a match, open the gate
if (!strcmp(Data, o_master)) {
Serial.println("");
Serial.println("Correct, you may enter");
open_gate();
clear_data();
initialize();
}
//compare the array to the close password, if it's a match, close the gate
else if (!strcmp(Data, c_master)) {
Serial.println("");
Serial.println("Correct, the gate is closing");
close_gate();
clear_data();
initialize();
}
//if the password doesn't match either, ask the user to try again.
else {
Serial.println("");
Serial.println("Incorect. Please try again");
clear_data();
initialize();
}
}
}
}
//determines where the gate is at and prompts the user to enter a password //if gate isn't at top or bottom, it takes it to the bottom and prompts user to enter password
void initialize() {
int close_value = digitalRead(clim);
int open_value = digitalRead(olim);
if (close_value == LOW ) {
Serial.println("Please enterthe 6 digit open password");
return;
}
else if (open_value == LOW) {
Serial.println("Please enter the 6 digit close password");
return;
}
else {
while (digitalRead(clim) == HIGH) {
digitalWrite(cgate, HIGH);
digitalWrite(ogate, LOW);
}
digitalWrite(cgate, LOW);
digitalWrite(ogate, LOW);
delay(100);
Serial.println("Please enter the 6 digit open password");
return;
}
}
//clears the list of numbers in the keypad array
void clear_data() {
while (data_count != 0) {
Data[data_count--] = 0;
}
return;
}
// runs the motor in the open direction while the open limit switch is not pressed,
//then turns off the motors before going back to main program
void open_gate() {
while (digitalRead(olim) == HIGH) {
digitalWrite(ogate, HIGH);
digitalWrite(cgate, LOW);
}
digitalWrite(ogate, LOW);
digitalWrite(cgate, LOW);
delay(100);
return;
}
// runs motor in close direction while the close limit switch is not pressed,
//then turns off the motors before going back to main program
void close_gate() {
while (digitalRead(clim) == HIGH) {
digitalWrite(ogate, LOW);
digitalWrite(cgate, HIGH);
}
digitalWrite(ogate, LOW);
digitalWrite(cgate, LOW);
delay(100);
return;
}