Кнопка (Trema-модуль)

Тактовая кнопка для подключения к Arduino

Trema-модуль Кнопка - это тактовая кнопка, которая может служить источником сигналов (команд) для Ваших проектов. Кнопки используются для управления устройствами, подачи команд, осуществления настроек, ввода данных и т.д.

Общие сведения:

Тактовые кнопки предназначены для коммутации электрических цепей и широко используются в радиоэлектронной аппаратуре. Trema-кнопка имеет три вывода: Signal (S), Vcc (V), GND (G). В не нажатом состоянии на выходе S присутствует уровень логического «0» (выход прижат к GND через резистор). В нажатом состоянии на выходе S устанавливается уровень логической «1» (выход соединяется с Vcc).

Спецификация:

  • Рабочее напряжение: до 5,5 В
  • Коммутируемый ток: до 50 мА
  • Время дребезга при нажатии: < 3 мкс
  • Время дребезга при отпускании: < 5 мс
  • Сопротивление прижимающего резистора: 10 кОм
  • Сопротивление S - V: > 100 МОм (в разомкнутом состоянии)
  • Сопротивление S - V: < 100 мОм (в замкнутом состоянии)
  • Рабочая температура: -20 ... 70 °C
  • Габариты: 30x30x15 (без учёта выводов)

Подключение

Trema-кнопка входит в линейку Trema-модулей, что позволяет подключать её к Arduino через Trema Shield по 3-проводному шлейфу (который идёт в комплекте с кнопкой) без пайки, без дополнительных проводов и переходников.

Trema-кнопку можно подключать к любому выводу Arduino, как цифровому, так и аналоговому.

Питание:

Рабочее напряжение питания до 5,5 В постоянного тока

Работа с модулем:

Для работы с модулем нужно сконфигурировать вывод Arduino подключённый к выходу модуля, как вход. И считывать состояние логического уровня с данного вывода.

При считывании показаний с Trema-кнопки нужно учитывать такое явление как дребезг контактов. При нажатии или отпускании кнопки, её контакты сначала многократно и неконтролируемо замыкаются и размыкаются по причине упругости их металла, а постоянный логический уровень устанавливается только после окончания дребезга. Это значит, что если 1 раз нажать на кнопку и отпустить её, то алгоритм программы может зафиксировать многократное нажатие на кнопку, если в нём не учитывается подавление дребезга.

Для подавления влияния дребезга на алгоритм скетча, нужно после фиксации изменения логического уровня на выходе кнопки выдержать паузу, равную или превышающую время дребезга.

Примеры:

При работе с кнопкой можно фиксировать её состояния (нажата / отпущена) и события (нажимается / отпускается).

Фиксация всех состояний и событий одной кнопки:
// Фиксируем НАЖАТИЕ, УДЕРЖАНИЕ, ОТПУСКАНИЕ и НЕ НАЖАТИЕ кнопки:
const uint8_t pinBTN = 2;                            // Определяем номер вывода к которому подключёна кнопка
                                                     // 
void setup(){                                        // 
    pinMode(pinBTN, INPUT );                         // Конфигурируем вывод к которому подключена кнопка как вход
}                                                    // 
                                                     // 
void loop(){                                         // 
    if(digitalRead(pinBTN)){                         // Если кнопка нажата, то ...
        delay(1);                                    // Выполняем задержку на 1 мс для подавления дребезга при нажатии на кнопку
            // КОД ВЫПОЛНЯЕТСЯ ПРИ НАЖАТИИ           // Код в данной части скетча выполняется однократно при нажатии на кнопку
            /* ... КОД ... */                        // 
        while(digitalRead(pinBTN)){                  // Если кнопка удерживается, то ...
            // КОД ВЫПОЛНЯЕТСЯ ПРИ УДЕРЖАНИИ         // Код в данной части скетча выполняется постоянно пока нажата кнопка
            /* ... КОД ... */                        // 
        }                                            // Если кнопка отпущена, то ...
        delay(10);                                   // Выполняем задержку на 10 мс для подавления дребезга при отпускании кнопки
            // КОД ВЫПОЛНЯЕТСЯ ПРИ ОТПУСКАНИИ        // Код в данной части скетча выполняется однократно при отпускании кнопки
            /* ... КОД ... */                        // 
    }                                                // 
            // КОД ВЫПОЛНЯЕТСЯ ЕСЛИ КНОПКА НЕ НАЖАТА // Код в данной части скетча выполняется постоянно пока кнопка не нажата
            /* ... КОД ... */                        // 
}

В данном примере каждый участок кода выполняется в зависимости от состояния или события кнопки.

В следующем примере код скетча не разбит на участки, а состояние кнопки хранится в переменной.

Фиксация всех состояний и событий одной кнопки через переменную:
const uint8_t  pinBTN = 2;                                        // Определяем номер вывода к которому подключёна кнопка
      bool     valBTN = 0;                                        // Определяем переменную для хранения логического уровня
      uint8_t  evnBTN = 0;                                        // Определяем переменную для хранения состояний и событий кнопки
                                                                  // 
void setup(){                                                     // 
    pinMode(pinBTN, INPUT );                                      // Конфигурируем вывод к которому подключена кнопка как вход
}                                                                 // 
                                                                  // 
void loop(){                                                      // 
    valBTN=digitalRead(pinBTN);                                   // Сохраняем логический уровень со входа pinBTN в переменную valBTN
    switch(evnBTN){                                               // Определяем состояния и события кнопки
        case 0:  if( valBTN){evnBTN=1; delay(1);     } break;     // Фиксируем событие:   нажатие    (подавляем дребезг)
        case 2:  if(!valBTN){evnBTN=3; delay(10);    } break;     // Фиксируем событие:   отпускание (подавляем дребезг)
        default: if( valBTN){evnBTN=2;}else{evnBTN=0;} break;     // Фиксируем состояние: удерживается или отпущена
    }                                                             //
                                                                  // 
    /* ... КОД СКЕТЧА ... */                                      // 
                                                                  // 
    if(evnBTN==0){ /* КНОПКА ОТПУЩЕНА     */ ;}                   // Код выполняется постоянно  при отпущенной кнопке
    if(evnBTN==1){ /* КНОПКА НАЖИМАЕТСЯ   */ ;}                   // Код выполняется однократно при нажимании на кнопку
    if(evnBTN==2){ /* КНОПКА УДЕРЖИВАЕТСЯ */ ;}                   // Код выполняется постоянно  при нажатой кнопке
    if(evnBTN==3){ /* КНОПКА ОТПУСКАЕТСЯ  */ ;}                   // Код выполняется однократно при отпускании кнопки
}

Следующий пример является копией данного скетча, только проверяется состояние, не одной, а двух кнопок.

Фиксация всех состояний и событий двух (и более) кнопок через переменные:
const uint8_t  pinBTN1 = 2, pinBTN2 = 3;                          // Определяем номера выводов к которым подключены кнопки
      bool     valBTN1 = 0, valBTN2 = 0;                          // Определяем переменные для хранения логических уровней
      uint8_t  evnBTN1 = 0, evnBTN2 = 0;                          // Определяем переменные для хранения состояний и событий кнопок
                                                                  // 
void setup(){                                                     // 
    pinMode(pinBTN1, INPUT );                                     // Конфигурируем вывод к которому подключена кнопка 1 как вход
    pinMode(pinBTN2, INPUT );                                     // Конфигурируем вывод к которому подключена кнопка 2 как вход
}                                                                 // 
                                                                  // 
void loop(){                                                      // 
    valBTN1=digitalRead(pinBTN1);                                 // Сохраняем логический уровень со входа pinBTN1 в переменную valBTN1
    valBTN2=digitalRead(pinBTN2);                                 // Сохраняем логический уровень со входа pinBTN2 в переменную valBTN2
    switch(evnBTN1){                                              // Определяем состояния и события кнопки 1
        case 0:  if( valBTN1){evnBTN1=1; delay(1);      } break;  // Фиксируем событие:   нажатие    (подавляем дребезг)
        case 2:  if(!valBTN1){evnBTN1=3; delay(10);     } break;  // Фиксируем событие:   отпускание (подавляем дребезг)
        default: if( valBTN1){evnBTN1=2;}else{evnBTN1=0;} break;  // Фиксируем состояние: удерживается или отпущена
    }                                                             //
    switch(evnBTN2){                                              // Определяем состояния и события кнопки 2
        case 0:  if( valBTN2){evnBTN2=1; delay(1);      } break;  // Фиксируем событие:   нажатие    (подавляем дребезг)
        case 2:  if(!valBTN2){evnBTN2=3; delay(10);     } break;  // Фиксируем событие:   отпускание (подавляем дребезг)
        default: if( valBTN2){evnBTN2=2;}else{evnBTN2=0;} break;  // Фиксируем состояние: удерживается или отпущена
    }                                                             //
                                                                  // 
    /* ... КОД СКЕТЧА ... */                                      // 
                                                                  // 
    if(evnBTN1==0){ /* КНОПКА 1 ОТПУЩЕНА     */ ;}                // Код выполняется постоянно  при отпущенной кнопке
    if(evnBTN1==1){ /* КНОПКА 1 НАЖИМАЕТСЯ   */ ;}                // Код выполняется однократно при нажимании на кнопку
    if(evnBTN1==2){ /* КНОПКА 1 УДЕРЖИВАЕТСЯ */ ;}                // Код выполняется постоянно  при нажатой кнопке
    if(evnBTN1==3){ /* КНОПКА 1 ОТПУСКАЕТСЯ  */ ;}                // Код выполняется однократно при отпускании кнопки
                                                                  // 
    if(evnBTN2==0){ /* КНОПКА 2 ОТПУЩЕНА     */ ;}                // Код выполняется постоянно  при отпущенной кнопке
    if(evnBTN2==1){ /* КНОПКА 2 НАЖИМАЕТСЯ   */ ;}                // Код выполняется однократно при нажимании на кнопку
    if(evnBTN2==2){ /* КНОПКА 2 УДЕРЖИВАЕТСЯ */ ;}                // Код выполняется постоянно  при нажатой кнопке
    if(evnBTN2==3){ /* КНОПКА 2 ОТПУСКАЕТСЯ  */ ;}                // Код выполняется однократно при отпускании кнопки
}

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

Управляем светодиодом при каждом нажатии на кнопку:
const uint8_t pinBTN = 2;                            // Определяем номер вывода к которому подключёна кнопка
const uint8_t pinLED = 13;                           // Определяем номер вывода с интегрированным в Arduino светодиодом
void setup(){
    pinMode(pinBTN, INPUT );                         // Конфигурируем вывод кнопки как вход
    pinMode(pinLED, OUTPUT);                         // Конфигурируем вывод светодиода как выход
}
void loop(){
    if(digitalRead(pinBTN)){delay(1);                // Если кнопка нажимается, то подавляем дребезг
        digitalWrite(pinLED, !digitalRead(pinLED));  // и меняем состояние на выходе светодиода
        while(digitalRead(pinBTN)){}                 // Если кнопка удерживается, то ничего не делаем
        delay(10);                                   // Если кнопка отпускается, то подавляем дребезг
    }
}

Светодиод будет менять своё состояние (включён/выключен) при каждом нажатии на кнопку.

Управляем светодиодом при каждом отпускании кнопки:
const uint8_t pinBTN = 2;                            // Определяем номер вывода к которому подключёна кнопка
const uint8_t pinLED = 13;                           // Определяем номер вывода с интегрированным в Arduino светодиодом
void setup(){
    pinMode(pinBTN, INPUT );                         // Конфигурируем вывод кнопки как вход
    pinMode(pinLED, OUTPUT);                         // Конфигурируем вывод светодиода как выход
}
void loop(){
    if(digitalRead(pinBTN)){delay(1);                // Если кнопка нажимается, то подавляем дребезг
        while(digitalRead(pinBTN)){}                 // Если кнопка удерживается, то ничего не делаем
        digitalWrite(pinLED, !digitalRead(pinLED));  // Если кнопка отпускается, то меняем состояние на выходе светодиода
        delay(10);                                   // и подавляем дребезг при отпускании кнопки
    }
}

Светодиод будет менять своё состояние (включён/выключен) при каждом отпускании на кнопки.

Включаем светодиод при удержании кнопки дольше 2 секунд:
const uint8_t pinBTN = 2;                            // Определяем номер вывода к которому подключёна кнопка
const uint8_t pinLED = 13;                           // Определяем номер вывода с интегрированным в Arduino светодиодом
uint8_t       timeLED;                               // Объявляем переменную для хранения времени удержания кнопки
void setup(){
    pinMode(pinBTN, INPUT );                         // Конфигурируем вывод кнопки как вход
    pinMode(pinLED, OUTPUT);                         // Конфигурируем вывод светодиода как выход
}
void loop(){
    if(digitalRead(pinBTN)){ timeLED=0;              // Если кнопка нажимается, то сбрасываем счётчик времени
        while(digitalRead(pinBTN)){                  // Если кнопка удерживается, то ...
            if(timeLED>=200){                        // Если значение счётчика >= 200
                digitalWrite(pinLED, HIGH);          // Включаем светодиод
            }else{timeLED++;}                        // Иначе, приращаем счетчик времени
            delay(10);                               // Устанавливаем задержку на 10 мс
        }
        digitalWrite(pinLED, LOW);                   // Если кнопка отпускается, то выключаем светодиод
    }
}

Светодиод будет включаться, только если кнопка удерживается дольше 2 секунд. А выключаться будет сразу при отпускании кнопки.

При удержании кнопки, постоянно выполняется цикл while с задержкой в теле цикла на 10 мс. С каждым проходом данного цикла, счетчик timeLED увеличивается на единицу. После того как значение счетчика timeLED станет >= 200 (200*10 мс = 2 сек.) включается светодиод, а счетчик перестанет увеличиваться. Как только кнопка будет отпущена, произойдет выход из цикла while и светодиод погаснет.

В отличии от предыдущих скетчей, данный скетч использует только одну функцию delay() которая выполняется внутри цикла while постоянно, пока нажата кнопка, а следовательно, подавляет дребезг и при нажатии и при отпускании кнопки.

Ссылки:

Видео


Обсуждение

Присоединяйся

На главную