Не нужно ждать, пока оператор 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);
}
}
@user76578, 👍0
Обсуждение1 ответ
Время задержки(в ontime);
заявление в //---------DC_Motor---------
раздел вашего кода мешает что-то еще происходит до конца мотор запустить. Вместо того, чтобы откладывать, вам нужно проверить, как долго работает двигатель, и ничего не делать, если это время еще не достигнуто. Как указывали другие, пример программы BlinkWithoutDelay демонстрирует, как это сделать. Но короче говоря, моторная секция должна делать:
// Пуск двигателя здесь
timeMotorStarted = millis();
:
:
:
if( millis() - timeMotorStarted > onTime ){ // мотор работал достаточно долго?
// остановите двигатель
}
- Как я могу использовать степпер для определенной степени?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Шаговый двигатель не поворачивается/не поворачивается против часовой стрелки
- Шаговый двигатель с концевыми выключателями
- Запустить два степпера одновременно
- Попытка понять постоянную скорость AccelStepper
- Шаговый двигатель - концевой выключатель положения
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
Вы проверили [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