подпрограмма с if else не работает

Всё в этом коде работает, как и ожидалось, за исключением подпрограммы speedcw внизу. Она должна изменить переменную time_delay.

#define ENA 2 //контакт 2 на чипе
#define in_A 0 //контакт 0 на чипе IN2
#define in_B 1 //контакт 1 на чипе IN1
#define in_C 3 //контакт 3 на чипе AUX
#define in_D 4 //контакт 4 на чипе AUX

byte PWM_PIN = 5;  //контакт 5 на чипе

int pwm_value = 1500;

int time_delay = 7;

void setup() {
    pinMode(ENA, OUTPUT);
    pinMode(in_A, OUTPUT);
    pinMode(in_B, OUTPUT);
    pinMode(in_C, OUTPUT);
    pinMode(in_D, OUTPUT);
    pinMode(PWM_PIN, INPUT);
}

void step1(){
    //А+,Б+
    digitalWrite(in_A, 1);
    digitalWrite(in_B, 1);
    delay(time_delay);
}

void step2(){
    //А+,Б-
    digitalWrite(in_A, 1);
    digitalWrite(in_B, 0);
    delay(time_delay);
}

void step3(){
    //А-,Б-
    digitalWrite(in_A, 0);
    digitalWrite(in_B, 0);
    delay(time_delay);
}

void step4(){
    //А-,Б+
    digitalWrite(in_A, 0);
    digitalWrite(in_B, 1);
    delay(time_delay);
}

void clockwise(long st){
    long i = 0;
    while( i < st ){
        //шаг1
        step1();
        //шаг2
        step2();
        //шаг3
        step3();
        //шаг4
        step4();
        i++;
    }
}

void counter_clockwise(long st){
    long i = 0;
    while( i < st ){
        //шаг1
        step4();
        //шаг4
        step3();
        //шаг3
        step2();
        //шаг2
        step1();
        i++;
    }
}

void loop() {
    pwm_value = pulseIn(PWM_PIN, HIGH);
    time_delay = 7;

    while (pwm_value <= 1450) {//красный светодиод
        pwm_value = pulseIn(PWM_PIN, HIGH);
        digitalWrite(ENA, 1);
        // digitalWrite(in_C, 1); // красный светодиод
        // digitalWrite(in_D, 0); //зеленый светодиод
        // time_delay = 1;
        speedcw();
        clockwise(2);
    }

    while (pwm_value >= 1550) {//зеленый светодиод
        pwm_value = pulseIn(PWM_PIN, HIGH);
        digitalWrite(ENA, 1);
        // digitalWrite(in_C, 0); //красный светодиод
        // digitalWrite(in_D, 1); //зеленый светодиод
        time_delay = 1;
        // speedccw();
        counter_clockwise(2);
    }

    while ((pwm_value >= 1451)&&(pwm_value <= 1549)) {
        pwm_value = pulseIn(PWM_PIN, HIGH);
        digitalWrite(ENA, 0);
        digitalWrite(in_C, 0);
        digitalWrite(in_D, 0);
    }
}

void speedcw(){
    if (pwm_value <= 900){
        time_delay = 1;
    }
    else if (pwm_value <= 1000){
        time_delay = 2;
    }
    else if (pwm_value <= 1100){
        time_delay = 3;
    }
    else if (pwm_value <= 1200){
        time_delay = 4;
    }
    else if (pwm_value <= 1300){
        time_delay = 5;
    }
    else if (pwm_value <= 1400){
        time_delay = 6;
    }
}

void speedccw(){
}

, 👍1

Обсуждение

Вы уверены, что 'pwm_value <= 1450' всегда верно? Если нет, то код просто пропустит этот цикл while и даже не вызовет speedcw()., @bigjosh

Спасибо, вы были правы, я допустил ошибку с ШИМ, которую я использовал в своем коде, 1300 было самым низким полученным значением. Я новичок в Arduino., @benjamin nikkel

@bigjosh - тебе стоит опубликовать это в качестве ответа, @Greenonline


1 ответ


1

Если «pwm_value» достигает значения 1401 или выше и остается там, «time_delay» никогда не изменится со своего значения 7.

Для широкого применения я бы убрал присваивание 7 значению «pwm_value» в «void loop()» и позволил бы коду «case else» внести существенные изменения и поддерживать их до тех пор, пока не появится новое значение «pwm_value». Вставьте значение «else» в условие for, где «pwm_value» равно 1401 или больше (например, 7, если это то, что вам нужно).

,