===== Эксперимент 45. Работа с кнопкой как с объектом =====
Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок.
Соберем простую схему для работы с кнопкой. Пусть при нажатии на кнопку светодиод загорается на 1 секунду.
==== Схема эксперимента ====
{{ :products:esp-iot:exp3.4.png?direct |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
{{ :products:esp-iot:exp3.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
==== Программный код эксперимента ====
Теперь напишем программный код.
#define LED_PIN 0
class Button {
private:
int pin;
bool pressState;
bool oldState;
public:
Button(int _pin, bool _pressState) {
pin = _pin;
pinMode(pin, INPUT);
pressState = _pressState;
oldState = not _pressState;
}
bool onPress() {
bool state = digitalRead(pin);
if (state != oldState){
oldState = state;
if (state == pressState) return true;
}
return false;
}
};
Button btn(16, HIGH);
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (btn.onPress()) {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
}
}
Разберем класс кнопки. У него есть конструктор ''Button()'':
Button(int _pin, bool _pressState) {
pin = _pin;
pinMode(pin, INPUT);
pressState = _pressState;
oldState = not _pressState;
}
Здесь настраивается вывод микроконтроллера, записывается какое состояние считать нажатым — логический 0 или логическую 1. Ведь это зависит от схемотехники. Если кнопка подтянута к питанию, а при нажатии соединяется с землей, то в нажатом состоянии на выводе будет 0. А если наоборот, то 1.
И у кнопки есть метод определения факта нажатия:
bool onPress() {
bool state = digitalRead(pin);
if (state != oldState){
oldState = state;
if (state == pressState) return true;
}
return false;
}
Здесь считывается текущее состояние кнопки и сравнивается со старым. Состояние сохраняется как старое. Проверяется соответствие состояния кнопки состоянию нажатой кнопки, которое было задано при создании объекта. Если совпадает — значит кнопка нажата, возвращаем True, иначе False.
Создаем объект кнопки. Она на 16 выводе и нажатым будем считать состояние логической 1.
Button btn(16, HIGH);
Использование кнопки стало предельно простым. Нам больше не нужна переменная для хранения прошлого состояния кнопки и вычисление события нажатия. Все это реализовано в классе кнопки. Мы просто создали объект кнопки, передали ей в качестве параметра номер пина и состояние которое считается нажатым. В нашем случае состояние логической единицы когда кнопка нажата. И обращаемся к методу ''onPress()'', чтобы узнать было ли событие нажатия.
if (btn.onPress()) {
Мы могли бы создать несколько таких кнопок и работать с ними также легко.
==== Дополнительное задание ====
* Измени схему, чтобы кнопка подтягивалась к питанию, а при нажатии придавливала вывод к земле. Внеси соответствующие изменения в программу, чтобы поведение всего проекта не изменилось
* Добавь вторую кнопку и обрабатывай ее нажатия тоже