Проблема подключения кнопки к шаговому двигателю

Я не могу заставить этот код работать. Код кнопки и код шагового двигателя работают отдельно. Однако, когда я кодирую с помощью оператора 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;
    }
  }
}

, 👍0

Обсуждение

Чего должно достичь это "если" в вашем цикле "for", который все время меняет значение "i" на 5?, @Majenko

не могли бы вы объяснить, чего вы пытаетесь достичь?, @Vaibhav


1 ответ


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, он просто заставил бы каждый выход кратковременно активироваться по очереди. Если это то, что вам нужно, чтобы управлять своим мотором, то прекрасно. Однако он никогда не запустится, так как остальная часть программы - просто чепуха.

,