Уроки arduino: основы работы с семисегментными дисплеями

Arduino: 7-сегментный индикатор

Если вы научились пользоваться “световой шкалой”, то следующий шаг в освоении нового компонента “7-сегментный индикатор” дастся вам легко. Он попадается практически во всех стартовых наборах.

Одноразрядный 7-сегментный индикатор

Мы имеем дело опять с набором светодиодов, только на этот раз их 8 (семь полосок и один кружочек) и они расположены не друг за другом, а в определённом порядке, которые позволяют вам выводить цифры от 0 до 9.

Важная отличительная черта – у индикатора имеются общие ножки для катода (ножки 3 и 8). Всего их две и они равноценны. Это удобно, вам не нужно будет от каждого катода вести отдельный провод на землю. Достаточно выбрать один из общих катодов и от неё соединиться с GND. Аноды у всех отдельные.

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

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

Схематично можно изобразить следующим образом.

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

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

Если мы хотим помигать цифрой 1, то нам надо использовать светодиоды 4 и 6, которые идут на порты 4 и 6 платы микроконтроллера.

Если мы захотим вывести цифру 5, то понадобится работать с пятью светодиодами, цифру 8 – уже семь светодиодов. При сложных проектах работать с таким количеством становится затруднительно. Придётся каждый раз смотреть на схему, что вспомнить, какие светодиоды нужно включить для отображения каждой цифры.

Но можно пойти другим путём. А поможет нам единица информации – байт. Байт в своём двоичном представлении состоит из 8 бит. Каждый бит может принимать значения 0 или 1. А наш светодиодный индикатор как раз и состоит из восьми светодиодов. Таким образом мы можем представить цифру на индикаторе в виде набора байт, где единица будет отвечать за включённый диод, а ноль – за выключенный диод.

Число в двоичном виде записывается следующим образом:

Первые два символа 0b дают понять, что речь идёт о двоичном счёте. Все нули означают, что все светодиоды будут выключены.

У нас задействованы порты от 2 по 9. Второй порт записывается в самую правую позицию. Чтобы его включить, поставим единицу.

Можно самостоятельно включать по отдельности каждый диод, перемещая единицу в представленном байте. Поняв принцип, можно, например, заметить, что за точку отвечает четвёртый бит справа. Если мы его не будем использовать, то он всегда будет равен 0. За чёрточку посередине индикатора отвечает самый последний байт (или первый слева).

Комбинируя набор нулей и единиц, можно создать нужные нам цифры. Например, цифра 0 будет представлена как 0b01110111.

Давайте напишем пример вывода цифры 0.

Код немного избыточен, переменная mask здесь лишняя, но она нам пригодится в следующем примере. Здесь важно, что мы пробегаемся в цикле по числу светодиодов и устанавливаем у всех режим OUTPUT. Затем также в цикле проходим через все светодиоды и узнаём, комбинацию бит с помощью метода bitRead(). Полученная информация помогает нам подсветить нужные светодиоды и получить цифру 0 на выходе.

Для остальных цифр можно также подготовить нужные наборы бит.

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

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

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

Позже я добавил на плату ещё один светодиод, который загорался при значении 0. При других значениях он был выключен.

На Амперке есть упоминания о двух компонентах, которые можно использовать для светодиодного индикатора. Я пока ими не пользовался:

Четырёхразрядный 7-сегментный индикатор

У четырёхразрядного 7-сегментного индикатора двенадцать выводов: 8 для каждого разряда с точкой и 4 для выбора нужного разряда. Чтобы разобраться в подключении, желательно иметь картинку перед глазами.

Если индикатор держать точкой вниз, то отсчёт идёт против часовой стрелки от нижнего левого угла.

Выводы 6, 8, 9 и 12 отвечают за конкретные разряды. Это могут быть общие катоды или общие аноды.

Выводы 1, 2, 3, 4, 5, 7, 10, 11 отвечают за конкретные сегменты. Например, самая верхняя полоска обозначена буквой A и имеет номер вывода 11. Таким образом, если подключить выводы 11 и 12 индикатора к выводу 11 и 12 на плате Arduino, то можем управлять этой полоской стандартным способом, например, помигать светодиодом.

Соедините все двенадцать выводов индикатора с выводами на плате. В своих примерах я использовал следующую схему.

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

Включаем букву H на всех разрядах.

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

Библиотека fDigitsSegtPin

К счастью есть библиотека fDigitsSegtPin, которую можно установить через менеджер библиотек. Подключаем библиотеку, указываем все двенадцать выводов по порядку и выводим нужное число.

Модули 7-сегментных дисплеев

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

Семисегментный индикатор Ардуино

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

Одноразрядный семисегментный индикатор подключить к Ардуино можно через макетную плату, самое главное знать распиновку (цоколевку индикатора), чтобы управлять сегментами от Arduino Uno. Рассмотрим, как подключить семисегментный индикатор к Ардуино и сделать простую программу с таймером. Будем управлять индикатором напрямую от микроконтроллера, используя тактовую кнопку.

Семисегментный индикатор распиновка

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

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

Как подключить семисегментный индикатор

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • одноразрядный семисегментный индикатор 5161as / hdsp 7503;
  • тактовая кнопка;
  • резисторы 220 Ом;
  • макетная плата (breadboard);
  • провода «папа-папа».

Схема подключения семисегментного индикатора к Ардуино

Для использования модуля 5161as / hdsp 7503 без сдвигового регистра потребуется использовать большое количество пинов Arduino Uno для включения светодиодов на индикаторе. В первом примере мы будем просто поочередно включать / мигать светодиодами для индикации на панели различных чисел. Соберите схему, как на представленной выше картинке и загрузите следующий скетч в микроконтроллер.

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

Пояснения к коду:

  1. скетч получается большим, поэтому мы ограничились тремя числами. Вывод других чисел на семисегментный индикатор Arduino не составит труда.

Управление семисегментными индикаторами

В следующем примере переключение чисел на индикаторе будет происходить только при нажатии тактовой кнопки. Дойдя до числа 3, таймер вновь обнулится и будет ожидать повторного нажатия на кнопку. Это довольно простые программы для Ардуино и семисегментного индикатора, для более сложных и интересных программ необходимо уже использовать сдвиговый регистр 74hc595 для Ардуино.

Скетч. Одноразрядный семисегментный индикатор и кнопка

Пояснения к коду:

  1. переменная byte v = 0; используется в программе для перехода одного цикла while к другому. При нажатии на кнопку значение переменной v меняется;
  2. в программе поставлена небольшая задержка в каждом условии для защиты от быстрого перехода от одного цикла while в другой.

Заключение. Мы ограничились лишь знакомством с данным модулем и его применением с платой Ардуино. Используя несколько панелек или четырехразрядный семисегментный индикатор можно уже сделать полноценный таймер на Ардуино или часы реального времени. Эти схемы мы разместили в разделе Проекты на Ардуино для начинающих, где любой может найти по своему вкусу проект на микроконтроллере.

Мир микроконтроллеров

Популярное

  • Устройство и программирование микроконтроллеров AVR для начинающих – 143
  • Трехканальный термостат, терморегулятор, таймер на ATmega8 – 70
  • Двухканальный термостат, терморегулятор на ATmega8 – 67

Подключение семисегментного дисплея к Arduino Uno

В этой статье мы рассмотрим подключение семисегментного дисплея к плате Arduino Uno. Дисплей может отображать цифры от 0 до 9. Вначале рассмотрим общие принципы работы семисегментного дисплея.

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

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

На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:

Необходимые компоненты

Плата Arduino UNO
Напряжение питания 5 В
Семисегментный дисплей HDSP5503 (2 шт.) – или другой подобный с общим катодом
Конденсатор 47 пФ, соединенный по питанию.

Работа схемы

Схема подключения семисегментного дисплея к плате Arduino представлена на следующем рисунке.

В схеме необходимо сделать следующие соединения семисегментного дисплея с платой Arduino:
PIN1 или E к контакту PIN 6 of ARDUINO UNO
PIN2 или D к контакту PIN 5
PIN4 или C к контакту PIN 4
PIN5 или H или DP к контакту PIN 9 /// в этом соединении нет необходимости если мы не будем использовать десятичную точку (decimal point)
PIN6 или B к контакту PIN 3
PIN7 или A к контакту PIN 2
PIN9 или F к контакту PIN 7
PIN10 или G к контакту PIN 8
PIN3 или PIN8 или CC (общий катод) на землю через резистор 100Ω.

Теперь, чтобы лучше понять принцип работы семисегментного дисплея, представим что он как будто подсоединен к порту микроконтроллера, то есть сегмент A соединен с контактом PIN0 микроконтроллера, сегмент B – с контактом PIN1, сегмент А – с контактом PIN3, сегмент А – с контактом PIN4, сегмент А – с контактом PIN5, сегмент А – с контактом PIN6. Общий вывод соединен с землей как показано на следующем рисунке.

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

Теперь, чтобы на семисегментном дисплее отобразить 0, необходимо подать питающие напряжения как показано на рисунке ниже.

То есть чтобы зажечь светодиоды в сегментах “A, B, C, D, E F” (то есть отобразить на дисплее цифру 0) нам необходимо подать питающее напряжение на контакты PIN0, PIN1, PIN2, PIN3, PIN4 and PIN5.

Теперь, если мы хотим отобразить цифру 1 на дисплее, мы должны подать питающее напряжение на сегменты “B, C”, то есть запитать контакты PIN1, PIN2. Эта ситуация показана на следующем рисунке.

То есть, чтобы отобразить какую либо цифру на дисплее, необходимо подать питание на соответствующие контакты дисплея.

Исходный код программы

В представленной программе мы будем последовательно подавать питание на соответствующие контакты семисегментного дисплея, чтобы по очереди отображать на нем цифры от 0 до 9.

#define segA 2 // подключение сегмента A к PIN2
#define segB 3 // подключение сегмента B к PIN3
#define segC 4 // подключение сегмента C к PIN4
#define segD 5 // подключение сегмента D к PIN5
#define segE 6 // подключение сегмента E к PIN6
#define segF 7 // подключение сегмента F к PIN7
#define segG 8 // подключение сегмента G к PIN8

int COUNT=0; //объявляем переменную для счета от 0 до 9
void setup()
<
for (int i=2;i // конфигурируем все используемые контакты на вывод данных
>
>

case 0: // показываем ”0” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;

case 1: // показываем ”1” на дисплее
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;

case 2: // показываем ”2” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;

case 3: // показываем ”3” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;

case 4: // показываем ”4” на дисплее
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;

case 5: // показываем ”5” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;

case 6: // показываем ”6” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;

case 7: // показываем ”7” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;

case 8: // показываем ”8” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;

case 9: // показываем ”9” на дисплее
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;

break;
>
if (COUNT /// увеличиваем значение счетчика каждую секунду
>
if (COUNT==10)
<
COUNT=0; // если значение счетчика становится равным 10, то сбрасываем его в 0
delay(1000);
>
>

Видео, демонстрирующее работу схемы

Подключить семисегментный дисплей к ардуино – Проектов – 2020

Подключение 7(8) сегментного индикатора MAX7219 к Arduino (Февраль 2020).

Интерфейс 7-сегментного дисплея в Arduino

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

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

Семь сегментных дисплеев имеют два типа: общий анод и общий катод. Внутренняя структура обоих типов почти одинакова. Разница заключается в полярности светодиодов и общей клеммы. В общем семисегментном дисплее катода (том, который мы использовали в экспериментах) все семь светодиодов плюс точечный светодиод снабжены катодами, подключенными к контактам 3 и контакту 8. Чтобы использовать этот дисплей, нам нужно подключить GROUND к контакту 3 и контакт 8 и, и подключите + 5V к другим контактам, чтобы отдельные сегменты загорелись. На следующей диаграмме показана внутренняя структура семисегментного дисплея с общим катодом:

Общий анодный дисплей является абсолютно противоположным. В общем анодном дисплее положительная клемма всех восьми светодиодов соединена вместе, а затем подключена к контакту 3 и выходу 8. Чтобы включить отдельный сегмент, вы заземляете один из контактов. На следующей диаграмме показана внутренняя структура семисегментного дисплея общего анода.

Семь сегментов обозначаются как ag, а точка – «dp», как показано на рисунке ниже:

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

Источники:

http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D1%81%D0%B5%D0%BC%D0%B8%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9-%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80/

http://microkontroller.ru/arduino-projects/podklyuchenie-semisegmentnogo-displeya-k-arduino-uno/

http://ru.electronics-council.com/interface-seven-segment-display-an-arduino-70840

http://arduinoplus.ru/assistent-parkovschik-dlya-garazha-arduino/

Ссылка на основную публикацию