1.4. Практикум: Сигнал светофора
На этом уроке вы будете писать программу, которая позволит смоделировать ситуацию смены сигналов светофора. При этом зеленый свет будет сопровождаться звуковым сигналом (версия светофора для слабовидящих людей).
Вы научитесь
- Контролировать время работы красного, желтого и зеленого сигналов светофора
- Использовать в одном проекте свет, цвет и звук
- Использовать цикл с оператором while для продолжения выполнения операций до нажатия на кнопку esc
Как известно, в светофоре есть три отдельных лампочки - красная, желтая и зеленая, и по позиции лампочки даже дальтоники могут определить, какой свет горит.
Также для слабовидящих пешеходов подается звуковой сигнал о том, когда безопасно пересекать дорогу. В своей программе вы тоже будете одновременно использовать звуковой и световой сигналы.
1. Ваша задача - написать программу, в которой попеременно загорается красный, желтый и зеленый цвет светофора в течение заданного количества секунд. При красном сигнале светофора должны быть активны и световой LED, и красный LED индикатор. Когда горит желтый или зеленый, будет включен только цветовой LED индикатор. Одновременно с зеленым цветом нужно будет активировать звуковой сигнал, чтобы оповестить пешехода о том, что можно переходить дорогу.
Начните с создания нового проекта Python Hub. Файл в примере называется u1app.
Примечание для учителя: В данном проекте вы познакомитесь с циклом с выражением while get_key()!="esc", которое завершает программу после нажатия на кнопку esc. Это самый простой способ завершить программу по нажатию кнопки.
2. Добавьте три выражение input() для ввода времени (в секундах), в течение которого должен гореть красный, желтый и зеленый цвет. Для простоты вычисления мы используем только целые числа, поэтому здесь подходит оператор int() в функции input(), который конвертирует введенную строку в число.
На скриншоте показан только один пример функции ввода.
Обратите внимание на заглавную букву O в выражении redOn. В языке Python регистр имеет значение, поэтому все символы в этой переменной должны быть прописаны так, как в примере.
3. Начните работать с красным светом. Нужно включить красный цветовой LED индикатор, а также световой (красный LED) индикатор.
Используйте функцию sleep(), чтобы приостановить программу на определенное количество секунд, равное переменной redOn. Для этого используйте следующее выражение:
sleep(redOn)
Не забудьте выключить световой индикатор, когда цвет сменится на желтый.
Примечание для учителя: Заглавные символы в командах встречаются редко, но в программах на языке Python их использовать можно. Еще удобно использовать символ нижнего подчеркивания, например, red_on. На калькуляторе TI-Nspire символ подчеркивания (_) находится в кнопках пунктуации справа от буквы g. Заглавную букву легко ввести с помощью кнопки shift.
Как долго должен гореть желтый свет? Все зависит от скорости и уклона дороги.
Самая крутая улица в Сан-Франциско (Калифорния) - это улица Filbert Street, ее уклон составляет 32.5% или 18°
4. Затем подобным способом активируйте желтый цветовой LED индикатор для моделирования желтого сигнала светофора, а затем зеленый - для зеленого сигнала.
Зеленый свет также должен сопровождаться звуковым сигналом (который можно применить с помощью операторов .tone или .note), который будет воспроизводиться через динамик. После того, как зеленый свет погаснет, звук нужно отключить.
Запустите программу, чтобы протестировать. Понаблюдайте за работой индикаторов на микроконтроллере TI-Innovator Hub.
Примечание для учителя: В следующем шаге будет рассмотрено применение цикла с оператором while...
5. Если программа работает исправно, то она должна завершиться после одного цикла - когда поочередно будут включены три цвета. Чтобы программа работала более продолжительно, необходимо добавить цикл в свой код.
6. Цикл - это программная "управляющая структура", которая снова и снова обрабатывает блок кода. Одним из видов цикла в программировании на языке Python является цикл с оператором while <condition>:. Элемент <condition> это логическое выражение, которое выдает значение True (Верно) или False (Неверно).
Пример:
while x<10: (необходимо двоеточие :)
block (блок структурирован)
Пока x не превышает значение 10, выражение в блоке будет вычисляться многократно. Когда x будет больше или равен 10, цикл завершится, и обработка команд переходит к следующему выражению под блоком.
Примечание для учителя: Выражения внутри структуры с оператором while должны быть одинаково структурированы. Именно по пробелам система в языке Python определяет блоки кода.
7. Вставьте пустую строку в программу под тремя выражениями ввода (input). Затем добавьте следующее выражение:
while get_key() != "esc":
Его можно найти в меню: menu > TI Hub > Commands.
Обратите внимание, что светло-серое слово block структурировано с помощью двух пробелов в виде символов-заменителей - ромбов (но фактически это пробелы).
Знак != в языке Python обозначает "не равняется".
8. Цикл с оператором while снова и снова выполняет все выражения в своем "блоке"до тех пор, пока не нажата кнопка esc. Структурированный блок обозначен двумя пробелами.
Удалите слово block (строковую подсказку) и структурируйте оставшуюся часть программы двумя пробелами. Вы можете ввести их в начале каждой строки, нажав на кнопку tab. Или воспользуйтесь следующим способом:
Выделите все выражения ниже оператора while (используя комбинацию shift+стрелка вниз), затем нажмите на tab. Эта команда автоматически структурирует все выбранные строки.
9. Теперь убедитесь в том, что все ваши выражения, связанные с включением цветовых, световых и звуковых сигналов, структурированы одинаковым количеством пробелов (двумя). Таким образом, вся часть кода работы со светом становится одним блоком оператора while. Запомните: Неверное структурирование может привести к ошибке в программе.
Снова запустите программу и нажмите esc, когда вам необходимо ее завершить. При завершении возможна небольшая задержка, так как система должна обработать все коды блока и завершить цикл только после мигания зеленого света.
Когда программа завершится, в каком состоянии будут LED индикаторы на микроконтроллере TI-Innovator Hub? Как можно выключить оба этих индикатора?
Примечание для учителя: После нажатия на esc цветовой LED индикатор будет гореть зеленым. Чтобы выключить его, просто добавьте выражение color.off() внизу программы. Оно должно находиться вне цикла (то есть не быть структурированным).
Пример возможного написания кода:
redOn = int( input("Red time? ") )
yellowOn = int( input("Yellow time? ") )
greenOn = int( input("Green time? ") )
while get_key() != "esc":
color.rgb(255,0,0)
light.on()
sleep(redOn)
light.off()
color.rgb(255,255,0)
sleep(yellowOn)
color.rgb(0,255,0)
sound.note("A4" ,greenOn)
sleep(greenOn)
color.off()