← Ночной светильник | Оглавление | Бегущий огонёк →
В этом эксперименте мы плавно наращиваем яркость светодиодной шкалы, управляя большой нагрузкой через транзистор.
#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 + 1brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала.% работает только с целыми операндами.(brightness + 1) % 256 скобки используются для назначения порядка действий. Операция % имеет больший приоритет, чем +, а сложение нам нужно выполнять раньше. С операциями умножения и деления оператор взятия остатка имеет одинаковый приоритет.brightness обнуляется?delay.%, но с применением условного оператора if.