Arduino 我无法重新运行循环
我使用HC-05与arduino和控制电机。 每次我从我的应用程序向蓝牙发送一个字符(如“R”)时,我希望一个电机一直运行到一个特定的值(k)。我只能发送一次,但当我再次发送“R”时,它就不起作用了。 我希望每当我发送字符“R”时,电机都应该运行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
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);
}
}