@Spoony 弄了好久问题解决了,还加入了存档系统,后期要做成用WS2812仿辉光灯。
问题出在串口接收数据缓存val这个变量上面,优化之后就好了,串口发送的时候还得选没有结束符否则也没法正常运行
/*
* 串口命令:
G+ 红色亮度+10
R+ 绿色亮度+10
B+ 蓝色亮度+10
G- 红色亮度-10
R- 绿色亮度-10
B- 蓝色亮度-10
CS 存储颜色数值到内存
*/
#include <EEPROM.h>
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 28 // LED灯珠数量
#define DATA_PIN 9 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
int WS_G;// 红色
int WS_R;// 绿色
int WS_B;// 蓝色
String val = "";//初始化串口缓存
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
byte valueG;
byte valueR;
byte valueB;
CRGB leds[NUM_LEDS]; // 建立光带leds
void setup() {
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
Serial.begin(9600);
/*↓↓↓↓↓↓读取内存中的颜色数值↓↓↓↓↓↓*/
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
WS_G = valueG;
WS_R = valueR;
WS_B = valueB;
/*↑↑↑↑↑↑读取内存中的颜色数值↑↑↑↑↑↑*/
}
void loop() {
/* 当串口有数据的时候,将数据拼接到变量comdata */
while (Serial.available() > 0)
{
val += char(Serial.read());
delay(50);
}
if (val == "G+" ) {
WS_G = WS_G + 10;
Serial.println("G+10");
} else if (val == "G-") {
WS_G = WS_G - 10;
Serial.println("G-10");
} else if (val == "R+") {
WS_R = WS_R + 10;
Serial.println("R+10");
} else if (val == "R-") {
WS_R = WS_R - 10;
Serial.println("R-10");
} else if (val == "B+") {
WS_B = WS_B + 10;
Serial.println("B+10");
} else if (val == "B-") {
WS_B = WS_B - 10;
Serial.println("B-10");
} else if (val == "CS") {
//EEPROM.write(i,value);//存储数据i=地址,value=数据 byte valueG;
EEPROM.write(1, WS_G);
EEPROM.write(2, WS_R);
EEPROM.write(3, WS_B);
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
Serial.println("已保存 ");
Serial.print(" G= ");
Serial.print(valueG);
Serial.print(" R= ");
Serial.print(valueR);
Serial.print(" B= ");
Serial.println(valueB);
}
if (WS_G > 256) {
WS_G = 255 ;
Serial.println("G=MAX");
}
if (WS_G < 0) {
WS_G = 1 ;
Serial.println("G=MIX");
}
if (WS_R > 256) {
WS_R = 255 ;
Serial.println("R=MAX");
}
if (WS_R < 0) {
WS_R = 1 ;
Serial.println("R=MIX");
}
if (WS_R > 256) {
WS_R = 255 ;
Serial.println("B=MAX");
}
if (WS_R < 0) {
WS_R = 1 ;
Serial.println("B=MIX");
}
/*↓↓↓↓↓↓DeBUG↓↓↓↓↓↓*/
/*
Serial.println(val);//输出串口保存到数据
Serial.print("G= ");
Serial.print(WS_G);//G值
Serial.print(" R= ");
Serial.print(WS_R);//R值
Serial.print(" B= ");
Serial.println(WS_B);//B值
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
Serial.println("内存数据GRB ");
Serial.println(valueG);
Serial.println(valueR);
Serial.println(valueB);
*/
/*↑↑↑↑↑↑DeBUG↑↑↑↑↑↑*/
leds[0] = CRGB(WS_G, WS_R, WS_B); // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
val = "";//串口缓存清空
delay(500);
}