#10 Эксперимент “Таймер”
Практически в любом современном электроприборе есть панель индикации. Такие панели служат для отображения различной информации: режиме работы прибора, время его работы и текущие установки и настройки. Оглянувшись вокруг, вы увидите такие панели на ваших “микроволновке”, холодильнике, стиральной машине и т.д. Такие панели могут быть представлены как отдельными светодиодами различных цветов, так и светодиодными сборками, которое позволяют сделать индикацию более удобной, понятной и развёрнутой. Все средства индикации можно разделить на:
- светодиоды;
- светодиодные сборки;
- жидкокристаллические дисплеи;
Семисегментные индикаторы являются дешёвыми и удобными средствами индикации, служащие для отображения числовой информации. Именно такие индикаторы используются в дисплеях электронных часов, и прочих устройств, для которых необходим вывод каких-либо числовых показаний (термометры, счётчики электроэнергии, панели холодильников и стиральных машин). Сегодня мы разберёмся с работой таких индикаторов и соберём и запрограммируем свой собственный таймер (устройство отсчёта обратного времени).
Перед выполнением эксперимента прочтите:
СБОРКА УСТРОЙСТВА НА МАКЕТНОЙ ПЛАТЕ
Нам понадобятся следующие компоненты:
- Arduino Uno;
- USB-кабель для подключения компьютера;
- Беспаечная макетная плата;
- 1 семисегментный индикатор;
- 1 кнопка;
- 1 пьезодинамик;
- 8 резисторов, номиналом 220 Ом;
- 1 резистор, номиналом 10 кОм;
- 17 проводов разных цветов.
Соберите устройство по следующей схеме:
Схема устройства на макетной плате |
Принципиальная схема устройства |
Обратите внимание:
- Начиная сборку, лучше сразу соединить между собой рельсы питания, т.к. нам понадобится “земля” как снизу, так и сверху;
- Подключение семисегментного индикатора выполнено по схеме, указанной в памятке “Светодиодные сборки”. Пины индикатора нумеруются против часовой стрелки, начиная с нижнего левого пина. Для удобства, мы подключили пины таким образом, чтобы их нумерация совпадала с нумерацией пинов Arduino;
- Поскольку каждый сегмент индикатора является, по сути, светодиодом, мы должны использовать токоограничительный резистор при их подключении к пинам Arduino. Т.к. у нас 8 сегментов (светодиодов) на индикаторе, нам понадобится 8 резисторов, номиналом 220 Ом;
- 3-й и 8-й пины семисегментного индикатора – пины “земли”. При сборке схемы, можно подключать к “земле” лишь один из них, тем не менее во избежание неравномерного нагрева светодиодного модуля, рекомендуется “притягивать к земле” сразу оба пина;
- Для того, чтобы зажечь нужный нам сегмент, нужно подать на пин, к которому подключён данный сегмент, высокий (HIGH) сигнал. Если же нужно погасить сегмент – подать низкий (LOW) сигнал;
- Кнопку мы подключили по схеме со стягивающим резистором к 11-му пину Arduino;
- Пьезодинамик подключен к 12-му пину.
ПРОГРАММИРОВАНИЕ
Семисегментный индикатор называется таким образом из-за того, что имеет 7 светодиодных сегментов для отображения любой цифры от 0 до 9. На некоторых модулях есть ещё дополнительный 8-й сегмент, который зажигает на индикаторе точку. Чтобы зажечь на индикаторе изображение нужной нам цифры, следует включить сегменты, из которых состоит цифра и выключить все остальные сегменты. Например, для того, чтобы зажечь цифру 1, требуется подать высокий сигнал на 4-й и 6-й пины, и подать низкий сигнал на 1-й, 2-й, 7-й, 9-й и 10-й пины. Давайте попробуем это сделать.
Запустите Arduino IDE, выберите [Инструменты] ⇒ [ArduBlock], и составьте следующий алгоритм:
Если вы всё сделали правильно, то на индикаторе “загорится” единица. У вас может возникнуть вопрос – зачем отключать пины, которые и так не были зажжены? Это нужно для того, чтобы при смене цифр на индикаторе они не “накладывались” друг на друга. Ведь при выводе новой цифры, нужно всегда гасить ненужные индикаторы и зажигать нужные. Для того, чтобы не забывать это делать, лучше сразу взять в привычку гасить неиспользуемые индикаторы при выводе любой цифры. Если вы используете ещё и “точку”, то следует не забывать гасить и её.
Вторая проблема заключается в громоздкости нашего алгоритма. На данный момент мы зажгли только одну цифру, а алгоритм уже выглядит громоздко. А что будет дальше? Поэтому, алгоритм, который будет выводить каждую из 10-ти цифр, мы будем записывать в подпрограммы, а затем использовать их. Так наш основной алгоритм, станет намного короче. Для того, чтобы создать подпрограмму, нужно воспользоваться блоком [подпрограмма], который находится в разделе [Управление]:
Дадим имя нашей подпрограмме (например, [one]) и перетащим внутрь все блоки, необходимые для вывода на индикатор цифры 1:
Наша подпрограмма готова. Её можно оттащить в сторону, чтобы она не мешала. Как же теперь заставить эту подпрограмму работать внутри нашей основной программы? Очень просто, её нужно вызвать с помощью другого блока [подпрограмма], который находится в разделе [управление]:
Переименуйте блок, присвоив ему имя [one] и вставьте его в блок [Программа] нашего основного алгоритма:
Загрузите программу в Arduino. Как видите, программа работает также, как и до использования подпрограммы, зато теперь наш основной код стал намного короче. Сейчас нам нужно составить подпрограммы для остальных цифр и использовать их по мере необходимости. Давайте создадим остальные подпрограммы и дадим им имена [two], [three], [four], [five], [six], [seven], [eight], [nine], [zero]. Для того, чтобы не запутаться – на какие пины подавать высокий сигнал, а на какие – низкий, можете воспользоваться следующей картинкой:
Давайте создадим подпрограммы, для каждой цифры:
Теперь, для того, чтобы выводить нужную цифру на семисегментный индикатор, мы будем просто вызывать нужную подпрограмму. Давайте попробуем “прогнать” все цифры на нашем индикаторе. Для того, чтобы цифры не сменяли друг друга мгновенно, будем использовать задержку в 1000 мс после вызова каждой подпрограммы:
Загрузите полученную программу в Arduino и понаблюдайте за её работой. Если какая-либо из цифр “зажигается” неправильно, проверьте подпрограмму, в которой описан алгоритм работы сегментов для этой цифры.
Уже сейчас мы получили модель простейшего секундомера. Цифры сменяют друг другу с задержкой в 1 секунду. Осталось сделать таймер, т.е. “прогнать” эти цифры в обратном порядке. Но кроме этого, наш таймер должен начинать работу лишь по команде пользователя, поэтому необходимо запрограммировать начало обратного отсчёта лишь после нажатия на кнопку. Для этого, воспользуемся уже знакомым вам, блоком [если] и будем проверять – нажата ли кнопка, подключенная к 11-му пину? Когда кнопка будет нажата, необходимо начинать отсчёт. При этом, отсчёт должен начинаться с цифры 9, а заканчиваться цифрой 1. Если таймер не запущен, индикатор должен быть пустым, т.е. все сегменты должны быть погашены. Поэтому создадим ещё одну подпрограмму и назовём её [empty], что значит “пусто”. Внутри подпрограммы составим алгоритм, который будет отключать все сегменты индикатора:
Сама программа будет выглядеть следующим образом:
Наш таймер практически готов. Осталось добавить ему звуковую индикацию. Пускай наш таймер подаёт короткие сигналы при смене цифр, а в конце даёт 3 коротких сигнала, обозначающих окончание обратного отсчёта. Для этого можно создать подпрограмму [beep], которая будет содержать блоки, включающие и выключающие пьезодинамик, подключенный к 12-му пину:
Будем вызывать эту подпрограмму перед каждой выводимой цифрой, а в конце программы вызовем её 3 раза подряд, для получения тройного сигнала. При этом, нужно учесть, что внутри подпрограммы используется задержка в 200 мс, поэтому задержку между сменами цифр уменьшим до 800 мс:
Загрузите программу в Arduino и проверьте её работу. Наш таймер готов!
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Задание 1:
Измените программу таким образом, чтобы каждый раз вместе с сигналом пьезодинамика, на семисегментном индикаторе вспыхивала “точка”.
Задание 2*:
Добавьте в схему устройства потенциометр и создайте настраиваемый таймер. Т.е. вначале, вращая потенциометр, пользователь может выбрать цифру с которой начнётся обратный отсчёт, а далее при нажатии кнопки – отсчёт пойдёт именно от выбранной цифры.
Для того, чтобы получить сертификат, подтверждающий успешное прохождение курса – выполняйте тесты в конце занятий. | Пройти проверочный тест |