I was wandering the internet looking for a good arduino tutorial on how to build a binary clock with seconds, but I could not find one. So now I am writing this for you to have a binary clock with seconds, minutes, and hours.
What I did:
-Because controlling 20 LEDs individually for this cube would be messy, I multiplexed.
-I used an ATtiny84 and a SN74HC164N to control the clock. This makes the clock cheaper and smaller.
-I built it all on two PCB boards and affixed a stand, power plug, and buttons.
Step 1: Parts List
Somethings you have to have to make a binary clock, others are optional and I will try to give you ideas to use what you have.
-20 LEDs, any color I used 5mm I wouldn't recommend 10 unless you have the space
-6 PN2222 transistor, or any that you have that are simmilar
-2 push buttons, any flavor of interface you want to try would work buttons are easy
-2 1K resistors, for the buttons
-10 resistors for LEDs, i used 470ohm you could use as low 100ohm but they would be very bright at night
-various wire for connections
-I used ATtiny84 and SN74HC164, I choose it because it was small, cheep, and easy to use with this option you will use the shift register to control one side of the LED matrix
-ATmega, any of this series would work as long as you have a programmer and the space
-Arduino Board, I don't recommend spending the money on this option and it also takes up a lot of space
-ATtiny with only 6 I/O if you use two shift registers
-The library is written for arduino and feels free to use anything else that you would re-code
*Use a DIP socket for whichever controller you choose to use.
-I used USB charger and cable to power it
-any 5V power supply would work, just make sure it works with your controller
-Some type of board is needed. I used two small boards, 4cm x 6cm and 3cm x 7cm. I have seen cardboard used for the LEDs but i do not recommend cardboard for the controller.
-I used polymorph, it's cool stuff to have around
-origami would work
Step 2: My Multiplexing
I use the SN74HC164 shift register and PN2222 transistor to shift on each column of the LED matrix to ground faster than the eye can see. When the correct column is grounded then the ATtiny then outputs HIGH to the LED that represents the time.
When a the transistor emitter is connected to ground the transistor will provide ground, from collector, if the base is connected to Vcc.
Step 3: Wiring
Wiring will depend on your design choices but here are the connections you need to make.
1. Solder your LED matrix as in the diagram, note it is drawn from the back make sure the cathode and anodes are corrected to ground and Vcc, respectively
2. Connect the LEDs ground to the emitter of the transistor
3. Solder the push buttons and DIP sockets on the board
4. Connect power and ground to all the right parts
5. Connect the 1K resistor to ground and the resistor, connect Vcc to the push button, and connect an input of the ATtiny to the push button
6. Solder the 470ohm resistors next to the DIP sockets, 6 go to the SN74HC164 and 4 the outputs of the ATtiny
7. Connect the 6 resistors to the base of each transistor, they need to be in order of A-F so they multiplexing works
8. Connect the 4 resistors to each anode layer
9. Connect 2 outputs of the ATtiny to the clock and data of the shift registor
Step 4: Build a Stand
I used polymorph, this is not necessary. Use whatever material you want to support your clock.
Step 5: Programming the ATtiny84
If you have an arduino you also have a free In System Programmer (ISP)
1. Connect the following:
Vcc to pin 1 on ATtiny
Gnd to pin 14 on ATtiny
D10 to pin 4 on ATtiny
D11 to pin 7 on ATtiny
D12 to pin 8 on ATtiny
D13 to pin 9 on ATtiny
2. For the rest follow instructions here
(If that site is down then here is a different instructional on it with the file attached to this step.
Or here as a third backup
The instructions are great and easy to use.
Step 6: The Code
The code is divided into functions to make changes easier.
Step by Step Walk Through:
This sets up all of the pin outs for the ATtiny
assigns pinMode to all pins
I had problems with configuring my binary clock to be the same as my watch so i added a configuration setting, pressing the hour button bypasses this option
shiftOut send the byte of data 0xff, B11111111 in binary, to the shift register this turns on all columns
digitalWrite then lights up one layer
then it waits for the hour button or the minute button; the hour button skips the adjustment process the minute starts the timmer
another layer lights up and begins counting
when you are done with 60 seconds press the HOUR BUTTON, it changed buttons
lastSecond stores when the clock added a second, if it is over the testTime then it adds a second
testTime was configured or bypassed earlier the default is 1000
the if()s evaluate if the minute or hour need to be changed, I added an if() not used if you want your minute button to count down
all of the unit variables sUnit, mUnit, and hUnit are given the value of the ones place for seconds, minutes, and hours
the buttons are then asked if they are on
the function activate() is called, described next
this will turn on all of the LEDs for the current time
*a note about not using a shift register, use the one labeled that - I haven't tested so i hope it works for you
when the clock is LOW data can be written to it and will be shifted when clock is pulled HIGH
doing this while allowing for the layer to be activated
there is a delay so your eyes will see the LED
then all of the layers are turned off before the next layer is loaded
rinse and repeat...
one, two, four, and eight correspond to the value of the LED, in binary, will be turned high or low...
its a lot of numbers that will blink in the way know to be a clock
turns on the layer corresponding to the time value