подпрограмма с 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(){
}
@benjamin nikkel, 👍1
Обсуждение1 ответ
▲ 1
Если «pwm_value» достигает значения 1401 или выше и остается там, «time_delay» никогда не изменится со своего значения 7.
Для широкого применения я бы убрал присваивание 7 значению «pwm_value» в «void loop()» и позволил бы коду «case else» внести существенные изменения и поддерживать их до тех пор, пока не появится новое значение «pwm_value». Вставьте значение «else» в условие for, где «pwm_value» равно 1401 или больше (например, 7, если это то, что вам нужно).
,
@DLSmith
Смотрите также:
- При использовании Arduino Uno в качестве ISP: "Yikes! Invalid device signature" - плохое соединение, неверную конфигурацию или неверную версию avrdude?
- Связь ATtiny85 с компьютером через USB
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- avrdude: ошибка проверки, первое несоответствие в байте 0x0000 : 0x00 != 0x16 с использованием USBasp
- Радиочастотное дистанционное управление с использованием VirtualWire на ATtiny85, работающем на частоте 8 МГц на внутреннем генераторе
- I2C с ATtiny85 на частоте 8 МГц с использованием библиотеки TinyWireM
- Эмуляция 1-проводных устройств
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
Вы уверены, что 'pwm_value <= 1450' всегда верно? Если нет, то код просто пропустит этот цикл while и даже не вызовет speedcw()., @bigjosh
Спасибо, вы были правы, я допустил ошибку с ШИМ, которую я использовал в своем коде, 1300 было самым низким полученным значением. Я новичок в Arduino., @benjamin nikkel
@bigjosh - тебе стоит опубликовать это в качестве ответа, @Greenonline