Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int LED_RGB[] = {9, 10, 11};
- int LED_RGB_val[] = {0, 0, 0};
- int LED_RGB_cnt = 3;
- void setRGB(int * led, int * val, int r, int g, int b, int smooth);
- void fadeInOut(int led);
- void fadeInOut(int * led, int cnt);
- void setColorFromSerial(int * led, int * val);
- void handleSerialMsg(int * led, int * val);
- void signal(int r, int g, int b);
- int serialCounter = 0;
- void setup() {
- for(int i=0; i<LED_RGB_cnt; i++)
- {
- pinMode(LED_RGB[i],OUTPUT);
- }
- //fadeInOut(LED_RGB,LED_RGB_cnt);
- signal(255,0,0,0,0,0);
- Serial.begin(9600);
- //Serial.println("Set color for RGB led by typing it in hex like: rrggbb");
- //Serial.println("Add letter 's' at the beggining to smooth out color change");
- };
- void loop()
- {
- if(Serial.available() > 0)
- {
- if(serialCounter>100)
- {
- handleSerialMsg(LED_RGB,LED_RGB_val);
- }
- serialCounter++;
- }
- else
- {
- serialCounter = 0;
- }
- //fadeInOut(LED_RGB,LED_RGB_cnt);
- //setRGB(LED_RGB,LED_RGB_val,255,0,0,1);
- //delay(1000);
- //setRGB(LED_RGB,LED_RGB_val,0,255,0,1);
- //delay(1000);
- //setRGB(LED_RGB,LED_RGB_val,0,0,255,1);
- //delay(1000);
- //setRGB(LED_RGB,LED_RGB_val,0,0,0,1);
- //delay(1000);
- delay(1);
- };
- int max_abs(int a, int b, int c)
- {
- int m = max(abs(a),abs(b));
- m = max(m, abs(c));
- return m;
- }
- void updateLed(int * diff, int pin, int * val)
- {
- if(*diff != 0)
- {
- if(*diff < 0)
- {
- (*diff)++;
- (*val)--;
- }
- else if(*diff > 0)
- {
- (*diff)--;
- (*val)++;
- }
- analogWrite(pin,*val);
- }
- }
- void setRGB(int * led, int * val, int r, int g, int b, int smooth)
- {
- //printColor(val[0],val[1],val[2]);
- //Serial.print(" -> ");
- r = r<0 ? 0 : ( r>255 ? 255 : r);
- g = g<0 ? 0 : ( g>255 ? 255 : g);
- b = b<0 ? 0 : ( b>255 ? 255 : b);
- if(smooth)
- {
- int r_diff = r - val[0];
- int g_diff = g - val[1];
- int b_diff = b - val[2];
- int max_diff = max_abs(r_diff,g_diff,b_diff);
- for(int i=0; i<max_diff; i++)
- {
- updateLed(&r_diff,led[0],val);
- updateLed(&g_diff,led[1],val+1);
- updateLed(&b_diff,led[2],val+2);
- delay(5);
- }
- }
- else
- {
- analogWrite(led[0],r);
- val[0] = r;
- analogWrite(led[1],g);
- val[1] = g;
- analogWrite(led[2],b);
- val[2] = b;
- }
- //printColor(val[0],val[1],val[2]);
- //Serial.println();
- }
- void printColor(int r, int g, int b)
- {
- if(r < 0x10)
- {
- Serial.print(0);
- }
- Serial.print(r,HEX);
- Serial.print(" ");
- if(g < 0x10)
- {
- Serial.print(0);
- }
- Serial.print(g,HEX);
- Serial.print(" ");
- if(b < 0x10)
- {
- Serial.print(0);
- }
- Serial.print(b,HEX);
- }
- void fadeInOut(int led)
- {
- for(int i=0; i<255; i+=5)
- {
- analogWrite(led,i);
- delay(30);
- }
- for(int i=255; i>=0; i-=5)
- {
- analogWrite(led,i);
- delay(30);
- }
- }
- void fadeInOut(int * led, int cnt)
- {
- for(int i=0; i<cnt; i++)
- {
- fadeInOut(led[i]);
- }
- }
- int parseCharToIntHex(int x)
- {
- if(x>=48 && x<=57) // x := {0-9}
- {
- x -= 48;
- }
- else if(x>=65 && x<=70) // x := {A-F}
- {
- x -= 55;
- }
- else if(x>=97 && x<=102) // x := {a-f}
- {
- x -= 87;
- }
- else
- {
- x = -1;
- }
- return x;
- }
- int read2BytesAsHex()
- {
- int x = Serial.read();
- int y = Serial.read();
- x = parseCharToIntHex(x);
- y = parseCharToIntHex(y);
- if(x<0 || y<0)
- {
- return -1;
- }
- else
- {
- return x*16 + y;
- }
- }
- void setColorFromSerial(int * led, int * val)
- {
- int smooth = 0;
- int ok = 1;
- if(Serial.available() == 7)
- {
- if(Serial.read()=='s')
- {
- smooth = 1;
- }
- else
- {
- ok = 0;
- }
- }
- if(ok && Serial.available() == 6)
- {
- int r = read2BytesAsHex();
- int g = read2BytesAsHex();
- int b = read2BytesAsHex();
- if(r>=0 || g>=0 || b>=0)
- {
- setRGB(led, val, r, g, b, smooth);
- return;
- }
- }
- else
- {
- for(int i=0; i<Serial.available(); i++)
- {
- Serial.read();
- }
- }
- signal(0,0,255,val[0],val[1],val[2]);
- //Serial.println("Incorrect color format, clearing serial buffer");
- }
- float calculateTemp()
- {
- float temp = analogRead(0)*5/1024.0;
- temp -= 0.5;
- temp /= 0.01;
- return temp;
- }
- void handleSerialMsg(int * led, int * val)
- {
- if(Serial.available() >= 6 && Serial.available() <= 7)
- {
- setColorFromSerial(LED_RGB,LED_RGB_val);
- }
- else if(Serial.available() == 4)
- {
- if(Serial.read() == 't' &&
- Serial.read() == 'e' &&
- Serial.read() == 'm' &&
- Serial.read() == 'p')
- {
- Serial.println(calculateTemp());
- }
- }
- else
- {
- signal(255,255,0,val[0],val[1],val[2]);
- for(int i=0; i<Serial.available(); i++)
- {
- Serial.read();
- }
- }
- }
- void signal(int r, int g, int b, int r_end, int g_end, int b_end)
- {
- setRGB(LED_RGB,LED_RGB_val,0,0,0,0);
- delay(250);
- for(int i=0; i<3; i++)
- {
- setRGB(LED_RGB,LED_RGB_val,r,g,b,0);
- delay(250);
- setRGB(LED_RGB,LED_RGB_val,0,0,0,0);
- delay(250);
- }
- setRGB(LED_RGB,LED_RGB_val,r_end,g_end,b_end,0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement