Проблема с дребезгом кнопок.

Тема в разделе "Arduino & Shields", создана пользователем Саня_76, 5 фев 2018.

  1. Саня_76

    Саня_76 Нерд

    Помогите пожалуйста с кодом, я собрал небольшую схему но не как не могу написать код, выдает ошибку. Собрал схему на управление 2-ух разных светодиодов 2-мя кнопками. С обычным кодом все получается а чтобы устранить дребезг нет.
     
  2. koteika

    koteika Гик

    Схемку, код в студию.
     
  3. Саня_76

    Саня_76 Нерд

    Нечем фотографировать
     
  4. koteika

    koteika Гик

    Дребезг можно и аппаратно устранить. Что самый лучший вариант..
     
  5. Саня_76

    Саня_76 Нерд

    Код (C++):
    const int LED=10; // Контакт 10 для подключения светодиода
    const int BUTTON=2; // Контакт 2 для подключения кнопки
    int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки
    int prevButton = LOW; // Переменная для сохранения предыдущего состояния
    // к нопки
    boolean ledOn = false; // Текущее состояние светодиода (включен/выключен)
    void setup()
    {
    // Сконфигурировать контакт светодиода как выход
    pinMode (LED, OUTPUT);
    // Сконфигурировать контакт кнопки как вход
    pinMode (BUTTON, INPUT);
    }
    // Функция сглаживания дребезга. Принимает в качестве
    // аргумента предыдущее состояние кнопки и выдает фактическое.
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON); // Считать состояние кнопки,
    if (last != current) // если изменилось...
    {
    d elay(5); // ж дем 5 м с
    current = digitalRead(BUTTON); // считываем состояние кнопки
    return current; // возвращаем состояние кнопки
    }
    }
    void loop()
    {
    tekButton = debounce(prevButton);
    if (prevButton == LOW && tekButton == HIGH) // если нажатие...
    {
    ledOn = !ledOn; // инвертировать значение состояния светодиода
    }
    prevButton = tekButton;
    digitalWrite(LED, ledOn); // изменить статус состояния светодиода
    }
     
  6. Саня_76

    Саня_76 Нерд

    подробнее
     
  7. koteika

    koteika Гик

  8. Саня_76

    Саня_76 Нерд

  9. SergeiL

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

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

    ELITE Гик

    100-500пф параллельно кнопке запаять - и проблема дребезга решена
    ну и до кучи прогрммно отсекать повторные нажатия в течении 10мс
     
  11. b707

    b707 Гуру

    бред крутого программиста
    Не спорю, идея неплохая. но совершенно лишено хоть какой-нибудь наглядности и хорошего стиля программирования. Новичкам не рекомендуется :)
     
  12. b707

    b707 Гуру

    Саня_76, уточните, какие конкретно проблемы у вас с кодом?
    Пока вижу. что в функции debounce собственно дебонса то и нет.
     
  13. SergeiL

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

    А в чем бред то? Вы хоть разобрались? :) Для новичков пример лежит - скопировал - и забыл.
    Код минимален, короче не получится, хоть в прерывание вставляй. В свое время перетаскивал с ассемблера, когда выкладывал на сайт, убрал структуры с указателями на функции, чтобы для новичков понятней было, изначально код был с оптимизирован на кол-во команд процессора, дабы код прерывания короче был.
    Когда выложил, один товарищ через 5 минут критиковать начал, не думаю, что он понял даже суть за это время.
     
    Последнее редактирование: 6 фев 2018
  14. vvr

    vvr Инженерище

    а лохи-кодеры какие то программы пишут, целые библиотеки ваяют, а оказывается кондёр - и вуаля)))))
     
    Airbus нравится это.
  15. SergeiL

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

    Использую данный вариант устранения дребезга уже много лет, в основном в прерываниях от таймера - никаких задержек (все входы параллельно обрабатываются), никаких сбоев.
    Даже в обработке наличия полупериодов сети на нескольких входах используется, и прекрасно работает.
     
  16. Airbus

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

    Не самый лучший.
    Не факт.Лучше всего програмно и аппаратно вкупе
     
    ELITE, b707 и vvr нравится это.
  17. ELITE

    ELITE Гик

    лучше всего в каждом конкретном случае выбирать наиболее оптимальный вариант
    тк порой бороться с дребезгом и вовсе нет смысла - тогде и нет смысла в любых методах борьбы
    а порой надо 100% защиту - тогда уж и вкупе...

    но в большинстве случаев при использовании маломощных мк, аппаратное решение будет более целесообразней...(ИМХО)