Почему после достижения значения 255 переменная rightness обнуляется?
Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом:
· Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
· Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256становится 0 и на следующей итерации loop() всё начинается сначала.
Задания для самостоятельного решения
Измените программу так, чтобы яркость шкалы росла только до половины от максимальной.
#define CONTROL_PIN 9
int brightness = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(CONTROL_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
brightness = (brightness + 1)% 128;
analogWrite (CONTROL_PIN, brightness);
delay (10);
}
Измените программу так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay.
#define CONTROL_PIN 9
int brightness = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(CONTROL_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
brightness = (brightness + 3)% 256;
analogWrite (CONTROL_PIN, brightness);
delay (10);
}
3.Измените исходную программу так, чтобы такой же результат был получен без использования операции %, но с применением условного оператора if.
#define CONTROL_PIN 9
int brightness = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(CONTROL_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
if (brightness <= 255)
{
analogWrite (CONTROL_PIN, brightness);
delay (10);
++brightness;
}
else
brightness=0;
}
Эксперимент 7. Бегущий огонёк
В этом эксперименте мы заставляем огонёк бежать по светодиодной шкале.
Схема
Код
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + (ms / 120) % 10;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
Вопросы для проверки себя
Почему в данном эксперименте мы подключаем светодиодную шкалу, не используя транзистор?
Так как светодиоды в шкале будут включаться не все вместе, а по отдельности, и не будут потреблять большой ток.
Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе?
#define FIRST_LED_PIN 5
#define LAST_LED_PIN 9
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + (ms / 120) % 5;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
3.С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin?
pin = pin + 1
В чем разница между переменными типов int и unsigned int?
Тип данных unsigned int используют для хранения целых чисел без знака, т.е. только неотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535.
Что возвращает функция millis()?
Функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера. Здесь мы используем ее для отсчета времени между переключениями светодиодов.
Как в данном эксперименте мы вычисляем номер порта, на котором нужно включить светодиод?
С помощью выражения (ms / 120) % 10 мы определяем, который из 10 светодиодов должен гореть сейчас. Перефразируя, мы определяем какой отрезок длиной в 120 мс идет сейчас и каков его номер внутри текущего десятка. Мы добавляем порядковый номер отрезка к номеру того порта, который в текущем наборе выступает первым.
Задания для самостоятельного решения
Измените код так, чтобы светодиоды переключались раз в секунду.
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + (ms / 1000) % 10;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
Не выключая порты, сделайте так, чтобы огонёк бежал только по средним четырем делениям шкалы.
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + 3 + (ms / 120) % 4;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
3.Переделайте программу так, чтобы вместо int pin = FIRST_LED_PIN + (ms / 120) % 10перемещением огонька управлял цикл for