- 线路图
- Arduino 代码
/*
适用于拆分类"120,95,211"样式的字符串
分割之后NumData[0]=120,NumData[1]=95,NumData[2]=211
且NumData[0],NumData[1],NumData[1]是整形的数字;
发送"120,95,211"样式的字符串给Arduino,将三个数据分给9.10.11三个针脚
RGBPin[0] = 9,RGBPin[1] = 10,RGBPin[2] = 11
9.10.11三个针脚接多彩共阳LED,接收到对应的数据时显示对应的颜色。
本程序多用于多彩LED的调色。
*/
#define NumData_length 3
String ComData = ""; //定义一个ComData字符串变量,赋初值为空
int NumData[NumData_length] = {0}, RGBPin[3] = {9, 10, 11}, mark = 0; //NumData是分拆之后的数字数组,RGBPin是对应的针脚
void setup() {
for(int i = 0; i < NumData_length; i++) pinMode(RGBPin[i], OUTPUT); //定义9,10,11脚是输出
Serial.begin(9600);
}
void loop()
{
int N = 0; // N是拆分后数字数组的位置记数
while (Serial.available() > 0) //不断循环检测串口缓存,一个个读入字符串,
{
ComData += char(Serial.read()); //读入之后将字符串,串接到ComData上面。
delay(2); // 延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
mark = 1; // 标记串口读过数据,如果没有数据的话,直接不执行这个while了。
}
if (mark == 1) //如果接收到数据则执行ComData分析操作,否则什么都不做。
{
/**********************重点标记开始**********************/
for(int i = 0; i < ComData.length(); i++) //以串口读取字符串长度循环
{
//逐个分析ComData[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
//即比如11,22,33,55开始的11记到NumData[0];碰到逗号就N等于1了,
//再转换就转换到NumData[1];再碰到逗号就记到NumData[2];以此类推,直到字符串结束
if(ComData[i] == ',')
{
N++;
}
else
{
//如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
//并且(ComData[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
//比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
//因为左边的数字先获取到,并且NumData[0]等于0,
//所以第一次循环是NumData[0] = 0*10+1 = 1
//第二次NumData[0]等于1,循环是NumData[0] = 1*10+2 = 12
//第三次是NumData[0]等于12,循环是NumData[0] = 12*10+3 = 123
//第四次是NumData[0]等于123,循环是NumData[0] = 123*10+4 = 1234
//如此类推,字符串将被变成数字0
NumData[N] = NumData[N] * 10 + (ComData[i] - '0');
}
}
ComData = String(""); //ComData的字符串已经全部转换到NumData了,清空ComData以便下一次使用,如果不请空的话,本次结果极有可能干扰下一次。
for(int i = 0; i < NumData_length; i++) //循环输出NumData的内容,并且写到PWM(9,10,11)引脚
{
Serial.print("Pin");
Serial.print(RGBPin[i]);
Serial.print(" = ");
Serial.println(NumData[i]);
analogWrite(RGBPin[i], 255 - NumData[i]);
NumData[i] = 0;
}
/**********************重点标记结束**********************/
}
mark = 0; //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
}
/*
1.特别留意的是读串口时的delay(2)不能删掉,否则串口缓冲区不够时间接受数据。即使调小延时也会出错。具体数值也可以实验决定。
2.ComData,也是一个数组,引用每个字的话可以用ComData[0],ComData[1]......ComData[n]。
如果我们要每个字节取出的话,可以每个引用。
*/
- 手机APP (点击下载)