Кнопка

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

Кнопка

Повідомлення 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;                     // Запам'ятовуємо останній стан кнопки
}
Відповісти