{"id":18,"date":"2013-10-18T17:31:00","date_gmt":"2013-10-18T16:31:00","guid":{"rendered":"https:\/\/blog.hslracing.com\/3dprinters\/2013\/10\/18\/binary-clock-3\/"},"modified":"2023-08-18T12:21:41","modified_gmt":"2023-08-18T11:21:41","slug":"binary-clock-3","status":"publish","type":"post","link":"https:\/\/blog.hslracing.com\/electronics\/2013\/10\/binary-clock-3.html","title":{"rendered":"Binary Clock 3"},"content":{"rendered":"<p>Well I finally soldered it all up after finalising the board layout and ironing out bugs in the software.<\/p>\n<p>Final Schematic:<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-17.25.01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-99 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-17.25.01-300x218.png\" alt=\"\" width=\"300\" height=\"218\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-17.25.01-300x218.png 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-17.25.01-768x559.png 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-17.25.01.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<p>Final Board Layout:<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-15.22.01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-100 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-15.22.01-300x272.png\" alt=\"\" width=\"300\" height=\"272\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-15.22.01-300x272.png 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/Screen-shot-2013-10-18-at-15.22.01.png 738w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<div>Here are the parts:<\/div>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockParts.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-101 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockParts-300x266.jpg\" alt=\"\" width=\"300\" height=\"266\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockParts-300x266.jpg 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockParts-768x682.jpg 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockParts.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<div style=\"clear: both; text-align: left;\">BOM:<\/div>\n<div style=\"clear: both; text-align: left;\">1 x Perfboard<\/div>\n<div style=\"clear: both; text-align: left;\">1 x <a href=\"https:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CEAQFjAA&amp;url=http%3A%2F%2Fwww.atmel.com%2FImages%2Fdoc8006.pdf&amp;ei=O2BhUqb7JcSW0AX644CADw&amp;usg=AFQjCNHLPIeVGSvAvaxKo6epqNxfpUNFlA&amp;sig2=EVMdtyDe44DbDVEWIt04yQ&amp;bvm=bv.54176721,d.d2k\">ATtiny44<\/a> MCU<\/div>\n<div style=\"clear: both; text-align: left;\">17 x LEDs<\/div>\n<div style=\"clear: both; text-align: left;\">2 x switches<\/div>\n<div style=\"clear: both; text-align: left;\">2 x 10K resistors<\/div>\n<div>2 x 7 pin female headers<\/div>\n<div>2 x 12 pin female headers<\/div>\n<div>1 x 10 pin female header<\/div>\n<div>1 x 3 pin connector<\/div>\n<div><\/div>\n<div>Total cost is about \u00a32.50 (if you buy the items in bulk just to have them available &#8211; it would probably cost a bit more if just buying the individual items as a one off for this project).<\/div>\n<div><\/div>\n<div>\n<p>I added 3 additional strips of machined female header pins for the LEDs, (not shown in the above picture, so I could play about with what LEDs are used, rather than being stuck with what is soldered in place.<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockFront.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-102 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockFront-300x283.jpg\" alt=\"\" width=\"300\" height=\"283\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockFront-300x283.jpg 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockFront-768x724.jpg 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockFront.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<\/div>\n<p>Here is the rear of the board showing the wiring, solid wires are legs from cut off LEDs soldered in other projects, the blue wire is Kynar 30awg <a href=\"http:\/\/en.wikipedia.org\/wiki\/Wire_wrap\">wrapping wire<\/a>.<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockRear.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-103 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockRear-300x255.jpg\" alt=\"\" width=\"300\" height=\"255\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockRear-300x255.jpg 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockRear-768x654.jpg 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/BinaryClockRear.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<div>I also had to strip out all of the debug code from the software as it was too big for the <a href=\"https:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CEAQFjAA&amp;url=http%3A%2F%2Fwww.atmel.com%2FImages%2Fdoc8006.pdf&amp;ei=O2BhUqb7JcSW0AX644CADw&amp;usg=AFQjCNHLPIeVGSvAvaxKo6epqNxfpUNFlA&amp;sig2=EVMdtyDe44DbDVEWIt04yQ&amp;bvm=bv.54176721,d.d2k\">ATtiny44<\/a>, it would be fine on an <a href=\"https:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CEAQFjAA&amp;url=http%3A%2F%2Fwww.atmel.com%2FImages%2Fdoc8006.pdf&amp;ei=O2BhUqb7JcSW0AX644CADw&amp;usg=AFQjCNHLPIeVGSvAvaxKo6epqNxfpUNFlA&amp;sig2=EVMdtyDe44DbDVEWIt04yQ&amp;bvm=bv.54176721,d.d2k\">ATtiny84<\/a>, I still wired up the TX connection should I decide to use an 84 and still want to see debug output via TinyDebugSerial.<\/div>\n<div><\/div>\n<div>I also had to renumber the output pins based on how <a href=\"http:\/\/www.arduino.cc\/\">Arduino<\/a> numbers them for an <a href=\"https:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CEAQFjAA&amp;url=http%3A%2F%2Fwww.atmel.com%2FImages%2Fdoc8006.pdf&amp;ei=O2BhUqb7JcSW0AX644CADw&amp;usg=AFQjCNHLPIeVGSvAvaxKo6epqNxfpUNFlA&amp;sig2=EVMdtyDe44DbDVEWIt04yQ&amp;bvm=bv.54176721,d.d2k\">ATtiny44<\/a>:<\/div>\n<div style=\"clear: both; text-align: center;\">\u00a0<a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/ATtiny84_arduino-tiny_pins.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-173 size-full\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/10\/ATtiny84_arduino-tiny_pins.png\" alt=\"\" width=\"300\" height=\"202\" \/><\/a><\/div>\n<div>Final version of the code (all of the previous debug messages have been removed):<\/div>\n<div><\/div>\n<div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">#include &lt;Bounce.h&gt;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">#define TONEPIN 3 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ digital pin 3 (pa7) used as tone output<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">#define BUTTON1 1 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ digital pin 0 (pb1) used to set clock<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">#define BUTTON2 4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ digital pin 6 (pa6) used to set clock<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int masterClock = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int lastsec = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int seconds = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int minutes = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int hours = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int hms = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int sw1 = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int sw2 = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">int both = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">boolean sw1on = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">boolean sw2on = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">boolean bothon = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">const int nPins = 5;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">const int pins[] = {6, 7, 8, 9, 10};<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">const int clock[17][2] = { {6, 7}, {6, 8}, {7, 8}, {8, 9}, {8, 10}, {9, 10}, \u00a0 \u00a0\/\/ Seconds LEDs<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0{7, 6}, {8, 6}, {8, 7}, {9, 8}, {10, 8}, {10, 9}, \u00a0 \u00a0\/\/ Minutes LEDs<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0{9, 6}, {6, 9}, {6, 10}, {10, 7}, {7, 10} }; \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Hours LEDs<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">Bounce button1 = Bounce(BUTTON1, 5); \u00a0\/\/ set 5ms debounce for BUTTON1<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">Bounce button2 = Bounce(BUTTON2, 5); \u00a0\/\/ set 5ms debounce for BUTTON2<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void setup() {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 attachInterrupt(0, tick, RISING); \/\/ call ISR on rising input to INT0 (digital pin 2)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(TONEPIN, OUTPUT); \u00a0\/\/ setup tonepin for output<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 tone(TONEPIN, 8000); \u00a0 \u00a0 \u00a0 \/\/ generate 8000Hz tone on digital pin 4 to act as clock input for ISR<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(BUTTON1, INPUT); \u00a0 \/\/ setup button1 for input<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(BUTTON2, INPUT); \u00a0 \/\/ setup button2 for input<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void tick() { \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Interrupt Service Routine to generate 1 second &#8220;tick&#8221;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 masterClock++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment clock counter<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (masterClock == 8000) { \/\/ 8000 reached (8MHz) 16000 (16MHz)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 seconds++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment seconds<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 masterClock = 0; \u00a0 \u00a0 \u00a0 \u00a0 \/\/ reset masterClock<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void turnon(int led) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int Vcc = clock[led][0];<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int Gnd = clock[led][1];<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(Vcc, OUTPUT);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(Gnd, OUTPUT);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 digitalWrite(Vcc, HIGH);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 digitalWrite(Gnd, LOW);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void alloff() {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 for (int i = 0; i &lt; nPins; i++) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 digitalWrite(pins[i], LOW);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 pinMode(pins[i], INPUT);<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void showtime(int Value, int Width, int Offset) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int mask;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 for (int i = 0; i &lt; Width; i++) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 mask = 1 &lt;&lt; i; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ shift bit mask by current position<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (HIGH &amp;&amp; (Value &amp; mask)) { \u00a0 \u00a0 \u00a0\/\/ check if LED should be lit<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 turnon(Offset + i); \u00a0 \/\/ turn on the LED<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 alloff();<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">void loop() {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ Check if buttons have been pressed \u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 button1.update(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ update button1<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 button2.update(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ update button2<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw1 = button1.read(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ button 1 state<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw2 = button2.read(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ button 2 state<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 both = sw1 &amp;&amp; sw2; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ both state<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (sw1 == 0) sw1on = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (sw2 == 0) sw2on = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (both == 0) bothon = false;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ toggle setup states if both buttons are pressed and then released together<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (both &amp;&amp; !bothon) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 0) hms=1; \u00a0 \u00a0 \u00a0 \/\/ toggle hours\/minutes\/seconds to hours if entering setup mode<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 else hms = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ toggle hours\/minutes\/seconds to off if leaving setup mode<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 bothon = true; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ set flag for both buttons on<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ set hours(1), minutes(2), or seconds(3)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw1 &amp;&amp; !sw1on &amp;&amp; !bothon) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 hms++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ toggle hours\/minutes\/seconds<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 4) hms = 1; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset back to hours if hms goes beyond seconds<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw1on = true;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw2 &amp;&amp; !sw2on &amp;&amp; !bothon) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 1) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 hours++;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (hours == 24) hours = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 2) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 minutes++;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (minutes == 60) minutes = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 3) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 seconds = 0;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 sw2on = true;<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ Adjust the time based on seconds passed<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (seconds == 60) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 minutes++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ increment minutes when seconds reach 60<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (minutes == 60) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 hours++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ increment hours when minutes reach 60<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (hours == 24) {<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 hours = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset hours when hours reaches 24<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 minutes = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset minutes when minutes reaches 60<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 seconds = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset seconds when seconds reaches 60<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 showtime(seconds, 6, 0); \u00a0 \/\/ Display seconds (LEDs 0-5)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 showtime(minutes, 6, 6); \u00a0 \/\/ Display minutes (LEDs 6-11)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 showtime(hours, 5, 12); \u00a0 \u00a0\/\/ Display hours (LEDs 12-16)<\/span><\/div>\n<div><span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Well I finally soldered it all up after finalising the board layout and ironing out bugs in the software. Final Schematic: Final Board Layout: Here are the parts: BOM: 1 x Perfboard 1 x ATtiny44 MCU 17 x LEDs 2 x switches 2 x 10K resistors 2 x 7 pin female headers 2 x 12&hellip;<\/p>\n","protected":false},"author":2,"featured_media":99,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2],"class_list":["post-18","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-binary-clock"],"_links":{"self":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":5,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/18\/revisions"}],"predecessor-version":[{"id":174,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/18\/revisions\/174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/media\/99"}],"wp:attachment":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/media?parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/categories?post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/tags?post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}