Не нужно ждать, пока оператор if будет запущен

Мне нужен совет. Я пытаюсь закодировать установку из 4 шаговых двигателей, которые подключены к клавиатуре, и 2 двигателей постоянного тока, которые работают на конвейерной ленте. Моя цель состоит в том, чтобы иметь возможность нажать клавишу, соответствующий шаговый двигатель запускается, и DC-двигатели запускаются также и работают в течение нескольких секунд после шага. Однако я хочу иметь возможность нажимать несколько клавиш, пока работают двигатели постоянного тока. Прямо сейчас мне нужно подождать, пока двигатели постоянного тока будут сделаны, прежде чем я смогу нажать другую клавишу. Как я могу это сделать?

Я думаю, что возникнут проблемы, если я закодирую его с помощью таймера, так как клавиши ждут ввода. У меня нет никаких сенсоров.

Вот мой код:

#include <Keypad.h>
#include <Stepper.h>

const int stepsPerRevolution = 1024;

Stepper myStepper1(stepsPerRevolution, 22, 26, 24, 28);
Stepper myStepper2(stepsPerRevolution, 32, 36, 34, 38);
Stepper myStepper3(stepsPerRevolution, 23, 27, 25, 29);
Stepper myStepper4(stepsPerRevolution, 33, 37, 35, 39);

const int IN1 = 47;
const int IN2 = 45;
const int IN3 = 51;
const int IN4 = 49;

const int ENA = 43;
const int ENB = 53;



const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'D','C','B','A'},
  {'H','G','F','E'},
  {'L','K','J','I'},
  {'P','O','N','M'}
};

byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
   myStepper1.setSpeed(10);
   myStepper2.setSpeed(10);
   myStepper3.setSpeed(10);
   myStepper4.setSpeed(10);

  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (ENA, OUTPUT);
  pinMode (ENB, OUTPUT);

}
  
void loop(){
 // char key = keypad.getKey();
 char key = keypad.waitForKey();


   if (key){
    Serial.println(key);
//control speed 
  analogWrite(ENA, 200);
  analogWrite(ENB, 200); 
//control direction 
int onTime   = 5000;
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);



 
// ----------------------------------Stepper1-----------------------------

        // just print the pressed key
   if (key == 'A' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper1.step(256);
  delay(100);
}

  // just print the pressed key
   if (key == 'E' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper1.step(512);
  delay(100);
}

  if (key == 'I' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper1.step(768);
  delay(100);
  }

  if (key == 'M' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper1.step(1024);
  delay(100);
  }


//-----------------------Stepper2------------------------

if (key == 'B' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper2.step(256);
  delay(100);
}

  // just print the pressed key
   if (key == 'F' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper2.step(512);
  delay(100);
}


  if (key == 'J' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper2.step(768);
  delay(100);
  }


  if (key == 'N' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper2.step(1024);
  delay(100);
  }


 //------------------------Stepper3--------------------

if (key == 'C' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper3.step(256);
  delay(100);
}

  // just print the pressed key
   if (key == 'G' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper3.step(512);
  delay(100);
}


  if (key == 'K' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper3.step(768);
  delay(100);
  }


  if (key == 'O' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper3.step(1024);
  delay(100);
  }

 //------------------------Stepper4--------------------

if (key == 'D' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper4.step(256);
  delay(100);
}

  // just print the pressed key
   if (key == 'H' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper4.step(512);
  delay(100);
}


  if (key == 'L' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper4.step(768);
  delay(100);
  }


  if (key == 'P' ){
    Serial.println(key);
     // step one revolution in one direction:
  Serial.println("clockwise");
  myStepper4.step(1024);
  delay(100);
  }


//---------DC_Motor---------

   delay(onTime);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);

 }
}

, 👍0

Обсуждение

Вы проверили [millis()](https://www.arduino.cc/reference/en/language/functions/time/millis/)?, @Fahad

Если вы хотите знать, как использовать millis (), чтобы избежать использования delay (), проверьте пример BlinkWithoutDelay в Arduino IDE. Файл->Примеры->>02.Digital->>>BlinkWithoutDelay., @Fahad

Чтобы делать несколько вещей одновременно, вам нужно избавиться от операторов delay (), а также от оператора waitForKey (). Вместо этого библиотека клавиатуры предлагает возможность добавить прослушиватель событий с функцией " keypad.addEventListener(keypadEvent)". Посмотрите на пример на странице arduino: https://playground.arduino.cc/KeypadTutorial/EventKeypad/, @Kerbolosh


1 ответ


1

Время задержки(в ontime); заявление в //---------DC_Motor--------- раздел вашего кода мешает что-то еще происходит до конца мотор запустить. Вместо того, чтобы откладывать, вам нужно проверить, как долго работает двигатель, и ничего не делать, если это время еще не достигнуто. Как указывали другие, пример программы BlinkWithoutDelay демонстрирует, как это сделать. Но короче говоря, моторная секция должна делать:

// Пуск двигателя здесь
timeMotorStarted = millis();
   :
   :
   :
if( millis() - timeMotorStarted > onTime ){  // мотор работал достаточно долго?
  // остановите двигатель
}
,