В этом эксперименте мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.
#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
.