Меню Рубрики

Алс334б1 подключение семисегментного индикатора к ардуино

Содержание

Наверняка у многих валяется вот такая светодиодная панелька:

Правильное название: семисегментный индикатор

Он получил такое названия благодаря тому, что в его корпусе находится 7 сегментов – светодиодов (часто добавляют ещё 8-й – точку).

Сейчас они не актуальны. Проще LCD экран подключить, он меньше выводов занимает, да и работать с ним проще. Однако иногда такие индикаторы могут быть полезен. Например, когда нужно отобразить только какую-либо цифру и ничего более. Плюс, они дешевле экранчиков.

Работать с семисегментом надо как со сборкой светодиодов (с общим катодом или анодом). Распиновку можно узнать, прозванивая ножки мультиметром. У меня получилось так: ( общий катод)

Каждый сегмент – это отдельный светодиод (красный или зелёный). Если подключаем к источнику 5V, то последовательно с каждым из них нужно подключить по резистору (150-300 ом) – чтобы не перегорели.

А соединять с Arduino я предлагаю через сдвиговый регистр 74HC595N (интерфейс SPI)

схема на BreadBoard:

Принципиальную схему не смог нарисовать в sPlan (нет 28-пиновой Atmega), так-что сделал в Fritzing:

Описание схемы:

– ноги 15,1,2,3,4.5,6,7 – это выходы регистра. Их подключаем к соответствующим ногам индикатора (A к Q0, B к Q1, C к Q3, ну и т. д.. Главное, чтобы было по порядку – тогда часть программирования будет проще)
– ноги 8 и 16 – это питание микросхемы (подключаем к GND и +5V Arduino)
– 10 ногу к +5V
– 13 ногу к GND
– Ноги 14, 12, 11 – управляющие пины шины SPI .
11 (SH_CP) – тактовая шина (clock) к 13 контакту Arduino (не принципиально)
12 (ST_CP) – защёлка (latch) к 12 контакту Arduino (не принципиально)
14 (DS) – данные (data) к 8 контакту Arduino (не принципиально)

Прошивка

Код очень простой. Мы даже не будем использовать библиотеку SPI. Посылать данные будем функцией shiftOut()

Она будет отправлять регистру 1 байт (8 бит). Каждый сегмент – это 1 бит. ( Если отправить вот такой байт: 0b10000000, то получим такую вот картину: (зажжётся первый сегмент – А)

Суть: Зажигая определённую комбинацию сегментов, мы получаем на экране цифру. Так, например, если зажечь сегменты B и С то загорится единичка. A, B, C – семёрка, и т. д..

Сам код: SevSeg1_SPI.ino

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino 1 Поиск в Utsource В блокнот
Сдвиговый регистр 1 Поиск в Utsource В блокнот
Резистор 100-300 Ом 8 Поиск в Utsource В блокнот
Семисегментный индикатор 1 Поиск в Utsource В блокнот
Добавить все

Прикрепленные файлы:

Оценить статью

  • Техническая грамотность

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал ( 0 ) | Подписаться

Для добавления Вашей сборки необходима регистрация

#define CLOCK 13 //SH_CP
#define DATA 12 //DS
#define LATCH 8 //ST_CP
int val = 0;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

0b12345678
*/
switch (val) <
case -1: //точка
shiftOut(DATA, CLOCK, LSBFIRST, 0b00000001);
break;
case 0: //0
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 1: //1
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 2: //2
shiftOut(DATA, CLOCK, LSBFIRST, 0b11011010);
break;
case 3: //3
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110010);
break;
case 4: //4
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100110);
break;
case 5: //5
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 6: //6
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111110);
break;
case 7: //7
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100000);
break;
case 8: //8
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111110);
break;
case 9: //9
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110110);
break;
case 10: //A
shiftOut(DATA, CLOCK, LSBFIRST, 0b11101110);
break;
case 11: //b
shiftOut(DATA, CLOCK, LSBFIRST, 0b00111110);
break;
case 12: //C
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011100);
break;
case 13: //d
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111010);
break;
case 14: //E
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011110);
break;
case 15: //F
shiftOut(DATA, CLOCK, LSBFIRST, 0b10001110);
break;
case 16: //G
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111100);
break;
case 17: //H
shiftOut(DATA, CLOCK, LSBFIRST, 0b01101110);
break;
case 18: //I
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 19: //J
shiftOut(DATA, CLOCK, LSBFIRST, 0b01110000);
break;
case 20: //L
shiftOut(DATA, CLOCK, LSBFIRST, 0b00011100);
break;
case 21: //n
shiftOut(DATA, CLOCK, LSBFIRST, 0b00101010);
break;
case 22: //O
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 23: //P
shiftOut(DATA, CLOCK, LSBFIRST, 0b11001110);
break;
case 24: //q
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100110);
break;
case 25: //S
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 26: //U
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111100);
break;
//некоторые буквы невозможно отобразить. их нет в списке
>

Читайте также:  Датчик уровня воды в баке своими руками

//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
if(val==26) <
val=-2;
>
delay(1000);
val=val+1;
>

#define CLOCK 13 //SH_CP 11 74СН
#define DATA 12 //DS 14 74СН
#define LATCH 8 //ST_CP 12 74СН

// – распиновка сегментов
byte numberSegments[10] = <
0b11111101, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110,
>;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

void loop() <
for (int i = 0; i

Наверняка у многих валяется вот такая светодиодная панелька:

Правильное название: семисегментный индикатор

Он получил такое названия благодаря тому, что в его корпусе находится 7 сегментов – светодиодов (часто добавляют ещё 8-й – точку).

Сейчас они не актуальны. Проще LCD экран подключить, он меньше выводов занимает, да и работать с ним проще. Однако иногда такие индикаторы могут быть полезен. Например, когда нужно отобразить только какую-либо цифру и ничего более. Плюс, они дешевле экранчиков.

Работать с семисегментом надо как со сборкой светодиодов (с общим катодом или анодом). Распиновку можно узнать, прозванивая ножки мультиметром. У меня получилось так: ( общий катод)

Каждый сегмент – это отдельный светодиод (красный или зелёный). Если подключаем к источнику 5V, то последовательно с каждым из них нужно подключить по резистору (150-300 ом) – чтобы не перегорели.

А соединять с Arduino я предлагаю через сдвиговый регистр 74HC595N (интерфейс SPI)

схема на BreadBoard:

Принципиальную схему не смог нарисовать в sPlan (нет 28-пиновой Atmega), так-что сделал в Fritzing:

Описание схемы:

– ноги 15,1,2,3,4.5,6,7 – это выходы регистра. Их подключаем к соответствующим ногам индикатора (A к Q0, B к Q1, C к Q3, ну и т. д.. Главное, чтобы было по порядку – тогда часть программирования будет проще)
– ноги 8 и 16 – это питание микросхемы (подключаем к GND и +5V Arduino)
– 10 ногу к +5V
– 13 ногу к GND
– Ноги 14, 12, 11 – управляющие пины шины SPI .
11 (SH_CP) – тактовая шина (clock) к 13 контакту Arduino (не принципиально)
12 (ST_CP) – защёлка (latch) к 12 контакту Arduino (не принципиально)
14 (DS) – данные (data) к 8 контакту Arduino (не принципиально)

Читайте также:  В каких странах дают бесплатное жилье

Прошивка

Код очень простой. Мы даже не будем использовать библиотеку SPI. Посылать данные будем функцией shiftOut()

Она будет отправлять регистру 1 байт (8 бит). Каждый сегмент – это 1 бит. ( Если отправить вот такой байт: 0b10000000, то получим такую вот картину: (зажжётся первый сегмент – А)

Суть: Зажигая определённую комбинацию сегментов, мы получаем на экране цифру. Так, например, если зажечь сегменты B и С то загорится единичка. A, B, C – семёрка, и т. д..

Сам код: SevSeg1_SPI.ino

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino 1 Поиск в Utsource В блокнот
Сдвиговый регистр 1 Поиск в Utsource В блокнот
Резистор 100-300 Ом 8 Поиск в Utsource В блокнот
Семисегментный индикатор 1 Поиск в Utsource В блокнот
Добавить все

Прикрепленные файлы:

Оценить статью

  • Техническая грамотность

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал ( 0 ) | Подписаться

Для добавления Вашей сборки необходима регистрация

#define CLOCK 13 //SH_CP
#define DATA 12 //DS
#define LATCH 8 //ST_CP
int val = 0;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

0b12345678
*/
switch (val) <
case -1: //точка
shiftOut(DATA, CLOCK, LSBFIRST, 0b00000001);
break;
case 0: //0
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 1: //1
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 2: //2
shiftOut(DATA, CLOCK, LSBFIRST, 0b11011010);
break;
case 3: //3
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110010);
break;
case 4: //4
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100110);
break;
case 5: //5
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 6: //6
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111110);
break;
case 7: //7
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100000);
break;
case 8: //8
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111110);
break;
case 9: //9
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110110);
break;
case 10: //A
shiftOut(DATA, CLOCK, LSBFIRST, 0b11101110);
break;
case 11: //b
shiftOut(DATA, CLOCK, LSBFIRST, 0b00111110);
break;
case 12: //C
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011100);
break;
case 13: //d
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111010);
break;
case 14: //E
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011110);
break;
case 15: //F
shiftOut(DATA, CLOCK, LSBFIRST, 0b10001110);
break;
case 16: //G
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111100);
break;
case 17: //H
shiftOut(DATA, CLOCK, LSBFIRST, 0b01101110);
break;
case 18: //I
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 19: //J
shiftOut(DATA, CLOCK, LSBFIRST, 0b01110000);
break;
case 20: //L
shiftOut(DATA, CLOCK, LSBFIRST, 0b00011100);
break;
case 21: //n
shiftOut(DATA, CLOCK, LSBFIRST, 0b00101010);
break;
case 22: //O
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 23: //P
shiftOut(DATA, CLOCK, LSBFIRST, 0b11001110);
break;
case 24: //q
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100110);
break;
case 25: //S
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 26: //U
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111100);
break;
//некоторые буквы невозможно отобразить. их нет в списке
>

//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
if(val==26) <
val=-2;
>
delay(1000);
val=val+1;
>

#define CLOCK 13 //SH_CP 11 74СН
#define DATA 12 //DS 14 74СН
#define LATCH 8 //ST_CP 12 74СН

// – распиновка сегментов
byte numberSegments[10] = <
0b11111101, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110,
>;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

Читайте также:  Гост на изготовление воздуховодов из оцинкованной стали

void loop() <
for (int i = 0; i

ru_arduino
[ lucky_byte ]
Сегодня я расскажу о подключении светодиодного индикатора АЛС334Б к Ардуино.
Для своих часов-будильника я решил выбрать индикацию вполне привычными светодиодными семисегментными индикаторами.

Во-первых, индикацию будет хорошо видно даже в темноте. Кроме того, у светодиодов низкое энергопотребление, они не дорого стоят и довольно легко управляются.

Немного теории

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

Цифры, 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

Результат

Ну, и в завершении знакомства, я написал простенькую программку, которая циклично показывает цифры от 0 до 9, с интервалом в одну секунду. Вот что получилось:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *