Кнопка

Тема в разделе "Arduino & Shields", создана пользователем Valeryy, 8 дек 2019.

  1. Valeryy

    Valeryy Нуб

    Заимел скетч, а так же поимел с ним проблему. При нажатии кнопки всё срабатывает, но иногда при отпускании кнопки происходит так же срабатывание. Подключал резистор не помогает. На другом скетче эта кнопка работает нормально. подскажите, в чём проблема.


    #define BUTTON_PIN 4 // кнопка подключается между пином и GND
    #define LED_PIN 13 // LED подключается через резистор 200-400 Ом между пином и GND
    const byte ledTimeout = 1; // время до отключения LED, сек (не более 255)

    boolean LEDstate; // переменная-флаг для обмена информацией между функциями
    unsigned long timestamp; // переменная для расчета времени отключения LED

    void setup()
    {
    pinMode(BUTTON_PIN, INPUT_PULLUP);
    pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {
    checkButton(); // вызываем функцию чтения состояния кнопки
    setLED(); // вызываем функцию управления LED
    }

    void checkButton()
    {
    static boolean btnState = false; // локальная переменная для хранения состояния кнопки
    if (!digitalRead(BUTTON_PIN)) // реакция на нажатие кнопки
    {
    if (btnState == false) // если до этого момента кнопка была НЕ нажата...
    {
    btnState = true; // то ставим флаг, что кнопка нажата,
    LEDstate = true; // разрешаем включение LED
    timestamp = millis() + ledTimeout * 50; // и запоминаем время отключения
    }
    }
    else btnState = false; // реакция на отжатие кнопки: ставим флаг, что кнопка НЕ нажата
    }

    void setLED()
    {
    if (LEDstate == true) // если включение LED разрешено...
    {
    if (millis() < timestamp) digitalWrite(LED_PIN, HIGH); // и если с момента включения прошло меньше 2 сек, то подаем питание на LED
    else LEDstate = false; // если прошло больше 2 сек, то запрещаем включение LED
    }
    else digitalWrite(LED_PIN, LOW); // в любом другом случае гасим LED
    }
     
  2. NikitOS

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

    [​IMG]
     
    De_XXX_ter38 нравится это.
  3. Valeryy

    Valeryy Нуб

    Код (C++):
     #define BUTTON_PIN       4  // кнопка подключается между пином и GND
    #define LED_PIN          13 // LED подключается через резистор 200-400 Ом между пином и GND
    const byte ledTimeout  = 1; // время до отключения LED, сек (не более 255)

    boolean LEDstate;           // переменная-флаг для обмена информацией между функциями
    unsigned long timestamp;    // переменная для расчета времени отключения LED

    void setup()
    {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
      pinMode(LED_PIN, OUTPUT);
     
    }

    void loop()
    {
      checkButton();  // вызываем функцию чтения состояния кнопки
      setLED();       // вызываем функцию управления LED
    }

    void checkButton()
    {
      static boolean btnState = false; // локальная переменная для хранения состояния кнопки
      if (!digitalRead(BUTTON_PIN))    // реакция на нажатие кнопки
      {
        if (btnState == false)                        // если до этого момента кнопка была НЕ нажата...
        {
          btnState = true;                            // то ставим флаг, что кнопка нажата,
          LEDstate = true;                            // разрешаем включение LED
          timestamp = millis() + ledTimeout * 50;   // и запоминаем время отключения
        }
      }
      else btnState = false; // реакция на отжатие кнопки: ставим флаг, что кнопка НЕ нажата
    }

    void setLED()
    {
      if (LEDstate == true) // если включение LED разрешено...
      {
        if (millis() < timestamp) digitalWrite(LED_PIN, HIGH); // и если с момента включения прошло меньше 2 сек, то подаем питание на LED
        else LEDstate = false;                                 // если прошло больше 2 сек, то запрещаем включение LED
      }
      else digitalWrite(LED_PIN, LOW);                         // в любом другом случае гасим LED
    }
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Гугли по словам "дребезг контактов"
     
    Vovka и Daniil нравится это.