Пример 9. Четырехразрядный 7-сегментный индикатор [База знаний]
#include <TimerOne.h>
//заняты все цифровые пины от 2 до 13
int a = 7;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 2;
int g = 8;
int p = 9;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
long n = 0;
int x = 100;
int del = 5;
int count = 0;
void setup()
{
//пины на вывод
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(p, OUTPUT);
Timer1.initialize(100000);
Timer1.attachInterrupt( add );
}
void loop()
{
clearLEDs();
pickDigit(0); //включаем первую цифру
pickNumber((n/1000)); //значение тысячи
delay(del); //пауза 5мс
clearLEDs();
pickDigit(1); //включаем вторую цифру
pickNumber((n%1000)/100); //значение сотни
delay(del); //пауза 5мс
clearLEDs();
pickDigit(2); //включаем третью цифру
pickNumber(n%100/10); //значение десятки
delay(del); //пауза 5мс
clearLEDs();
pickDigit(3); //включаем четвертую цифру
pickNumber(n%10); //значение единицы
delay(del); //пауза 5мс
}
// определение разряда
void pickDigit(int x)
{
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch(x)
{
case 0:
digitalWrite(d1, LOW); //включаем d1
break;
case 1:
digitalWrite(d2, LOW); //включаем d2
break;
case 2:
digitalWrite(d3, LOW); //включаем d3
break;
default:
digitalWrite(d4, LOW); //включаем d4
break;
}
}
// определение символа (цифры)
void pickNumber(int x)
{
switch(x)
{
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
// очистка
void clearLEDs()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(p, LOW);
}
// вывод 0
void zero()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
// вывод 1
void one()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 2
void two()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
// вывод 3
void three()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
// вывод 4
void four()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 5
void five()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 6
void six()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 7
void seven()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 8
void eight()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 9
void nine()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// счетчик
void add()
{
count ++;
if(count == 10)
{
count = 0;
n++;
if(n == 10000)
{
n = 0;
}
}
}
Большие семисегментные индикаторы для часов
Для проекта часов с интернет синхронизацией по WiFi на ESP8266 понадобились большие индикаторы. Ну не солидно как то смотрятся полудюймовые цифирьки.Закупал детали и корпуса на ТаоБао, там же нашел индикаторы всевозможных размеров. У больших индикаторов каждый сегмент состоит из нескольких последовательных светодиодов. У 4″ индикаторов их 5 шт, а значит и питание нужно для них в районе 10В. Мне же не хотелось уходить от 5В, поэтому то я и остановился на 1.8″ индикаторов, сегмент которых состоит всего из двух светодиодов. О них этот обзор
Так как в проекте не хотелось много дискретных компонентов, решил делать часы на проверенных MAX7219 поэтому и индикаторы со светодиодами с общим катодом. Цвет свечения красный, так как другие цвета светодиодов сегментов выходили дороже
Сразу отвечу на вопрос — «а можно ли взять такие на Али?»
Да можно, по цене чуть больше $1 за штуку
Так как я делал комплексных заказ, то мне эти индикаторы обошлись дешевле. Если заказывать их на Тао отдельно, то партия в 16-20 шт обойдется так же в районе $1, зато можно заказать любое количество, в отличие от Али, где партии идут по 5шт, 10шт и т.д.
Итак заказ сделан, закончено долгое ожидание в 35 дней и посылка с индикаторами у меня дома.
Упаковка нормальная — индикаторы наколоты на пенопластовые пластины и замотаны стрейч пленкой
Маркировки на них никакой кроме двух букв «AS», что скорее всего соответствует общему катоду.
Размеры вполне ожидаемые и соответствуют описанию товара у продавца на ТаоБао
Цифры высотой 45мм
Вес может быть интересен тому, кто будет заказывать на ТаоБао — 10шт с упаковкой примерно 220г
Расчлененку я делать не буду, но кому интересно, может посмотреть здесь
Я же перейду к испытаниям. Описание выводов есть на картинке у продавца
Подцепляем катод к минуса, а анод сегмента «А» к 5В через сопротивление 100 ом к плюс 5В. Ток свечения сегмента получается примерно 15мА, что при наличии двух светодиодов сегмента дает падение напряжения на каждом в районе 1.75В
В «точке» только один диод и она при таком сопротивлении светится ярче и забирает 33мА при напряжении на светодиоде 1.8В.
Ну что ж, отлично, первый эксперимент показал, что MAX7219 при своих максимальных 320мА на каждую цифру и вполне потянет четыре таких индикатора
Собираю схему на макетке — все отлично работает:
На фотоаппарате в некоторых режимах можно различить два светодиода в сегменте, хотя глазу доступны яркие ровные светящиеся полоски
Теперь делаю прототип платы из отличного фольгированного бакелита (гетинакса)
В ходе экспериментов пришла светлая мысль — посадить два дискретных диода, разделяющих часы и минуты, вместо точки второго индикатора. Почему второго? Точка у него ближе всех к эти диодам. )))
Такое решение дает возможность управления яркостью этих светодиодов вместе с яростью всего индикатора. А MAX7219 позволяет выставить 16 градаций яркости, управляя при этом токовым драйвером каждого сегмента.
Итак вставляю в разъемы индикаторы, подключаю к прототипу платы управления, которую собирал здесь
И вот он — прототип моих часов в работе
Фотоаппарат постоянно уводит цвет в сторону оранжевого.
Реальный цвет воспринимаемый глазом ближе к такому
Тестовый корпус из фанеры у меня уже тоже почти готов
Осталось только поместить контроллер и блок питания внутрь и немного дошлифовать программу в ESP8266 и можно от прототипа переходить к готовым часам.
Индикаторы полностью оправдали мои ожидания. Из них получатся часы или другое табло с вполне приличными по размеру цифрами. При этом им достаточно 5В питания и драйвера MAX7219
Кота загрузил кормушкой за окном. Ему теперь не до моих поделок
РадиоКот :: Переделка семисегментного индикатора.
РадиоКот >Лаборатория >Радиолюбительские технологии >Переделка семисегментного индикатора.
Я думаю, что не ошибусь, когда скажу, что многие самодельщики используют в своих конструкциях семисегментные светодиодные индикаторы. Да, это очень удобная в применении штука, только вот беда — выбор цветов невелик, да и по яркости они порой оставляют желать лучшего. А крупные по размеру индикаторы не хотят светиться от низкого напряжения. Знакомая ситуация? Но всё, как говориться, в ваших руках. Предлагаю свой способ переделки индикаторов в любой цвет свечения, любой яркости и даже многоцветного сегмента. Для переделки годятся даже горелые индикаторы.
Берём индикатор и аккуратно зажимаем его в тиски фрезерного станка.
И потом не торопясь, слой за слоем снимаем заливку вместе с платой. Нам, в дальнейшем, понадобиться только сама пластмассовая матрица.
Не торопитесь и не старайтесь снять весь слой пластика за один проход, индикатор — вещь довольно хрупкая.
Срезаем до того момента, когда от платы ничего не останется. Потом надо проверить на просвет — не осталось ли чего лишнего, все сегменты должны равномерно просвечивать.
Потом при помощи клея «Поксипол-прозрачный» надо приклеить напротив каждого сегмента свои светодиоды. Для этого я применяю светодиоды «Пиранья», у них плоская верхушка и отсутствие линзы, то что нам и надо. Есть правда «Пиранья» и с линзами, но этот «недостаток» легко устраняется напильником. Можно применять и круглые диоды 3-5 миллиметров, только тогда придётся спилить у них линзу. На фото у меня стоят по два диода на сегмент, что обеспечивает равномерное освещение. Но можно ставить и больше, всё зависит от схемы включения и вашего желания. Диоды тоже можно соединять в сегменте как последовательно, так и параллельно. При параллельном включении ставьте на каждый диод свой балластный резистор. И желательно диоды из одной партии, что обеспечит равномерность освещения и чистоту цвета. Можно поставить и два разных по цвету диода, тогда на сегменте получится плавный переход цвета от одного к другому. Или в центре одного цвета, а по краям другого. Как видите вариантов много.
После приклейки распаяйте диоды по вашей схеме.
И проверьте каждый сегмент.
Вот на этом модернизацию можно завершить.
А так выглядит готовый индикатор после переделки.
Ещё несколько рекомендаций. После распайки покрасьте обратную сторону чёрной нитроэмалью или залейте чёрным термоклеем из клеящего пистолета, это не позволит проникать свету из одного сегмента в другой и поможет избежать паразитной засветки не горящих сегментов. Снять пластик можно и без фрезерного станка, только в этом случае понадобиться усердно, поработать напильником.
Вопросы, как обычно, складываем тут.
Как вам эта статья? | Заработало ли это устройство у вас? |
Одноразрядные семисегментные индикаторы на микроконтроллере
Глаз человека по природе является биологическим приёмником световой информации. Однако, в отличие от животных, человекспособен не только фиксировать наличие или отсутствие свечения, но и осмысливать наблюдаемые данные, к примеру, символы на экране семисегментного индикатора.
Первые светодиодные семисегментные индикаторы были сделаны на фирмах Monsanto и Hewlett-Packard в 1968 г. Как следует из названия, индикаторы содержат семь светодиодных сегментов, которые располагаются по контуру стилизованной цифры «8» (Рис. 2.18). На жаргоне — «индикатор-восьмёрка».
Рис. 2.18. Расположение сегментов в семисегментном индикаторе:
а) с одной точкой; б) с двумя точками.
Маркируются сегменты большими или малыми буквами латинского алфавита A…J в строго определённом порядке. Надо знать, что бывают индикаторы с десятичными точками и без, а также неполные «восьмёрки» с числом сегментов 2…6.
Электрическое соединение сегментов внутри индикатора производится по двум схемам: с общим анодом и с общим катодом. Каждый сегмент — это отдельный единичный светодиод со стандартными электрическими параметрами, зависящими от его цвета и материала изготовления. В «крупногабаритных» моделях для повышения яркости и площади свечения каждый сегмент составляется из 2…4 последовательно включённых излучателей.
Учитывая большое разнообразие вариантов цоколевки выводов, условные обозначения семисегментных индикаторов будут обезличенными (Рис. 2.19, а, б). Однако в каждой конкретной схеме (Рис. 2.20, а…и) надо смотреть даташиты.
Рис. 2.19. Условное обозначение семисегментных индикаторов: а) с общим анодом; б) с общим катодом.
Рис. 2.20. Схемы подключения семисегментных индикаторов к MK (начало):
а) стандартная схема с раздельным включением/выключением сегментов. При ВЫСОКОМ уровне на выходе MK соответствующий сегмент светится, при НИЗКОМ — погашен. Сопротивление резисторов R1..R8 выбирается так, чтобы суммарный ток через все линии MK при ВЫСОКОМ выходном уровне не превышал допустимое по даташиту MK значение, как правило,
100.. .300 мА;
б) аналогично Рис. 2.20, а, но для индикатора HG1 с общим анодом. При НИЗКОМ уровне на выходе MK соответствующий сегмент светится, при ВЫСОКОМ — погашен;
в) вместо восьми резисторов, как на Рис. 2.20, а, применяется один, но меньшего сопротивления. Как следствие, цифры с большим и малым числом сегментов будут иметь разную яркость, например, «1» и «8». Чтобы выровнять яркости, применяют циклы импульсов с одинаковой длительностью, но с разной частотой. Например, для высвечивания цифры «4» выдаётся «бегущая единица» по сегментам «Ь», «с», «f», «g» со средней частотой. Для цифры «8» частота будет максимальная, а для цифры «1» — минимальная, но выше 25 Гц, чтобы глаз не замечал мерцание;
г) аналогично Рис. 2.20, б, но для индикатора HG1 с общим анодом. Вместо «бегущей единицы» формируется «бегущий нуль»;
д) поочерёдная смена изображения букв «С» и «Р» на индикаторе HG1 при противофазных сигналах на двух выходах MK. Сегменты «а», «е», «f» светятся постоянно. Сегменты «Ь», «g» и «d» коммутируются в противофазе. Вместо двух линий MK можно использовать только одну, а другую заменить транзисторным ключом или логическим инвертором; О
О Рис. 2.20. Схемы подключения семисегментных индикаторов к MK (окончание):
е) подключение яркого индикатора HG1 к источнику повышенного напряжения +9…+ 12 В. Если сегменты индикатора потребляют большой ток, например, 50 мА, то следует уменьшить сопротивление резисторов и увеличить их мощность. Сборка транзисторных ключей DA 1 может быть заменена аналогичной зарубежной ULN2003 или отдельными транзисторами KT817 с резисторами 1…10 кОм между базой и соответствующей линией MK;
ж) регулирование яркости свечения индикатора HG1 через элементы VT1, DA1. В дневное время яркость автоматически увеличивается за счёт изменения сопротивления фоторезистора R11. Возможна оперативняа ручная регулировка переменным резистором R9. Резистор R10 ограничивает ток через фоторезистор Л/7, когда он ярко освещён и имеет низкое сопротивление;
з) сокращение числа выходных линий MK за счёт специализированного дешифратора DD1, имеющего выходы с открытым коллектором;
и) аналогично Рис. 2.20, з, но с другим типом дешифратора DD1, который допускает в нагрузке повышенное до.15 В напряжение. Сегмент «h» (точка) управляется транзисторным ключом VT1, поскольку в дешифраторе не предусмотрен восьмой выход. Замена микросхемы DD1 — 74LS249.
Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).
Схема подключения 7-сегментных индикаторов к Arduino [Амперка / Вики]
Исходные компоненты
Для эксперимента нам понадобятся:
Принцип работы
Семисегментный индикатор — это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.
Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.
На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.
Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.
Подключение
Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.
Далее, подключим один из драйверов в соответствии с его распиновкой
16 — к рельсе питания: это питание для микросхемы
2 «disable clock» — к рельсе земли: мы его не используем
3 «enable display» — к рельсе питания: это питание для индикатора
8 «0V» — к рельсе земли: это общая земля
- 1 «clock» — через стягивающий резистор к земле. К этому контакту мы позже подведём сигнал с Arduino. Наличие резистора полезно, чтобы избежать ложного срабатывания из-за окружающих помех пока вход ни к чему не подключен. Подходящим номиналом является 10 кОм. Когда мы соединим этот контакт с выходом Arduino, резистор не будет играть роли: сигнал притянет к земле микроконтроллер. Поэтому если вы знаете, что драйвер при работе всегда будет соединён с Arduino, можете не использовать резистор вовсе.
15 «reset» и 5 «÷10» пока оставим неподключенными, но возьмём на заметку — нам они понадобятся в дальнейшем
Контакты 3 и 8 на индикаторе обозначены как «катод», они общие для всех сегментов, и должны быть напрямую соединены с общей землёй.
Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через токоограничивающие резисторы как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.
Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)
Повторяем процедуру для второго разряда
Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.
Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.
Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.
Железо подготовленно, осталось реализовать несложную программу.
Программирование
- 7segment.pde
#define CLOCK_PIN 2 #define RESET_PIN 3 /* * Функция resetNumber обнуляет текущее значение * на счётчике */ void resetNumber() { // Для сброса на мгновение ставим контакт // reset в HIGH и возвращаем обратно в LOW digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } /* * Функция showNumber устанавливает показания индикаторов * в заданное неотрицательное число `n` вне зависимости * от предыдущего значения */ void showNumber(int n) { // Первым делом обнуляем текущее значение resetNumber(); // Далее быстро «прокликиваем» счётчик до нужного // значения while (n--) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); } } void setup() { pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); // Обнуляем счётчик при старте, чтобы он не оказался // в случайном состоянии resetNumber(); } void loop() { // Получаем количество секунд в неполной минуте // с момента старта и выводим его на индикаторы showNumber((millis() / 1000) % 60); delay(1000); }
Результат
Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 — к общему reset’у драйверов; разводим питание; включаем — работает!