{"id":5827,"date":"2010-09-19T11:54:24","date_gmt":"2010-09-19T15:54:24","guid":{"rendered":"http:\/\/scruss.com\/blog\/?p=5827"},"modified":"2010-09-19T11:54:24","modified_gmt":"2010-09-19T15:54:24","slug":"much-improved-hsv-colour-cycling-led-on-arduino","status":"publish","type":"post","link":"https:\/\/scruss.com\/blog\/2010\/09\/19\/much-improved-hsv-colour-cycling-led-on-arduino\/","title":{"rendered":"much improved HSV colour cycling LED on Arduino"},"content":{"rendered":"<p>There were some flaws in the post <a href=\"..\/..\/blog\/2010\/09\/12\/hsv-colour-cycling-led-on-arduino\/\">HSV colour cycling LED on Arduino<\/a>. This does much more what I wanted:<\/p>\n<pre><span style=\"color: #7e7e7e;\">\/*<\/span>\r\n<span style=\"color: #7e7e7e;\">HSV\u00c2\u00a0fade\/bounce\u00c2\u00a0for\u00c2\u00a0Arduino\u00c2\u00a0-\u00c2\u00a0Stewart\u00c2\u00a0C.\u00c2\u00a0Russell\u00c2\u00a0-\u00c2\u00a0scruss.com\u00c2\u00a0-\u00c2\u00a02010\/09\/19<\/span>\r\n\r\n<span style=\"color: #7e7e7e;\">Wiring:<\/span>\r\n<span style=\"color: #7e7e7e;\">LED\u00c2\u00a0is\u00c2\u00a0RGB\u00c2\u00a0common\u00c2\u00a0cathode\u00c2\u00a0(SparkFun\u00c2\u00a0sku:\u00c2\u00a0COM-09264\u00c2\u00a0or\u00c2\u00a0equivalent)<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a0\u00c2\u00a09\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0165\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Red\u00c2\u00a0pin<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a010\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0100\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Green\u00c2\u00a0pin<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a011\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0100\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Blue\u00c2\u00a0pin<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0GND\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0common\u00c2\u00a0cathode.<\/span>\r\n<span style=\"color: #7e7e7e;\">*\/<\/span>\r\n\r\n#define\u00c2\u00a0RED\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a09\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ pin for red LED; green on RED+1 pin, blue on RED+2 pin<\/span>\r\n#define\u00c2\u00a0DELAY\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a02\r\n\r\n<span style=\"color: #cc6600;\">long<\/span> rgb[3];\r\n<span style=\"color: #cc6600;\">long<\/span> rgbval, k;\r\n<span style=\"color: #cc6600;\">float<\/span> hsv[3] = {\r\n\u00c2\u00a0\u00c2\u00a00.0,\u00c2\u00a00.5,\u00c2\u00a00.5\r\n};\r\n<span style=\"color: #cc6600;\">float<\/span> hsv_min[3] = {\r\n\u00c2\u00a0\u00c2\u00a00.0,\u00c2\u00a00.0,\u00c2\u00a00.4\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ keep V term greater than 0 for smoothness<\/span>\r\n};\r\n<span style=\"color: #cc6600;\">float<\/span> hsv_max[3] = {\r\n\u00c2\u00a0\u00c2\u00a06.0,\u00c2\u00a01.0,\u00c2\u00a01.0\r\n};\r\n<span style=\"color: #cc6600;\">float<\/span> hsv_delta[3] = {\r\n\u00c2\u00a0\u00c2\u00a00.0005,\u00c2\u00a00.00013,\u00c2\u00a00.00011\r\n};\r\n\r\n<span style=\"color: #7e7e7e;\">\/*<\/span>\r\n<span style=\"color: #7e7e7e;\">chosen\u00c2\u00a0LED\u00c2\u00a0SparkFun\u00c2\u00a0sku:\u00c2\u00a0COM-09264<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0has\u00c2\u00a0Max\u00c2\u00a0Luminosity\u00c2\u00a0(RGB):\u00c2\u00a0(2800,\u00c2\u00a06500,\u00c2\u00a01200)mcd<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0so\u00c2\u00a0we\u00c2\u00a0normalize\u00c2\u00a0them\u00c2\u00a0all\u00c2\u00a0to\u00c2\u00a01200\u00c2\u00a0mcd\u00c2\u00a0-<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0R\u00c2\u00a0\u00c2\u00a01200\/2800\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a00.428571428571429\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0109\/256<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0G\u00c2\u00a0\u00c2\u00a01200\/6500\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a00.184615384615385\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a047\/256<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0B\u00c2\u00a0\u00c2\u00a01200\/1200\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a01.0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0=\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0256\/256<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0*\/<\/span>\r\n<span style=\"color: #cc6600;\">long<\/span> bright[3] = {\r\n\u00c2\u00a0\u00c2\u00a0109,\u00c2\u00a047,\u00c2\u00a0256\r\n};\r\n\r\n<span style=\"color: #cc6600;\">void<\/span> <span style=\"color: #cc6600;\"><strong>setup<\/strong><\/span> () {\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">randomSeed<\/span>(<span style=\"color: #cc6600;\">analogRead<\/span>(4));\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">for<\/span> (k=0; k&lt;3; k++) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">pinMode<\/span>(RED + k, <span style=\"color: #006699;\">OUTPUT<\/span>);\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0rgb[k]=0;\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ start with the LED off<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">analogWrite<\/span>(RED + k, rgb[k] * bright[k]\/256);\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> (k&gt;1 &amp;&amp; <span style=\"color: #cc6600;\">random<\/span>(100) &gt; 50) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ randomly twiddle direction of saturation and value increment on startup<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv_delta[k]\u00c2\u00a0*=\u00c2\u00a0-1.0;\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0}\r\n}\r\n\r\n<span style=\"color: #cc6600;\">void<\/span> <span style=\"color: #cc6600;\"><strong>loop<\/strong><\/span>() {\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">for<\/span> (k=0; k&lt;3; k++) { <span style=\"color: #7e7e7e;\">\/\/ for all three HSV values<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv[k]\u00c2\u00a0+=\u00c2\u00a0hsv_delta[k];\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> (k&lt;1) { <span style=\"color: #7e7e7e;\">\/\/ hue sweeps simply upwards<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> (hsv[k] &gt; hsv_max[k]) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv[k]=hsv_min[k];\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">else<\/span> { <span style=\"color: #7e7e7e;\">\/\/ saturation or value bounce around<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> (hsv[k] &gt; hsv_max[k] || hsv[k] &lt; hsv_min[k]) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv_delta[k]\u00c2\u00a0*=\u00c2\u00a0-1.0;\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv[k]\u00c2\u00a0+=\u00c2\u00a0hsv_delta[k];\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0hsv[k]\u00c2\u00a0=\u00c2\u00a0<span style=\"color: #cc6600;\">constrain<\/span>(hsv[k], hsv_min[k], hsv_max[k]); <span style=\"color: #7e7e7e;\">\/\/ keep values in range<\/span>\r\n\u00c2\u00a0\u00c2\u00a0}\r\n\r\n\u00c2\u00a0\u00c2\u00a0rgbval=HSV_to_RGB(hsv[0],\u00c2\u00a0hsv[1],\u00c2\u00a0hsv[2]);\r\n\u00c2\u00a0\u00c2\u00a0rgb[0]\u00c2\u00a0=\u00c2\u00a0(rgbval\u00c2\u00a0&amp;\u00c2\u00a00x00FF0000)\u00c2\u00a0&gt;&gt;\u00c2\u00a016;\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ there must be better ways<\/span>\r\n\u00c2\u00a0\u00c2\u00a0rgb[1]\u00c2\u00a0=\u00c2\u00a0(rgbval\u00c2\u00a0&amp;\u00c2\u00a00x0000FF00)\u00c2\u00a0&gt;&gt;\u00c2\u00a08;\r\n\u00c2\u00a0\u00c2\u00a0rgb[2]\u00c2\u00a0=\u00c2\u00a0rgbval\u00c2\u00a0&amp;\u00c2\u00a00x000000FF;\r\n\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">for<\/span> (k=0; k&lt;3; k++) { <span style=\"color: #7e7e7e;\">\/\/ for all three RGB values<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">analogWrite<\/span>(RED + k, rgb[k] * bright[k]\/256);\r\n\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">delay<\/span>(DELAY);\r\n}\r\n\r\n<span style=\"color: #cc6600;\">long<\/span> HSV_to_RGB( <span style=\"color: #cc6600;\">float<\/span> h, <span style=\"color: #cc6600;\">float<\/span> s, <span style=\"color: #cc6600;\">float<\/span> v ) {\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/*<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0modified\u00c2\u00a0from\u00c2\u00a0Alvy\u00c2\u00a0Ray\u00c2\u00a0Smith's\u00c2\u00a0site:<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0http:\/\/www.alvyray.com\/Papers\/hsv2rgb.htm<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0H\u00c2\u00a0is\u00c2\u00a0given\u00c2\u00a0on\u00c2\u00a0[0,\u00c2\u00a06].\u00c2\u00a0S\u00c2\u00a0and\u00c2\u00a0V\u00c2\u00a0are\u00c2\u00a0given\u00c2\u00a0on\u00c2\u00a0[0,\u00c2\u00a01].<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0RGB\u00c2\u00a0is\u00c2\u00a0returned\u00c2\u00a0as\u00c2\u00a0a\u00c2\u00a024-bit\u00c2\u00a0long\u00c2\u00a0#rrggbb<\/span>\r\n<span style=\"color: #7e7e7e;\">\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\/<\/span>\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">int<\/span> i;\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">float<\/span> m, n, f;\r\n\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ not very elegant way of dealing with out of range: return black<\/span>\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> ((s&lt;0.0) || (s&gt;1.0) || (v&lt;0.0) || (v&gt;1.0)) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> 0L;\r\n\u00c2\u00a0\u00c2\u00a0}\r\n\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> ((h &lt; 0.0) || (h &gt; 6.0)) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>( v * 255 ) + <span style=\"color: #cc6600;\">long<\/span>( v * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( v * 255 ) * 65536;\r\n\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0i\u00c2\u00a0=\u00c2\u00a0<span style=\"color: #cc6600;\">floor<\/span>(h);\r\n\u00c2\u00a0\u00c2\u00a0f\u00c2\u00a0=\u00c2\u00a0h\u00c2\u00a0-\u00c2\u00a0i;\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">if<\/span> ( !(i&amp;1) ) {\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0f\u00c2\u00a0=\u00c2\u00a01\u00c2\u00a0-\u00c2\u00a0f;\u00c2\u00a0<span style=\"color: #7e7e7e;\">\/\/ if i is even<\/span>\r\n\u00c2\u00a0\u00c2\u00a0}\r\n\u00c2\u00a0\u00c2\u00a0m\u00c2\u00a0=\u00c2\u00a0v\u00c2\u00a0*\u00c2\u00a0(1\u00c2\u00a0-\u00c2\u00a0s);\r\n\u00c2\u00a0\u00c2\u00a0n\u00c2\u00a0=\u00c2\u00a0v\u00c2\u00a0*\u00c2\u00a0(1\u00c2\u00a0-\u00c2\u00a0s\u00c2\u00a0*\u00c2\u00a0f);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">switch<\/span> (i) {\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 6:\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 0: <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(v, n, m)<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(v * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( n * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( m * 255);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 1: <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(n, v, m) <\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(n * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( v * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( m * 255);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 2:  <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(m, v, n)<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(m * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( v * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( n * 255);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 3:  <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(m, n, v)<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(m * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( n * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( v * 255);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 4:  <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(n, m, v)<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(n * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( m * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( v * 255);\r\n\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">case<\/span> 5:  <span style=\"color: #7e7e7e;\">\/\/ RETURN_RGB(v, m, n)<\/span>\r\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0<span style=\"color: #cc6600;\">return<\/span> <span style=\"color: #cc6600;\">long<\/span>(v * 255 ) * 65536 + <span style=\"color: #cc6600;\">long<\/span>( m * 255 ) * 256 + <span style=\"color: #cc6600;\">long<\/span>( n * 255);\r\n\u00c2\u00a0\u00c2\u00a0}\r\n}\u00c2\u00a0\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>There were some flaws in the post HSV colour cycling LED on Arduino. This does much more what I wanted: \/* HSV\u00c2\u00a0fade\/bounce\u00c2\u00a0for\u00c2\u00a0Arduino\u00c2\u00a0-\u00c2\u00a0Stewart\u00c2\u00a0C.\u00c2\u00a0Russell\u00c2\u00a0-\u00c2\u00a0scruss.com\u00c2\u00a0-\u00c2\u00a02010\/09\/19 Wiring: LED\u00c2\u00a0is\u00c2\u00a0RGB\u00c2\u00a0common\u00c2\u00a0cathode\u00c2\u00a0(SparkFun\u00c2\u00a0sku:\u00c2\u00a0COM-09264\u00c2\u00a0or\u00c2\u00a0equivalent) \u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a0\u00c2\u00a09\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0165\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Red\u00c2\u00a0pin \u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a010\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0100\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Green\u00c2\u00a0pin \u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0Digital\u00c2\u00a0pin\u00c2\u00a011\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0100\u00ce\u00a9\u00c2\u00a0resistor\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0Blue\u00c2\u00a0pin \u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0*\u00c2\u00a0GND\u00c2\u00a0\u00e2\u2020\u2019\u00c2\u00a0LED\u00c2\u00a0common\u00c2\u00a0cathode. *\/ #define\u00c2\u00a0RED\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a09\u00c2\u00a0\/\/ pin for red LED; green on RED+1 pin, blue on RED+2 pin #define\u00c2\u00a0DELAY\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a02 long rgb[3]; long rgbval, k; float hsv[3] = { \u00c2\u00a0\u00c2\u00a00.0,\u00c2\u00a00.5,\u00c2\u00a00.5 }; float [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[7],"tags":[2207,2213,150,2212],"class_list":["post-5827","post","type-post","status-publish","format-standard","hentry","category-computers-suck","tag-arduino","tag-hsv","tag-led","tag-rgb"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pQNZZ-1vZ","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/5827","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/comments?post=5827"}],"version-history":[{"count":1,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/5827\/revisions"}],"predecessor-version":[{"id":5828,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/5827\/revisions\/5828"}],"wp:attachment":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/media?parent=5827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/categories?post=5827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/tags?post=5827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}