This shows you the differences between two versions of the page.
pm:prj2025:iivasciuc:131375 [2025/05/21 17:40] mircea_ovidiu.dodi [Software Design] |
pm:prj2025:iivasciuc:131375 [2025/05/30 10:45] (current) mircea_ovidiu.dodi [Arduino Pinout:] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Smart Locker ====== | ====== Smart Locker ====== | ||
- | ! Version: 11.05 - 1st assigment version. Work was started on the other milestones as well but it is yet unfinished ! | + | |
+ | Release notes: | ||
+ | |||
+ | Version: 11.05 - 1st assigment version. Work was started on the other milestones as well but it is yet unfinished | ||
Done: general details, hardware implementation and most of the software implementation. | Done: general details, hardware implementation and most of the software implementation. | ||
- | ! Version 21.05 - 2nd milestone - full functionality achieved. ! | + | Version 21.05 - 2nd milestone - full functionality achieved. |
===== Introduction ===== | ===== Introduction ===== | ||
Smart Locker is a solution for securing valuable items coming in the form of a lockable safe. | Smart Locker is a solution for securing valuable items coming in the form of a lockable safe. | ||
Line 13: | Line 16: | ||
===== Functionality ===== | ===== Functionality ===== | ||
Functionality TLDR: | Functionality TLDR: | ||
- | * The locker can be opened by introducing the correct numerical combination or presenting the RFID card. | + | * The locker can be opened/locked by introducing the correct numerical combination or presenting the RFID card. |
- | * If 3 wrong PINs are introduced, the buzzer is triggered. | + | * If 3 wrong PINs are introduced, the buzzer is triggered, thus entering alarm mode. |
+ | * Alarm mode can only be stopped by presenting the Master RFID Card. | ||
+ | * The PIN can be reset by presenting the Master RFID card (not the standard one!) and entering/confirming twice the new PIN | ||
* For each PIN introduction, a status is displayed ("Correct!" / "X tries remaining") | * For each PIN introduction, a status is displayed ("Correct!" / "X tries remaining") | ||
* A PIR sensor detect human presence close to the keypad. | * A PIR sensor detect human presence close to the keypad. | ||
* If the door is forced, high pressure is read by the weight sensor which prompts entry to alarm mode. | * If the door is forced, high pressure is read by the weight sensor which prompts entry to alarm mode. | ||
- | * The PIN can be reset by presenting the RFID card. | ||
* A motor moves the mechanism for locking/unlocking the door. | * A motor moves the mechanism for locking/unlocking the door. | ||
===== General Description===== | ===== General Description===== | ||
- | To implement the project in a physical format, a servo motor is used which performs the opening/closing of the door. A toothed wheel was attached to this motor to create a mechanism together with a rack. In this way, the rotational motion from the motor is used to move the lock to the correct position. To actuate the servo motor, and thus open the door, a keypad is added, through which the user can enter the correct password, as well as an RFID card communication module, where, using the correct card, the door can be opened. | + | To implement the project in a physical format, a servo motor is used which performs the opening/closing of the door. To actuate the servo motor, and thus open the door, a keypad is added, through which the user can enter the correct password, as well as an RFID card communication module, where, using the correct card, the door can be opened. |
- | The locking mechanism rests against a weight sensor - if the door is forced (i.e high weight reading), the buzzer is triggered. | + | The locking mechanism rests against a weight sensor - if the door is forced (i.e high weight reading), the buzzer is triggered. This functionality was later abandoned, since the two load cells used were either too hard to trigger (50kg, 3 wires) or had no pins remaining to be wired to the Arduino board (10kg, 4 wires). Right now, the 50kg is present but not connected, it only is used as part of the locking mechanism. |
- | The alarm system is activated if the door is forced or 3 incorrect passwords have been entered consecutively or the wrong card has been used 3 times, or a combination of these two events, with the user having three attempts to open the door. Once the alarm system is activated, a buzzer will emit a loud audible signal, which can only be stopped by using the correct RFID card. | + | The alarm system is activated if the door is forced or 3 incorrect passwords have been entered consecutively 3 times, with the user having three attempts to open the door. Once the alarm system is activated, a buzzer will emit a loud audible signal, which can only be stopped by using the correct RFID card. |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 56: | Line 60: | ||
* Active buzzer | * Active buzzer | ||
* PIR sensor HW-201 | * PIR sensor HW-201 | ||
- | * Load Cell | + | * 10kg Load Cell |
</note> | </note> | ||
Line 88: | Line 92: | ||
* SCL: A5 (Fixed for I2C) | * SCL: A5 (Fixed for I2C) | ||
- | Power Connections | + | Power Connections: |
VCC (5V) | VCC (5V) | ||
* LCD Display | * LCD Display | ||
- | * RFID Module | ||
* Servo Motor | * Servo Motor | ||
* Load Cell | * Load Cell | ||
* Keypad | * Keypad | ||
+ | |||
+ | VCC (3.3V) | ||
+ | * RFID Module | ||
GND | GND | ||
Line 106: | Line 113: | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | State Machine: The core logic is driven by the currentState variable, which can be one of the following: | + | [[https://github.com/MirceaOvidiu/SmartLocker|Code available here]] |
+ | |||
+ | Finite State Machine: The core logic is driven by the currentState variable, which can be one of the following: | ||
* STATE_IDLE: The default state, waiting for PIN input or RFID card. | * STATE_IDLE: The default state, waiting for PIN input or RFID card. | ||
Line 117: | Line 126: | ||
The loop() function continuously checks for RFID card presence and reads the keypad. Based on the current state and the input received, it transitions to other states and performs corresponding actions. | The loop() function continuously checks for RFID card presence and reads the keypad. Based on the current state and the input received, it transitions to other states and performs corresponding actions. | ||
- | Important Functions | + | Important Functions: |
- | setup(): Initializes all the peripherals (LCD, servo, buzzer, keypad, RFID) and sets the initial state of the door lock. | + | * setup(): Initializes all the peripherals (LCD, servo, buzzer, keypad, RFID) and sets the initial state of the door lock. |
- | loop(): The main execution loop that handles state transitions, reads sensors and input devices, and performs actions based on the current state. | + | * loop(): The main execution loop that handles state transitions, reads sensors and input devices, and performs actions based on the current state. |
- | handleIdleState(): Manages the PIN entry process via the keypad, checks the entered PIN against the stored password, and handles locking/unlocking or triggering the alert state. | + | * handleIdleState(): Manages the PIN entry process via the keypad, checks the entered PIN against the stored password, and handles locking/unlocking or triggering the alert state. |
- | unlockDoor(): Controls the servo motor to the unlocked position. | + | * unlockDoor(): Controls the servo motor to the unlocked position. |
- | lockDoor(): Controls the servo motor to the locked position. | + | * lockDoor(): Controls the servo motor to the locked position. |
- | isMasterCard(): Checks if the scanned RFID card's UID matches the masterUID. | + | * isMasterCard(): Checks if the scanned RFID card's UID matches the masterUID. |
- | isUserCard(): Checks if the scanned RFID card's UID matches the userUID. | + | * isUserCard(): Checks if the scanned RFID card's UID matches the userUID. |
- | Why Were the Libraries Used? | + | |
- | The code utilizes several libraries to simplify interaction with the hardware components: | + | What are the used libraries and why? |
+ | |||
+ | * <Servo.h>: This library provides functionalities to control servo motors. It's used here to move the servo that controls the door lock. | ||
+ | * <Wire.h>: The Wire library allows communication with I2C devices. It's essential for communicating with the I2C-based Liquid Crystal Display (LCD). | ||
+ | * <LiquidCrystal_I2C.h>: This library provides a convenient way to control I2C-based LCDs, making it easy to display text and information to the user. | ||
+ | * <Keypad.h>: This library simplifies reading input from a matrix keypad. It handles the scanning of rows and columns to detect which key is pressed. | ||
+ | * <SPI.h>: The SPI (Serial Peripheral Interface) library is used for communication with devices that use the SPI protocol, such as the MFRC522 RFID module. | ||
+ | * <MFRC522.h>: This library provides functions to interact with the MFRC522 RFID reader/writer module, allowing the system to read RFID card UIDs. | ||
- | <Servo.h>: This library provides functionalities to control servo motors. It's used here to move the servo that controls the door lock. | + | These libraries abstract away the low-level details of hardware communication, making it easier to develop the application logic. |
- | <Wire.h>: The Wire library allows communication with I2C devices. It's essential for communicating with the I2C-based Liquid Crystal Display (LCD). | + | |
- | <LiquidCrystal_I2C.h>: This library provides a convenient way to control I2C-based LCDs, making it easy to display text and information to the user. | + | |
- | <Keypad.h>: This library simplifies reading input from a matrix keypad. It handles the scanning of rows and columns to detect which key is pressed. | + | |
- | <SPI.h>: The SPI (Serial Peripheral Interface) library is used for communication with devices that use the SPI protocol, such as the MFRC522 RFID module. | + | |
- | <MFRC522.h>: This library provides functions to interact with the MFRC522 RFID reader/writer module, allowing the system to read RFID card UIDs. | + | |
- | These libraries abstract away the low-level details of hardware communication, making it easier to develop the application logic. For instance, instead of manually sending I2C commands to the LCD, the LiquidCrystal_I2C library provides functions like lcd.print() and lcd.setCursor(). Similarly, the Keypad library handles the complexities of reading a matrix keypad, returning the pressed key directly. The MFRC522 library simplifies the process of detecting and reading data from RFID cards. | + | |
===== Results, Conclusions ===== | ===== Results, Conclusions ===== | ||
<note tip> | <note tip> | ||
- | The intended functionality was achieved - a demo can be found on the following [[https://www.youtube.com/watch?v=Mho3pYF5UIk&ab_channel=MirceaOvidiu|YouTube]] link or embedded in the [[https://github.com/MirceaOvidiu/SmartLocker|GitHub]] page. | + | The intended functionality was achieved (except the load cell feature) - a demo can be found on the following [[https://www.youtube.com/watch?v=Mho3pYF5UIk&ab_channel=MirceaOvidiu|YouTube]] link or embedded in the [[https://github.com/MirceaOvidiu/SmartLocker|GitHub]] page. |
</note> | </note> | ||
Line 175: | Line 186: | ||
{{:pm:prj2025:iivasciuc:smartlockerfinal.jpg?nolink&300|}} | {{:pm:prj2025:iivasciuc:smartlockerfinal.jpg?nolink&300|}} | ||
- | ===== Bibliografie/Resurse ===== | + | ===== Bibliography ===== |
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
+ | Resources used: | ||
+ | |||
+ | [[https://www.instructables.com/Arduino-Wiring-and-Programming-of-RFID-Sensor/| RFID guide]] | ||
+ | |||
+ | [[https://docs.arduino.cc/tutorials/generic/basic-servo-control/| Servo Motor guide]] | ||
+ | |||
+ | [[https://arduinogetstarted.com/tutorials/arduino-keypad| Keypad configuring]] | ||
+ | |||
+ | [[https://randomnerdtutorials.com/arduino-load-cell-hx711/| Load cell and HX711 module tutorial]] | ||
+ | |||
+ | [[https://arduinogetstarted.com/tutorials/arduino-lcd-i2c| I2C display configuration]] | ||
+ | |||
</note> | </note> | ||