В этом эксперименте мы плавно наращиваем яркость светодиодной шкалы, управляя большой нагрузкой через транзистор.
#define CONTROL_PIN 9
// переменные верхнего уровня, т.е. объявленные вне функций,
// называют глобальными. Их значения сохраняются всё время,
// пока работает микроконтроллер
int brightness = 0;
void setup()
{
pinMode(CONTROL_PIN, OUTPUT);
}
void loop()
{
// увеличиваем значение яркости на единицу, чтобы нарастить
// яркость. Однако яркость не должна быть более 255, поэтому
// используем операцию остатка от деления, чтобы при
// достижении значения 255, следующим значением снова стал 0
// Y % X — это остаток от деления Y на X;
// плюс, минус, делить, умножить, скобки — как в алгебре.
brightness = (brightness + 1) % 256;
// подаём вычисленный ШИМ-сигнал яркости на пин с базой
// управляющего транзистора
analogWrite(CONTROL_PIN, brightness);
// ждём 10 мс перед следующим наращиванием яркости. Таким
// образом, полный накал будет происходить в течение
// 256×10 = 2560 мс
delay(10);
}
analogWrite(pin, value)
в качестве value
принимает значения от 0 до 255. Если передать значение из-за пределов этого диапазона, функция сработает, но в общем случае вы получите неожиданный результат. X % Y
дает остаток от деления X
на Y
. Если X
меньше Y
, т.е. целая часть результата деления равна 0, оператор %
будет возвращать X
. Таким образом:brightness + 1
меньше 256, в brightness
записывается значение brightness + 1
brightness + 1
принимает значение 256, результатом (brightness + 1) % 256
становится 0 и на следующей итерации loop()
всё начинается сначала.%
работает только с целыми операндами.(brightness + 1) % 256
скобки используются для назначения порядка действий. Операция %
имеет больший приоритет, чем +
, а сложение нам нужно выполнять раньше. С операциями умножения и деления оператор взятия остатка имеет одинаковый приоритет.brightness
обнуляется?delay
.%
, но с применением условного оператора if
.