Arduino 我无法重新运行循环

Arduino 我无法重新运行循环,arduino,bluetooth,hc-05,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); pinMod

我使用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);
}
Arduino代码
#定义stpwm 13
#定义stdir 12
int j=0;
int k=20;
焦英寸;
无效设置(){
Serial.begin(9600);
pinMode(stpwm,输出);
pinMode(stdir,输出);
}
void循环(){
如果(Serial.available()>0){//检查数据是否从串行端口提交
inChar=(Serial.read());//从串行端口读取数据
}
如果(英寸=R')
{
如果(j尝试

if(inChar=='R')
{

而(j代码有一个主要问题:

用于控制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);
  }
}
#定义stpwm 13
#定义stdir 12
#定义k20
uint8_t j=0;
半英寸[1];
无效设置(){
Serial.begin(9600);
pinMode(stpwm,输出);
pinMode(stdir,输出);
}
void循环(){
如果(Serial.available()>0){//检查数据是否从串行端口提交
inChar=(Serial.read());//从串行端口读取数据
}
如果(英寸=R')
{
if(jk)
模拟写入(stpwm,0);
}
}
我还对您的代码做了一些小改动:

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

希望这能有所帮助。

因为j大于k?我知道这是因为j大于k。但是当j的值达到k时,我的马达应该停止。当我发送一个字符“R”时,它应该重新启动。怎么做?@jurajreset j如果你收到RIf,我在循环结束时写入j=0,循环会再次启动。有更好的方法吗?你必须重新设置不是在你收到这个角色后才开始的吗
#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);
  }
}