Как сделать часы на ардуино уно на дисплее 7 segment

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Часы на 7 сегментном LED индикаторе - нужна помощь.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Проблема в следующем (точнее в нехватке моих знаний) - ткните пжт носом.

Есть ARDUINO Uno

Есть 7 сегментный LED индикатор LD5641A/B

Хотелось создать часики!

Скетч нашел в инете - НО - немного не подходит к моему индюку

все подключил - залил скетч

часики работаю - щитают

НО - после каждой цифры стоит точка (неморгает)

нужно чтобы моргала точка после второго индикатора (сама точка распаложенна на 2ой цифре)

не сооброжу где копать (чайник еще)

но очень хочется довести до ума - помогите пож-то .

/*
Arduino clock on a standard 4-digit clock display

Connections:
LTC - Arduino
1 - nc
2 - nc
3 - nc
4 - d7
5 - d3
6 - d2
7 - d11
8 - d10
9 - d4
10 - gnd
22 - d9
23 - d5
24 - d6
25 - A0 // because d13 already has a built-in LED getting in the way
26 - d8
27 - d12
28 - A1
29 - gnd

button:
5v - button - A4 - 10k resistor - gnd

unsigned short hours, minutes, seconds;
boolean pm;
unsigned long lastTime; // keeps track of when the previous second happened

int buttonState; // the current reading from the button pin
int lastButtonState = LOW; // the previous reading from the button pin
unsigned long button_down_start = 0; // how long the button was held down
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time

void setup() <
// initialize all the required pins as output.
pinMode(DIGIT1, OUTPUT);
pinMode(DIGIT2, OUTPUT);
pinMode(DIGIT3, OUTPUT);
pinMode(DIGIT4, OUTPUT);

pinMode(SEGMENTA, OUTPUT);
pinMode(SEGMENTB, OUTPUT);
pinMode(SEGMENTC, OUTPUT);
pinMode(SEGMENTD, OUTPUT);
pinMode(SEGMENTE, OUTPUT);
pinMode(SEGMENTF, OUTPUT);
pinMode(SEGMENTG, OUTPUT);

pinMode(COLON, OUTPUT);
pinMode(AMPM, OUTPUT);

// button is input
pinMode(BUTTON, INPUT);

// set the initial time
hours = 00;
minutes = 00;
seconds = 0;
pm = true;

// Keep showing the display while waiting for timer to expire
while (millis() - lastTime debounceDelay) // whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:

if (buttonState != reading) button_down_start = millis(); // record the start of the current button state
>

// buttonState is now either on or off
if (buttonState == HIGH) // if the button was held down more than 5 seconds, make it go faster
if ((millis() - button_down_start) > 5000) seconds += 10;
if (seconds > 59) seconds = 59;
>

// button has been pressed
incrementTime();
>
>

//
// a call to incrementTime increases time by one second.
//
void incrementTime()

if (seconds == 59) seconds = 0;

if (minutes == 59) minutes = 0;

if (hours == 12) <
hours = 1;
>
else hours++;

//
// clock_show_time - displays the given time on the clock display
// Note that instead of hr/min the user can also send min/sec
// Maximum hr is 99, Maximum min is 59, and minimum is 0 for both (it's unsigned, heh).
//
void clock_show_time(unsigned short hours, unsigned short minutes) unsigned short i;
unsigned short delaytime;
unsigned short num_leds[10] = < 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 >;
unsigned short digit[4];
unsigned short hide_leading_hours_digit;

// convert minutes and seconds into the individual digits
// check the boundaries
if (hours > 99) hours = 99;
if (minutes > 59) minutes = 59;

// convert hr
if (hours 0) hide_leading_hours_digit = 1;
>
else hide_leading_hours_digit = 0 ;
>

digit[0] = hours / 10;
digit[1] = hours % 10; // remainder
digit[2] = minutes / 10;
digit[3] = minutes % 10; // remainder

Заметки старого ватника.

Ардуино. 7-сегментный светодиодный индикатор ч.2

В прошлой статье мы разбирали устройство семисегментного светодиодного индикатора и собрали из четырех таких приборов устройство:

led dyn5

Сегодня мы будем его оживлять, т.е. выводить на индикаторы какую-то осмысленную информацию.

Вкратце еще раз напомню принцип работы таких индикаторов. Они состоят из светодиодов, которые мы зажигаем в определенной комбинации, чтобы получить нужный нам символ или цифру. Каждый индикатор имеет один общий провод (в нашем случае - анод) и восемь выводов, по числу сегментов. Соответствующие друг другу сегментные выводы индикаторов соединяем между собой. Анодные выводы используются для включения и выключения индикаторов.

Используется принцип динамической индикации. То есть, если последовательно переключать индикаторы с определенной скоростью (около 50 раз в секунду), то человеческому глазу будет казаться, что они горят одновременно.

Ну, поехали программировать. Под спойлером я сразу расположу полный рабочий скетч получившейся программы, а потом разберу ее по кусочкам.

Полный код скетча:

int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;


void setup() <
pinMode(A, OUTPUT); pinMode(B, OUTPUT);
pinMode(C, OUTPUT); pinMode(D, OUTPUT);
pinMode(E, OUTPUT); pinMode(FF, OUTPUT);
pinMode(G, OUTPUT); pinMode(DIG1, OUTPUT);
pinMode(DIG2, OUTPUT); pinMode(DIG3, OUTPUT);
pinMode(DIG4, OUTPUT);
digitalWrite(A,HIGH); digitalWrite(B,HIGH);
digitalWrite(C,HIGH); digitalWrite(D,HIGH);
digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
digitalWrite(G,HIGH); digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,HIGH); digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,HIGH);
>

void loop() <
DisplayMath((millis() / 1000));
DisplayShow();
>


void DisplayShow() <
digitalWrite(DIG1,HIGH);
Show(dig1);
delay(BRIGHT);
Clean();
digitalWrite(DIG1,LOW);
delay(TAKT-BRIGHT);
digitalWrite(DIG2,HIGH);
Show(dig2);
delay(BRIGHT);
Clean();
digitalWrite(DIG2,LOW);
delay(TAKT-BRIGHT);
//===============================

digitalWrite(DIG3,HIGH);
Show(dig3);
delay(BRIGHT);
Clean();
digitalWrite(DIG3,LOW);
delay(TAKT-BRIGHT);

digitalWrite(DIG4,HIGH);
Show(dig4);
delay(BRIGHT);
Clean();
digitalWrite(DIG4,LOW);
delay(TAKT-BRIGHT);
>

void Show(int digit) <
switch(digit) <
case 0: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(E,LOW); digitalWrite(FF,LOW);
>
break;
case 1: <
digitalWrite(B,LOW); digitalWrite(C,LOW);
>
break;
case 2: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(D,LOW); digitalWrite(E,LOW);
digitalWrite(G,LOW);
>
break;
case 3: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(G,LOW);
>
break;
case 4: <
digitalWrite(B,LOW); digitalWrite(C,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
case 5: <
digitalWrite(A,LOW); digitalWrite(C,LOW);
digitalWrite(D,LOW); digitalWrite(FF,LOW);
digitalWrite(G,LOW);
>
break;
case 6: <
digitalWrite(A,LOW); digitalWrite(C,LOW);
digitalWrite(D,LOW); digitalWrite(E,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
case 7: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW);
>
break;
case 8: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(E,LOW); digitalWrite(FF,LOW);
digitalWrite(G,LOW);
>
break;
case 9: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
>
>

void Clean() <
digitalWrite(A,HIGH); digitalWrite(B,HIGH);
digitalWrite(C,HIGH); digitalWrite(D,HIGH);
digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
digitalWrite(G,HIGH);
>

Приступаем разбирать важные куски скетча:

Сначала задаем выводы Ардуины, к которым будут подключены наши индикаторы, а также - другие параметры и переменные:

int dig1 = 0; // четыре целочисленных переменных
int dig2 = 0; // для каждого разряда (индикатора)
int dig3 = 0;
int dig4 = 0;


void setup() <
pinMode(A, OUTPUT); pinMode(B, OUTPUT); // первичная настройка всех выводов для
pinMode(C, OUTPUT); pinMode(D, OUTPUT); // работы на выход
pinMode(E, OUTPUT); pinMode(FF, OUTPUT);
pinMode(G, OUTPUT); pinMode(DIG1, OUTPUT);
pinMode(DIG2, OUTPUT); pinMode(DIG3, OUTPUT);
pinMode(DIG4, OUTPUT);
digitalWrite(A,HIGH); digitalWrite(B,HIGH); // гашение всех сегментов
digitalWrite(C,HIGH); digitalWrite(D,HIGH);
digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
digitalWrite(G,HIGH); digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,HIGH); digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,HIGH);

Вроде бы, с установками все просто и вопросов быть не должно. Поэтому перейдем сразу к функциям.

Функция Clean() - это то же самое гашение индикаторов, что и в первоначальной установке, только вызывается в процессе работы. При установке на сегментах высокого уровня - индикаторы гаснут, независимо от того, какой уровень присутствует на анодах.

void Clean() <
digitalWrite(A,HIGH); digitalWrite(B,HIGH);
digitalWrite(C,HIGH); digitalWrite(D,HIGH);
digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
digitalWrite(G,HIGH);
>

Функция Show(int digit) - предназначена непосредственно для зажигания определенных сегментов, соответствующих переданному в нее целому числу digit. Работает она так - в функцию передается целое число. При помощи оператора switch() - case, она сравнивает его с предопределенными значениями, и , если натыкается на совпадение этих значений, то зажигает определенные сегменты индикатора, соответствующие переданному в функцию числу

void Show(int digit) <
switch(digit) <
case 0: < //если переданное в функцию число - 0
digitalWrite(A,LOW); digitalWrite(B,LOW); // то зажигаются сегменты индикатора,
digitalWrite(C,LOW); digitalWrite(D,LOW); // образующие рисунок цифры 0
digitalWrite(E,LOW); digitalWrite(FF,LOW);
>
break;
case 1: <
digitalWrite(B,LOW); digitalWrite(C,LOW);
>
break;
case 2: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(D,LOW); digitalWrite(E,LOW);
digitalWrite(G,LOW);
>
break;
case 3: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(G,LOW);
>
break;
case 4: <
digitalWrite(B,LOW); digitalWrite(C,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
case 5: <
digitalWrite(A,LOW); digitalWrite(C,LOW);
digitalWrite(D,LOW); digitalWrite(FF,LOW);
digitalWrite(G,LOW);
>
break;
case 6: <
digitalWrite(A,LOW); digitalWrite(C,LOW);
digitalWrite(D,LOW); digitalWrite(E,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
case 7: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW);
>
break;
case 8: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(E,LOW); digitalWrite(FF,LOW);
digitalWrite(G,LOW);
>
break;
case 9: <
digitalWrite(A,LOW); digitalWrite(B,LOW);
digitalWrite(C,LOW); digitalWrite(D,LOW);
digitalWrite(FF,LOW); digitalWrite(G,LOW);
>
break;
>
>

Функция DisplayShow() - обеспечивает поочередную индикацию всех четырех разрядов нашего устройства. Причем, как говорилось выше - с такой скоростью, чтобы для человеческого глаза казалось, что они горят одновременно. Глобальные переменные dig1 - dig4 должны содержать поразрядно цифры, которые нам необходимо индицировать.

void DisplayShow() <
digitalWrite(DIG1,HIGH); // зажигаем первый индикатор подачей на анод высокого уровня (1).
Show(dig1); // вызываем функцию Show(dig1) и устанавливаем на сегментах уровни для индикации соответствующей цифры.
delay(BRIGHT); // делаем короткую паузу, чем она больше, тем больше яркость горения индикатора.
Clean(); // гасим индикатор
digitalWrite(DIG1,LOW); // подаем на анод низкий уровень (0)
delay(TAKT-BRIGHT); // чисто для экспериментов - поиграться со значениями времени горения индикатора:-)

//_----------------------
digitalWrite(DIG2,HIGH);
Show(dig2);
delay(BRIGHT);
Clean();
digitalWrite(DIG2,LOW);
delay(TAKT-BRIGHT);

Самая важная функция DisplayMath(int data). В нее передается целое число (data), которое для нашего 4-х разрядного устройства может быть в интервале от 0 до 9999. Эта функция разбивает это число по разрядам для индикации соответствующих цифр в каждом разряде нашего устройства.

Общий принцип такой: от заданного для индикации числа, в цикле отнимают тысячи, сотни или десятки, одновременно инкрементируя старший разряд. Но лучше всего это понять на примерах:

void DisplayMath(int data) <
dig1 = dig2 = dig3 = dig4 = 0; // в переменные, соответстующие разрядам индикатора записывается 0
if (data
while (data >= 10) < // пока число больше 10, в цикле отнимаем от него
data -= 10; //десятки, одновременно
dig2++; // инкрементируя на каждом проходе переменную dig2, соответствующую цифре второго разряда.
>
dig1 = data; // остаток, когда число станет меньше 10, записываем в переменную первого разряда.

>

if ((data >= 100)&& (data

while (data >= 100) < // аналогично вышеизложенному, вычитаем из него
data -= 100; // сотни, одновременно накапливая третий разряд (сотни)
dig3++;
>
while (data >= 10) < // когда в результате вычитаний сотен, число станет
data -= 10; // но >=10, начинаем вычитать десятки,
dig2++; // накапливая второй разряд (десятки)
>
dig1 = data; // остаток записываем в первый разряд
>

if ((data >= 1000)&& (data
// в интервале от 1000 до 9999.
while (data >= 1000) <
data -= 1000;
dig4++;
>

while (data >= 100) <
data -= 100;
dig3++;
>
while (data >= 10) <
data -= 10;
dig2++;
>
dig1 = data;
>

>

Для проверки работоспособности также использована уже знакомая функция millis(), которая отсчитывает миллисекунды, прошедшие с момента включения устройства. В данном случае, она передает для индикации количество секунд с момента включения, которые мы и можем наблюдать на индикаторах:

led dyn7

Используя описанные функции, на основе таких индикаторов, совсем нетрудно собрать какие-нибудь часы с термометром, как в предыдущих статьях. Единственное, за чем нужно следить, чтобы в процессе работы всех частей скетча не было временных задержек, бОльших, чем используются в функциях, осуществляющих саму динамическую индикацию.

Ардуино. Подключаем 7-сегментный светодиодный индикатор

В недавнем материале мы небезуспешно пытались заставить работать с Ардуиной жидкокристаллический индикатор на базе чипа HD44780. Что же - это было сравнительно легко. Потому что большую часть функций по организации работы индикатора брал на себя тот самый чип, встроенный в него. Плюс к этому, Ардуина также имеет достаточно развитые средства работы с такими индикаторами, поэтому работа с ним была легка и приятна.

Изучаемые в этой статье семисегментные светодиодные индикаторы, пожалуй, на сегодняшний момент, являются самым распространенным средством представления цифровой и псевдографической информации. Все вы наверняка их видели в различных бытовых приборах - от часов до микроволновки. Хотя, как правило, в таких приборах они скрыты за полупрозрачным цветным (чаще зеленым) экраном. Цвет свечения таких индикаторов также бывает различный. Лично я видел оранжевые, зеленые и красные.

led dyn

Вот, примерно, такие они на вид. Размеры также бывают очень разные - от совсем небольших, до "гигантских".

Для удобства подключения, эти черточки, из которых составляются знаки, обозначают буквами латинского алфавита:

led dyn2

Теперь разберемся, как же соединены эти светодиоды внутри самого индикатора. Из одной из прошлых статей, где мы перемигивались похожими светодиодами, помним, что они загораются только при определенной полярности приложенного напряжения. То есть - диод будет гореть, если на анод подать "+", а на катод - "-". В наших индикаторах или катоды, или аноды всех светодиодов соединены между собой. Если в один проводник соединены аноды, то индикатор называется - с "общим анодом", если катоды - с "общим катодом". Соответствующую полярность источника питания нужно подавать на него в том и другом случае.

Соответственно, все остальные выводы такого индикатора, кроме общего анода (катода), выведены наружу и соответствуют своим сегментам на "экране". Схема соединения индикатора:

led dyn3

Общее правило: если при подаче на общий проводник индикатора "плюса" питания, а на любой сегмент "минуса", этот самый сегмент загорается, то имеем индикатор с "общим анодом". Ну и, соответственно, наоборот.

Вот эти мои индикаторы, которые на фото выше (те что поменьше), были когда-то выпаяны из какой-то аппаратуры и не имели никакой маркировки. Причем, можно заметить, что у них в одном корпусе содержится по 2 индикатора. Тем не менее, взяв 2 проводка, соединенные с источником питания (лучше стандартные 5 вольт) и (обязательно!) сопротивление на 100 - 200 ом, можно методом научного тыка определить все выводы. То есть, начинаем подавать напряжение наугад на разные выводы индикатора. В какой-то момент мы найдем такую пару выводов, когда загорится какой-то сегмент. Значит, один из выводов, на которые мы наткнулись - это общий провод для данного индикатора (анод или катод). Ну, а вычисление расположения выводов других сегментов - дело техники и здравого смысла. Рекомендую нарисовать на бумажке расположение выводов индикатора и соответствующих им сегментов.

Разобравшись с выводами и нарисовав схему соответствия выводов конкретного индикатора с его сегментными светодиодами, мы обнаружим, что для подключения КАЖДОГО индикатора (разряда), нам нужно управлять ДЕВЯТЬЮ выводами (7 сегментов, точка и анод). То есть, так выходит, что, если мы хотим одновременно использовать, например, 4-хразрядный экран, то нам понадобится куда-то подключать 4 * 9 = 36 его выводов! И куда мы будем их подключать, когда во всей Ардуине их меньше?

Придется как-то выкручиваться. Если мы физически не можем управлять одновременно всеми 4-мя индикаторами, то будем управлять ими. ПО ОЧЕРЕДИ! Воспользуемся недостатком человеческого глаза.. Ну, или достоинством, раз в данном случае оно нам поможет.

А именно - если достаточно быстро демонстрировать и скрывать какое-то изображение, то, при определенной частоте показов, оно покажется нам постоянно демонстрирующимся- неизменяющимся. Этот эффект называется инерционностью зрения, и мы им воспользуемся.

Идея такая: показывать цифры (или другие знаки) не одновременно, а поочередно. Причем, с такой скоростью, чтобы наблюдателю казалось, что все они горят одновременно.

Алгоритм работы: исходное положение - на анодах (буду для простоты про свои индикаторы) нулевой потенциал, ни один индикатор не горит. Все выводы одноименных сегментов всех индикаторов соединены между собой согласно рисунку. Набираем на них нужную комбинацию "0" и "1", соответствующую какой-нибудь цифре. Затем подаем на анод "1". Индикатор загорается первым разрядом, показывая нам набранную цифру. Через какое-то время подаем на анод "0", первый разряд тухнет. Набираем на сегментных выводах комбинацию, соответствующую второму разряду, подаем "1" на анод второго разряда, он загорается цифрой, выдержка - и тушим его. И так далее по кругу. Если проделывать это с достаточно большой скоростью, то нашему глазу будет казаться, что все разряды зажжены одновременно. При этом мы использовали всего 7 сегментных выводов и 1 анодный для каждого индикатора, в моем случае, для четырех индикаторов - 4. Всего - 11, если не считая точки. Уже стало гораздо легче.

Вот это и есть принцип динамической индикации, на котором работает подавляющее количество приборов с цифровой индикацией.

Ну, а пока займемся размещением наших индикаторов на макетной плате:

led dyn1

На этом рисунке показаны установленные на макетке индикаторы и зажжен один сегмент. ВАЖНО! Напряжение на сегменты необходимо подавать через гасящие сопротивления 50-150 ом!

led dyn4

Продолжаем монтаж. На рисунке сверху видно, что мы соединяем все одноименные сегменты между собой, используя отрезки оголенного и не очень провода.

led dyn5

После всех соединений проверяем работоспособность схемы, подавая напряжения на разные сегменты. Не забываем подключать к сегментным выводам гасящие сопротивления!

Теперь еще такой нюанс. Как мы помним из предыдущих статей, ток одного включенного светодиода - примерно 20 миллиампер. А их, в одном разряде - целых 7, а с точкой - так и 8. То есть, через общий анодный вывод, при одновременном свечении всех сегментов разряда может протекать суммарный ток около 150 миллиампер. А это очень много, если учесть, что максимальный выходной ток вывода Ардуины - не более 40 миллиампер. Поэтому, для соединения анодов с Ардуиной будем использовать дополнительно транзисторные ключи:

led dyn6

Транзисторы, в принципе, можно использовать любые, главное, правильно их подключить. У меня оказались - типа p-n-p. Поэтому их коллекторы я напрямую соединил с анодами индикатора, эмиттеры - с "+" питания, а к базам - подключил сопротивления 1 ком. Теперь это и будут мои "выводы" анодов индикатора. Надо еще учесть такую вещь - теперь, с транзисторными ключами, для того, чтобы на аноде индикатора появился "+" , на базу транзистора нужно подать "-". Не забыть этот момент при написании программы.

Ну, с "железом", вроде как и все. Можно начинать писать программы для нашего прибора. Но об этом - уже в следующей статье.


Часики с 7-сигментным индикатором на TM1637 и часами реального времени DS3231, с возможностью установки времени кнопками.

Ниже несколько версий.

Видео:

Ссылки и файлы:

позже приведу в порядок и их.


update: 04.08.20 \ код и то что написано ниже, основанно на том видео, но не является истенно верным.

Как все подключено:


Было решено отказаться от мигалки двоеточием при помощи аппаратного прерывания, ибо для многих это оказалось слишком сложным техническим решением. Подключать ногу SQW на модуле к ардуино, не нужно. Кнопки и остальная логика работы не изменилась.

Железки на али:

Чтобы всё заработало как нужно, чтобы при компиляции не вываливались ошибоки, необходимо установить библиотеку для работы с индикатором TM1637:

Существуют и другие библиотеки для TM1637, но код написан с использованием DigitalTube от seeedstudio. Работа проверена на версии IDE 1.6.5-r5.

Для мигания двоеточием можно использовать таймер и для удобства работы с таймером, библиотеку:

Возможно с ней будут проблемы в новых версиях IDE, но на версии 1.6.5-r5 оно работает.

Цифры, 6, 7 и 9 имеют по два разных представления на семисегментном индикаторе. В ранних калькуляторах Casio и Электроника цифра 0 отображалась в нижней половине индикатора.

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная запятая, предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

Выбор индикатора

С выбором я немного поторопился, и вместо того чтобы почитать теорию, пошёл в магазин радиодеталей и просто выбрал те индикаторы, которые мне больше приглянулись.

На самом деле, при выборе стоит учитывать, что индикаторы могут быть с общим катодом или с общим анодом. По сути - это просто полярность. А вот при подключении, меньше заморочек если общий всё-таки катод.

Если общий - катод, то его обычно цепляют на землю, и можно регулировать яркость каждого сегмента отдельно, изменяя ток на каждом отдельном аноде. А если общий - анод, то на него подают напряжение, и приходится включать сегменты, инвертируя подачу сигнала на катоды. Так, сегмент будет включен, если на ножку не подаётся сигнал.

В общем, этим можно и пренебречь, подключая к Ардуине. Обычно яркость отдельного сегмента совершенно не обязательно.

Ещё одна заморочка была в схеме подключения. Найти её для конкретной модели индикатора не удалось, и пришлось опытным путём всё выяснять (хотя это само по себе интересно).

Подключение

Перерыв интернет, и не найдя описания подключения конкретно этого индикатора, решил определить всё сам:

Сам процесс оказался интересным и совсем не сложным.

Так, из 14 ножек, мне понадобилось только 9 (7 на сегменты, 1 на запятую и 1 на общее питание +3.3v). Проверял, подключая сегменты на землю (в ардуине это будет отсутствие сигнала на ноге).

Чтобы выводить цифры, надо комбинировать включение-выключение сегментов. Так, например, для цифры семь, надо включить сегменты A, B и C. Или, с Ардуины подать на их выводы LOW, а на остальные HIGH (для общего катода - наоборот, а сам катод нужно подключить на землю).

Вот, собственно табличка, соответствий для цифер от 0 до 9:

Цифра Сегменты
0 ABCDEF
1 BC
2 ABDEG
3 ABCDG
4 BCFG
5 ACDFG
6 ACDEFG
7 ABC
8 ABCDEFG
9 ABCDFG

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора



int pins[ 7 ]=< 2 , 3 , 4 , 5 , 6 , 7 , 8 >;
// значения для вывода цифр 0-9
byte numbers[ 10 ] = < B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110>;
// переменная для хранения значения текущей цифры
int number= 0 ;
void setup ()
<
// Сконфигурировать контакты как выходы
for ( int i= 0 ;i 7 ;i++)
pinMode(pins[i],OUTPUT);
>
void loop ()
<
showNumber(number);
delay( 1000 );
number=(number+ 1 )% 10 ;
>
// функция вывода цифры на семисегментный индикатор
void showNumber ( int num)
<
for ( int i= 0 ;i 7 ;i++)
<
if (bitRead(numbers[num], 7 -i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
>
>

Читайте также: