Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Простые многофункциональные часы-барометр-термометр на LCD-дисплее на контроллере PCF8576

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

Периодически поглядывая на валяющиеся без дела индикаторы, закралась мысль все-таки попробовать их оживить. На передней панели дисплея расположены 25 символьных знакоместа, каждое из которых имеет 19 сегментов; из 16 формируется цифра или буква, и еще три: точка, запятая и треугольник под цифрой. Символы зажигаются красным или зеленым цветом, в зависимости от исполнения LCD. На самой плате имеется только каталожный номер платы: 14AXLCM0HMSV06, более никаких опознавательных знаков нет. На задней стороне платы располагаются два одинаковых, запараллеленных 6-ти пиновых разъема и три микросхемы PCF8576. Размеры LCD экрана весьма внушительные: 40 на 227 мм, а размеры цифры/буквы — 15х7мм.

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

  1. SDA
  2. SCL
  3. +5v – питание контроллера
  4. GND
  5. +5v – питание подсветки
  6. GND

Как видим, дисплей должен легко управляться по шине I2C. Произведя поиск по названию контроллера, выяснилось, что универсальной библиотеки для работы с ним нет. Пришлось копать даташит дальше. Подключив дисплей к Ардуино, и запустив сканер I2C портов, получаем адрес контроллера PCF8576 равный 0х38 (B0111000). Но на плате установлено 3-и микросхемы, соответственно 3 контроллера, их под-адреса определяются подключением пинов микросхемы к земле или питанию, пины А0, А1, А2 (соответственно 7, 8, 9-я ноги микросхемы), таким образом, получаем под-адрес первого контроллера 000, второго — 001, третьего – 010.

Для инициализации дисплея, достаточно послать несколько команд по шине I2C:

Wire.beginTransmission (0x38) ; //начать передачу по адресу 0х38

Wire.write (B11001000) ; // MODE SET – режим работы дисплея

Wire.write (B11100000); // DEVICE_SELECT – выбор контроллера

Wire.write (B11111000); // BANK_SELECT – не влияет при 1:4 multiplex mode

Wire.write (adr); // указать адрес

Wire.write (B00000000); // указать данные

Wire.write (B00000000); // указать данные

Wire.write (B00000000); // указать данные

...

Wire.endTransmission () ; // закончить передачу

Для упрощения понимания, далее, наборы символов будем называть «банком». Первый банк (левый набор символов) состоит из 8 знакомест и подчиняется первому контроллеру, соответственно, второй банк (средний) — второму, а третий банк (левый) состоит из 9 знакомест, подчиняется третьему контроллеру.

Адрес первого сегмента в каждом банке одинаков — B00000000. Адрес следующего знакоместа в 1-м и 2-м банке и до 5 символа включительно в 3-м банке, отличается от предыдущего на B00000101. Для простоты обращения к конкретному знакоместу в банке, их адреса собраны в массивах pointer_digit12[] (для 1-го и 2-го банков) и pointer_digit3[] (для 3-го). Почему отличаются адреса знакомест в 3-м банке? Дело в том, что в нем на одно знакоместо больше, не 8-мь, а целых 9 знакомест, и разработчики просто сэкономили на точке, запятой и треугольничке с 6 по 8 знакоместо для возможности размещения дополнительного, 9-го знакоместа.

Теперь рассмотрим формирование символа на знакоместе.

На рисунке вы можете видеть распределение сегментов на знакоместе. Для формирования одного символа требуется 2 байта, первый байт: hgfedcba, второй — h'g'f'e'd'c'b'a' . Так, например, для вывода символа «0» цепочка байт будет: {B00001111, B00001111}, где 1-означает зажечь сегмент, 0 соответственно — потушить. В скетче, в массиве digit[][2] сформированы необходимые для работы символы, в основном это цифры и символы типа градуса и т. п. При необходимости, таким образом, не трудно сформировать любой символ.

Для печати в выбранной позиции необходимого символа написана функция: print_digital(byte i, byte j, byte N, boolean z) { // печать символа в выбранной позиции (i=банк (1-3), j=позиция(1-8, 9-для 3-го банка), порядковый номер символа в массиве digit[][2] для цифр совпадает с порядковым номером, z=запятая да/нет). Функция clear(byte N) — стирает все символы из банка N.

Когда с дисплеем разобрались — подключаем по той же шине I2C часовой модуль DS3231 и метеодатчик BMP280. Все — часы готовы. В левом банке отображается текущая температура, в центре — время и текущая дата, в правом банке — текущее давление и стрелкой вверх, вниз, указывается, куда движется давление — поднимается или опускается. Для установки текущего времени и даты в схеме предусмотрены три кнопки: левая и средняя изменяют часы/минуты и число/месяц соответственно, правая, в режиме показа даты, изменяет год, в режиме показа времени - корректирует показания температуры. Поскольку метеодатчик стоит в корпусе часов, то на его показания влияет нагрев самой Ардуины, чтобы компенсировать этот нагрев и используется корректировка правой кнопкой, причем данная корректировка запоминается в энергонезависимой памяти.

 Часы задумывались, как подарок фанату ЦСКА, поэтому, в качестве "хранителя экрана" периодически, на дисплей выводится строка - "* ЦСКА - ЧЕМПИОН *", впрочем, можно выводить и любую другую строку, заменив массив  S_CSKA[] .

Принципиальная схема часов изображена ниже.

Принципиальная схема часов

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

  

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

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Плата Arduino
Arduino Nano 3.0
1 Поиск в магазине ОтронВ блокнот
Часы реального времени (RTC)
DS3231
1 Поиск в магазине ОтронВ блокнот
ДатчикBMP2801 Датчик температуры и давленияПоиск в магазине ОтронВ блокнот
LCD-дисплей1 На контроллере PCF8576Поиск в магазине ОтронВ блокнот
Тактовая кнопка3 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

Опубликована: 0 1
Я собрал 0 1
x

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

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

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

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

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0

[Автор]
DimaVolk #
Данные LCD есть в наличии, кому надо - обращайтесь.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Набор начинающего радиолюбителя Мини гравер 125 Ватт
вверх