重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2866|回复: 2

李秀康-第三周软件任务

[复制链接]

2

主题

3

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2018-11-24 18:03:15 | 显示全部楼层 |阅读模式

可调跑马灯

功能
输入的数字为要亮的第几号灯(数字范围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);
          }
       }
  }

arduino uno

arduino uno

light_shiyanshi1_3week.zip

33.09 KB, 下载次数: 8

代码文件

回复

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
发表于 2018-11-26 20:00:07 | 显示全部楼层
你确认你的代码验证通过的吗?特别是if(Serial.available()>0)这一句
还有就是你的发帖格式再仔细看看
回复 支持 反对

使用道具 举报

2

主题

3

帖子

22

积分

新手上路

Rank: 1

积分
22
 楼主| 发表于 2018-11-26 22:16:00 | 显示全部楼层
验证通过了的。代码的结果,用板子测了一下的,符合功能。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-3-29 19:54 , Processed in 0.178970 second(s), 34 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表