Почему после достижения значения 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

Наши рекомендации