李秀康 发表于 2018-11-24 18:03:15

李秀康-第三周软件任务


可调跑马灯

功能
输入的数字为要亮的第几号灯(数字范围0-8);
输入go灯从当前状态流动;在此状态下输入数字,灯会从输入数字对应的灯开始流动;
输入stop   灯从保持当前状态,不流动;在此状态下输入数字,保持点亮输入对应数字的灯。


函数部分

int i=0;                   //light数组中对应的灯不全亮,i 数组中要亮的灯个数
String str;                //提取输入的 字符串中除去要求外的数字字符 的全部字符串
int light;            //要亮的灯的数组
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=4,light=5,light=6,light=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=4,light=5,light=6,light=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=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,HIGH);
      light+=1;
      if(light>9)
   {
      light=2;
       }
    }

}
}
void stop_light(void)                         //点亮light[]数组对应灯                           
{
   no_light();                              //关闭除light数组的全部灯
   for(int j=0;j<i;j++)
   {
   digitalWrite(light,HIGH);
    }

}
void no_light(void)                           //关闭除light数组的全部灯
{
    int j,n;
    for(n=2;n<10;n++)
    {
       for(j=0;j<i;j++)
       {
          if(light==n)
          {
            break;
            }
      }
      if(j==i)
      {
            digitalWrite(n,LOW);
          }
       }
}

鲁亮 发表于 2018-11-26 20:00:07

你确认你的代码验证通过的吗?特别是if(Serial.available()>0)这一句
还有就是你的发帖格式再仔细看看

李秀康 发表于 2018-11-26 22:16:00

验证通过了的。代码的结果,用板子测了一下的,符合功能。
页: [1]
查看完整版本: 李秀康-第三周软件任务