Кнопки

Тема в разделе "Arduino & Shields", создана пользователем gaara, 5 янв 2016.

  1. gaara

    gaara Нуб

    Привет Всем, ВСех с Новым годом, у меня такой вопрос, по кнопкам:

    1. как сделать так, чтобы контроллер различал когда кнопкой кликнули, а когда нажали и задержали

    2. как сделать так, чтобы при кликанье контроллер делал одно, а при нажатие и удерживание другое, причём в зависимости от количество кликов или времени удержания, выполнялись разные функции

    т.е. Загрузился контроллер, ждёт действий от меня, я в свою очередь нажал трижды он мне включил подсветку на десять сикунд, далее, я нажал и зажал на секунду кнопку, он мне включил свет на 30 секунд, далее я опять нажал три раза кнопку, но не стал ее отпускать а зажал на секунду и он мне включил туже подсветку но не на 10 секунд, а уже окончательно, пока я не зажму кнопку на пару секунд.

    Зачем. Задумал штуку в авто сделать, по управлению светом, в основном внешним, и управлять более, чем одной кнопкой не очень удобно, мне хотябы просто накидать примерный скетчик, и самое интересное это и менно момент с нажал "тир раза и задержал"

    можно ссылки где такое уже реализованно или похожее, просто сколько не рылся в сети, что то не как не натыкался
     
  2. ИгорьК

    ИгорьК Гуру

  3. gaara

    gaara Нуб

    Здорово, очень! :) а как это все перетащить на arduino? Возможно такое?
     
  4. ИгорьК

    ИгорьК Гуру

    Есть два способа: за деньги или разобраться самостоятельно.
    Есть третий. Сильно попросить и кто-то в доказательство своей крутости сделает это для Вас. Такое тоже случается.
     
    vvr нравится это.
  5. vvr

    vvr Инженерище

    есть готовые библиотеки для работы с кнопками
    ClickButton
    OneButton
    Button
    посмотрите и попробуйте примеры - найдёте для себя решения
    там есть и длительное нажатие, тройной и двойной клик
     
    ImrDuke нравится это.
  6. DrProg

    DrProg Вечный нерд

    Простейший способ.

    1. Ждет нажатия типа вот так (для случая если притянута к +):
    Код (C++):
    while (digitalRead(KEY));
    2. Засекает время и ждет отпускания:
    Код (C++):
      long timePress = millis();
      while (!digitalRead(KEY));
      timePress = millis() - timePress;
    3. Определяет что делать в случае короткого нажатия и длинного:
    Код (C++):
      if (timePress < 500) {
        // если коротко
      } else {
        // если длинно
      }
    По аналогии доработать на разное время нажатий. Для подсчета количества схема чуть усложняется.

    Вотъ.
     
    Последнее редактирование: 6 янв 2016
    ImrDuke, gaara и ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Ну я же говорил, что есть третий способ.
    Он, как обычно, не доделан. В том числе не в курсе, что время в Ардуино есть переменная типа unsigned long, как обычно раздает домашние задания, но появился же... И мне очень нравится - ставим лайки!
     
    AlexVS нравится это.
  8. gaara

    gaara Нуб

    Спасибо огромное, буду сидеть пробовать потихоньку :)
     
  9. gaara

    gaara Нуб

    Для подсчета, я так понял прокручивается ещё счётчик?
     
  10. DrProg

    DrProg Вечный нерд

    Счетчик, но самое главное определиться с паузами. Сколько ждать после нажатия кнопки? Она же не знает все на сегодня или еще будет. Плюс засекать время нажатия каждый раз, чтобы отличить короткие нажатия от длинных. В итоге получится массив данных где, например, первый элемент это число нажатий, остальные - длины каждого в мс. Затем обработчик этой азбуки Морзе с соответствующими событиями.
     
    ИгорьК нравится это.
  11. gaara

    gaara Нуб

    значится так получается, сначало я должен создать некое пояснение по кнопкам в отдельной фукцие, тоесть там будет описанно какое есть длинное нажатие, какое есть короткое, и потом в основной программе смотреть на кнопки и сравниваться с функцией написанной, потом следовательно как сравнились, поняли что это короткое нажатие, отправлять на выполнение задачи под ту или иную комбинацию кнопок?
     
  12. DrProg

    DrProg Вечный нерд

    Функция запускается при первом нажатии и работает подсчитывая нажатия и паузы до окончания ввода (определяемому по долгой паузе). В качестве результата получается массив типа такого:
    5, 0, 0, 1, 0, 1
    Где 5 - число нажатий, нули это короткие нажатия, единицы - длинные.
     
    ИгорьК нравится это.
  13. gaara

    gaara Нуб

    Ну красота, в голове уложить только надо это всё :)