Arduino + 手机APP + HC-05蓝牙 对全彩共阳LED的调色

  • 线路图在这里插入图片描述
  • 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]。
如果我们要每个字节取出的话,可以每个引用。
*/
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值