Проблема подключения кнопки к шаговому двигателю
Я не могу заставить этот код работать. Код кнопки и код шагового двигателя работают отдельно. Однако, когда я кодирую с помощью оператора if, говорящего, что при нажатии кнопки двигатель будет двигаться или нет. ПОЖАЛУЙСТА, ПОМОГИТЕ.
const int buttonPin = 7;
int buttonState = 0;
int serialData = 0;
#define IN_1 8
#define IN_2 9
#define IN_3 10
#define IN_4 11
#define DELAY_TIME 30
int i = 0;
void setup() {
Serial.begin(9600);
pinMode(IN_1, OUTPUT);
pinMode(IN_2, OUTPUT);
pinMode(IN_3, OUTPUT);
pinMode(IN_4, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.print ("start");
}
void loop() {
buttonState = digitalRead (buttonPin);
if (buttonState == HIGH) {
//delay(1000);
for (i=0; i<4; i++)
Serial.println ("pressed");
switch (i) {
case 3: // ASCII value for '1'
digitalWrite(IN_1, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_1, LOW);
break;
case 1: // ASCII value for '2'
digitalWrite(IN_2, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_2, LOW);
break;
case 0: // ASCII value for '3'
digitalWrite(IN_3, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_3, LOW);
break;
case 2: // ASCII value for '4'
digitalWrite(IN_4, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_4, LOW);
break;
default:
Serial.println("Not a valid case");
break;
}
if (i == 4) {
i = 0;
} else {
i = 5;
}
}
}
@Kikilizer, 👍0
Обсуждение1 ответ
Ваш код вообще не имеет смысла. Давайте разберемся с этим. Сначала мы переформатируем код с помощью автоматического форматирования (AStyle) в UECIDE:
const int buttonPin = 7;
int buttonState = 0;
int serialData = 0;
#define IN_1 8
#define IN_2 9
#define IN_3 10
#define IN_4 11
#define DELAY_TIME 30
int i = 0;
void setup()
{
Serial.begin(9600);
pinMode(IN_1, OUTPUT);
pinMode(IN_2, OUTPUT);
pinMode(IN_3, OUTPUT);
pinMode(IN_4, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.print("start");
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
//delay(1000);
for (i = 0; i < 4; i++) {
Serial.println("pressed");
}
switch (i) {
case 3: // ASCII value for '1'
digitalWrite(IN_1, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_1, LOW);
break;
case 1: // ASCII value for '2'
digitalWrite(IN_2, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_2, LOW);
break;
case 0: // ASCII value for '3'
digitalWrite(IN_3, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_3, LOW);
break;
case 2: // ASCII value for '4'
digitalWrite(IN_4, HIGH);
delay(DELAY_TIME);
digitalWrite(IN_4, LOW);
break;
default:
Serial.println("Not a valid case");
break;
}
if (i == 4) {
i = 0;
} else {
i = 5;
}
}
}
Теперь, когда мы исправили форматирование, мы видим некоторые очень странные вещи:
if (buttonState == HIGH) {
Сначала мы делаем это для каждой итерации цикла, в которой нажата кнопка. Это означает, что мы делаем это снова и снова, пока вы не отпустите кнопку.
for (i = 0; i < 4; i++) {
Serial.println("pressed");
}
Теперь мы печатаем слово "прессованный" четыре раза. После этого я
буду установлен на 4.
Теперь переключатель
будет принимать входное значение 4, что является "Недопустимым случаем". Так что ничего не случится.
Затем:
if (i == 4) {
i = 0;
} else {
i = 5;
}
i
всегда равно 4, поэтому он всегда будет устанавливать его равным 0. Я понятия не имею, чего именно должен достичь этот блок. Если бы он должен был быть внутри цикла for
выше, то он просто убил бы цикл на первой итерации, так как i
, когда 0, не был бы 4, поэтому был бы изменен на 5, что равно> 4. Это не имеет никакого смысла и не может принести ничего ценного.
Что касается переключателя
: если бы он находился внутри цикла for
и мог получать некоторые различные значения i
, он просто заставил бы каждый выход кратковременно активироваться по очереди. Если это то, что вам нужно, чтобы управлять своим мотором, то прекрасно. Однако он никогда не запустится, так как остальная часть программы - просто чепуха.
- Непрерывное обнаружение кнопок для шагового управления
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Управление направлением шагового двигателя с помощью кнопок.
- Как прервать функцию цикла и перезапустить ее?
Чего должно достичь это "если" в вашем цикле "for", который все время меняет значение "i" на 5?, @Majenko
не могли бы вы объяснить, чего вы пытаетесь достичь?, @Vaibhav