Урок №06. Работа с кнопками: тактовые кнопки, переключатели.

## Логические переменные и операторы

Логические переменные - это переменные типа boolean. Этот тип данных обладает диапозоном из всего лишь двух возможных значений: **true** и **false**. В переводе с английского - истина и ложь. Так же их иногда записывают как **1** и **0**, соответственно. Этими переменными можно описывать различные бинарные состояния: включен/выключен, вращать/не вращать, светить/ не светить.

Для переменных этого типа определены некоторые операции: логическое сложение (дизъюнкция) ||, так же называемое операцией ИЛИ, логическое произведение (конъюнкция) &&, так же называемое операцией И, и логическое отрицание обозначающееся как !.

Возьмем две переменные А и В. Ниже приведены таблицы для каждой операции.

С помощью этих операций можно составлять условия для рассмотрения различных ситуаций. Рассмотрим создание таких условий на примере схемы с использованием кнопки. Так как у кнопки всего два состояния, boolean идеально подходит для описания её состояния.

## Тактовые кнопки

**Тактовая кнопка** - простой механизм, замыкающий цепь пока есть давление на толкатель.

У классической 4-ех контактной тактовой кнопки замыкание происходит по диагонали.

Всего существуют 3 способа подключения тактовой кнопки к Arduino

### **Самая элементарная схема**

Любой из контактов подключается к цифровому пину, а контакт ,находящийся на диагонали подключается к минусу платы

в данной сборке необходимо объявить цифровой пин в специальный режим **INPUT\_PULLUP.**

```
pinMode(цифровой пин, INPUT_PULLUP);

```

снимать состояние кнопки мы будем с помощью функции **digitalRead().**

```
boolean buttonstate = digitalRead(№пина);

```

* Есть нажатие: **buttonstate = 0;**
* Нет нажатия: **buttonstate = 1;**

### **Схема с подтягивающим резистором**

Программирование аналогично схеме сверху ,в данном случае цифровой пин Vout должен иметь тип **INPUT**

```
pinMode(Vout, INPUT);

```

* Есть нажатие: **buttonstate = 0;**
* Нет нажатия: **buttonstate = 1;**

### **Схема с стягивающим резистором**

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

* Есть нажатие: **buttonstate = 1;**
* Нет нажатия: **buttonstate = 0;**

    Переключатель представляет из себя тактовую кнопку с фиксацией . Для работы с ним достаточно схемы № 1,без каких либо резисторов .

## Пример кода

Пусть дана схема подключения кнопки со стягивающим резистором подключенной к пину 2 и светодиодом подключенным к цифровому пину 3.

```
boolean buttonState = 0; //логическая переменная с которой мы будем смотреть нажатие кнопки
int LED = 3; //пин к которому подключен светодиод
int BUT = 2; //пин к которому подключена кнопка
void setup(){

pinMode(LED, OUTPUT); // устанавливаем пин светодиода как выход
pinMode(BUT, INPUT); // устанавливаем пин кнопки как вход

}
void loop(){

buttonState = digitalRead(BUT): //считываем нажатие
if (buttonState == true){       //если есть нажатие...
digitalWrite, LED, HIGH)        //включаем светодиод
}
else{                           //иначе..
digitalWrite(LED, LOW)          //выключаем светодиод
}

}

```

## Практическое задание

### Задание:

1. Соберите схему из нескольких светодиодов (минимум два).
2. Подключите две кнопки.
3. Напишите код, такой, что когда нажата одна кнопка - загорается одна группа светодиодов, когда нажата другая - вторая группа светодиодов. Когда нажаты обе - загораются обе.

### Подсказки:

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