Проблема с библиотекой <JC_Button.h>
- Войдите на сайт для отправки комментариев
Пт, 30/11/2018 - 00:13
Парни, помогите разобраться. Вот код:
btnLEFT.read(); // Если нажатие короткое, то включаем / выключаем левый поворотник if (btnLEFT.wasReleased()){leftTurn = !leftTurn;} // Если нажатие длинное, и оба джойстика отпущены, то уменьшаем расходы if (btnLEFT.pressedFor(LONG_PRESS)) {consumption --; if (consumption == 0) {consumption = 1;} MainScreen(); delay(200);} // Считываем показания BUTTON_RIGHT / правый поворотник btnRIGHT.read(); // Если нажатие короткое, то включаем / выключаем правый поворотник if (btnRIGHT.wasReleased()){rightTurn = !rightTurn;} // Если нажатие длинное, и оба джойстика отпущены, то увеличиваем расходы if (btnRIGHT.pressedFor(LONG_PRESS)) {consumption ++; if (consumption == 6) {consumption = 5;} MainScreen(); delay(200);} // Считываем показания BUTTON_PROG / включаем / выключаем фары btnPROG.read(); // if (btnPROG.wasReleased()) {headLight = !headLight;} // btnPROG.read(); // Если нажатие короткое, то включаем / выключаем правый поворотник if (btnPROG.wasReleased()){headLight = !headLight;} // Считываем показания BUTTON_OK / включаем / выключаем спецсигнал btnOK.read(); if (btnOK.wasReleased()) {specialLight = !specialLight;}
Библиотека <JC_Button.h>
отрабатываются только первые 2 кнопки, которые идут по тексту. т.е. в данном случае будут работать кнопки btnLEFT и btnRIGHT. Поставлю первым btnOK и btnPROG - будут отрабатываться только они...
по кнопкам берите лучше титоновый велосипед, библиотека проверенная.
Ну это не код, а фрагмент кода ...
Так, на всякий случай, а почему изменение первых двух кнопкок вызывает перерисовку экрана, а остальных - нет ?
Ну, это франмент кода который приводит к ошибке. Вернее, работает не как хочется.
Пилю универсвльный пульт управляние на nrf24. Есть экран, на котором отображается номер выбранной модели и "расход", (не знаю, как правильно назвать, вроде как consumption, т.е. максимальная скорость). Длительное нажатие кнопок меню "влево" и "вправо" по идее должно увеличивать и уменьшать "расход". При этом меняется отображаемая информация на экране.
Короткое нажатие на кнопки работает как триггер для каждого канала, отображение на экране не требуется.
Ну это не код, а фрагмент кода ...
Так, на всякий случай, а почему изменение первых двух кнопкок вызывает перерисовку экрана, а остальных - нет ?
наверное потому что для остальных перерисовка экрана не прописана.
Попробую "велосипед"
Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.
Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.
Если необходимо различать короткое и длинное нажатие, то на короткое нажатие необходимор реагировать только при отсутствии длинного.
Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.
Если необходимо различать короткое и длинное нажатие, то на короткое нажатие необходимор реагировать только при отсутствии длинного.
А чем они различаются? 2 кнопки с отрабатыванием короткого и длинного нажатия, две - с отрабатыванием просто короткого...
Проблема в том, что отрабатываются только ЛЮБЫЕ 2 кнопки в коде...
Уважаемый, прочитав этот пост, я так и не понял, что Вы хотите получить. Напишите как-нибудь попроще.Типа:
1) Если кнопка 1 будет нажата и отпущена в течении 1 секунды, то я включаю лампочку
2) Если кнопка 2 будет нажата и отпущена в течении 1 секунды, то я включаю бомбу
3) Если кнопка 1 будет нажата и более 1 секунды, то я выключаю лампочку
....
и. т.д.
Иначе все, что Вы пытаетесь запрограммировать упирается в Ваше непонятие того, что Вы хотите получить.
Уважаемый, прочитав этот пост, я так и не понял, что Вы хотите получить. Напишите как-нибудь попроще.Типа:
1) Если кнопка 1 будет нажата и отпущена в течении 1 секунды, то я включаю лампочку
2) Если кнопка 2 будет нажата и отпущена в течении 1 секунды, то я включаю бомбу
3) Если кнопка 1 будет нажата и более 1 секунды, то я выключаю лампочку
....
и. т.д.
Иначе все, что Вы пытаетесь запрограммировать упирается в Ваше непонятие того, что Вы хотите получить.
Блин... Ну разве можно так читать?
Спасибо за разные варианты.
Попробовал, но ни в одном случае не смог добиться 100% повторяемости результата. Иной раз приходится повторно нажимать на кнопку, чтоб свершилось "чудо". Это так и надо или у меня слишком завышенные требования к результату?
Спасибо за разные варианты.
Попробовал, но ни в одном случае не смог добиться 100% повторяемости результата. Иной раз приходится повторно нажимать на кнопку, чтоб свершилось "чудо". Это так и надо или у меня слишком завышенные требования к результату?
Если же судить по исходному сообщению, то там у Вас куча delay(200) - с ним ничего устойчиво работать и не должно.
то там у Вас куча delay(200) - с ним ничего устойчиво работать и не должно.
Не куча, а 2... Это при обработке состояния "долго нажато" изменялись значения счетчика и выводилось значение на экран. Задержка нужна, чтоб цифры не так быстро бежали.
В обшем, побдел я эту неприятность. Дело было не в бабине. И Serial.println (параметр) очень помог. Код прекрасно отрабатывал все нажатия и менял значения соответственно, а изменения значений на какие попало происходило при заполнении массива.
Код прекрасно отрабатывал все нажатия и менял значения соответственно, а изменения значений на какие попало происходило при заполнении массива.
В итоге после полутора десятков сообщений пришли к тому, что ошибка была за пределами выложенной части кода :)
Это я к тому. что не зря всегда новичков просят выложить полный код, а не какие-то обрывки...
В итоге после полутора десятков сообщений пришли к тому, что ошибка была за пределами выложенной части кода :)
Это я к тому. что не зря всегда новичков просят выложить полный код, а не какие-то обрывки...
Зато я узнал еще несколько методов обработки событий с кнопками:)
Но никто из мЭтров не сказал, "слыш, нуб, тут у тебя все нормально, ищи в другом месте"
Но никто из мЭтров не сказал, "слыш, нуб, тут у тебя все нормально, ищи в другом месте"
А вообще, интересно - с чего это Вы решили, что "тут у тебя все нормально"? По выложенному фрагменту этого не скажешь.
И даже, зараза, не сказал, в какой строке этого другого места.
А вообще, интересно - с чего это Вы решили, что "тут у тебя все нормально"? По выложенному фрагменту этого не скажешь.
Я не спорю, программы пишу... Ну не долго. Очень не долго. Но я учусь.
Код, может быть и не идеален, но он работает.
А можно узнать, на что обратить внимание в приведенном коде для улучшения процесса?
vdm, Вы, вообще-то, начинаете совсем не с того.
Начинать нужно с подробного описания алгоритма. По-русски.
Вы же предлагаете взять код с ошибками и "исправить" его.
Но, чтобы исправить, нужно знать, как именно он должен работать.
Вы понимаете разницу между "сейчас работает" и "должен работать"?
Если я даже затрачу время на разбор криво написанного кода, я все равно смогу узнать только как он работает, а узнать, как он должен работать, мне неоткуда.
Дальше: отладка - процесс примерно на порядок более трудоемкий, чем написание кода. Следовательно, код надо писать так, чтобы его легче было отлаживать. Следовательно, во многих случаях переписать код с нуля - рациональнее, чем пытаться исправить существующий код. А чтобы написать с нуля, опять же, нужно описание алгоритма, и совершенно не нужен неправильно работающий код.
vdm, Вы, вообще-то, начинаете совсем не с того.
Хорошо, учту. Исправлюсь.
Начинать нужно с подробного описания алгоритма. По-русски.
Код должен обабатывать кнопки btnLEFT, btnRIGHT, btnPROG и btnOK.
В результате короткого нажатия инвертируется состояние leftTurn, rightTurn, headLight и specialLight соответственно.
Длительное нажатие и удержание кнопок btnLEFT и btnRIGHT приводит к уменьшению и увеличению переменной consumption.
Переменные leftTurn, rightTurn, headLight и specialLight типа boolean.
- integer
Значения переменных leftTurn, rightTurn, headLight, specialLight и consumption записываются с массив и отправоляются в модуль nrf24l01.
Изначально был обьявлен массив port[6] куда я все и записывал. При этом возникала ошибка в переменных headLight, specialLight и consumption.
Когда изменил размер массива на 8, ошибка ушла.
Вероятнее всего вся проблема была в том, что я записывал в массив как значения int, так и boolean
если у вас так:
то вообще-то нужно создавать массив int port[7], если что.
если у вас так:
то вообще-то нужно создавать массив int port[7], если что.
Ну правильно... Если [6] то и пунктов 6.... [0] то не считаем... В)))))