I’ve decided to make a Digital Alarm Clock for my diploma final year project. Before I start this post, here’s a video about it
The Hardware
- Atmel ATmega328P Microcontroller with 32kB Program Memory and running at 16MHz
- Philips PCF8574A IO Port Expander
- Maxim DS1307 Real-Time Clock
- 16×2 HD44780 Monochrome LCD with Blue Backlight
- UM66 Melody IC
- 4×3 Numerical Keypad
- LM7805 Voltage Regulator
Features
- Display Time in 12-Hour AM/PM Format
- Display Date in dd/mm/yyyy Format
- Display Day
- Set Alarm Time
- Set Date
- Set Time
- Menu Based Navigation System
- Anti-Sleepiness Alarm Function
- Auto Generated Day Function
The Making of the Digital Alarm Clock
This Digital Alarm Clock project started its’ life on a breadboard, and with a brand new ATmega328P MCU bought from Cytron.
Together with the Microcontroller, I bought the UC00B USB to Serial adapter to program the MCU using the Arduino IDE.
To make it work on the Arduino platform, the microcontroller must have the appropriate bootloader. There are many ways to burn the bootloader but I settled on the ArduinoISP method (using my Arduino Uno R3).
I made a video on the bootloader burning process.
After successfully burning the bootloader, I can now use the Cytron UC00B USB to Serial adapter to upload code into the MCU.
With the basic Arduino circuit done, I can start the programming and also assembling other hardware components.
To read more on how to make your own Arduino on a breadboard, read this post
Next, I made some special push buttons so that the user can identify its’ function more easily.
Here’s how I assembled these push buttons.
I ended up using 4 breadboards to completely construct the prototype circuit.
Writing the Code
First and foremost, I should mention and give credit to a few libraries that I’ve had to use in my code.
- Wire by Arduino (Source) : Establish I2C connection to/from the PCF8574A and DS1307
- LiquidCrystal by Arduino (Source) : Interface with the HD44780 LCD
- I2CKeypad by Angel Sancho (Source) : Interface with the 4×3 Keypad through the PCF8574A
- TrueRandom by Peter Knight (Source) : Generate true random numbers for the random math question
Other than the libraries mention above, the code is solely written by yours truly.
It is 1,029 lines long, and takes up around 16kB of program memory. It took me close to 50 hours to come up with this.
My initial idea of using an ATmega16 to cut cost was scrapped because this code and the bootloader takes up around 18kB of program memory, which is more than the 16kB capacity of the ATmega16.
Designing the Schematic and PCB in Eagle 6.2.0
I chose to use the Eagle software to design the schematic and PCB because the library is huge and it’s simple to use (IMHO).
This is the final revision of the schematic :
Initially, I plan to make a dual layer PCB but because of time constraint, I had to settle for a single layer PCB.
This is the final revision of my PCB.
I’ll admit that I used autoroute, and it’s not that smart, so I had to give it a bigger workspace to work on. Thus I’m using a 25cm by 15cm PCB.
Printed the PCB layout on a transparency sheet to mask the PCB from UV exposure.
I’ve wrote a post before this on how to make your own PCB. You can read them here
The end result.
Tour of the Board
At the centre of the board is where all the magic happens, ATmega328P MCU, DS1307 Real-Time Clock and the PCF8574A IO Port Expander.
There is also a backup battery for the DS1307 Real-Time Clock IC. Even if the power runs out, the ‘clock’ will still continue to tick.
The 6 Buttons. Menu, Back, Forward, Cancel, OK and Alarm ON/OFF.
At the bottom left is the 4×3 Numerical Keypad for user input. It is used for setting the time, date and also answering the math question.
At the top left are the buzzer, the UM66 Melody IC, and a 10k potentiometer to adjust the LCD Contrast.
Lastly, at the left hand side of the board is the programmer port, where I can plug in the UC00B USB to Serial adapter to upload a new code into the ATmega328P.
Features
Menu-Based Navigation System
The user can press the Back and Forward button to scroll through the Menu. To select the desired function, press Enter.
Anti-Sleepiness Alarm Function
To turn off the Alarm, the user has to answer a simple math question. The alarm will not turn off until a correct answer has been entered. The question is generated randomly everytime the alarm rings.
Auto Generated Day Function
To set the date, the user doesn’t have to enter the Day. The code has an algorithm that will determine the correct Day that corresponds to the date entered.
Project Costing
Below is a list of all the components that are used in this project and also their cost. So much money!
The total cost shown below does not even reflect the true amount of money I spent, there are things like troubleshooting cost, buying new components to try out, soldering cost, flux, damaged components, etc.
Looking aside the cost, I’m thankful that I’m able to complete this project and I did learn alot from it.
I hope you’ve enjoyed reading this post as much as I’ve did during the making of this project.
Thank you



































great project mine is in developement. Working on alarm system to send gsm. all things working, just added clock, but could use your code to to able to set clock from keypad instead of serial.
can you share your code yet.
Hi.
I don’t have access to my computer now, I’ll post a section of my code later that uses the keypad to set the time.
Any luck with the code.
Hi Waihung,
Great job in coding this. Working on something similar but with 4×4 keypad. Would you mind sharing your code? like the way you enter the new time with blinking cursor, but have troubles getting that coded.
Thanks in advance
Hi.
Sorry I can’t give you the code because this is my actual college assignment. Hope you understand.
On the other hand, to enable the blinking cursor, just use lcd.blink() and to disable it just use lcd.noBlink().
The position of the blinking cursor can be set by using lcd.setCursor(column, row).
Thanks
No problem, understand.
Would however like a small pointer how you collect the keystrokes. via string, or char??
I collect it as char. Because I didn’t need the hash and asterisk, I can just take the char and minus 48. And the result is saved into int.
According to the ASCII table, the character ’0′ is actually 48 in decimal.
Thanks, was on that route as well and will continue now.
Good luck with your project…
Thanks and good luck with yours too
This is awesome !!! So long time and effort in it !! Good job bro
Thanks
so the true amount you spent is?
Should be > 200 gua.
Buy the programmer also RM20 already.
Buy thinner, the dual layer PCB, broken drill bit, petrol money always go to Jalan Pasar.
Haha.