Кнопка

Конструкції та програмування ARDUINO UNO
Відповісти
Аватар користувача
radioman
Site Admin
Повідомлень: 133
З нами з: 28 вересня 2020, 12:01
Звідки: Тернопіль
Дякував (ла): 8 разів
Подякували: 6 разів

Кнопка

Повідомлення radioman »

Практично у всіх проектах на ARDUINO використовується кнопка, а то і декілька. І тут виникає таке неприємне явише як брязкіт контактів.
Уникнути його можна двома способами - апаратним та програмним. Пропонуюється поєднане використання цих двох методів: спочатку за допомогою конденсатора ослабимо брязкіт апаратно:
Апаратне зменшення брязкоту контактів
Апаратне зменшення брязкоту контактів
а після цьго використаємо програмну "стабілізацію":

Код: Виділити все

*https://radioman.com.ua/*
int pinButton = 8;                                // Пін кнопки
int pinLED = 13;                                  // Пін світлодіода (використано інтегрований)

void setup() {
  pinMode(pinButton, INPUT);                      // Встановлюємо пін кнопки як вхід
  pinMode(pinLED, OUTPUT);                        // Встановлюємо пін світлодіода як вихід
}

bool flag       = LOW;                            // "Обнуляємо" прапорець світлодіода
bool lastButton = LOW;                            // "Обнуляємо" кнопку

bool debounce()                                   // Функція для ігнорування брязкоту контактів
{
  bool current = digitalRead(pinButton);          // Зчитуємо стан кнопки
  if (current != lastButton) {                    // Якщо старе значення відрізняється від отриманого
    delay(10);                                    // Чекаємо коли стан стабілізується - ігноруємо брязкіт контактів
    current = digitalRead(pinButton);             // Зчитуємо стабілізоване значення
  }
  return current;                                 // Повертаємо значення кнопки
}

void loop() {
  int currentButton = debounce();                 // Отримуємо стабілізоване значення
  if (lastButton == LOW && currentButton == HIGH) // Якщо стан кнопки "натиснута" - HIGH, а попередній LOW - фіксуємо подію натискання кнопки 
  { 
    flag = !flag;                                 // Змінюємо прапорець статусу світлодіода
    digitalWrite(pinLED, flag);                   // В залежності від прапорця, включаємо чи виключаємо світлодіод
  }
  lastButton = currentButton;                     // Запам'ятовуємо останній стан кнопки
}
Мирослав
Повідомлень: 4
З нами з: 16 березня 2021, 17:51
Дякував (ла): 5 разів
Подякували: 3 рази

Re: Кнопка

Повідомлення Мирослав »

У таймері із зворотнім відліком, що став базою для мого проекту, "брязкіт" контактів блокували програмно: у алгоритм зчитування включили затримку після натискання кнопки 10 мс (delay(10);). Перевірив на практиці. Працює.
Фрагмент скетчу:

Код: Виділити все

 if (button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(2);

...
Аватар користувача
radioman
Site Admin
Повідомлень: 133
З нами з: 28 вересня 2020, 12:01
Звідки: Тернопіль
Дякував (ла): 8 разів
Подякували: 6 разів

Re: Кнопка

Повідомлення radioman »

У попередньому скетчі є подібне, лише "оформлено" як функція:

Код: Виділити все

bool debounce()                                   // Функція для ігнорування брязкоту контактів
{
  bool current = digitalRead(pinButton);          // Зчитуємо стан кнопки
  if (current != lastButton) {                    // Якщо старе значення відрізняється від отриманого
    delay(10);                                    // Чекаємо коли стан стабілізується - ігноруємо брязкіт контактів
    current = digitalRead(pinButton);             // Зчитуємо стабілізоване значення
  }
  return current;                                 // Повертаємо значення кнопки
}
Але, чим більше варіантів коду - тим краще :) Апаратний спосіб є додатковим до програмного.
Відповісти