{"id":20,"date":"2013-06-26T13:25:00","date_gmt":"2013-06-26T12:25:00","guid":{"rendered":"https:\/\/blog.hslracing.com\/3dprinters\/2013\/06\/26\/binary-clock\/"},"modified":"2023-08-18T12:10:13","modified_gmt":"2023-08-18T11:10:13","slug":"binary-clock","status":"publish","type":"post","link":"https:\/\/blog.hslracing.com\/electronics\/2013\/06\/binary-clock.html","title":{"rendered":"Binary Clock"},"content":{"rendered":"<p>For a while now I have wanted to build a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Binary_clock\">binary clock<\/a>, simply because they are cool, but not wanted to pay the price of some of the shop bought items.<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/led-binclock.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-120 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/led-binclock-291x300.jpg\" alt=\"\" width=\"291\" height=\"300\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/led-binclock-291x300.jpg 291w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/led-binclock.jpg 400w\" sizes=\"auto, (max-width: 291px) 100vw, 291px\" \/><\/a><\/div>\n<p>I decided that I would not use the classic <a href=\"http:\/\/en.wikipedia.org\/wiki\/Binary_clock\">binary coded decimal<\/a>, but instead use <a href=\"http:\/\/en.wikipedia.org\/wiki\/Binary_clock\">binary coded sexagesimal<\/a>, as it makes use of fewer LEDs and makes it even more difficult to read for those not used to binary.<\/p>\n<p>I also decided I wanted to make use of <a href=\"http:\/\/en.wikipedia.org\/wiki\/Charlieplexing\">charlieplexing<\/a>\u00a0so as to make best use of the pins available on a given microcontroller.<\/p>\n<p>First I mocked up a suitable circuit on a breadboard using an ATMega168 and half a dozen LEDs and was trying out the <a href=\"http:\/\/playground.arduino.cc\/code\/charlieplex\">Arduino charlieplex library<\/a>, the coding looked to be simple enough, I could make it compile, but could not actually make it light any of the LEDs.<\/p>\n<p>I eventually gave up with this library and went with direct control of the pins with the\u00a0<a href=\"http:\/\/arduino.cc\/en\/Reference\/pinMode\">pinMode()<\/a>\u00a0and <a href=\"http:\/\/arduino.cc\/en\/Reference\/DigitalWrite\">digitalWrite()<\/a> functions.<\/p>\n<p>I was originally going to use a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Real-time_clock\">real time clock<\/a>\u00a0<a href=\"http:\/\/datasheets.maximintegrated.com\/en\/ds\/DS1307.pdf\">DS1037<\/a> chip connected via <a href=\"http:\/\/en.wikipedia.org\/wiki\/I%C2%B2C\">I2C<\/a>, but then read about using the <a href=\"http:\/\/arduino.cc\/en\/Reference\/Tone\">tone()<\/a>\u00a0function and the liked possibility of using that as an Interrupt Service Routine (ISR) trigger.<\/p>\n<p>I played around with the code and eventually managed to cobble something together that seemed to work, it has the option of providing serial output when in debug mode &#8211; this is so I could check that the maths\/shift parts were all doing what they were supposed to, that code can all be removed once I confirm it all works correctly and I re-compile it for an ATTiny44.<\/p>\n<p>I only have enough space on my breadboard, without giving myself serious headaches, to wire up the 6 seconds LEDs via 3 inputs, but if that works then the theory is sound and it can be expanded out for all 15 LEDs on 5 inputs.<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-12.15.16.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-122 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-12.15.16-300x217.png\" alt=\"\" width=\"300\" height=\"217\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-12.15.16-300x217.png 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-12.15.16-768x557.png 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-12.15.16.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<p>The schematic shows how the 15<span style=\"font-family: Verdana, Verdana, Geneva, sans-serif;\"><span style=\"font-size: 12px; line-height: 17px;\"><b>\u00a0<\/b><\/span><\/span><a href=\"http:\/\/en.wikipedia.org\/wiki\/Charlieplexing\">charlieplexed<\/a>\u00a0LEDs connect to the 5 pins of the ATTiny44.<br \/>\nI have also drawn up a simple perf board layout for the clock using <a href=\"https:\/\/code.google.com\/p\/diy-layout-creator\/\">DIY Layout Creator<\/a>, which is a little limited with regards components, but is much easier to master than say <a href=\"http:\/\/www.cadsoftusa.com\/\">Eagle<\/a>, and for the quantity\/density of LEDs I am using, much clearer than <a href=\"http:\/\/fritzing.org\/\">Fritzing<\/a>.<\/p>\n<div style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-11.26.40.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-124 size-medium\" src=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-11.26.40-300x230.png\" alt=\"\" width=\"300\" height=\"230\" srcset=\"https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-11.26.40-300x230.png 300w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-11.26.40-768x588.png 768w, https:\/\/blog.hslracing.com\/wp-content\/uploads\/sites\/2\/2013\/06\/Screen-shot-2013-06-26-at-11.26.40.png 827w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/div>\n<div style=\"clear: both; text-align: center;\"><\/div>\n<p>The code below works for the seconds, with an ATMega168 on my breadboard. The &#8220;clock&#8221; array needs expanding to include the LEDs for hours and minutes, at which point the &#8220;showtime&#8221; lines for minutes and hours can be uncommented.<\/p>\n<p>There are 2 buttons in the design and I have chosen to use the <a href=\"http:\/\/playground.arduino.cc\/code\/bounce\">Arduino Bounce Library<\/a> to <a href=\"http:\/\/en.wikipedia.org\/wiki\/Debounce#Contact_bounce\">debounce<\/a> the button presses, the buttons are intended to be used in the same way as on simple digital watches &#8211; both buttons to enter\/leave setup mode, then one cycles through hours, minutes, seconds, the other increments the current value.<\/p>\n<p><span style=\"font-family: Courier New, Courier, monospace;\">#include &lt;Bounce.h&gt; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ include debounce functions<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">#define TONEPIN 4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ digital pin 4 (pd4) used as tone output<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">#define BUTTON1 5 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ digital pin 5 (pd5) used to set clock<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">#define BUTTON2 6 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ digital pin 6 (pd6) used to set clock<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\/\/#define DEBUG 1 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ set debug mode<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">\/\/ Initialise variables<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int DELAY_TIME = 1000;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int masterClock = 0;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int seconds = 0;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int minutes = 0;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int hours = 0;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">int hms = 0;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw1 = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw2 = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean both = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw1on = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw2on = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw1off = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">boolean sw2off = false;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">const int nPins = 3;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">const int pins[] = {9, 10, 11};<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">const int clock[6][2] = { {10,11}, {11,10}, {9, 10}, {10, 9}, {9, 11}, {11, 9} };<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">Bounce button1 = Bounce(BUTTON1, 5); \u00a0\/\/ set 5ms debounce for BUTTON1<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">Bounce button2 = Bounce(BUTTON2, 5); \u00a0\/\/ set 5ms debounce for BUTTON2<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">void setup() {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.begin(9600);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 attachInterrupt(1, tick, RISING); \u00a0 \/\/ call ISR on rising input to INT1 (digital pin 3)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(TONEPIN, OUTPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ setup tonepin for output<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 tone(TONEPIN, 8000); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ generate 8000Hz tone on digital pin 4 to act as clock input for ISR<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(BUTTON1, INPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ setup button1 for input<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(BUTTON2, INPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ setup button2 for input<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">\/\/ Interrupt Service Routine to generate 1 second &#8220;tick&#8221;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">void tick() {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 masterClock++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ increment clock counter<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (masterClock == 16000) { \u00a0 \u00a0 \u00a0 \u00a0 \/\/ 8000 reached<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 seconds++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ increment seconds<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 masterClock = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset masterClock<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">\/\/ Turn on an LED<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">void turnon(int led) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int Vcc = clock[led][0]; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ set positive pin<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int Gnd = clock[led][1]; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ set ground pin<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(Vcc, OUTPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ set positive pin for OUTPUT<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 pinMode(Gnd, OUTPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ set ground pin for OUTPUT<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 digitalWrite(Vcc, HIGH); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Turn on LED<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 digitalWrite(Gnd, LOW); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Turn off ground pin<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">\/\/ Turn off all LEDs<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">void alloff() {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 for (int i = 0; i &lt; nPins; i++) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 digitalWrite(pins[i], LOW); \u00a0 \u00a0 \u00a0 \/\/ turn off all LEDs<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 pinMode(pins[i], INPUT); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ set all pins to INPUT<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">void showtime(int Value, int Width, int Offset) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 int mask;<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 for (int i = 0; i &lt; Width; i++) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 mask = 1 &lt;&lt; i; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ shift bit mask by current position<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (HIGH &amp;&amp; (Value &amp; mask)) { \u00a0 \/\/ check if LED should be lit<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 turnon(Offset + i); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ turn on the LED<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 alloff(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ turn off all LEDs<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">#ifdef DEBUG \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ debug output<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(&#8220;Mask: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(mask, BIN);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(&#8221; On or Off: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(HIGH &amp;&amp; (Value &amp; mask), BIN);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(&#8221; LED: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.print(Offset + i, DEC);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 Serial.println(&#8220;&#8221;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">#endif<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">void loop() {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ Check if buttons have been pressed \u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 button1.update(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ update button1<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 button2.update(); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ update button2<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw1on = button1.risingEdge(); \u00a0 \u00a0 \u00a0 \u00a0\/\/ button 1 pressed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw1off = button1.fallingEdge(); \u00a0 \u00a0 \u00a0\/\/ button 2 pressed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw2on = button2.risingEdge(); \u00a0 \u00a0 \u00a0 \u00a0\/\/ button 1 released<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 sw2off = button2.fallingEdge(); \u00a0 \u00a0 \u00a0\/\/ button 2 released<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ toggle stup option: hours(1), minutes(2) or seconds(3)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw1on) sw1 = true; \/\/ button1 pressed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw1off &amp;&amp; sw1) { \u00a0 \/\/ button1 released<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 sw1 = false; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ reset button 1 state<\/span><br \/>\n<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><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms = 4) hms = 1; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset back to hours if hms goes beyond seconds<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ set hours(1), minutes(2) or seconds(3)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw2on) sw2=true; \u00a0 \/\/ button2 pressed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if ((hms != 0) &amp;&amp; sw2off &amp;&amp; sw2) { \u00a0 \/\/ button2 released<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms = 1) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 hours++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment hours<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (hours = 60) hours = 0; \u00a0 \u00a0 \u00a0 \/\/ reset houts to 0 if we reach 60<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms = 2) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 minutes++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment minutes<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (minutes = 60) minutes = 0; \u00a0 \/\/ reset minutes to 0 if we reach 60<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms = 3) seconds = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ set seconds to 0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0\u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ toggle setup states if both buttons are pressed and then released together<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (sw1on &amp;&amp; sw2on) both = true; \u00a0 \u00a0 \/\/ both buttons pressed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (sw1off &amp;&amp; sw2off &amp;&amp; both) { \u00a0 \u00a0 \u00a0\/\/ both buttons released<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 both = false; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ reset dual button status<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (hms == 0) hms=1; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ toggle hours\/mins\/sec to hours if entering setup mode<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 else hms = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ toggle hours\/minutes\/secs to off if leaving setup mode<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/ Adjust the time based on seconds passed<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 if (seconds == 60) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 minutes++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment minutes when seconds resch 60<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 if (minutes == 60) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 hours++; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ increment hours when minutes reach 60<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 if (hours == 24) {<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 \u00a0 hours = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ reset hours<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 \u00a0 minutes = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ reset minutes<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \u00a0 seconds = 0; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ reset seconds<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 }<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0\u00a0<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 showtime(seconds, 6, 0); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Display seconds (LEDs 0-5)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/showtime(minutes, 6, 6); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Display minutes (LEDs 6-11)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 \/\/showtime(hours, 5, 12); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Display hours (LEDs 12-16)<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\"><br \/>\n<\/span><span style=\"font-family: Courier New, Courier, monospace;\">#ifdef DEBUG \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Debug output<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(&#8220;Hours: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(hours, DEC);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(&#8221; Minutes: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(minutes, DEC);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(&#8221; Seconds: &#8220;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.print(seconds, DEC);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">\u00a0 Serial.println(&#8220;&#8221;);<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">#endif<\/span><br \/>\n<span style=\"font-family: Courier New, Courier, monospace;\">}<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>For a while now I have wanted to build a binary clock, simply because they are cool, but not wanted to pay the price of some of the shop bought items. I decided that I would not use the classic binary coded decimal, but instead use binary coded sexagesimal, as it makes use of fewer&hellip;<\/p>\n","protected":false},"author":2,"featured_media":121,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2],"class_list":["post-20","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\/20","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=20"}],"version-history":[{"count":5,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/20\/revisions"}],"predecessor-version":[{"id":166,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/20\/revisions\/166"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/media\/121"}],"wp:attachment":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/media?parent=20"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/categories?post=20"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/tags?post=20"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}