lqk

入驻于 2019-10-16 / MAKE 主页

lqk 创作的主题

如何分割字符存入数组中?

编程 lqk 2020-02-13最后回复来自 lqk
5

串口控制操作搞不定,求教

技术支持 lqk 2020-02-12最后回复来自 Spoony
7


lqk 发表的回复
回复了 lqk 创建的主题 编程 / 如何分割字符存入数组中?
2020-02-13

@Spoony 对啊,我想了一下午,百度也没看到这个方法😂我记得是有这样的操作就是想不起来了

回复了 lqk 创建的主题 编程 / 如何分割字符存入数组中?
2020-02-13

@Spoony 这个数据只是一串数字没有分隔符所以不知道接下来怎么切片

回复了 lqk 创建的主题 编程 / 如何分割字符存入数组中?
2020-02-13

@Spoony 不是这样,数据是动态的,比如02134210512,要分割成一位一位的

回复了 lqk 创建的主题 技术支持 / 串口控制操作搞不定,求教
2020-02-12

@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);
}

回复了 lqk 创建的主题 技术支持 / 串口控制操作搞不定,求教
2020-02-12

#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 = 5;// 红色
int WS_R = 5;// 绿色
int WS_B = 5;// 蓝色
String val = "";
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高

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);
while (Serial.read() >= 0) {

} //清除串行缓冲区
}
void loop() {
val = Serial.readString(); //读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
if (val == 'G+' ) {//判断接收到的数据
if ( WS_G < 255 || WS_G > 0 ) {
WS_G = WS_G + 10;
Serial.println("G+10");
} else if (WS_G < 0) {
‌Serial.println("G=MIX");
} else if (WS_G > 255) {
‌Serial.println("G=MAX");
}
}
Serial.println(val);
leds[0] = CRGB(WS_G, WS_R, WS_B); // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
val = "";
delay(500);
}

/*只会回显val的数据但是并不会执行R+的操作,但是把if的条件改成val == 'G'就很神奇的可以操作 */

回复了 lqk 创建的主题 技术支持 / 串口控制操作搞不定,求教
2020-02-11

@Spoony 操作的时候程序并不会进入if循环但是输出接收到的数据是正常的,是什么原因呢