как избавиться от дребезга кнопки

Тема в разделе "Arduino & Shields", создана пользователем Nikita, 7 окт 2013.

  1. Nikita

    Nikita Гик

    int regim=1;
    int flag=0;

    void setup()
    {
    pinMode(13,OUTPUT);
    pinMode(11,OUTPUT);

    }

    void loop()

    {
    regim++;
    flag=1;



    if(regim>6)//ограничим количество режимов
    {
    regim=1;//так как мы используем только одну кнопку,
    // то переключать режимы будем циклично
    }

    }



    if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
    //и переменная flag равна - 1 ,то ...
    {

    flag=0;//обнуляем переменную "кнопка"
    }



    if(regim==1)//первый режим
    {
    digitalWrite(11,LOW);//выключаем все светодиоды
    digitalWrite(13,LOW);


    //здесь может быть любое ваше действие
    }
    if(regim==2)//второй режим
    {
    digitalWrite(13,HIGH);//включае красный светодиод
    digitalWrite(11,LOW);

    //здесь может быть любое ваше действие
    }

    if(regim==3)//третий режим
    {

    digitalWrite(13,HIGH);//включае зеленый светодиод
    digitalWrite(11,LOW);


    //здесь может быть любое ваше действие
    }

    if(regim==4)//четвертый режим
    {

    digitalWrite(11,HIGH);//включаем светодиоды одновременно
    digitalWrite(13,HIGH);
    //здесь может быть любое ваше действие
    }
    if(regim==5)//пятый режим
    {

    digitalWrite(13,HIGH);//включаем светодиоды одновременно
    digitalWrite(11,HIGH);
    //здесь может быть любое ваше действие
    }
    if(regim==6)//6 режим
    {

    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000);
    // и так делее)
    }
    }
     
  2. greenoakst

    greenoakst Нерд

    Для подавления дребезга есть библиотека bounce, как с ней работать я уже давно писал.
     
  3. Nikita

    Nikita Гик

    если я правильно понял

    Код (Text):
    int regim=1;
    int button= A0 ;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;

    void setup()
    {
      pinMode(button, INPUT);
      pinMode(13,OUTPUT);  
      pinMode(11,OUTPUT);
    }
    boolean debounce(boolean last)
    {
      boolean current = digitalRead(button);
      if (last != current)
      {
        delay(5);
        current = digitalRead(button);
      }
      return current;
    }

    void loop()

    {
         
        if(digitalRead(14)==HIGH&&button==0)//если кнопка нажата
        // и перемення flag равна 0 , то ...
        {
          regim++;
          button=1;
           
         
             
            if(regim>2)//ограничим количество режимов
            {
              regim=1;//так как мы используем только одну кнопку,
                        // то переключать режимы будем циклично
            }
         
        }
         
          if(digitalRead(14)==LOW&&button==1)//если кнопка НЕ нажата
        //и переменная flag равна - 1 ,то ...
        {
             
            button=0;//обнуляем переменную "кнопка"
        }
         
         
         
        if(regim==1)//первый режим
        {
          digitalWrite(11,LOW);//выключаем все светодиоды
          digitalWrite(13,LOW);
           
           
          //здесь может быть любое ваше действие
        }
        if(regim==2)//второй режим
        {
      digitalWrite(13, HIGH);  
      delay(1000);            
      digitalWrite(13, LOW);  
      delay(1000);
      //  и так делее)
           
          //здесь может быть любое ваше действие
        }
            }
     
     
  4. Megakoteyka

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

    Вы не совсем правильно поняли. Зачем пихать код библиотеки в свой скетч? Библиотека не для этого придумана. Посмотрите пример со страницы библиотеки:
    Код (Text):
    // подключаем библиотеку
    #include <Bounce.h>

    #define BUTTON 2
    #define LED 13

    // создаем объект для чтения кнопки без дребезга
    Bounce bouncer = Bounce( BUTTON,5 );

    void setup() {
      pinMode(BUTTON,INPUT);
      pinMode(LED,OUTPUT);
    }

    void loop() {
      // обновляем состояние кнопки
      bouncer.update ( );

      // пишем на ножку светодиода состояние кнопки
      digitalWrite(LED, bouncer.read());
    }
    Не правда ли, так гораздо компактней и проще? ;)
    И избавляйтесь от "магических чисел" в коде, не создавайте себе проблем!
     
  5. lerik2703

    lerik2703 Гик

    в вашем примере есть один небольшой косячок :) если порт будет висеть в воздухе то диод начинает лихорадочно моргать ! предлагаю решение подключить подтягивающий резистор и изменить полярность подключения кнопки !? :rolleyes:
     
  6. Megakoteyka

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

    А у кнопки разве есть полярность? :) И почему порт должен висеть в воздухе, если по схеме он подключен?
    Там не хватает только перемычек на разрывах шины земли, в остальном вроде все ОК, кнопка притянута резистором к земле, не заметил отличий от схемы тут (справа).
     
  7. lerik2703

    lerik2703 Гик

    естественно нет ! :) я про схему подключения в исходном варианте управлявший вывод подтянут к земле , я предлагаю подтянуть к шине питания объясню почему библиотека регистрирует смену уровня с высокого на низкий а так как подключен подтягивающий резистор притягивает вход шине пиления ,соответственно когда отключим провод от кнопки произойдет смена уровня ,соответственно нажатие будет зафиксировано ! а вы не допускаете что провод может просто выскочить или просто окажешься не туда вставлен!?? ладно по диоду видно а если кнопка много функциональная! ИМХО отключённая случайно или по каким либо причинам кнопка не должна оказывать влияние на исполнение программы!
     
  8. Megakoteyka

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

    Библиотека регистрирует изменение состояния кнопки, все остальное зависит от фантазии программиста :)
    Код (Text):
    Bounce bouncer = Bounce(BUTTON, 5);

    if(bouncer.update())
    {
        if(bouncer.read() == HIGH)
        { ... }// поймали нажатие
        else
        { ... }// поймали отпускание
    }
    Мне кажется, особой разницы нет, особенно если разводить плату и паять - тогда точно ничего не выскочит. А на бредборде все равно только отлаживать схему можно, для реального применения он не годится. Но логика в ваших словах есть, возьму на заметку :)
     
  9. Nikita

    Nikita Гик

    теперь он вкл. но не выключается

    Код (Text):
    // подключаем библиотеку
    #include <Bounce.h>
    #define BUTTON A0
    #define LED 13
    int regim=1;
    int ledValue = LOW;
    // создаем объект для чтения кнопки без дребезга
    Bounce bouncer = Bounce( BUTTON,5 );

    void setup() {
      pinMode(BUTTON,INPUT);
      pinMode(LED,OUTPUT);    
    }

    void loop() {
    if ( bouncer.update() ) {
    {
          regim++;  
            if(regim>2)//ограничим количество режимов
            {
              regim=1;//так как мы используем только одну кнопку,
                        // то переключать режимы будем циклично
            }
         
        }
      if(regim==1)//первый режим
        {
          digitalWrite(13,HIGH);
            delay(1000);
          digitalWrite(13,HIGH);
            delay(1000);
         
          //здесь может быть любое ваше действие
        }
       
     
        if(regim==2)//второй режим
        {
          digitalWrite(13,HIGH);//включае красный светодиод
         
           
          //здесь может быть любое ваше действие
        }
      }
      }
     
  10. Megakoteyka

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

    Вы просто комбинируете готовые куски кода, что ли? Разобраться не пробовали?
    Состояние кнопки обновляете, но нигде не читаете.
    В обоих режимах включаете светодиод. Причем в первом включаете, ждете секунду, потом снова включаете, потом ждете еще секунду. Что это, по Вашему, должно дать?
    Начните с изучения статей на вики, там все очень подробно и доходчиво написано.
     
  11. Nikita

    Nikita Гик

    я разобрался но не знаю как считать состояние кнопки if ( bouncer.read() == HIGH) { типо того?
     
  12. Megakoteyka

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

    Это называется "я не разобрался". Примеры для кого написаны? Документация на библиотеку зачем нужна? Чтобы вставлять в скетч кусочки, не понимая, как они работают?
    Начните с самого начала, разберите каждую строку, добейтесь абсолютного понимания того, что она делает, попробуйте ее изменить и посмотрите на поведение программы. Иначе так и будете плавать и ничего не добьетесь.
     
  13. atompost

    atompost Гик

    ИМХО. А может решить эту проблему не прибегая к программному коду?? Например введением в схему, ну например инвертора, тем самым за счет гистерезиса сигналов решить проблему с дребезгом кнопки. sss.jpg

    З.Ы.

    Гистерезис используется для подавления шумов (быстрых колебаний, дребезга контактов) в момент переключения логических сигналов.

    http://ru.wikipedia.org/wiki/Гистерезис
     
    Последнее редактирование: 9 окт 2013
  14. Megakoteyka

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

    А также кондер+резистор (некоторые данный способ презирают).
    Еще есть мнение, что лучше всего давит дребезг схема на RS-триггере.
    Но есть народная мудрость: то, что не удается запаять, приходится программировать :)
     
    Nikita, lerik2703 и atompost нравится это.
  15. atompost

    atompost Гик

    :)
     
  16. panda1945

    panda1945 Нуб

    [​IMG]
    а нельзя ли поподробней про связку кондер+резистор?
    это где тригер шмидта юзают?

    p/s
    идею спер отсюда:
    https://uscr.ru/drebezg-kontaktov-i-sposoby-podavleniya-drebezga/
     
    Последнее редактирование: 16 июн 2016
  17. Onkel

    Onkel Гуру

    конденсатор 0,1 uF параллельно входу и будет подавитель дребезга, не требующий библиотек. в 99.9999% случаев работает.