今天写了一个arduino串口指令控制IO口独立输出的程序,简单的来说就是可以通过串口输入指令来控制2~12和A0~A5这些IO口输出高电平,
且独立运行互不干扰。
指令A:
指令格式:A+io口号+低电平延时+高电平延时。
发送这个指令之后,相应io口号会进行一个低电平延时,然后将IO口电平拉高,再经过一个高电平延时,从新将电平拉低。
例:A 14 3 2 这个指令发送之后,经过3秒14号io口输出高电平,再经过2秒,又输出低电平然后停止。
指令B:
指令格式:B+io口号
发送这个指令之后,会停止相应io口号的运行,并且将电平拉低。
例: A 14 这个指令运行后,14号io口刚刚正在运行的A指令会停止运行。
每个io口独立运行,对每个io口发送指令都不会影响其他io口正在运行的指令。
指令C:停止全部IO口
#define A0 //14
#define A1 //15
//#define A2 //16
//#define A3 //17
//#define A4 //18
//#define A5 //19
String cmd;
unsigned long time_last[20]={0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
unsigned long time_high_delay[20]={0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
unsigned long time_low_delay[20]={0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
bool io_state[20]={
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
bool io_zhixing[20]={
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1
};
unsigned long currentMillis;
char cmd_s='B';
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
for(int i=2;i<=19;i++)
{
pinMode(i,OUTPUT);
}
}
void loop() {
// put your main code here, to run repeatedly:
int string_k[2];//定位空格位置
if(Serial.available()>0)
{
cmd="";
while(Serial.available()>0)
{
char cmd_char = Serial.read();
cmd+=String(cmd_char);
delay(1);
}
Serial.println(cmd);
if(cmd.startsWith("A"))
{
cmd_s='A';
for(int i=3,j=0;i<cmd.length()-1;i++)
{
if(cmd[i]==' ')
{
string_k[j]=i;
Serial.print(i);
Serial.println(" ");
j++;
}
}
int io=(cmd.substring(2,string_k[0])).toInt();
io_zhixing[io]=0;
time_last[io]=millis();
time_low_delay[io]=long(1000.0*((cmd.substring(string_k[0]+1,string_k[1])).toFloat()));
time_high_delay[io]=long(1000.0*((cmd.substring(string_k[1]+1)).toFloat()));
Serial.println(io,DEC);
Serial.println(time_last[io],DEC);
Serial.println(time_low_delay[io],DEC);
Serial.println(time_high_delay[io],DEC);
io_zhixing[13]=1;
#ifndef A0
io_zhixing[14]=1;
#endif
#ifndef A1
io_zhixing[15]=1;
#endif
#ifndef A2
io_zhixing[16]=1;
#endif
#ifndef A3
io_zhixing[17]=1;
#endif
#ifndef A4
io_zhixing[18]=1;
#endif
#ifndef A5
io_zhixing[19]=1;
#endif
}
else if(cmd.startsWith("B"))
{
cmd_s='B';
}
else if(cmd.startsWith("C"))
{
cmd_s='C';
}
}
//Serial.println(cmd);
currentMillis=millis();
if(cmd_s=='A')
{
for(int i=2;i<=19;i++)
{
if(io_zhixing[i]==0)
{
if(((currentMillis-time_last[i])>time_low_delay[i])&&(!io_state[i]))
{
Serial.println(currentMillis);
Serial.println(time_last[i]);
Serial.println(currentMillis-time_last[i]);
Serial.println("-------------------------------------jinlai");
digitalWrite(i,HIGH);
io_state[i]=1;
time_last[i]=millis();
currentMillis=millis();
}
if(((currentMillis-time_last[i])>time_high_delay[i])&&io_state[i])
{
Serial.println("-------------------------------------jinlai");
digitalWrite(i,LOW);
io_state[i]=0;
time_last[i]=millis();
io_zhixing[i]=1;
}
}
}
}
else if(cmd_s=='B')
{
int io=(cmd.substring(2)).toInt();
digitalWrite(io,LOW);
io_state[io]=0;
io_zhixing[io]=1;
cmd_s='A';
// for(int i=2;i<=19;i++)
// {
// digitalWrite(i,LOW);
// io_state[i]=0;
// }
}
else if(cmd_s=='C')
{
for(int i=2;i<=19;i++)
{
digitalWrite(i,LOW);
io_state[i]=0;
io_zhixing[i]=1;
}
cmd_s='A';
}
//Serial.println("------------------------------end");
}