Добрый вечер! Я вот только начал обучение и я захотел сделать код, по задумке которого кнопка переключала бы светодиоды ( один гаснет, другой загорается). И вот, я сделал код. Но увы в коде есть ошибка из-за которой кнопка не переключает на другой пин. То есть когда нажимаешь на кнопку она не переключает, переключить может только в том случае когда ее подержишь. И светодиод один горит изначально . Буду благодарен! Код (C++): #define btn 9 int x = 2 ; void setup() { pinMode (btn , INPUT_PULLUP); pinMode (2 , OUTPUT); pinMode (3 , OUTPUT); Serial.begin(9600); } void loop() { Serial.println(x); digitalWrite(x, HIGH); digitalWrite(x + 1, LOW); digitalWrite(x - 1, LOW); if (digitalRead(btn) == 0) { x = x + 1 ; } if (x > 3) { x = 2 ; } }
Новореги читают то, что их просят сверху страницы, то бишь почитать правила и пост про использования редактора
Надо написать алгоритм обработки нажатия. Для вас 1 сек долго, а 5, а 0.1? Выбрать тот интервал, который можно считать однократным нажатием. Если за выбранный интервал кнопка была нажата, то нужно переключать светодиоды. На мой взгляд, проще ввести 2 флага: 1. Флаг текущего состояния светодиодов 2. Флаг необходимости изменения состояния светодиодов, он же флаг нажатия кнопки.
Пина используется 3, а инитятся два. Уже это странно. И отсутствие элементарного делея, я уж молчу про миллис. Это за одно нажатие сколько раз х+1 сработает, Тысячу? Если бы не serial.print, то и миллион. Послушайте совета, пройдите все мини-проекты от Амперки, там делов на несколько дней. Все станет намного понятнее.
Сначала нарисовать алгоритм. В виде блок-схемы. Начальные значения, и что будем делать после определения нажатий. Потом читаем про дребезг и добавляем код устраняющий этот дребезг. Понятно, что тем кто в теме - задача на пять минут. Но учитывая @Baltika-9 - дольше.
добавлю еще один косяк - выход за границы описанных пинов. пример, если х = 2 то х -1 это пин номер 1 - такой пин в программе не описан если х = 3. то в сво. очередь х+1 - это 4, такого пина тоже нет
Здравствуйте уважаемые форумчане, то что на первый взгляд сделать элементарно, вызывает самы большие трудности. Прошу помочь разобраться с КНОПКОЙ, Есть скетч «меню» и пятипозиционный кнопочный джойстик, нужно что бы при нажатии на кнопки курсор передвигался по пунктам меню, но сейчас если кнопка не нажата в тот момент когда ее опрашивают, то нажатие игнорируется до следующей петли, таким образом кнопку нужно немного подержать нажатой, пока не пройдет «длинный код» и снова не прочтет статус кнопки (около 150мс). Подключить кнопку к пинам прерывания нет возможности (так как в проекте используется большое число кнопок и датчиков. Разнообразные библиотеки не поддаются логики и направлены на устранения дребезга (на фига только, разве интервал повторного нажатия не устраняет дребезг?). Библиотека ALEXGYVER_BUTTON очень медленная и не комфортная на столько, что без нее все работает лучше. Прошу помочь советом.
если "длинный код" нельзя ускорить, то можно опрос кнопки на прерывание по таймеру посадить. естественно избегая всяких кривых библиотек которые еще наверно используют делей
совет тут может быть только один - "длинный код" нужно убыстрить. Вообще, если цикл кода выполняется 150мс - это четкий признак того, что программу нужно выкинуть в помойку. В идеале цикл должен проходить быстрее миллисекунды, самое длинное за две-пять мс, а не за 150. Тогда и библиотеки кнопок начнут нормально работать.
Delay не использую, согласен, что код не красивый и может работать быстрее, но что если нажимать кнопку быстро 5-10 (это достаточно жесткий микрик) то все равно можно не попасть в вызов, и все равно нужно будет использовать прерывание по таймеру и количество переменных соответствующее количеству кнопок для тригера? Попахивает как минимум функцией. Я все правильно понял?
неправильно. Никто не говорил. что кнопку надо нажимать быстрее - надо программу переписать так. чтобы кнопка опрашивалась каждые 5мс, а не 150
у вас каша в голове. Чем "выделение в библиотеку" вам поможет? прерываний будет ровно столько же функция в программе и функция в библиотеке - это одно и тоже
Буш-младший, судя по вопросам здесь и на ардуино.ру - я бы посоветовал вам для начала почитать учебник по Си. хороший, толстый. страниц на 500. типа Кернигана и Ритчи
Так, кнопку нужно опросить в прерывании, и запомнить ее статус, или добавить еще один таймер, что бы не успеть прочитать два нажатия и мигом не перенестись на несколько пунктов меню? очень хочеться узнать есть ли готовые решения?
неправильно, не "опрос в прерывании", а само прерывание возникает по нажатию написать код нормально и потом использовать любую готовую библиотеку для кнопок.