# Dynamic Combination Lock Box with Arduino Uno

For this project I wanted to not only create a Combination Lock Box, but also have the combination change as a function of time. In order to achieve this, I needed the following materials.

## Materials

- Arduino Uno
- Breadboard
- Green and Red LED
- 9V Battery
- 3V Coin Cell Battery
- Wires
- DS3231 AT24C32 IIC High Precision RTC Module Clock Timer Memory Module for Arduino
- 4 x 4 Matrix Array 16 Key Membrane Switch Keypad Keyboard for Arduino AVR PIC
- 220K Ohm Resistor

## Process

I first needed to solder together the materials and create a static combination lock box. I set the rule that pressing * after entering the password submits it, and pressing ‘#’ resets the currently entered passcode. I downloaded the Keypad library for Arduino from online.

After I set up the static keypad, I want to make the password a little more interesting. What if the passcode wasn’t a set number, but depended on what time or day it was?

I decided to set a rule that the passcode would:

- Be a 3 digit number
- Be the factorial of the current day (Sunday = 1, Monday = 2, etc) modulo 101
- Be submitted by pressing * and reset by pressing #

My logic behind finding modulo 101 of the passcode was to ensure that the number was not larger than a 3 digit number. Technically, it could have been mod any 3 digit number (for instance 999), to keep the passcode 3 digits.

The function for getting the factorial of the date is below:

Please note that the function had to be type “long”. Originally, making it into an integer caused a bunch of strange errors and ultimately resulted in a negative number output. After a ton of troubleshooting, I realized that this issue was caused because the factorial number was too big to fit into the int data type.

In order to ensure that the password is always 3 digits, I first created a default keycode 000. When getting the factorial value, we replace the digits with the appropriate new keycode.

For certain entries, such as 1 or 4, the keycode would end up being 100, since the factorial of 1 is just 1, or 240, since the factorial of 4 is 24.

In addition, the DS3231 tells time and keeps the time correct once you set it the first time in the code. This also required the DS3231 library which I found online.

Please see videos below for a quick demo, and the full code on my github.

Ta-da! A dynamic keypad that takes a mathematician who knows the secret to open.