{"id":85,"date":"2011-01-05T23:31:28","date_gmt":"2011-01-05T23:31:28","guid":{"rendered":"http:\/\/paulsarduino.co.uk\/?page_id=85"},"modified":"2011-01-05T23:32:32","modified_gmt":"2011-01-05T23:32:32","slug":"analogue-clock","status":"publish","type":"page","link":"https:\/\/paulsarduino.co.uk\/?page_id=85","title":{"rendered":"Analogue Clock"},"content":{"rendered":"<pre>\r\n<pre>#include &lt;TimerOne.h&gt;<\/pre>\n<pre>\/**<\/pre>\n<pre> Analog Clock<\/pre>\n<pre> Paul Cox Dec 2010<\/pre>\n<pre>*\/<\/pre>\n<pre>#define\u00a0\u00a0\u00a0 PI\u00a0\u00a0\u00a0\u00a0\u00a0 3.141592653589793e-06;<\/pre>\n<pre>byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};<\/pre>\n<pre>byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};<\/pre>\n<pre>byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};<\/pre>\n<pre>byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};<\/pre>\n<pre>volatile byte screenRow = 0;<\/pre>\n<pre>volatile byte screenCol = 0;<\/pre>\n<pre>int iHour = 0;<\/pre>\n<pre>int iMin = 0;<\/pre>\n<pre>int iSec = 0;<\/pre>\n<pre>void setup()<\/pre>\n<pre>{<\/pre>\n<pre>  Timer1.initialize(100);<\/pre>\n<pre>  for (int i = 2; i &lt;= 17; i++)<\/pre>\n<pre>  {<\/pre>\n<pre>     pinMode(i, OUTPUT);<\/pre>\n<pre>  }<\/pre>\n<pre>  Timer1.attachInterrupt(doubleBuffer);<\/pre>\n<pre>  Serial.begin(9600);<\/pre>\n<pre>  resetAnim();<\/pre>\n<pre>}<\/pre>\n<pre>void doubleBuffer()<\/pre>\n<pre>{<\/pre>\n<pre>  digitalWrite(translatePin(rows[screenRow]), LOW);<\/pre>\n<pre>  digitalWrite(translatePin(cols[screenCol]), HIGH);<\/pre>\n<pre>  screenCol++;<\/pre>\n<pre>  if (screenCol &gt;= 8)<\/pre>\n<pre>  {<\/pre>\n<pre>     screenCol = 0;<\/pre>\n<pre>     screenRow++;<\/pre>\n<pre>     if (screenRow &gt;= 8)<\/pre>\n<pre>     {<\/pre>\n<pre>       screenRow = 0;<\/pre>\n<pre>     }<\/pre>\n<pre>   }<\/pre>\n<pre>   if((screen[screenRow] &gt;&gt; screenCol) &amp; B1 == B1)<\/pre>\n<pre>   {<\/pre>\n<pre>     digitalWrite(translatePin(rows[screenRow]), HIGH);<\/pre>\n<pre>     digitalWrite(translatePin(cols[screenCol]), LOW);<\/pre>\n<pre>   }<\/pre>\n<pre>   else<\/pre>\n<pre>   {<\/pre>\n<pre>     digitalWrite(translatePin(rows[screenRow]), LOW);<\/pre>\n<pre>     digitalWrite(translatePin(cols[screenCol]), HIGH);<\/pre>\n<pre>   }<\/pre>\n<pre>}<\/pre>\n<pre>byte translatePin(byte original)<\/pre>\n<pre>{<\/pre>\n<pre>  return pins[original - 1];<\/pre>\n<pre>}<\/pre>\n<pre>void allOFF()<\/pre>\n<pre>{<\/pre>\n<pre>  for (int i = 0; i &lt; 8; i++)<\/pre>\n<pre>  {<\/pre>\n<pre>     screen[i] = 0;<\/pre>\n<pre>  }<\/pre>\n<pre>}<\/pre>\n<pre>void on(byte row, byte column)<\/pre>\n<pre>{<\/pre>\n<pre>  screen[column-1] |= (B1 &lt;&lt; (row - 1));<\/pre>\n<pre>}<\/pre>\n<pre>void off(byte row, byte column)<\/pre>\n<pre>{<\/pre>\n<pre>  screen[column-1] &amp;= ~(B1 &lt;&lt; (row - 1));<\/pre>\n<pre>}<\/pre>\n<pre>void resetAnim()<\/pre>\n<pre>{<\/pre>\n<pre>  for (int i = 0; i &lt; 8; i++)<\/pre>\n<pre>  {<\/pre>\n<pre>     screen[i] = B11111111;<\/pre>\n<pre>     delay(25);<\/pre>\n<pre>  }<\/pre>\n<pre>  for (int i = 0; i &lt; 8; i++)<\/pre>\n<pre>  {<\/pre>\n<pre>     screen[i] = B00000000;<\/pre>\n<pre>     delay(25);<\/pre>\n<pre>  }<\/pre>\n<pre>}<\/pre>\n<pre>void loop()<\/pre>\n<pre>{<\/pre>\n<pre>  drawClock();<\/pre>\n<pre>  iSec++;<\/pre>\n<pre>  if (iSec == 60)<\/pre>\n<pre>  {<\/pre>\n<pre>    iSec = 1;<\/pre>\n<pre>    iMin++;<\/pre>\n<pre>    if (iMin == 60)<\/pre>\n<pre>    {<\/pre>\n<pre>       iMin = 0;<\/pre>\n<pre>       iHour++;<\/pre>\n<pre>       if (iHour == 12)<\/pre>\n<pre>       {<\/pre>\n<pre>          iHour = 0;<\/pre>\n<pre>       }<\/pre>\n<pre>    }<\/pre>\n<pre>  }<\/pre>\n<pre>  delay(10);<\/pre>\n<pre>}<\/pre>\n<pre>void drawClock()<\/pre>\n<pre>{<\/pre>\n<pre>  allOFF();<\/pre>\n<pre>  setHand(iHour,12,3);<\/pre>\n<pre>  setHand(iMin,60,4);<\/pre>\n<pre>  setHand(iSec,60,5);<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ work out the pixel for a hand - val is out of a possible max val<\/pre>\n<pre>\/\/ radius is distance from the centre<\/pre>\n<pre>void setHand(int iVal, int iMax, int iRadius)<\/pre>\n<pre>{<\/pre>\n<pre>  double\u00a0 dAngle = (iVal * 2 * PI) \/ iMax;<\/pre>\n<pre>  double\u00a0 dPosX = 4.5 + (iRadius * cos(dAngle));<\/pre>\n<pre>  double\u00a0 dPosY = 4.5 + (iRadius * sin(dAngle));<\/pre>\n<pre>  drawLine(5,5,constrain(round(dPosX),1,8),constrain(round(dPosY),1,8));<\/pre>\n<pre>}<\/pre>\n<pre>void drawLine(int x0, int y0, int x1, int y1)<\/pre>\n<pre>{<\/pre>\n<pre>  int\u00a0\u00a0\u00a0\u00a0\u00a0 iTemp;<\/pre>\n<pre>  boolean\u00a0 bSteep = abs(y1 - y0) &gt; abs(x1 - x0);<\/pre>\n<pre>  if (bSteep)<\/pre>\n<pre>  {<\/pre>\n<pre>     iTemp = x0; x0 = y0; y0 = iTemp;\u00a0\u00a0\u00a0 \/\/ swap x0,y0<\/pre>\n<pre>     iTemp = x1; x1 = y1; y1 = iTemp;\u00a0\u00a0\u00a0 \/\/ swap x1,y1<\/pre>\n<pre>  }<\/pre>\n<pre>  if (x0 &gt; x1)<\/pre>\n<pre>  {<\/pre>\n<pre>     iTemp = x0; x0 = x1; x1 = iTemp;\u00a0\u00a0\u00a0 \/\/ swap x0,x1<\/pre>\n<pre>     iTemp = y1; y1 = y0; y0 = iTemp;\u00a0\u00a0\u00a0 \/\/ swap y0,y1<\/pre>\n<pre>  }<\/pre>\n<pre>  int deltax = x1 - x0;<\/pre>\n<pre>  int deltay = abs(y1 - y0);<\/pre>\n<pre>  int error = deltax \/ 2;<\/pre>\n<pre>  int ystep = ((y0 &lt; y1) ? 1 : -1);<\/pre>\n<pre>  int y = y0;<\/pre>\n<pre>  int x = x0;<\/pre>\n<pre> \u00a0while(x &lt;= x1)<\/pre>\n<pre>  {\r\n    if (bSteep)\r\n    {\r\n       on(y,x);\r\n    }\r\n    else\r\n    {\r\n       on(x,y);\r\n    }\r\n    error = error - deltay;\r\n    if (error &lt; 0)\r\n    {\r\n       y = y + ystep;\r\n       error = error + deltax;\r\n    }\r\n    x++;\r\n  }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;TimerOne.h&gt; \/** Analog Clock Paul Cox Dec 2010 *\/ #define\u00a0\u00a0\u00a0 PI\u00a0\u00a0\u00a0\u00a0\u00a0 3.141592653589793e-06; byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5}; byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16}; byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6}; byte [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-85","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=85"}],"version-history":[{"count":3,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/85\/revisions"}],"predecessor-version":[{"id":88,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/85\/revisions\/88"}],"up":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}