Как вы заканчиваете задержку для Arduino? - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время я пытаюсь создать работающую машину плинко с клешней, которая движется вперед и назад по мосту h, меняя двигатель постоянного тока каждые несколько секунд.Мне нужна моя кнопка, чтобы остановить двигатель постоянного тока в середине задержки.Я знаю, что это можно сделать с помощью функции millis (), но я все еще не понимаю, как использовать ее для сценария (видя, что я только начинающий). Если кто-то может мне помочь или изменить мой код,пожалуйста, сделайте это.

    #include <Servo.h>

    Servo servo;

    const int btn_pin = 9;
    const int servo_pin(8);

    const int EN_Pin(3);
    const int Pin_1A(4);
    const int Pin_2A(2);

    int btn_prev = HIGH;



    void setup() {

      servo.attach(servo_pin);
      Serial.begin(9600);


      pinMode(btn_pin, INPUT_PULLUP);
      pinMode(7, OUTPUT);

      pinMode(EN_Pin, OUTPUT);
      pinMode(Pin_1A, OUTPUT);
      pinMode(Pin_2A, OUTPUT);
    }

    void loop() {

        int btn_state;


      btn_state = digitalRead(btn_pin);


      while ( btn_state == HIGH )

        digitalWrite(Pin_1A, HIGH);
        digitalWrite(Pin_2A, LOW);
        analogWrite(EN_Pin, 255);

        delay(1000); 

        digitalWrite(Pin_1A, LOW);
        digitalWrite(Pin_2A, HIGH);
        delay(1000); 




      if ( (btn_prev == HIGH) && (btn_state == LOW) ) {


        digitalWrite(7, HIGH);


        servo.write(45);
        delay(2500);
        servo.write(-45);
        btn_prev = btn_state;

      }

    }

Мой блок схем

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вы НИКОГДА не должны использовать delay () .. это плохая практика .. и считается функцией «блокировки кода».как было сказано ранее .. используйте millis ()

, используя millis (), затем вы можете проверить состояние кнопки как обычно.

0 голосов
/ 15 мая 2018

Для этого вы можете использовать прерывания.

Но вам нужно будет подключить кнопку к определенным контактам на Arduino. Если вы используете Arduino Uno, вам нужно подключить кнопку к контакту № 2 или 3. Список плат и выводов прерывания, которые можно использовать, приведен здесь. https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

const int btn_pin=2; //you could use 3

Сначала вам нужно определить функцию, которая останавливает двигатели

void stopMotors(){
    digitalWrite(Pin_1A, HIGH);  //I am assuming this is the configuration stops the motor in your system.
    digitalWrite(Pin_2A, HIGH);
}

Используйте следующее в вашей функции настройки.

attachInterrupt(digitalPinToInterrupt(btn_pin), stopMotor, FALLING);

Хотя я считаю, что использование прерываний является более простым решением для вас, вы можете использовать миллис следующим образом

long time=millis()+1000; //Change this number to the delay you want.
while((time>millis())&&(digitalRead(btn_pin)==HIGH)); //pin state becomes an escape.

Надеюсь, это поможет.

...