Advertisement
neri

20130119 - RGB

Jan 19th, 2013
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.17 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int LED_RGB[] = {9, 10, 11};
  4. int LED_RGB_val[] = {0, 0, 0};
  5. int LED_RGB_cnt = 3;
  6.  
  7. void setRGB(int * led, int * val, int r, int g, int b, int smooth);
  8. void fadeInOut(int led);
  9. void fadeInOut(int * led, int cnt);
  10. void setColorFromSerial(int * led, int * val);
  11. void handleSerialMsg(int * led, int * val);
  12. void signal(int r, int g, int b);
  13.  
  14. int serialCounter = 0;
  15.  
  16. void setup() {
  17.   for(int i=0; i<LED_RGB_cnt; i++)
  18.   {
  19.     pinMode(LED_RGB[i],OUTPUT);
  20.   }
  21.  
  22.   //fadeInOut(LED_RGB,LED_RGB_cnt);
  23.   signal(255,0,0,0,0,0);
  24.  
  25.   Serial.begin(9600);
  26.   //Serial.println("Set color for RGB led by typing it in hex like: rrggbb");
  27.   //Serial.println("Add letter 's' at the beggining to smooth out color change");
  28. };
  29.  
  30. void loop()
  31. {
  32.   if(Serial.available() > 0)
  33.   {
  34.     if(serialCounter>100)
  35.     {
  36.       handleSerialMsg(LED_RGB,LED_RGB_val);
  37.     }
  38.     serialCounter++;
  39.   }
  40.   else
  41.   {
  42.     serialCounter = 0;
  43.   }
  44.   //fadeInOut(LED_RGB,LED_RGB_cnt);
  45.   //setRGB(LED_RGB,LED_RGB_val,255,0,0,1);
  46.   //delay(1000);
  47.   //setRGB(LED_RGB,LED_RGB_val,0,255,0,1);
  48.   //delay(1000);
  49.   //setRGB(LED_RGB,LED_RGB_val,0,0,255,1);
  50.   //delay(1000);
  51.   //setRGB(LED_RGB,LED_RGB_val,0,0,0,1);
  52.   //delay(1000);
  53.   delay(1);
  54. };
  55.  
  56. int max_abs(int a, int b, int c)
  57. {
  58.   int m = max(abs(a),abs(b));
  59.   m = max(m, abs(c));
  60.   return m;
  61. }
  62.  
  63. void updateLed(int * diff, int pin, int * val)
  64. {
  65.   if(*diff != 0)
  66.   {
  67.     if(*diff < 0)
  68.     {
  69.       (*diff)++;
  70.       (*val)--;
  71.     }
  72.     else if(*diff > 0)
  73.     {
  74.       (*diff)--;
  75.       (*val)++;
  76.     }
  77.     analogWrite(pin,*val);
  78.   }
  79. }
  80.  
  81. void setRGB(int * led, int * val, int r, int g, int b, int smooth)
  82. {
  83.   //printColor(val[0],val[1],val[2]);
  84.   //Serial.print(" -> ");
  85.  
  86.   r = r<0 ? 0 : ( r>255 ? 255 : r);
  87.   g = g<0 ? 0 : ( g>255 ? 255 : g);
  88.   b = b<0 ? 0 : ( b>255 ? 255 : b);
  89.  
  90.   if(smooth)
  91.   {
  92.     int r_diff = r - val[0];
  93.     int g_diff = g - val[1];
  94.     int b_diff = b - val[2];
  95.    
  96.     int max_diff = max_abs(r_diff,g_diff,b_diff);
  97.    
  98.     for(int i=0; i<max_diff; i++)
  99.     {
  100.       updateLed(&r_diff,led[0],val);
  101.       updateLed(&g_diff,led[1],val+1);
  102.       updateLed(&b_diff,led[2],val+2);
  103.      
  104.       delay(5);
  105.     }
  106.   }
  107.   else
  108.   {
  109.     analogWrite(led[0],r);
  110.     val[0] = r;
  111.     analogWrite(led[1],g);
  112.     val[1] = g;
  113.     analogWrite(led[2],b);
  114.     val[2] = b;
  115.   }
  116.  
  117.   //printColor(val[0],val[1],val[2]);
  118.   //Serial.println();
  119. }
  120.  
  121. void printColor(int r, int g, int b)
  122. {
  123.   if(r < 0x10)
  124.   {
  125.     Serial.print(0);
  126.   }
  127.   Serial.print(r,HEX);
  128.   Serial.print(" ");
  129.  
  130.   if(g < 0x10)
  131.   {
  132.     Serial.print(0);
  133.   }
  134.   Serial.print(g,HEX);
  135.   Serial.print(" ");
  136.  
  137.   if(b < 0x10)
  138.   {
  139.     Serial.print(0);
  140.   }
  141.   Serial.print(b,HEX);
  142. }
  143.  
  144. void fadeInOut(int led)
  145. {
  146.   for(int i=0; i<255; i+=5)
  147.   {
  148.     analogWrite(led,i);
  149.     delay(30);
  150.   }
  151.  
  152.   for(int i=255; i>=0; i-=5)
  153.   {
  154.     analogWrite(led,i);
  155.     delay(30);
  156.   }
  157. }
  158.  
  159. void fadeInOut(int * led, int cnt)
  160. {
  161.   for(int i=0; i<cnt; i++)
  162.   {
  163.     fadeInOut(led[i]);
  164.   }
  165. }
  166.  
  167. int parseCharToIntHex(int x)
  168. {
  169.   if(x>=48 && x<=57) // x := {0-9}
  170.   {
  171.     x -= 48;
  172.   }
  173.   else if(x>=65 && x<=70) // x := {A-F}
  174.   {
  175.     x -= 55;
  176.   }
  177.   else if(x>=97 && x<=102) // x := {a-f}
  178.   {
  179.     x -= 87;
  180.   }
  181.   else
  182.   {
  183.     x = -1;
  184.   }
  185.  
  186.   return x;
  187. }
  188.  
  189. int read2BytesAsHex()
  190. {
  191.   int x = Serial.read();
  192.   int y = Serial.read();
  193.  
  194.   x = parseCharToIntHex(x);
  195.   y = parseCharToIntHex(y);
  196.  
  197.   if(x<0 || y<0)
  198.   {
  199.     return -1;
  200.   }
  201.   else
  202.   {
  203.     return x*16 + y;
  204.   }
  205. }
  206.  
  207. void setColorFromSerial(int * led, int * val)
  208. {
  209.   int smooth = 0;
  210.   int ok = 1;
  211.   if(Serial.available() == 7)
  212.   {
  213.     if(Serial.read()=='s')
  214.     {
  215.       smooth = 1;
  216.     }
  217.     else
  218.     {
  219.       ok = 0;
  220.     }
  221.   }
  222.  
  223.   if(ok && Serial.available() == 6)
  224.   {
  225.     int r = read2BytesAsHex();
  226.     int g = read2BytesAsHex();
  227.     int b = read2BytesAsHex();
  228.    
  229.     if(r>=0 || g>=0 || b>=0)
  230.     {
  231.       setRGB(led, val, r, g, b, smooth);
  232.       return;
  233.     }
  234.   }
  235.   else
  236.   {
  237.     for(int i=0; i<Serial.available(); i++)
  238.     {
  239.       Serial.read();
  240.     }
  241.   }
  242.  
  243.   signal(0,0,255,val[0],val[1],val[2]);
  244.   //Serial.println("Incorrect color format, clearing serial buffer");
  245. }
  246.  
  247. float calculateTemp()
  248. {
  249.   float temp = analogRead(0)*5/1024.0;
  250.   temp -= 0.5;
  251.   temp /= 0.01;
  252.   return temp;
  253. }
  254.  
  255. void handleSerialMsg(int * led, int * val)
  256. {
  257.   if(Serial.available() >= 6 && Serial.available() <= 7)
  258.   {
  259.     setColorFromSerial(LED_RGB,LED_RGB_val);
  260.   }
  261.   else if(Serial.available() == 4)
  262.   {
  263.     if(Serial.read() == 't' &&
  264.        Serial.read() == 'e' &&
  265.        Serial.read() == 'm' &&
  266.        Serial.read() == 'p')
  267.     {
  268.       Serial.println(calculateTemp());
  269.     }
  270.   }
  271.   else
  272.   {
  273.     signal(255,255,0,val[0],val[1],val[2]);
  274.     for(int i=0; i<Serial.available(); i++)
  275.     {
  276.       Serial.read();
  277.     }
  278.   }
  279. }
  280.  
  281. void signal(int r, int g, int b, int r_end, int g_end, int b_end)
  282. {
  283.   setRGB(LED_RGB,LED_RGB_val,0,0,0,0);
  284.   delay(250);
  285.  
  286.   for(int i=0; i<3; i++)
  287.   {
  288.     setRGB(LED_RGB,LED_RGB_val,r,g,b,0);
  289.     delay(250);
  290.     setRGB(LED_RGB,LED_RGB_val,0,0,0,0);
  291.     delay(250);
  292.   }
  293.  
  294.   setRGB(LED_RGB,LED_RGB_val,r_end,g_end,b_end,0);
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement