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