===== Эксперимент 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()) { Мы могли бы создать несколько таких кнопок и работать с ними также легко. ==== Дополнительное задание ==== * Измени схему, чтобы кнопка подтягивалась к питанию, а при нажатии придавливала вывод к земле. Внеси соответствующие изменения в программу, чтобы поведение всего проекта не изменилось * Добавь вторую кнопку и обрабатывай ее нажатия тоже