代码有bug,待完善- int val[42] = {
- 255, 255, 255,
- 255, 0, 0,
- 0, 255, 0,
- 0, 0, 255,
- 255, 255, 0,
- 0, 255, 255,
- 255, 0, 255,
- 127, 255, 0,
- 127, 0 , 255,
- 0, 127, 255,
- 255, 127, 0,
- 255, 0, 127,
- 0, 255, 127,
- 0, 0, 0
- };
- String data = "";
- boolean isComplete = false;
- int id[4] = {0, 0, 0};
- int rgb[3] = {0, 0, 0};
- int pins[3] = {9, 10, 11};
- int lts = 64;
- int pointer = 0;
- boolean isLoop = true;
- void setup() {
- Serial.begin(9600);
- fade(0);
- }
- void loop() {
- if(isComplete) {
- if(data.length() > 15){
- clearData();
- } else if(data == "clear"){
- clearData();
- } else if(data == "fade"){
- fade(0);
- } else if(data == "continue"){
- fade(pointer - 3);
- } else if (data == "white") {
- lightIndex(0);
- } else if (data == "red") {
- lightIndex(1);
- } else if (data == "green") {
- lightIndex(2);
- } else if (data == "blue") {
- lightIndex(3);
- } else if (data == "yellow") {
- lightIndex(4);
- } else if (data == "cyan") {
- lightIndex(5);
- } else if (data == "purple") {
- lightIndex(6);
- } else if (data == "black") {
- lightIndex(13);
- } else{
- parseData(0);
- parseData(1);
- parseData(2);
-
- lightRgb(rgb[0], rgb[1], rgb[2]);
- }
- clearData();
- }
- }
- // clear data
- void clearData() {
- data = "";
- isComplete = false;
- }
- void serialEvent() {
- while(Serial.available()){
- char c = (char)Serial.read();
- Serial.print(c);
- if(c == ',') {
- isComplete = true;
- } else {
- data+=c;
- }
- if(data.length() > 15){
- data = "";
- isComplete = false;
- }
- }
- }
- // convert rgb string to integer
- int parseData(int i) {
- id[0] = data.indexOf('r');
- id[1] = data.indexOf('g');
- id[2] = data.indexOf('b');
- id[3] = data.indexOf(',');
- rgb[i] = data.substring(id[i] + 1, id[i + 1]).toInt();
- return rgb[i];
- }
- void lightIndex(int i) {
- rgb[0] = val[3*i];
- rgb[1] = val[3*i + 1];
- rgb[2] = val[3*i + 2];
- lightRgb(rgb[0], rgb[1], rgb[2]);
- }
- // constrain rgb value and light rgb leds
- void lightRgb(int r, int g, int b) {
- // common vcc rgb led
- analogWrite(pins[0], max(0, min(255, 255 - r)));
- analogWrite(pins[1], max(0, min(255, 255 - g)));
- analogWrite(pins[2], max(0, min(255, 255 - b)));
- }
- void fade(int i) {
- int j=i;
- data = "";
- while(isLoop){
- j+=3;
- rgb[0] = val[j];
- rgb[1] = val[j + 1];
- rgb[2] = val[j + 2];
- for(int i=1; i<=lts; i++) {
- serialEvent();
- if(data == "pause") goto toPause;
- lightRgb(rgb[0]*i/lts, rgb[1]*i/lts, rgb[2]*i/lts);
- delay(50);
- }
- for(int i=lts; i>=1; i--) {
- serialEvent();
- if(data == "pause") goto toPause;
- lightRgb(rgb[0]*i/lts, rgb[1]*i/lts, rgb[2]*i/lts);
- delay(50);
- }
- if(j == 36)
- j=0;
- }
- toPause:
- {
- isLoop == false;
- pointer = j;
- }
- }
复制代码 |