← Ночной светильник | Оглавление | Бегущий огонёк →
В этом эксперименте мы плавно наращиваем яркость светодиодной шкалы, управляя большой нагрузкой через транзистор.
#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
.