Урок 2.2. Цикл в работе с цветом
На этом уроке вы узнаете о том, как с помощью нескольких циклов с оператором for можно смешивать цвета для получения желаемого оттенка цветового LED индикатора.
Вы научитесь
- Использовать цикл с оператором for и функцию range()
- Регулировать цвета LED индикатора на микроконтроллере
- Использовать команды копировать (copy), вставить (paste) и редактировать (edit) для упрощения написания длинных программ
Цветовой LED индикатор на микроконтроллере TI-Innovator Hub способен воспроизводить не только цвета радуги, но и другие оттенки. На этом уроке вы создадите программу, которая будет менять цвет LED индикатора с помощью циклов с оператором for. Это также предоставит вам возможность потренироваться в работе с циклами и узнать подробнее, как они функционируют.
1. Начните работу с создания нового проекта Python Hub.
Данная программа работает следующим образом: по очереди постепенно увеличивает и уменьшает значения цветовых каналов LED индикатора. Это позволяет получить новые оттенки.
Напишите два выражения input, чтобы ввести величину шага step, которая может быть целым числом (поэтому используется функция int()), и значение задержки delay, которое может быть десятичным числом, например, от 0 до 1 (поэтому используйте функцию float()).
Шаг - это разница между значениями цветов, а задержка - это время, на которое приостанавливается программа перед каждым шагом смены цвета.
2. Войдите в меню menu > Built-ins > Control и обратите внимание на пункт for index in... в нем (пример показан на рисунке).
Во всех этих выражениях есть функция range(), но с разными аргументами. Самое многофункциональное из трех - это следующее выражение:
for index in range(start, stop, step):
Примечание для учителя: Циклы с оператором for, в которых используется функция range(), являются счетными циклами. Значение Шага (step) в них может быть либо положительным, либо отрицательным числом. Стоп-значение не обрабатывается в цикле, но программа постепенно должна до него дойти, в противном случае цикл никогда не завершится (например: функция range(10,5,2) будет производить числа 10, 12, 14, 16, 18, ... и т.д., и цикл не завершится, так как стоп-значение равно 5).
3. Выберите следующее выражение:
for index in range(start, stop, step):
и замените индекс (index) на переменную i. Введите 0 в качестве стартового значения start, 256 для стоп-значения stop и слово step для значения шага step. (Вы должны ввести именно слово step, так как это переменная, которая используется в выражении ввода).
Это выражение позволит циклу работать в диапазоне от 0 до 255, при этом на каждом этапе цикла будет прибавляться значение шага. Например, если переменная шага step равна 10, значения i будут следующими:
0, 10, 20, 30, ... и так далее
4. В области блока (block) цикла добавьте следующее выражение:
color.rgb(i, 0, 0) (это только для красного цвета)
Его можно найти в меню: menu > TI Hub > Hub Built in Devices > Color Output.
Нажмите ctrl+R, чтобы запустить программу. Обратите внимание на то, что LED индикатор немедленно загорается. Нам же необходимо, чтобы он загорался постепенно. Вам нужно немного замедлить его включение, используя переменную задержки (delay). Перед тем, как переходить к следующему шагу, попробуйте сделать это самостоятельно.
5. Догадались ли вы добавить выражение sleep(delay)?
Теперь LED индикатор постепенно загорается красным. Далее необходимо написать еще один цикл с оператором for, чтобы постепенно разбавлять красный цвет зеленым.
Вы можете скопировать (copy) цикл с оператором for, который только что использовали для красного цвета, а затем вставить (paste) его ниже и отредактировать (edit), чтобы он работал только для зеленого цвета.
Будьте внимательны со структурированием.
Убедитесь, что значение красного канала было все время максимальным во время выполнения этой части программы.
Примечание для учителя: Пользователь вполне может повторно использовать переменную цикла i.
Как копировать и вставлять? Также как и на компьютере:
- Shift+стрелки - выделение текста,
- Ctrl+c - копирование,
- Ctrl+v - вставка.
6. Вот так выглядит цикл для зеленого цвета:
for i in range(0, 256, step):
color.rgb(255, i, 0)
sleep(delay)
Обратите внимание на то, что значение красного цвета всегда установлено на 255, а переменная цикла теперь находится в позиции зеленого цвета.
Снова запустите программу. Какой цвет вы видите теперь после завершения программы?
7. А сейчас немного усложним задачу... постепенно уменьшим значение красного цвета путем изменения "направления" цикла с оператором for:
for i in range(255, 0, -step):
Этот цикл начинается со значения переменной i=255, а индекс цикла i уменьшается на заданное значение шага.
Примечание для учителя: Значения могут приближаться к 0, но ноль в цикле использоваться не будет. В зависимости от заданного шага цикл завершится на определенной цифре еще до того, как значение будет равно 0. Помните, что цикл завершается в том случае, когда индекс равняется или выходит за пределы стоп-значения.
8. Может быть, вам будет проще и понятнее работать с кодом, если вы будете добавлять комментарии в формате "# comments" перед каждым выражением for и пояснять, с чем именно работает тот или иной оператор. Все комментарии начинаются со знака # (ctrl+T), и они не обрабатываются программой при запуске.
Чтобы завершить свой проект, добавьте циклы следующих процессов:
- Увеличение значения синего цвета
- Уменьшение значения зеленого при максимальном значении синего
- Увеличение значения красного (снова)
- Уменьшение значения синего при максимальном значении красного
- Уменьшение значения красного для медленного отключения индикатора
Данный процесс предполагает смешение всех трех пар цветов: красный-зеленый, зеленый-синий и синий-красный. При смене оттенков вы также увидите и желтый, и голубой, и цвет маджента (пурпурный).
После завершения программы LED индикатор должен быть выключен.
Не забудьте сохранить свою работу.
Примечание для учителя: Весь код целиком выглядит довольно сложным. Но работу с ним упрощают функции копирования, вставки и редактирования:
step=int(input("Step? "))
delay=float(input("Delay? "))
# increase red
for i in range(0,256,step):
color.rgb(i,0,0)
sleep(delay)
# increase green
for i in range(0,256,step):
color.rgb(255,i,0)
sleep(delay)
# decrease red
for i in range(255,0,-step):
color.rgb(i,255,0)
sleep(delay)
# increase blue
for i in range(0,256,step):
color.rgb(0,255,i)
sleep(delay)
# decrease green
for i in range(255,0,-step):
color.rgb(0,i,255)
sleep(delay)
# increase red
for i in range(0,256,step):
color.rgb(i,0,255)
sleep(delay)
# decrease blue
for i in range(255,0,-step):
color.rgb(255,0,i)
sleep(delay)
# decrease red then all off
for i in range(255,0,-step):
color.rgb(i,0,0)
sleep(delay)
color.off()