arduino串口指令控制IO口独立输出

今天写了一个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");
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值