美文网首页
arduino从基础到实践项目10代码分析

arduino从基础到实践项目10代码分析

作者: 猛犸象和剑齿虎 | 来源:发表于2020-03-28 18:25 被阅读0次

    虽然书中讲解的很详细,但是涉及了一点点指针的用法,然而小道学习过VBA和python都没有涉及指针的概念,所以就尝试着用用看。

    RGB 控制串口彩灯

    image.png

    彩图很清晰,所以就不放实物图了。

    //串口控制彩灯
    
    char buffer[18];
    /*设置一个字符型数组,长度为18,r255,g255,b255(NULL),
    在文本的末端有一个看不见的字符NULL,书上没有解释为什么
    数的是17个字符。定义长度18保证不会溢出。*/
    int red,green,blue;//声明整型变量存储红绿蓝数值和引脚号
    
    int RedPin = 11;
    int GreenPin = 10;
    int BluePin =9;
    
    void setup()
    {
      Serial.begin(9600);//开始串口通讯,9600是波特率每秒中信号或脉冲数
      Serial.flush();//清空串口残留字符,为输入输出做准备
      pinMode(RedPin,OUTPUT);//设置3个引脚为输出引脚
      pinMode(GreenPin,OUTPUT);
      pinMode(BluePin,OUTPUT);
      }
    
    void loop()
    {
      if (Serial.available()>0)//检查是否有字符发送到串口,如果有则执行if语句
      {
        int index = 0;//用于存储字符数组中指针的位置。
        delay(100);//很重要,因为代码速度高于串口通信速度,所以等待一点时间
        int numChar =Serial.available();//字符个数装入变量
        if(numChar>15)//如果串口字符数大于15
        {
          numChar=15;//就将串口字符数量设置为15
          }
         while(numChar--)//如果numChar递减并大于0(numchar必然大于0,否则前面的if语句不会执行)
         {
          buffer[index++]=Serial.read();//将buffer空数组逐个写入串口的字符
          }
         splitString(buffer);//创建一个函数,用于拆分字符
        }
      }
    
      void splitString(char* data)
      /*
      c++程序不允许给函数传送字符型数组(真无奈),通过指针绕过这个限制,
      变量名前加一个星号* data,表明这是个指针,当然由于初次接触,还是不理解
      只当是个特殊的参数。可以用它变成一个指向另一个变量的变量。
      */
      {
        Serial.print("Data entered: ");//打印不解释hiahia~~
        Serial.println(data);
        char* parameter;//创建一个新变量,由于用到指针数据类型必须一致所以也加*号
        parameter = strtok(data," ,");
        /*strtok拆分字符函数,查找空格或者逗号,进行第一次分割。
         如果输入 r127 g56 b98第一次的值是r127
         */
        while(parameter!=NULL)//继续分割当字符串不为空时
        {
         setLED(parameter);//在这之间进行灯的亮度设置和操作,创建1个函数操作
         parameter = strtok(NULL," ,");//结尾部分直到分割完毕
          }
    
         for (int x=0; x<16;x++)//用于填充buffer数组,并清空缓存数据
         {
          buffer[x]="\0";
          }
        Serial.flush();
        
        }
    
      void setLED(char* data)//又见指针,无奈
      {
        if((data[0]=='r') || (data[0]=='R'))//如果第一个字符是r或者R执行
        {
          int Ans = strtol(data+1,NULL,10);
          /*
           定义一个整数变量,分割data+1,也就是从字符的第二个开始,后面一个参数是
           分隔符,因为已经分割完所以不用,传递NULL(暂时先这么理解吧,书上的指针
           概念看不懂,)
           第三个参数是基数,使用的是10进制。
           */
          Ans =constrain(Ans,0,255);//确保取出的数值在0到255之间,数字信号的范围。
          analogWrite(RedPin,Ans);//analogWrite(11,ans=0-255之间的数值)
          Serial.print("Red is set to: ");//打印,打印完毕
          Serial.println(Ans);
          }
         if((data[0]=='g') || (data[0]=='G'))//都一样
        {
          int Ans = strtol(data+1,NULL,10);
          Ans =constrain(Ans,0,255);
          analogWrite(GreenPin,Ans);
          Serial.print("Green is set to: ");
          Serial.println(Ans);
          } 
         if((data[0]=='b') || (data[0]=='B'))
        {
          int Ans = strtol(data+1,NULL,10);
          Ans =constrain(Ans,0,255);
          analogWrite(BluePin,Ans);
          Serial.print("Green is set to: ");
          Serial.println(Ans);
          } 
          
        }
    

    代码注释已尽量写清楚了。

    相关文章

      网友评论

          本文标题:arduino从基础到实践项目10代码分析

          本文链接:https://www.haomeiwen.com/subject/ixctuhtx.html