Функция выполняется только 1 раз
- Войдите на сайт для отправки комментариев
Вс, 20/10/2019 - 14:25
Доброго дня. Помогите, пожалуйста, не могу понять почему функция "walk" выполняется только 1 раз.
#include <IRremote.h> // Подключаем библиотеку инфракрасного приемника IRrecv irrecv(3); // Указываем вывод, к которому подключен приемник decode_results results; bool b_walk = false; #define RIGHT_FORWARD 14 // Пин 1 мотора (пин А0) для L298N #define LEFT_FORWARD 16 // Пин 2 мотора (пин А2) для L298N void setup() { Serial.begin(9600); // Инициализация последовательного порта irrecv.enableIRIn(); // Инизиализаця IR приемника for(int8_t i = 14; i <= 19; i++){ // С помощью цикла указываем аналоговые порты, как выход pinMode(i, OUTPUT); // С помощью цикла указываем аналоговые порты, как выход } } void loop() { ir(); } void ir() { if ( irrecv.decode( &results )) { // Если данные пришли if (results.value == 0xE9F1A5C0){b_walk = !b_walk; walk(b_walk, LEFT_FORWARD, RIGHT_FORWARD, 300);} irrecv.resume(); // Принимаем следующую команду } } void walk(bool b_walk, int8_t act_a, int8_t act_b, uint16_t stopping){ if (b_walk == true){ digitalWrite(act_a, HIGH); delay(stopping); digitalWrite(act_a, LOW); delay(stopping); digitalWrite(act_b, HIGH); delay(stopping); digitalWrite(act_b, LOW); delay(stopping); } }
насколько я вижу. функция должна выполнятся не один раз, а "через раз". Один раз послали команду - функция выполнилась, второй раз послали - ничего не произошло. Третий раз - выполнилась, четвертый - опять ничего. Так написан код.
Да. По задумке при однократном нажатии кнопки пульта функция должна начать выполняться, пока булевая переменная истинна.
Но так не происходит. Она не работает в цикле. Код выполняется только однократно. Для повторного запуска нужно вновь нажать кнопку.
При этом до повторного нажатия кнопки булевая переменная сохраняет свое состояние, как истина.
В целом мне необходимо, такая логика:
а) 1 мотор включился
б) 1 мотор работает в течении 300 мс
в) 1 мотор останавливается
г) 2 мотор включился
д) 2 мотор работает в течении 300 мс
е) 2 мотор останавливается
ж) Повторение цикла
Если избавиться от булевой переменной, то все-равно функция "walk" выполняется только 1 раз.
Реализованное в коде не соответствует алгоритму, описанному словами. Поэтому и "не работает, как надо".
Я нашел причину:
irrecv.resume();
// Принимаем следующую команду
Если избавиться от этой строки, то все начинает работать, но и новые команды не принимаются. Прошу помощи, я в тупике.
Реализованное в коде не соответствует алгоритму, описанному словами. Поэтому и "не работает, как надо".
А не могли бы Вы указать, что именно не правильно? Мне кажется, что я грамотно описал проблему и не прошу полностью за меня с самого начала переписать код.
Вы как врач из поликлиники: "а давайте-ка попьем эти таблеточки от головы" ... " нога, значит, не прошла за месяц - странно, таблеточки были хорошие".
Реализованное в коде не соответствует алгоритму, описанному словами. Поэтому и "не работает, как надо".
А не могли бы Вы указать, что именно не правильно?
Работа с драйвером двигателя производится в блокирующем стиле. Поэтому никакое воздействие извне прервать ее не способно. А переписывать придется процентов на 80...
irrecv.resume();
это хорошая таблетка. В код от Вас чтение новая команда, еслиwalk()
имеет работа завершено. еслиwalk()
имеет выполнение, чтение новая команда от รพ блокировка.irrecv.resume();
это хорошая таблетка. В код от Вас чтение новая команда, еслиwalk()
имеет работа завершено. еслиwalk()
имеет выполнение, чтение новая команда от รพ блокировка.Да, но мне не понятна такая вещь:
Я в функции "ir" только меняю состояние внешней булевой переменной. Почему она останавливает цикл после однократного выполнения если для функции "walk" булевая переменная остается истиной?
А не могли бы Вы указать, что именно не правильно? Мне кажется, что я грамотно описал проблему и не прошу полностью за меня с самого начала переписать код.
посмотрите в код - у вас выполнение команды walk() стоит внутри условия строки 21 "если пришли данные с пульта". Вот оно и выполняется только если на пульте кнопку нажать
А не могли бы Вы указать, что именно не правильно? Мне кажется, что я грамотно описал проблему и не прошу полностью за меня с самого начала переписать код.
Спасибо. Вроде начинают глаза открываться )))
Деньги на счёте есть? Может там только одно выполнение оплачено?
Да вроде норм. Баланс положительный.
А не могли бы Вы указать, что именно не правильно? Мне кажется, что я грамотно описал проблему и не прошу полностью за меня с самого начала переписать код.
Спасибо. Вроде начинают глаза открываться )))
Согласен. Вроде и начинаешь что-то понимать, потом поднимаешь те участки кода. к которым не возвращался несколько месяцев и не понимаешь, как это вообще работает.