← Кнопочный переключатель | Оглавление | Кнопочные ковбои →
В этом эксперименте мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.
#define PLUS_BUTTON_PIN 2 #define MINUS_BUTTON_PIN 3 #define LED_PIN 9 int brightness = 100; boolean plusUp = true; boolean minusUp = true; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP); pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP); } void loop() { analogWrite(LED_PIN, brightness); // реагируем на нажатия с помощью функции, написанной нами plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35); minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35); } // Собственная функция с 3 параметрами: номером пина с кнопкой // (buttonPin), состоянием до проверки (wasUp) и градацией // яркости при клике на кнопку (delta). Функция возвращает // (англ. return) обратно новое, текущее состояние кнопки boolean handleClick(int buttonPin, boolean wasUp, int delta) { boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) { delay(10); isUp = digitalRead(buttonPin); // если был клик, меняем яркость в пределах от 0 до 255 if (!isUp) brightness = constrain(brightness + delta, 0, 255); } return isUp; // возвращаем значение обратно, в вызывающий код }
loop
.boolean
. Если функция только выполняет какие-то действия и не возвращает никакого значения, используйте ключевое слово void
какПеременные
.wasUp
или isUp
из loop()
получим от компилятора сообщение об ошибке. Точно так же, переменные, объявленные в loop
, другим функциям не видны, но их значения можно передать в качестве параметров.return
указать, какое значение возвращать. Это значение должно быть того типа, который мы объявилиbrightness
.handleClick
происходит всё то же самое, что в эксперименте «Кнопочный переключатель».brightness + delta
выйдет за пределы интервала [0, 255]. С помощью функции constrain
мы ограничиваем допустимые значения для переменной brightness
указанными границами интервала.plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35)
мы обращаемся к переменной plusUp
дважды. Поскольку =
помещает значение правого операнда в левый, сначала вычисляется, что вернет handleClick
. Поэтому когда мы передаем ей plusUp
в качестве параметра, она имеет еще старое значение, вычисленное при прошлом вызове handleClick
.handleClick
мы вычисляем новое значение яркости светодиода и записываем его в глобальную переменную brightness
, которая на каждой итерации loop
просто передается в analogWrite
.void
?=
?analogWrite
.