2017-09-25 392 views
2

我需要帮助Arduino中的按钮打开和关闭。我想在我的技术课上为我的课程制作自己的Arduino汽车。Arduino按钮开启和关闭功能

这是一个连接到2个电机,Arduino板和Arduino传感器屏蔽v5.0的晶体管电路。我输入的代码用于开/关功能,但它不会关闭,只能保持永久。

代码的第一个:

//variables 
int led = 13; //led on indicator 
int motor1 = 12; //right motor 
int motor2 = 11; //left motor 
int button = A0; //on and off button 
int val = 0; //value for on press button 

void setup() { 
    //setting up code to definition of pins 
    Serial.begin(9600); 
    pinMode(led, OUTPUT); 
    pinMode(motor1, OUTPUT); 
    pinMode(motor2, OUTPUT); 
    pinMode(button, INPUT); 
} 

void loop() { 
    //looping the code to execute 
    //button code for on and off 
    val = digitalRead(button); 
    if (val == LOW) { 
    digitalWrite(led, HIGH); 
    start_driving(); 
    Serial.println("Turned on!"); 
    Serial.println("It is driving!"); 
    } else { 
    Serial.println("Not turned on!"); 
    } 
} 

//functions 
void start_driving() { 
    //The driving function 
    digitalWrite(motor1, HIGH); 
    digitalWrite(motor2, HIGH); 
    delay(500); 
    turn_left(); 
    digitalWrite(motor1, HIGH); 
    digitalWrite(motor2, HIGH); 
    delay(500); 
    turn_right(); 
    digitalWrite(motor1, HIGH); 
    digitalWrite(motor2, HIGH); 
    delay(1000); 
} 

//turn right 
void turn_right() { 
    //turning right at 90 degrees 
    digitalWrite(motor1, LOW); 
    digitalWrite(motor2, HIGH); 
    delay(500); 
    digitalWrite(motor1, LOW); 
    digitalWrite(motor2, LOW); 
    delay(78); 
} 

//turn left 
void turn_left() { 
    //turning left a 90 degrees 
    digitalWrite(motor1, HIGH); 
    digitalWrite(motor2, LOW); 
    delay(500); 
    digitalWrite(motor1, LOW); 
    digitalWrite(motor2, LOW); 
    delay(78); 
} 

现在我想提出一个新的.ino文件重新开始(我仍然保持第一位仍然),但我试图让一个按钮和关闭功能开启的领导,也被称为激活

void start_driving() { 
} 

所以我希望你明白我的意思,我希望我做意义上的空函数。哦,如果你想要,也可以帮助我解决驾驶功能,例如帮助我右转或左转或前进或后退功能。那么你能帮我吗?

+0

你使用下拉? –

+0

“那么你能帮我吗?”。发布问题就足够了。你不必求助 – Piglet

回答

0

它不停的原因很简单:你从未告诉他们停下来。在关闭按钮的情况下,它将完成start_driving()功能,并且最后的命令对于电机为高。剩下的时间它将停留在loop()功能的其他部分,并且永远不会被告知为低电平。 因此,最后在start_driving()函数中添加一些digitalWrite(motor1/2, LOW);,或者在loop()的其他部分中添加一些digitalWrite(motor1/2, LOW);

我做了一些改变你的代码,并添加所需的零件(LED有一个像你的汽车同样的问题):

#define LEDPIN   13  // Use defines, because the values won't change anyway 
            // For the same reason they are Uppercase like LOW, HIGH, INPUT ... 
            // It is an indicator for non changeing values 
#define RIGHTMOTORPIN 11  // Changed to PWM capable Pins, so you can 
#define LEFTMOTORPIN 10  // have a variable speed later on 
#define BUTTONPIN  A0 

#define RIGHT   0   // For more readability in the makeTurn function 
#define LEFT   1 

void setup() { 
    Serial.begin(9600); 

    pinMode(LEDPIN, OUTPUT); 
    pinMode(RIGHTMOTORPIN, OUTPUT); 
    pinMode(LEFTMOTORPIN, OUTPUT); 

    pinMode(BUTTONPIN, INPUT); 
} 

void loop() { 
    if(digitalRead(BUTTONPIN) == LOW){ 
    digitalWrite(LEDPIN, HIGH); 
    Serial.println("Turned on!");    // Put it in front, so it isn't shown after the drive 
    Serial.println("It is driving!"); 
    startDriving(); 
    }else{ 
    Serial.println("Not turned on!"); 
    digitalWrite(LEDPIN, LOW);    // I guess the led should be turned off too. 
    parallelMotorControl(LOW);    // THIS is the reason, why it continued driving! 
               // You never stopped the Motors 
    } 
} 

void startDriving() { 
    parallelMotorControl(HIGH); 
    delay(500); 
    makeTurn(RIGHT); 
    parallelMotorControl(HIGH); 
    delay(500); 
    makeTurn(LEFT); 
    parallelMotorControl(HIGH); 
    delay(1000); 
} 

// Reuse more code, that is similar. 
void makeTurn(bool turnDirection){ 
    if(turnDirection){       // Right turn 
    digitalWrite(RIGHTMOTORPIN, LOW); 
    digitalWrite(LEFTMOTORPIN, HIGH); 
    }else{          // Left turn 
    digitalWrite(RIGHTMOTORPIN, HIGH); 
    digitalWrite(LEFTMOTORPIN, LOW); 
    } 
    delay(500); 
    parallelMotorControl(LOW); 
    delay(78); 
} 

void parallelMotorControl(bool motorState){ 
    digitalWrite(RIGHTMOTORPIN, motorState); 
    digitalWrite(LEFTMOTORPIN, motorState); 
}