我无法重新运行循环

时间:2019-09-10 17:30:00

标签: arduino bluetooth hc-05

我正在将HC-05与arduino配合使用并控制电动机。 每次我从应用程序向蓝牙发送字符(例如“ R”)时,我都希望电动机运行到特定值(k)。我一次可以,但是当我再次发送“ R”时,它不起作用。 我希望每当我发送字符“ R”时,电动机都应运转。

Arduino code

#define stpwm 13
#define stdir 12
int j=0;
int k=20;
char inChar;

void setup() {
  Serial.begin(9600);
  pinMode(stpwm, OUTPUT);
  pinMode(stdir, OUTPUT);

}
void loop() {
 if (Serial.available() > 0 ) { // Checks whether data is comming from the serial port
    inChar = (Serial.read()); // Reads the data from the serial port

  }

  if (inChar == 'R')
  {

  if (j<=k)

  {
    analogWrite(AN2, 100);
    analogWrite(AN1, 50);
    analogWrite(stpwm, 50);

    digitalWrite(stdir, HIGH);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    delay(100);  
    Serial.println(j);
    j++;
}
analogWrite(stpwm,0);
}

2 个答案:

答案 0 :(得分:0)

尝试

  if (inChar == 'R')
  {

  while (j<=k)

  {
    analogWrite(AN2, 100);
    analogWrite(AN1, 50);
    analogWrite(stpwm, 50);

    digitalWrite(stdir, HIGH);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    delay(100);  
    Serial.println(j);
    j++;
}
      j=0;
analogWrite(stpwm,0);
}

答案 1 :(得分:0)

您的代码存在一个主要问题:

用于控制 if语句的变量永远不会重置,因此有一段时间(当 j> = k 时)它永远不会为真,除非您重新启动系统;

尽管Pradeep的答案很有可能奏效,但它会将您的系统锁定在一个循环中,而而j小于k

因此,如果您想在系统中实现将来的控制代码,则可能会成为问题。例如,如果您需要将紧急停车设置为另一个字母,则只有当您没有被困在 while循环中时,才会读取该信息。

我建议使用一个非常简单的结构: else ;如下:

#define stpwm 13
#define stdir 12
#define k 20

uint8_t j=0;
char inChar[1];

void setup() {
  Serial.begin(9600);
  pinMode(stpwm, OUTPUT);
  pinMode(stdir, OUTPUT);

}
void loop() {
 if (Serial.available() > 0 ) { // Checks whether data is comming from the serial port
    inChar = (Serial.read()); // Reads the data from the serial port

  }

  if (inChar == 'R')
  {

     if (j<=k)

     {
       analogWrite(AN2, 100);
       analogWrite(AN1, 50);
       analogWrite(stpwm, 50);

       digitalWrite(stdir, HIGH);
       digitalWrite(IN1, HIGH);
       digitalWrite(IN2, LOW);
       delay(100);  
       Serial.println(j);
       j++;
     }
  }
  else{
     //  resets both j and inChar, so that the iteration does not restart
     j = 0;
     inChar = "";
     // turn off signal only when this criteria is met: j > k
     analogWrite(stpwm, 0);
  }
}

我还对您的代码做了一些小的更改:

  • k 定义为常量,因为您不会在程序中对其进行更改
  • 将j声明为 8位整数,该整数的值介于0到255之间;这样可以节省内存
  • 修改了您关闭 stpwm 的位置。按照设置的方式,您的信号总是在每次迭代结束时关闭,这可能会损坏您的电机(您在执行另一种脉冲调制的方式)

希望这会有所帮助。