| 
 | 
	
 
 
可调跑马灯 
 
功能 
输入的数字为要亮的第几号灯(数字范围0-8); 
输入  go  灯从当前状态流动;在此状态下输入数字,灯会从输入数字对应的灯开始流动; 
输入  stop   灯从保持当前状态,不流动;在此状态下输入数字,保持点亮输入对应数字的灯。 
 
 
函数部分 
 
int i=0;                   //light数组中对应的灯不全亮,i 数组中要亮的灯个数 
String str;                //提取输入的 字符串中除去要求外的数字字符 的全部字符串  
int light[8];              //要亮的灯的数组 
unsigned long int timer=0; //定时 
 
void setup() { 
  // put your setup code here, to run once: 
    Serial.begin(9600); 
    pinMode(2,OUTPUT); 
    pinMode(3,OUTPUT); 
    pinMode(4,OUTPUT); 
    pinMode(5,OUTPUT); 
    pinMode(6,OUTPUT); 
    pinMode(7,OUTPUT); 
    pinMode(8,OUTPUT); 
    pinMode(9,OUTPUT); 
} 
 
 
void loop() { 
  // put your main code here, to run repeatedly: 
           
          if(Serial.available()>0) 
          {                                  
             check();                         //输入的数字为对应要亮的灯。函数作用:读取输入的字符串,把数字字符给予light[]数组,其余字符给str字符串变量;变量i为输入数字字符个数。 
                                              //check() 作用 如输入:45js67      则str=“js”  数组light[0]=4,light[1]=5,light[2]=6,light[3]=7,i=4 
             stop_light();                    //点亮light[]对应的灯 
             while(1)                         //对str字符串变量进行判断,若包含go进入bus go模式 
             {                                   
 
                                             //输入没有go或者stop,跳出while,不响应如何动作              
              if(str.indexOf("go")<0&&str.indexOf("stop")<0) 
              { 
                  break; 
                } 
               
               
 //  go模式            
              if(str.indexOf("go")>=0&&str.indexOf("stop")<0) 
              {    
                  Serial.println("BUS GO!!!"); 
                  while(1) 
                  { 
                      move_light(); 
                      if(Serial.available()) 
                      { 
                          check(); 
                          if(str.indexOf("stop")>=0&&str.indexOf("go")<0) 
                          {   
                              no_light();break; 
                            } 
                        } 
                    } 
                } 
 
//  stop 模式 
                 
                if(str.indexOf("stop")>=0&&str.indexOf("go")<0)    //对str字符串变量进行判断,若包含“stop”进入bus stop模式 
                {    
                    Serial.println("BUS STOP!!!"); 
                    while(1) 
                    { 
                        stop_light(); 
                        if(Serial.available()) 
                        { 
                          check(); 
                          if(str.indexOf("go")>=0&&str.indexOf("stop")<0) 
                          {   
                              break; 
                            } 
                        }     
                      }   
                  } 
             } 
            } 
        } 
 
void check(void)                             //函数作用  如 输入:45js67      则str=“js”  数组light[0]=4,light[1]=5,light[2]=6,light[3]=7,i=4 
{ 
 str=""; 
 for(int j=1;Serial.available();) 
    {  
      char getChar; 
      getChar=Serial.read();                 //读取字符 
      delay(5);                               //等待数据传输 
      if(getChar-48>=0&&getChar-48<=8&&j==1)  //若输入的字符串有数字。利用局部变量j,使i=0执行一次,便于统计数字字符个数 
      { 
          i=0;j=0; 
        } 
      if(getChar-48>=0&&getChar-48<=8&&i<8)   //判断是否为0-8之间的数字字符,题灯只有8个,所以i小于8 
      { 
        light[i++]=getChar-47;                //根据输入的数字字符重新定义light[]组,从而改变要亮的灯 
       } 
       else 
       { 
         str+=getChar;                        //输入的其余字符给str 
        } 
     } 
} 
void move_light(void)                         //让灯从当前状态下流动起来 
{                                              
 if(millis()-timer>=1000)                     //每个1000us 灯流动一次 
 {   
     no_light();                               //关闭除light数组的全部灯 
    timer=millis();                           //定时功能 
    for(int j=0;j<i;j++)                      //点亮light[]数组的灯 
    { 
      digitalWrite(light[j],HIGH);   
      light[j]+=1; 
      if(light[j]>9) 
     { 
        light[j]=2; 
       }   
    } 
 
  } 
} 
void stop_light(void)                         //点亮light[]数组对应灯                            
{   
   no_light();                                //关闭除light数组的全部灯 
   for(int j=0;j<i;j++) 
   { 
     digitalWrite(light[j],HIGH); 
    }  
 
  } 
void no_light(void)                           //关闭除light数组的全部灯 
{  
    int j,n; 
    for(n=2;n<10;n++) 
    { 
       for(j=0;j<i;j++) 
       { 
          if(light[j]==n) 
          { 
              break; 
            } 
        } 
        if(j==i) 
        { 
            digitalWrite(n,LOW); 
          } 
       } 
  } 
 |   
 
 
 
 |