Tm1637 модель для proteus

Tm1637 модель для proteus

Товары

Обзор светодиодного индикаторного дисплея на базе драйвера TM1637

Одним из широко используемых устройств для отображения информации в любительских проектах Arduino являются 7-сегментные светодиодные индикаторы, которые используют в сборках из 4 или 8 штук. На данные дисплеи уже можно выводить какие-то осмысленные данные, например текущее время или курс валюты. Но еще совсем недавно это требовало использования очень большого количества контактов Arduino. С появлением дисплеев на светодиодных индикаторов на микросхеме TM1637 (рис. 1) для подключения используется всего 2 цифровых контакта Arduino, плюс питание и земля. TM1637 полностью берет на себя организацию динамической индикации индикаторов.

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

Технические характеристики дисплея TM1637

Напряжение питания – 3.3 – 5.5 В;

Ток потребления – 0.2 – 80 мА;

Количество сегментов – 4 с десятичной точкой в каждом разряде;

Размер индикаторов – 0.36" или 0.56";

Наличие разделительных точек;

Интерфейс – двухпроводной последовательный;

Цвета – красный, синий, желтый, белый, зеленый;

Регулируемая яркость – 7 уровней.

Подключение 4-Digit LED дисплея к плате Arduino

Для подключения дисплея к микроконтороллеру используют два контакта дисплея:

DIO –отправка данных;

которые подключаем к двум любым цифровым контактам Arduino (рис. 2).

Для работы с данным дисплеем существует несколько библиотек, например TM1637, DigitalTube, GyverTm1637. Установим в Arduino IDE библиотеку, позволяющую выводить цифры, буквы, время, бегущую строку и имеющую интересные визуальные эффекты. Посмотреть возможности библиотеки можно, запустив пример GyverTm1637_Demo (Примеры → GyverTm1637 → GyverTm1637_Demo).

Пример использования светодиодного LED дисплея vTM1637

Создадим проект отображения на дисплее TM1637 времени, текущей даты, года, дня недели с различными эффектами.

Для проекта нам понадобятся:

Плата Arduino Nano – 1 шт;

Дисплей TM1637 – 1 шт;

RTC DS3231 – 1 шт;

Схема соединений нашего проекта на рис. 4.

Порядок показа даты и времени, получаемых с модуля RTC DS3231:

_ _ : s s – показ секунд с миганием двоеточия;

h h : m m – часы и минуты с миганием двоеточия;

d d m m – день месяц;

Загружаем на плату Arduino скетч из листинга 1.

И проверяем работу часов (рис. 5,6).

Часто задаваемые вопросы

1. Не выводится изображение на дисплей

Проверьте правильность подключения модуля к плате Arduino.

Часто проекты требуют от нас вывода данных с различных датчиков и устройств в монитор порта или же на дисплей, например, для вывода данных с датчика температуры. Многие из вас уже знакомы с бюджетным дисплеем LCD 1602, подключаемым с помощью i2c интерфейса.

Но существуют также и LED дисплеи. С их помощью можно выводить те же данные, но в более удобном формате: за счет большего размера дисплея данные легче считывать, а еще с их помощью можно создать проект наподобие настоящих часов!

В данной статье разберем устройство LED индикатора TM1637, научимся подключать его к Arduino и писать программный код для работы с ним!

Для реализации проекта из этой статьи нам потребуются следующие компоненты:

Обзор модуля

Модуль представляет собой небольшую плату, на которой установлен LED 4-х разрядный семисегментный дисплей на основе одноименного i2c драйвера TM1637.

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

Также на некоторых дисплеях имеется часовой разделитель, в виде двоеточия. Именно поэтому очень широкое применение индикатор TM1637 нашел в DIY часах на Arduino.

Схема подключения

Благодаря наличию i2c интерфейса на борту, подключается модуль очень просто – с помощью четырех контактов. Два из них отвечают за питание и подключаются к выводам 5V и Gnd на панели Power нашего контроллера; два других, называются они CLK и DIO, подключатся к цифровым выводам, например 3 и 2, соответственно.

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

Подключение в Arduino IDE

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

Одновременно с загруженной библиотекой в папке «примеры» появятся три новых кода для ознакомления и проверки работоспособности. Познакомимся с одним из них.

Читайте также:  Как удалить штамп в ворде

Приведенный ниже код выводит на дисплей любые 4 символа, которые мы пропишем перед компиляцией, а также включает и выключает часовой разделитель с задержкой в 1 секунду (1000 миллисекунд):

После загрузки и успешной компиляции данного кода, мы увидим цифры 1, 2, 3, 4 на LED экране.

Вывод данных на дисплей

Если мы хотим выводить данные на дисплей, например с датчика температуры, то в том нам поможет следующий код:

Обратите внимание, что мы также сначала подключаем отдельную библиотеку для датчика температуры и влажности DHT. Для нашего дисплея прописаны также цифры и буквы, но они не относятся к коду – эта часть кода лишь показывает нам, что библиотека позволяет модулю отображать цифры от 0 до 9 в обычном режиме, и от 10 до 15 в виде букв.

Далее прописываем, к какому выводу подключаем наши модули, по сравнению с предыдущей схемой у нас добавляется подключение цифрового вывода с датчика температуры к пину номер 2.

В функции void setup инициализируем работу датчиков и запускаем цикл. В самом цикле считываем показания с датчика температуры: в переменную temp сохраняем значение температуры, а в значение humidity влажности.

Далее идет деление этих значений на 10, чтобы выводить эти данные на наш дисплей, так как на семисегментный дисплей можно выводить информацию только посимвольно.

Последние восемь строчек посвящены выводу данных непосредственно на дисплей. Последним значением выведем символ С, для температуры и F для влажности. И также поставим задержку в 5 секунд между передачей показаний.

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

Запись опубликовал Л е о н ы ч · 24.07.2018 13:29

4 495 просмотров

Намедни приблудился китайский дисплейный модуль на контроллере TM1637 (далее в тексте — контроллер, устройство) .

Вещь конечно, приятная во всех отношениях. По цене, сопоставим с ценой "голого" четырёхразрядного индикатора. Управляется всего по двум проводам, позволяя применять в качестве "ядра" дешевые маловыводные микроконтроллеры (далее в тексте — МК) вплоть до шестиногих букашек вроде Tiny10. Причём, от процессора не потребуется отвлекаться на динамическую индикацию,.достаточно отправить контроллеру посылку из нескольких байтов, и заниматься своими делами. "Выстрелил и забыл".

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

И все эти радости — по двум проводочкам. Вкусно.

Но не без ложки китайского дёгтя , ессно.

Ибо даташит, переведенный с китайского на английский, это. что-то. (Здесь должен быть абзац, составленный исключительно из матерных слов).

Говоря коротко, не пытайтесь в нём что-то понять, не изучив предварительно этот контроллер по другим источникам.

И вот с этим-то — самая засада. Поскольку посторонние источники крайне скудны. Существуют библиотеки под некоторые среды, в том числе — Ардуино (не к ночи будь помянута), но понимания работы ТМ1637 они не добавляют.

Примеров ассемблерного кода для AVR найти и вовсе не удалось, что сподвигло меня добавить в конце сего материала демонстрационную программульку, чтобы по мере способностей, восполнить этот пробел. На исчерпывающую полноту, абсолютную истину, и красоту кода не претендую. ))

Итак — "О контроллере ТМ1637 человеческим языком".

Начнём с "физики".

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

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

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

Обмен данными происходит по двум шинам — тактовой CLK, и данных DIO. При отсутствии передачи, на обеих шинах сохраняется высокий уровень.

Читайте также:  Почему в экселе не выделяются ячейки

Для передачи одного байта требуется девять импульсов синхронизации CLK. Биты передаются начиная с младшего.

Активной стороной всегда является МК. Контроллер TM1637 только принимает данные и отвечает на запросы.

Важно 1 — изменения состояния шины DIO должны происходить только при низком уровне на шине CLK.

Перед восходящим (передним) фронтом на CLK, на шине DIO уже должен быть установлен актуальный потенциал, соответствующий состоянию передаваемого бита.

Важно 2 — это правило нарушается лишь в начале и в конце посылки, (в пределах одной посылки может быть передано от одного до нескольких байтов). Маркером начала посылки является переход от высокого уровня к низкому на DIO при высоком CLK. Маркер окончания посылки — переход от низкого уровня к высокому на DIO при высоком CLK.

Эти два условия соответствуют стандартному протоколу I2C.

Сигнал подтверждения ACK тоже почти похож на аналогичный от I2C, и представляет собой низкий уровень на шине DIO, выставляемый устройством по заднему (спадающему) фронту восьмого импульса CLK (напомню, что по переднему фронту этого же импульса происходит запись последнего, восьмого бита передаваемого байта). Этот низкий уровень удерживается в течение одного такта синхронизации — до заднего фронта девятого импульса CLK. Если после этого не будет сформирован маркер окончания передачи, то следующий импульс CLK будет считаться первым синхроимпульсом следующего передаваемого байта.

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

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

С физикой вроде разобрались, теперь — СОФТ.

Что нужно сделать, чтобы на табло появились заветные цифры или буквы?

1. Даташит требует перво-наперво провести "инициализацию". Причём нигде в даташите не объяснено, что сие значит. В голову сразу лезут страшные воспоминания о громоздких процедурах для дисплеев на контроллере HD44780 и ему подобных.

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

Структура этого байта такова:

Bit 7 _ Всегда 1.

Bit 6 _ Всегда 0

Bit 5 _ 0 или безразлично

Bit 4 _ 0 или безразлично

Bit 3 _ 1 — включить дисплей, 0 — выключить дисплей

Bit 2, Bit 1,Bit 0 _ Три бита 0. 2 задают 8 градаций яркости дисплея.

NB: Касаемо содержимого битов 4 и 5, даташит гласит: "Zero should be inserted for irrelevant items". Что по-видимому следует понимать как "Неиспользуемый бит. Рекомендуется записывать в него ноль". Однако при записи туда единиц, ровным счётом ничего не меняется.

z.B: Команда 0b10001000 (0х88) — включить дисплей на минимальной яркости. (см.Фиг.2)

2.Затем нужно передать ещё одну однобайтную команду конфигурации, определяющую последующие действия:

а. Включим ли мы дисплей в нормальный режим, или в тестовый. Что такое тестовый режим, даташит умалчивает.

б. Будем ли мы передавать данные пакетом в несколько знаков (с автоинкрементом адреса), или изменять данные в каждом знакоместе по отдельности (по фиксированному адресу).

в. Будем ли мы вообще передавать в устройство данные для отображения, или будем читать состояние подключенной клавиатуры.

Структура команды конфигурации

Bit 7 _ Всегда 0

Bit 6 _ Всегда 1.

Bit 5 _ 0 или безразлично

Bit 4 _ 0 или безразлично

Bit 3 _ 1 — тестовый режим, 0 — нормальный режим

Bit 2 _ 1 — с фиксированным адресом знакоместа, 0 — с автоинкрементом адреса

Bit 1 _ 1 — чтение клавиатуры, 0 — запись отображаемых данных

Bit 0 _ Всегда 0

z.B: Команда 0b01000000 — (0х40) будем записывать данные пакетом, в нормальном режиме.

3. И наконец, нужно передать в устройство адрес знакоместа, и данные которые мы хотим в нём увидеть.

Здесь вспоминаем пункт "2.б". Если выбран режим фиксированного адреса, то посылки будут двухбайтовыми: [адрес]+[передаваемые_данные] для каждого знакоместа.

Данные представляют собой сумму "весовых коэффициентов" зажигаемых сегментов, что проиллюстрировано на фиг.6.

Адреса знакомест начинаются с 0xC0 (крайне левое, оно же — первое), и заканчиваются на 0xC3 для четырёхзнакового индикатора, или на 0xC5 для шестизнакового.

Читайте также:  Port 443 https как закрыть

z.B: Посылка (0хC2,0x73) — отобразит в третьем разряде букву "Р". (см.Фиг.3)

Если выбрана пакетная передача данных, то достаточно передать начальный адрес (например для первого знакоместа — 0xC0 ) а затем передать группу байтов данных. При этом адрес для каждого из байтов будет добавлен автоматически, и все они последовательно попадут на свои места. Всё это, и начальный адрес, и несколько байтов данных передаются за одну посылку.

z.B: Посылка контроллеру подряд пяти байтов (0xC0,0x06,0x5B,0x4F,0x66) — отобразит, начиная с первого знакоместа, число "1234".

Работа с клавиатурой

Её чтение происходит так:

1. Если инициализация не проведена ранее, проводим её.

2. Подаём команду конфигурации, которая в данном случае выглядит примерно так: 0b01000010 (0х42)

Это запрос текущего состояния клавиатуры.

3 Получив запрос, устройство переключается в режим передачи, и в ответ на каждый следующий передний фронт получаемых от МК импульсов CLK, выставляет на шину DIO уровень, соответствующий значению передаваемого бита.

Поэтому нам потребуется перевести шину DIO в режим чтения (переконфигурируя соответствующий порт МК как вход), чтобы снимать с неё данные.

Данные передаются в течение первых восьми тактов CLK. Девятый такт образует стоп-бит.

Всю процедуру чтения нужно производить одной двухбайтной посылкой [команда]+[чтение_данных].

Запрос клавиатуры при ненажатых кнопках, возвращает значение 0xFF.

В полученном байте состояния клавиатуры, интерес представляют первые (младшие) пять битов.

Биты 0. 2 дают код нажатой кнопки в пределах одной группы (клавиатура организована как две группы по восемь кнопок. см.фиг.4)

Низкий уровень бита 3 указывает на активность в первой группе (К1).

Низкий уровень бита 4 указывает на активность во второй группе (К2).

Высокий уровень в обеих этих битах (Bit3,Bit4) указывает на отсутствие нажатых кнопок.

Чтение клавиатуры проиллюстрировано в документации картинкой (см.Фиг.5). Картинки — то немногое что ещё можно понять в даташите. )))

При работе с клавиатурой следует учитывать три особенности.

1. Клавиатура "не понимает" нажатия двух и более кнопок одновременно.

2. При изменении состояния клавиатуры, контроллер не проявляет никакой активности на интерфейсных шинах. Поэтому, вызывать от неё прерывания МК не получится. Клавиатуру придётся регулярно опрашивать с достаточной периодичностью.

3. Судя по осциллограммам, выход устройства в режиме передачи данных в МК представляет собой "открытый исток", хотя в даташите это нигде не упомянуто.

Поэтому скорость нарастания напряжения на шине DIO ограничена параметрами RC цепи, состоящей из резистора подтяжки (10 КОм) и конденсатора неведомой ёмкости, установленного параллельно шине. Это обстоятельство ограничивает скорость пересылки данных в режиме чтения клавиатуры. При попытках уменьшения периода импульсов CLK до 100. 150 мкс и менее, моё устройство отказывалось читать клавиатуру правильно.

В примере кода, этот период составляет около 300 мкс (его можно изменять, модифицируя подпрограмму "pause:").

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

Быстродействие же устройства "на индикацию" может быть достаточно высоким. У меня оно бодро выводило символы на табло при периоде синхроимпульсов на шине CLK менее четырёх микросекунд. Работу при более высокой частоте, я не проверял.

И ещё.

Если планируется прошивка МК прямо в устройстве, старайтесь не использовать ISP выводы МК для линий DIO и SCK. Контроллер может принять активность на этих линиях за обмен с ним, и в неподходящий момент выставить на DIO свой ACK.

Впрочем, разъём между МК и устройством гарантированно позволит избежать коллизий. ))

Внизу выложен файл "ТМ1637.asm" — листинг демонстрационной программки на Ассемблере для ATtiny24 с тактовой частотой 8 МГц (писано в AVRStudio_4.14).

В ней присутствуют все четыре основных действия для работы с TM1637 — инициализация, передача данных с автоинкрементом адреса, передача данных по фиксированному адресу, и чтение клавиатуры.

Программка выводит на табло цифры "123" в старших разрядах, и "кракозябры" соответствующие необработанному коду чтения клавиатуры, в младшем разряде. Расшифровать код клавиатуры можно с помощью "весовых коэффициентов", показанных на фиг.6.

; TM1637 + Tiny24 8MHz

; Отображение в старших разрядах надписи "123"

; и необработанного байта состояния клавиатуры в 4-м разряде

Ссылка на основную публикацию
Kingston scsi disk device
SCSI (англ. Small Computer System Interface , произносится «скази» [1] [2] (встречается вариант эс-си-эс-ай)) — представляет собой набор стандартов для...
Boya by m1 как подключить к компьютеру
Схемы переходников для компьютерных и мобильных гарнитур и микрофонов. Микрофон, наушники и гарнитура У звуковой карты компьютера предусмотрены раздельные гнёзда:...
Cannot import expandconstant как исправить
Увлекательный блог увлеченного айтишника Ошибка Runtime Error возникает достаточно часто. Во всяком случае, с ней сталкивается достаточно большое количество пользователей....
Logitech options не видит мышь
ОДНО ПРИЛОЖЕНИЕ. ПОЛНОЕ УПРАВЛЕНИЕ УСТРОЙСТВАМИ. Logitech G HUB ОПТИМАЛЬНАЯ СРЕДА ПОДДЕРЖКИ ПО Logitech G HUB представляет собой единый центр управления,...
Adblock detector