Работа с кнопкой

Тема в разделе "Arduino & Shields", создана пользователем Baltika-9, 3 дек 2019.

  1. Baltika-9

    Baltika-9 Нуб

    Добрый вечер! Я вот только начал обучение и я захотел сделать код, по задумке которого кнопка переключала бы светодиоды ( один гаснет, другой загорается). И вот, я сделал код. Но увы в коде есть ошибка из-за которой кнопка не переключает на другой пин. То есть когда нажимаешь на кнопку она не переключает, переключить может только в том случае когда ее подержишь. И светодиод один горит изначально . Буду благодарен!
    Код (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 ;
    }

    }
     
    Последнее редактирование: 3 дек 2019
  2. NikitOS

    NikitOS Король шутов Администратор

  3. Baltika-9

    Baltika-9 Нуб

    Новореги тоже люди
     
  4. NikitOS

    NikitOS Король шутов Администратор

    Новореги читают то, что их просят сверху страницы, то бишь почитать правила и пост про использования редактора
     
    Baltika-9 и Daniil нравится это.
  5. Daniil

    Daniil Гуру

    Надо написать алгоритм обработки нажатия. Для вас 1 сек долго, а 5, а 0.1? Выбрать тот интервал, который можно считать однократным нажатием.
    Если за выбранный интервал кнопка была нажата, то нужно переключать светодиоды.
    На мой взгляд, проще ввести 2 флага:
    1. Флаг текущего состояния светодиодов
    2. Флаг необходимости изменения состояния светодиодов, он же флаг нажатия кнопки.
     
    SergeiL и NikitOS нравится это.
  6. NikitOS

    NikitOS Король шутов Администратор

    Да просто взять пример из вики и запихнуть туда три строки новые...
     
  7. ostrov

    ostrov Гуру

    Пина используется 3, а инитятся два. Уже это странно. И отсутствие элементарного делея, я уж молчу про миллис. Это за одно нажатие сколько раз х+1 сработает, Тысячу? Если бы не serial.print, то и миллион. Послушайте совета, пройдите все мини-проекты от Амперки, там делов на несколько дней. Все станет намного понятнее.
     
    Tomasina нравится это.
  8. SergeiL

    SergeiL Оракул Модератор

    Сначала нарисовать алгоритм. В виде блок-схемы.
    Начальные значения, и что будем делать после определения нажатий.
    Потом читаем про дребезг и добавляем код устраняющий этот дребезг.
    Понятно, что тем кто в теме - задача на пять минут.
    Но учитывая @Baltika-9 - дольше. :)
     
    Daniil и DetSimen нравится это.
  9. Airbus

    Airbus Радиохулиган Модератор

    Сорри-Дребезг кнопки)))
     
  10. b707

    b707 Гуру

    добавлю еще один косяк - выход за границы описанных пинов.
    пример, если х = 2 то х -1 это пин номер 1 - такой пин в программе не описан
    если х = 3. то в сво. очередь х+1 - это 4, такого пина тоже нет
     
    Andrey12 нравится это.
  11. jr.Bush

    jr.Bush Нерд

    Здравствуйте уважаемые форумчане, то что на первый взгляд сделать элементарно, вызывает самы большие трудности.
    Прошу помочь разобраться с КНОПКОЙ,
    Есть скетч «меню» и пятипозиционный кнопочный джойстик, нужно что бы при нажатии на кнопки курсор передвигался по пунктам меню, но сейчас если кнопка не нажата в тот момент когда ее опрашивают, то нажатие игнорируется до следующей петли, таким образом кнопку нужно немного подержать нажатой, пока не пройдет «длинный код» и снова не прочтет статус кнопки (около 150мс).
    Подключить кнопку к пинам прерывания нет возможности (так как в проекте используется большое число кнопок и датчиков.
    Разнообразные библиотеки не поддаются логики и направлены на устранения дребезга (на фига только, разве интервал повторного нажатия не устраняет дребезг?). Библиотека ALEXGYVER_BUTTON очень медленная и не комфортная на столько, что без нее все работает лучше. Прошу помочь советом.
     
  12. akl

    akl Гуру

    если "длинный код" нельзя ускорить, то можно опрос кнопки на прерывание по таймеру посадить. естественно избегая всяких кривых библиотек которые еще наверно используют делей
     
  13. b707

    b707 Гуру

    совет тут может быть только один - "длинный код" нужно убыстрить. Вообще, если цикл кода выполняется 150мс - это четкий признак того, что программу нужно выкинуть в помойку.
    В идеале цикл должен проходить быстрее миллисекунды, самое длинное за две-пять мс, а не за 150. Тогда и библиотеки кнопок начнут нормально работать.
     
    Последнее редактирование: 9 апр 2020
  14. jr.Bush

    jr.Bush Нерд

    Delay не использую, согласен, что код не красивый и может работать быстрее, но что если нажимать кнопку быстро 5-10 (это достаточно жесткий микрик) то все равно можно не попасть в вызов, и все равно нужно будет использовать прерывание по таймеру и количество переменных соответствующее количеству кнопок для тригера? Попахивает как минимум функцией. Я все правильно понял?
     
  15. b707

    b707 Гуру

    неправильно. Никто не говорил. что кнопку надо нажимать быстрее - надо программу переписать так. чтобы кнопка опрашивалась каждые 5мс, а не 150
     
    Tomasina нравится это.
  16. b707

    b707 Гуру

    у вас каша в голове.
    Чем "выделение в библиотеку" вам поможет? прерываний будет ровно столько же
    функция в программе и функция в библиотеке - это одно и тоже
     
  17. b707

    b707 Гуру

    Буш-младший, судя по вопросам здесь и на ардуино.ру - я бы посоветовал вам для начала почитать учебник по Си. хороший, толстый. страниц на 500. типа Кернигана и Ритчи
     
  18. jr.Bush

    jr.Bush Нерд

    Так, кнопку нужно опросить в прерывании, и запомнить ее статус, или добавить еще один таймер, что бы не успеть прочитать два нажатия и мигом не перенестись на несколько пунктов меню? очень хочеться узнать есть ли готовые решения?
     
  19. parovoZZ

    parovoZZ Гуру

    НЕ надо так быстро. У некоторых кнопок дребезг длится до 20 мс.
     
  20. b707

    b707 Гуру

    неправильно, не "опрос в прерывании", а само прерывание возникает по нажатию
    написать код нормально и потом использовать любую готовую библиотеку для кнопок.