Сегодня в уроке подключим семисегментный индикатор TM1637 к Arduino. Установим библиотеку TM1637.h и научимся выводить на дисплей цифры и некоторые символы.
Характеристики Индикатора на TM1637:
• Напряжение питание: 5,5В
• Потребляемый ток 0.2 — 80мА (в зависимости от горящих сегментов)
• Градаций яркости индикаторов — 8
• Размеры платы: 42×24мм
• Двух проводной последовательный интерфейс (CLK, DIO).
Фото модуля от магазина RobotDyn фронтальный вид.
Фото модуля от магазина RobotDyn вид с тыльной стороны.
Этот модуль собран на драйвере TM1637.
• Есть модули красного, синего, зелёного, белого цвета.
• Размеры 0,36” и 0,56”
В уроке будем использовать модуль TM1637 0,56”, зеленого цвета.
Возможности модуля TM1637:
• Зажигать сразу все знаки или по одному сегменту или символу,
• Выводить цифры от 0 до 9 и некоторые буквы. Смотри ниже.
• Цифры могут выводиться как с нулями слева, так и без них,
• 8 градаций изменения яркости.
• Вывод символа в определённую позицию (ячейку).
Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.
Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.
Arduino Nano [PIN 5V] — TM1637 Module[PIN 5V]
Arduino Nano [PIN GND] — TM1637 Module[PIN GND]
Arduino Nano [PIN 2] — TM1637 Module[PIN DIO]
Arduino Nano [PIN 3] — TM1637 Module[PIN CLK]
Установить библиотеку TM1637.h можно из менеджера библиотек. Для этого откроем Arduino IDE, перейдем в раздел Скетч-> Подключить библиотеку -> Управление библиотеками.
Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.
Вы также можете скачать библиотеку TM1637 внизу урока, в разделе «материалы для скачивания».
Для реализации простых проектов, таких как часы, индикаторы и счетчики, этого набора символов достаточно. Я реализовывал часы с выводом температуры и влажности: Arduino часы. Видео 2. Подключаем к Arduino TM1637 и датчик DHT11.
Для отображения температуры использовал символ «С» номер для вывода на индикатор 12и для отображения влажности использовал символ «F» номер для вывода на дисплей 15.
Но для некоторых проектов на Arduino не достаточно данного набора символов. Расширить его достаточно легко, для этого в файле
Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.
После чего данные символы можно
использовать в своих проектах.
Если захочется закодировать свой символ, то можно использовать следующую таблицу:
После кодирования сегментов, установив нужные биты в байте, для сокращения записи можно перевести байт из двоичного в шестнадцатиричный формат, как — b00011110 -> 0x1E.
Пример 1. Вывод времени с мигающим двоеточием.
В данном примере выведем 4 цифры на индикатор TM1637, и научимся мигать двоеточием каждую секунду. Данный пример поможет вывести любую цифровую информацию: время, счётчики, показания с датчиков.
Пример 2. Вывод слов на модуль TM1637.
Дополнительные символы добавили в библиотеку, сейчас осталось научиться их выводить. Создадим массивы необходимых слов, после чего по очереди выведем их на дисплей. Данные слова можно использовать при выводе статуса работы устройств. Это пример слов. Вы можете составлять свои слова в соответствии с вашей задачей.
Пример 3. Выводданных с датчиком с символами.
Мы научились выводить цифры и слова на дисплей. Как же сделать динамическое изменение значений на дисплее. При этом добавлять символы для индикации различных данных.
Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5) выводит первый символ на дисплей 5. Аналогично выводятся остальные 3 символа.
Для разделения числа на десятки и единицы, для нахождения единиц нужно найти остаток от деления на 10, и для получения десяток нужно число делить на 10.
И после числового значения выведем символ, например, для температуры символ «С».
Пример применим при выводе даты, времени и показаний с датчиков.
Появились вопросы или предложения не стесняйся, пиши в комментарии!
Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.
Всем Пока-Пока.
И до встречи в следующем уроке
Понравилась статья? Поделитесь ею с друзьями:
Файлы для скачивания
Пример 1. Вывод времени с мигающим двоеточием.ino | 1 Kb | 171 | Скачать Вы можете скачать файл. | |
Пример 2. Вывод слов на модуль TM1637.ino | 1 Kb | 117 | Скачать Вы можете скачать файл. | |
Пример 3. Вывод данных с датчиком с символами.ino | 1 Kb | 129 | Скачать Вы можете скачать файл. | |
скачать библиотеку TM1637 (Доп символы).zip | 11 Kb | 150 | Скачать Вы можете скачать файл. | |
datasheet-TM1637.pdf | 685 Kb | 106 | Скачать Вы можете скачать файл. | |
TM1637.cpp (доп.символы).zip | 2 Kb | 110 | Скачать Вы можете скачать файл. |
Всем привет.
Сегодня для тестирования, подключаем к Arduino Nano, четырех значный, 7 х 4 сегментный, I2C дисплей TM1637.
Еще несколько лет назад подключить такой дисплей было не так просто и приходилось использовать все выводы платы Ардуино. Но сейчас благодаря микросхеме TM1637, преобразующей данные с шины I2C, в параллельные сигналы, эти дисплеи стало очень просто подключать к контроллерам. Так как для подключения этого дисплея нужно всего 4 провода, мама-мама или если использовать макетную плату, то 4 провода папа-папа. Из них 2 повода это питание +5 В, GND и оставшиеся 2 провода это шина I2C.
Вкратце расскажу про характеристики дисплея:
Микросхема драйвера дисплея TM1637
Логические уровни толерантные как к уровням напряжения 5 В и 3.3 В.
Четыре семи сегментные цифры плюс разделительные точки.
Сам дисплей с общим анодом.
Яркость дисплея можно регулировать и имеет 3 уровня.
Цвета свечения сегментов бывают разные красный, синий, желтый, белый и зеленый. Но самый популярный цвет красный. Я бы для себя предпочел бы белый, но как мне кажется белый при ярком дневном освещении будет плохо читаем. Наверно с этим и связана популярность красного.
И так, перейдем к подключению сегментного экрана к Arduino nano. Подключение занимает всего несколько секунд.
Схема подключения:
Принципиальная схема:
Для того что бы на экране индикатора появилась какая либо информация, нужно скачать и установить библиотеку TM1637, потом запустить Arduino IDE и выбрать «Файлы — примеры — TM1637» и после чего нажать кнопочку «Загрузка в контроллер», кнопку обозначил на изображении
Если все прошло успешно , то Ваш дисплей начнет демонстрировать свои возможности.
В выше приведенной библиотеке есть много разных эффектов, такие как бегущая строка, скроллинг, вращение, управление яркостью и пр.
Что бы создать и загрузить в дисплей свой символ, для его расчета нужно воспользоваться инструкций на изображении ниже. Если в двух словах, то значение каждого включенного сегмента нужно суммировать
Например нам нужно на экране получить цифру 4. Для этого нужно суммировать следующие значения 2 + 4 + 32 + 64 = 102. Переводим в шестнадцатеричную систему исчисления и получаем 0x66.
Ну вот как бы и все, что я хотел Вам рассказать про этот замечательный I2C экранчик. Надеюсь ничего не упустил. Если будут вопросы. Не стесняйтесь задавайте. Я отвечаю всегда, но может не всегда быстро как многим хотелось бы.
И на последок видео демонстрация возможностей сегментного индикатора TM1637
Намедни приблудился китайский дисплейный модуль на контроллере 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 для шестизнакового.
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.asm
(В более удобоваримом виде — тут: https://www.chipmake…les/file/16019/ )
;*****************************************
;
; TM1637 + Tiny24 8MHz
; CLK = PA3
; DIO = PA1
; Отображение в старших разрядах надписи «123»
; и необработанного байта состояния клавиатуры в 4-м разряде
;
;*******************************************
.include «tn24def.inc»
;****** РЕГИСТРЫ
.def tmp0 =r16
.def tmp1 =r17
.def tmp2 =r18
.def tmp3 =r19
;****** БИТЫ
.equ CLK =0x03 ;
.equ DIO =0x01 ;
rjmp RESET ; Reset Handler
rjmp EXINT ; IRQ0 Handler
rjmp PCIN0 ; PCINT0 Handler
rjmp PCIN1 ; PCINT1 Handler
rjmp WDT ; Watchdog Interrupt Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_COMPA ; Timer0 Compare A Handler
rjmp TIM0_COMPB ; Timer0 Compare B Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp ADCHN ; ADC Conversion Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp USI_STR ; USI STart Handler
rjmp USI_OVF ; USI Overflow Handler
RESET: ldi tmp1, low(RAMEND)
out SPL,tmp1
ldi tmp0,0xFF ;
out ddra,tmp1 ;весь porta как выход
out porta,tmp1 ;всем 1
;***************************************************
;***************************************************
LOOP:
;инициализация
rcall start ;маркер начала посылки
ldi tmp0,0x88 ;включение дисплея. Яркость минимальная.
rcall outcom ;вывожу команду
rcall end ;маркер конца посылки
rcall pause ;пауза 100 мкс
;включение режима передачи данных с автоинкрементом адреса
rcall start ;маркер начала посылки
ldi tmp0,0x40 ;режим передачи данных с автоинкрементом адреса
rcall outcom ;вывожу команду
rcall end ;маркер конца посылки
rcall pause ;пауза 100 мкс
;вывод сообщения «123» на табло
rcall start ;маркер начала посылки
ldi tmp0,0xC0 ;УСТАНОВКА НАЧАЛЬНОГО АДРЕСА (0хC0 — крайнее левое знакоместо)
rcall outcom ;вывожу адрес
ldi tmp0,0x06 ;1 в первый разряд
rcall outcom ;вывожу данные
ldi tmp0,0x5b ;2 во второй разряд
rcall outcom ;вывожу данные
ldi tmp0,0x4f ;3 в третий разряд
rcall outcom ;вывожу данные
rcall end ;маркер конца посылки
rcall pause ;пауза 100 мкс
;чтение клавиатуры
rcall start ;маркер начала посылки
ldi tmp0,0x42 ;режим чтения клавиатуры
rcall outcom ;вывожу команду
rcall incom ;получаю данные
rcall end ;маркер конца посылки
mov tmp2,tmp0 ;сохраняю данные клавиатуры в tmp2
;включение режима передачи данных с фиксированным адресом
rcall start ;маркер начала посылки
ldi tmp0,0x44 ;режим передачи данных с фиксированным адресом
rcall outcom ;вывожу команду
rcall end ;маркер конца посылки
;вывод необработанного байта состояния клавиатуры в четвертый разряд табло
rcall pause ;пауза 100 мкс
rcall start ;маркер начала посылки
ldi tmp0,0xC3 ;УСТАНОВКА АДРЕСА (0хC3 — четвертое знакоместо)
rcall outcom ;вывожу адрес
mov tmp0,tmp2 ;восстанавливаю в tmp0 сохранённые данные клавиатуры
rcall outcom ;вывожу данные
rcall end ;маркер конца посылки
rjmp LOOP
;***********************************
start: ;маркер начала посылки
rcall pause ;пауза 100 мкс
sbi porta,clk ;
sbi porta,dio ;
rcall pause ;пауза 100 мкс
cbi porta,dio ;
rcall pause ;пауза 100 мкс
ret
;***********************************
end: ;маркер конца посылки
sbi porta,clk ;
rcall pause ;пауза 100 мкс
sbi porta,dio ;
rcall pause ;пауза 100 мкс
ret
;***********************************
outcom: ;последовательный вывод. выводимый байт должен находиться в tmp0
push tmp1
; вывод восьми битов регистра tmp0
ldi tmp1,0x08 ;
outc10: cbi porta,clk ;опускаю CLK
rcall pause ;пауза 100 мкс
lsr tmp0 ; \
brcc outc20 ; |
sbi porta,dio ; > младший бит tmp0 выставляю на DIO
rjmp outc30 ; |
outc20: cbi porta,dio ; /
outc30: rcall pause ;пауза 100 мкс
sbi porta,clk ;поднимаю CLK
rcall pause ;пауза 100 мкс
dec tmp1 ;
brne outc10 ;последовательно вывожу весь байт
; стоп-бит
cbi ddra,dio ;переключаю DIO как вход, чтобы исключить коллизию с ACK
cbi porta,clk ;опускаю CLK
rcall pause ;пауза 100 мкс
sbi porta,clk ;поднимаю clk
rcall pause ;пауза 100 мкс
cbi porta,clk ;опускаю CLK
cbi porta,dio ;
sbi ddra,dio ;окончание стоп-бита, переключаю DIO как выход
; (выхожу с нулями на обеих шинах)
rcall pause ;пауза 100 мкс
pop tmp1 ;
ret ;
;********************************
incom: ;Чтение кнопок. выходные данные будут в tmp0
push tmp1
clr tmp0 ;
;последовательный ввод восьми битов в tmp0
ldi tmp1,0x08 ;
inc10: cbi porta,clk ;опускаю CLK
cbi ddra,dio ;переключение линии DIO как входа
sbi porta,dio ;включаю подтяжку DIO
rcall pause ;пауза 100 мкс
sbi porta,clk ;поднимаю CLK
rcall pause ;пауза 100 мкс
lsr tmp0 ;
sbr tmp0,0x80 ;\
sbis pina,dio ; >перенос пина DIO в tmp0
cbr tmp0,0x80 ;/
dec tmp1 ;
brne inc10 ;последовательно ввожу весь байт
rcall pause ;пауза 100 мкс
cbi porta,clk ;
;стоп-бит
rcall pause ;пауза 100 мкс
sbi porta,clk ;девятый импульс CLK
rcall pause ;пауза 100 мкс
cbi porta,clk ;опускаю CLK
cbi porta,dio ;выключаю подтяжку DIO
sbi ddra,dio ;переключение линии DIO как выхода
; выход с нулями на обеих шинах
rcall pause ;пауза 100 мкс
pop tmp1
ret
;********************************
pause: ;пауза 100 мкс
push tmp3 ;
ldi tmp3,0xff
de10: dec tmp3
brne de10
pop tmp3
ret
;*****************************************************************
;*****************************************************************
EXINT: ; IRQ0 Handler
PCIN0: ; PCINT0 Handler
PCIN1: ; PCINT1 Handler
WDT: ; Watchdog Interrupt Handler
TIM1_CAPT: ; Timer1 Capture Handler
TIM1_COMPA: ; Timer1 Compare A Handler
TIM1_COMPB: ; Timer1 Compare B Handler
TIM1_OVF: ; Timer1 Overflow Handler
TIM0_COMPA: ; Timer0 Compare A Handler
TIM0_COMPB: ; Timer0 Compare B Handler
TIM0_OVF: ; Timer0 Overflow Handler
ANA_COMP: ; Analog Comparator Handler
ADCHN: ; ADC Conversion Handler
EE_RDY: ; EEPROM Ready Handler
USI_STR: ; USI STart Handler
USI_OVF: ; USI Overflow Handler
rjmp reset ;
Начнем с модулей:
Для своих проектов я искал семисегментные индикаторы, яркие и компактные. Сделал ряд проектов на индикаторах с драйверами MAX7219
Недавно покупая на Алиэкспрессе всякую мелочевку наткнулся на эти индикаторы, на микросхеме TM1637. Мне понравилось компактное исполнение, невысокая цена и управление всего по двум проводам. Заказал парочку вместе с кучей других деталек.
Модули приехали запаянные в пакетики
Характеристики:
Вместе в посылке пришли и ESP8266 ES07, о которых упоминал в начале статьи. Подробно написал про них в своем блоге.
Последнее время много ковырялся с ESP-шками и решил опробовать индикаторы именно с ними. Особенностью данной реализации стало программирование из среды Arduino IDE.
Настройка Arduino IDE для работы с ESP8266 хорошо описана здесь
Хочу немного добавить, что купленные мною модули ESP-07 распаянные на платы-адаптеры уже практически готовы к использованию. Подключаем TX/RX и GND к TTL-USB конвертеру, например, такому. Подключаем питание 3.3В к VCC. Для загрузки прошивки GPIO0 присоединяем к земле. Собственно и все. Подключить GPIO0 и RESET к данному конвертеру у меня не получилось, но это оказалось не сильно нужно. При подсоединенном GPIO0 к земле ESP находится в режиме загрузки прошивки во флэш-память, но после загрузки происходит запуск программы без отсоединения данного GPIO. Это позволяет вполне комфортно отлаживать свою программу. Нужно перед загрузкой только перезагрузить модуль передергиванием питания или кратковременно подав на вывод RESET на землю. Для этого можно припаять специальную кнопку.
На фотке немного другой модуль ES12 из предыдущей партии. Конденсатор установлен для повышения стабильности работы. Последние модули использую без них.
Итак модуль подключен, среда настроена. Для ES07 все настройки ESP8266 ставятся «по умолчанию»:
Для работы с дисплеем на TM1637 я взял готовую библиотеку для Ардуино DigitalTube. «По умолчанию», дополнительные библиотеки устанавливаются в каталог: «Мои документы\Arduino\libraries\». Чтобы оправдать использование WiFi-модуля, эти часы буду синхронизировать время с NTP сервером в интернете.
Подключаем ESP, дисплей к CLK -> GPIO4, DIO ->GPIO5, стабилизатор 3.3В и USB-TTL конвертер макетными проводами
Грузим скетч, который можно взять здесь.
Настраиваем параметры своей точки доступа: AP_SSID и AP_PASS, свою таймзону TIMEZONE. У меня установлена для Перми/Екатеринбурга. Для Москвы будет 3.
Функцией tm1637.set(2) устанавливаем необходимую яркость индикатора от 0 до 7.
Компилируем:
Готово. Часы показывают часы и минуты, мигая двоеточием. Время точное из интернета, синхронизируется с NTP сервером. При длительном отсутствии соединения происходит перезагрузка ESP-шки.
В корпус все это делать не стал, так как это только прототип для будущего проекта.
Прочитать об этом можно будет в моем блоге
Полезные ссылки