RSS блога
Подписка
Самодельные часы с крупными символами, которые никогда не придётся настраивать.
В этом посте я расскажу о самодельных часах, которые не потребуют от пользователя вообще никаких настроек. Достаточно подать им питание, и они сами будут заботиться об отображении точного времени. Им не нужен ни интернет, ни Wi-Fi, ни подключение по витой паре, ни настройки в менюшках, ни подключение к смарт-домам / смартфонам. Вообще ничего. Просто «включил, поставил на полку и забыл». Идеальные часы? Конечно нет. Но стремятся к этому. И, возможно, кому-то нижеследующий текст будет интересен.
Скажу сразу. Я, в общем, не планировал писать этот обзор.
Частью из-за того, что тема DIY-часов тут периодически поднимается и без меня, частью из-за того, что товара, из-за которого и стоит писать этот обзор, — а именно, самих индикаторов, на Али уже нет. Более того, даже магазин этот удалён.
Так бы и осталось это без внимания, если бы я в одном из комментариев не обмолвился о своей самоделке. В ответ я получил просьбы посетителей (и в комментариях и в личной переписке) рассказать об этой конструкции. Посему решился на написание этого текста. Меня извиняет лишь то, что
а) часы действительно имеют несколько функциональных «изюминок», отсутствующих у других,
б) что на этом ресурсе чаще обозреваются готовые наборы, а вот именно часов-самоделок, с публикацией исходного кода, не так и много, и
в) что управляющий код содержит немало полезного функционала, который может кому-то пригодиться в своих будущих конструкциях (например алгоритм пофазового опроса DS18B20 с порционным питанием, честный расчёт CRC термодатчика, корректную обработку скретчпада датчика на отрицательных температурах, работу с символьным потоком GPS и синхронизацию времени с коррекцией под часовые зоны).
О часах вцелом.
• Часы собраны на популярном контроллере Arduino. Алгоритмические задачи, реализуемые в данных часах, как раз подходят под вычислительные мощности ардуины.
• В качестве источника точного времени для синхронизации часы используют сигналы со спутников GPS.
• Отсутствие сигналов GPS не является препятствием к работе, поскольку часы имеют кнопки ручной установки времени и даже в самом худшем случае они будут просто классическими электронными часами с ручной установкой часов и минут.
•Часы периодически сохраняют время в собственной энергонезависимой памяти, поэтому даже после сбоев питания они начинают отсчёт с последней сохранённой минуты. Да, такое время после сбоя будет неточным, но это явно лучше, чем начинать отсчёт с 00:00. По мере нахождения сигнала GPS, время, без вмешательства, синхронизируется.
• Часы хранят текущее время в специализированной микросхеме реального времени DS3231 с аварийным питанием от литиевой батарейки. Выход из строя (отсутствие) микросхемы реального времени или резервной батарейки не является препятствием к работе часов, они просто начнут терять время при сбоях по питанию, но автоматически восстанавливать его при синхронизации от спутника или при ручной установке.
• Отображение несинхронизированного неточного времени на дисплее визуально отличается от точного синхронизированного времени, если такая ситуация возникнет.
• Часы способны работать в любой часовой зоне. Коррекция часовой зоны производится с кнопок и не требует перекомпиляции или перезаливки кода.
• Часы умеют опрашивать один датчик температуры DS18B20 и периодически отображать температуру.
• Отсутствие или выход из строя датчика температуры не является препятствием к работе, часы просто не будут отображать экран с температурой.
• В часах отсутствует динамическая индикация. Часы не мерцают при отображении информации.
• В часах предусмотрен автоматический режим пониженной яркости для условий тёмной и ночной обстановки. Яркость изменяется аналоговым способом, что избавляет от мерцания индикаторов и в этом случае.
• По возможности, в конструкции я намеренно применял готовые унифицированные модули, что способствует более простому повторению и требует меньшей радиолюбительской подготовки от повторяющих.
Это не первые мои часы. Наверное каждый, кто научился держать паяльник, рано или поздно к этому приходит. Первые мои часы, тогда ещё с отцом, мы собрали в начале 80-х. На серии К155 и с К514ИД1 + АЛС304 на выходе. Потом было много часов «Старт 7176», сегодня уже не скажу, сколько их было собрано, — и себе, и другим. На КР145ИК1901 и с ИВЛ1-7/5, кто помнит. С различными модификациями, коими тогда изобиловал журнал «Радио». В самом начале двухтысячных я открыл для себя микроконтроллеры Атмел, и в ту же пору сделал часы на 2313 (тогда это было ещё не ATtiny, а AT90S) и кингбрайтовских дюймовых семисегментниках, кои вполне живы до сих пор. Описываемые тут часы являются, пожалуй, логичным продолжением этой цепочки. Ещё с самых первых часов я мечтал создать устройство, чтобы ему не надо было устанавливать каждый раз время, и чтобы оно (время) само восстанавливалось после сбоев по питанию. С появлением интернетов и NTP эта мечта стала вполне осуществимой. Однако технология GPS и доступность GPS-приёмников позволили создать устройство, максимально независящее от человека, максимально устойчивое к нештатным ситуациям и максимально самодостаточное.
Сначала о главном элементе часов.
Об индикаторах.
Судя по всему, это была какая-то индивидуальная разработка конкретного китайского подвала. Как я сказал выше, на Али уже нет ни самого лота, ни магазина, мне его продавшего. У меня остался снимок заказа, откуда я покажу фотографии продавца:
По сути, ничего особенного. Модуль собран на сдвиговом регистре 74HC595, который нагружен сегментами светодиодного индикатора. Сдвиговые регистры хороши тем, что позволяют «стекировать», «собирать» их в цепочки «друг за другом», и, последовательно вгружая цифровой код на вход первого, проталкивать его вдоль всей цепочки регистров до последнего. Поэтому, занимая от контроллера всего несколько пинов, мы можем управлять достаточно большим количеством независимых элементов; в данном случае, тридцатью двумя сегментами табло (семь сегментов + «точка», умножить на 4). Тем, кому хочется больше узнать про сдвиговые регистры и их применение, поисковик но запросу «74HC595 arduino» выдаст огромное количество информации и примеров.
Главной же интересной особенностью именно этих модулей было то, что питание самих сегментов было организовано не от общей линии питания регистров, а от отдельной колодочки на плате, — там простенькая схемка на паре транзисторов. Раздельное питание сдвиговых регистров и сегментов — довольно неплохая идея. Я этой особенностью попользовался вовсю, организовав ступенчатую регулировку яркости табло, не затрагивая питание регистров.
Я сумел подобрать примерно аналогичный модуль на площадке Таобао. Он стоит ¥8.00 за односимвольный модуль (это чуть больше доллара) плюс локальная доставка. Я не покупал эти модули и не держал их в руках. Но не вижу причин, почему бы они не заработали с описываемыми часами. Они отличаются от применённых мной, прежде всего, цветом свечения (тут красный, у меня синий) — но не проблема и перепаять, при необходимости. И отсутствием дополнительной линии питания. Но зато тут применён драйвер ULN2003A, что вселяет оптимизм в уверенности по нагрузочной способности схемы и в успешную доделку под разделение линий питания сдвигового регистра и сегментов индикатора, буде это кому-то понадобится.
На Таобао сейчас есть даже более прикольная платка — за пять долларов (включая локальную доставку) мы можем получить готовое красное табло с управляемым двоеточием; (подчеркну: это именно табло, без мозгов).
Вкратце познакомлю со своими модулями; тонкие подробности, очевидно, уже не актуальны.
Ширина модуля 29 мм
Высота модуля 40 мм
Высота символа: 30 мм
Питание цифрового интерфейса: 5V
Питание символов индикатора:7-12V
Модули приходят с защитной плёнкой на рабочей плоскости:
С обратной стороны:
Флюс, конечно, не отмыт.
Клеммная колодка установлена с перекосами.
Явно «хижина дядюшки Ляо».
Тем не менее, все надписи присутствуют, а внизу даже нарисована стрелка, показывающая вход и выход последовательного потока загружаемых данных.
Все четыре модуля-индикатора я закрепил на промежуточной пластине-шасси, оставив пробел в половину ширины символа между часами и минутами, чтобы зрительно будущее двоеточие между ними смотрелось более комфортно.
Двоеточие оформил так. Взял прямоугольный кусочек листового чёрного АБС-пластика, просверлил два отверстия, разметив их с тем же углом наклона, что и сегменты на индикаторах. Вклеил в эти отверстия пятимиллиметровые молочные светодиоды и аккуратно сошлифовал дремелем полукруглые линзы диодов. Получилась чёрная плашка с молочным двоеточием. Эту плашку просто приклеил между закреплёнными индикаторами.
Цвет пластика «двоеточия» чуть-чуть не совпадает с чёрным цветом индикаторов, но за тонированным стеклом это не имеет никакого значения. И это явно лучше, чем просто впаянные и открытые светодиоды: во-первых, не видны белые торцы индикаторов, во-вторых нет боковой засветки от светодиодов.
Принципиальная схема часов довольна проста и легко понимаема:
Несколько пояснений по схеме.
1. В качестве ардуины применено Arduino Pro Mini. Но подойдёт любая, хоть Nano, хоть Uno. Я люблю ProMini за то, что их не жалко оставлять в готовых конструкциях, это самая бюджетная модель из линейки ардуино. Покупаю их сразу пригоршню и всегда имею запас «в тумбочке». Новичкам же, наверное, больше подойдёт упомянутые выше Nano или Uno, потому что они сразу, без переходников и сложностей, умеют подключаться к USB «большого брата».
2. Токоограничительные резисторы светодиодов двоеточия надо подбирать так, чтобы при дневном освещении и за тонированным стеклом яркость двоеточия не отличалась от яркости остальных символов. В зависимости от применённых светодиодов, значения этих резисторов могут лежать в пределах от 100 Ом до 6кОм.
3. К пину 3 подключён узел ночного приглушения яркости. Приглушение обеспечивает одноваттный резистор 740 Ом. Его значение подбирается в зависимости от желаемой степени затемнения. Для дневного режима (т.е. режима полной яркости), этот резистор полностью блокируется p-канальным мосфетом, управляемым от пина микроконтроллера. IRF9Z24N применён потому, что он у меня был. Подойдёт и IRF9Z14N, и любой другой, подходящий по параметрам. Почему яркость меняется мощным резистором, а не ШИМ? Чтобы полностью исключить мерцание. Часы питаются не от батарей, а стационарно. В данном случае этот ход оправдан, глаза дороже.
Если вам опция ночного затемнения не нужна, можно просто этот узел не собирать.
4. В качестве датчика освещения применён недорогой модуль на фоторезисторе и компараторе LM393. Порог чувствительности между тёмным и светлым уровнем устанавливается движком подстроечного резистора на модуле. Фоторезистор надо располагать так, чтобы на него не попадал собственный свет от индикаторов часов. У меня он расположен на боковой грани корпуса.
5. В качестве часов реального времени я использовал модуль со встроенной батареей. Но, разумеется, подойдёт модуль в любом исполнении. Важно только убедиться, что обе сигнальные линии подтянуты к плюсу питания (в указанном модуле они уже подтянуты производителем). Чип DS3231 предпочтительнее, чем DS3107, поскольку имеет несравнимо более высокую точность хода.
6. О питании в схеме. В силу того, что моим индикаторам требовалось два питания (причём, одно — не очень-то стандартное), я поступил так. Для первой ступени применил замечательные понижающие мини DC-DC преобразователи. (вот лот сразу на 10 штук, можно и поштучно). Важно только сначала выставить движком требуемое напряжение, капелькой лака (цапона или лака для ногтей) зафиксировать движок подстроечного резистора, а уж потом впаивать модуль в схему. Применение DC-DC модуля позволило в качестве источника питания использовать любой ненужный сетевой адаптер в широком диапазоне питающих напряжений (от 9 до 21 вольта). У меня это двенадцативольтовый адаптер от какого-то мертвого сетевого хаба. Для второго стабильного напряжения +5V поставил 7805 (КР142ЕН5А). Потому что он у меня был. Но ничто не мешает поставить такой же DC-DC преобразователь, настроенный на 5 вольт.
7. В качестве приёмника GPS-сигналов используется модуль GY-NEO6MV2. У меня точное время с GPS ловится, пусть и не сразу, в метре от окна в панельном доме далеко не на верхнем этаже за пластиковыми окнами с внутренним металлизированным напылением. Но уже сегодня вполне доступны более современные GPS+ГЛОНАСС модули, те же Neo-M8N, там надо только чуть сконфигурировать их параметры для работы с данным скетчем.
К программной части.
Для тех, кто решит повторить описанную тут конструкцию, я приготовил архив с исходником и всеми необходимыми библиотеками. Из папки «libraries» внутри архива надо распаковать те библиотеки, которых не хватает в папке «libraries» вашей ArduinoIDE.
На случай, если архив протухнет, повторю код ещё и тут:
О работе с DS18B20. В моём решении питание датчику подаётся не постоянно, а только на требуемый для получения и считывания температуры период, оставляя всё остальное время датчик обесточенным. Такой подход сводит к минимуму самонагрев датчика, и, как следствие, завышение считываемых показаний. Вся работа по обслуживанию термодатчика содержится в процедуре, вызываемой по прерыванию таймера каждые полсекунды. Для того, чтобы не задерживать эту процедуру надолго, вся работа разбита на несколько тактов, т.е. каждые полсекунды делается один такт — маленький кусочек этой работы. Такой подход нисколько не задерживает основной цикл (в котором работают другие процессы) и полностью соответствует рекомендуемыми производителем временным интервалам. Так, в первом такте на датчик подаётся питание, в следующем такте (т.е. через полсекунды) датчику отправляется запрос на преобразование, ещё через полторы секунды готовое значение считывается из датчика и снимается питающее напряжение (оно больше не нужно до следующего цикла), в следующем такте рассчитывается контрольная сумма, ещё один такт тратится на пересчёт сырых данных в градусы Цельсия. Оставшиеся семь секунд десятисекундного цикла датчик отдыхает обесточенным.
Реализация расчёта контрольной суммы табличным методом, содержащаяся в стандартной библиотеке OneWire, взята из официального аппнота к DS18B20, но, как оказалось, мало кто сейчас читает официальные даташиты и аппноты. Бóльшая часть исходников к ардуино, доступных в сети, вообще не содержит какого-либо просчёта CRC, и, как следствие, такие «упрощённые» алгоритмы спотыкаются на неудобных значениях (+85°, 0°, +125°). Что довольно удивительно, на мой взгляд.
Вторая проблема, часто встречаемая в доступных исходниках по работе с DS18B20 — это пересчёт отрицательных значений температуры из дополнительной двоичной кодировки. Это удивительно, — ведь, вроде бы, обычная бинарная математика, но, такое впечатление, что половина авторов просто не проверяла свои скетчи на отрицательных температурах. Если ниже нуля ваша программа сразу показывает 65536 градусов, а вы не находитесь внутри Солнца, то гляньте в этот скетч, там всё в комментариях есть.
О синхронизации времени в часах. Как я уже сказал выше, текущее время япериодически пишу в EEPROM. С целью экономии износа ячеек, я не пишу секунды, а часы и минуты пишу только в том случае, если время не скомпрометировано и если значение внутри ячейки не совпадает с записываемой переменной. Более сложных алгоритмов по экономии ресурса EEPROM я не применял: не тот масштаб задачи. При включении питания значение времени читается из энергонезависимой памяти. При этом оно считается скомпрометированным и имеет наименьший приоритет важности. Тем не менее, даже такое время по ряду причин всё равно лучше, чем 00:00
получаю из RTC. В случае, если часы реального времени не обнаружены, системное время начинается с 00:00, но это время считается скомпрометированным, имеет наименьший приоритет и зрительно на дисплее будет отличаться от обычного. Как только время будет установлено вручную с кнопок, оно получит более высокий приоритет и уже будет считаться приемлемым. Ещё более приоритетным является время из RTC. Время, полученное с GPS и прошедшее проверку, считается наиболее точным и имеет наивысший приоритет. Оно корректирует показания, хранящиеся в RTC и, уж конечно, замещает собой установленное вручную с кнопоки считанное из памяти. Если время удачно синхронизировано, последующая синхронизация ожидается неспешно, примерно через четверть часа. В случае, если время скомпрометировано или или всё ещё не синхронизировано со спутника после включения, попытки синхронизации предпринимаются гораздо чаще, каждые десять секунд.
О конструктивном оформлении часов.
Я использовал готовый корпус производства Gainta. Дремелем в передней плоскости вырезал прямоугольное окно под индикаторы. На одной боковой плоскости виден фоторезистор. На другую боковину выведены толкатели стандартных тактовых кнопок (установка часов и минут), и разъёмы для подключения термодатчика и адаптера питания (мой адаптер питания имеет штекер 5,5x2,1 и втыкается вот в такое гнездо).
Переднюю сторону корпуса, по хорошему, надо закрыть тоненьким тонированным стеклом.
С советских времён у меня хранилось тонированное в серый цвет оргстекло толщиной 1,5 мм. Его осталось очень мало и на данную площадь его, увы, не хватило. Но сейчас же другое время, чего сейчас нельзя найти? Оказалось, что вот тонированного оргстекла такой толщины сейчас нельзя найти. Судя по всему, его не существует. Возможно найти тонированный плексиглаc толщиной 3 мм — и это всё. Но в Москве никто не продаст тебе кусочек плексигласа 15x10 сантиметров. Покупай трёхметровый лист — и никаких гвоздей. Такой плексиглас (стандартными кусками формата A4) возможно купить на ebay, но это довольно дорого.
Решил проблему так. Заказал по размерам обычное прозрачное оргстекло 2 мм (оно-то вполне доступно) и оттонировал его парой слоёв (спереди и сзади) вот такой тонировочной плёнки свётло-серого цвета (покупал дешевле, были скидки). Оттонированное стекло приклеил прозрачным силиконовым герметиком к корпусу. Получилось, на мой взгляд, вполне смотрибельно.
Часы работают уже более года, проблем не выявлено. Было несколько сбоев времени из-за неустойчивого приёма GPS (у меня для приёма условия, всё-таки, довольно экстремальные), но время без вмешательств самовосстанавливалось со следующей синхронизацией. Это действительно конструкция «включил коробочку и забыл». А бóльшего от неё и не требуется.
Главное, ради чего всё это писáлось. Я искренне надеюсь, что моя статья предоставит достаточное количество идей, и информационной помощи тем, кому эта сфера интересна. А, возможно, кому-то послужит недостающим импульсом для начала собственного творчества и реализации собственных идей.
Так, даже в существующем виде данная конструкция предоставляет широкое поле для фантазии и творчества. Мы уже сейчас внутри алгоритма, помимо текущего времени, совершенно бесплатно имеем дату и свои координаты. Мало того, что можно просто выводить эту информацию, из неё ещё можно получать рассветы и закаты Солнца непосредственно для вашей местности, можно получать фазу Луны, день недели, високосность года, рассчитывать Пасхалию и т.д. Осталось ещё шесть свободных пинов, а, значит, можно подключать ещё какие-то датчики или исполнительные механизмы: звуковые сигнализаторы, реле, ключи коммутации, кнопки, беспроводные передатчики/приёмники и т.д.
Добавлено спустя сутки:
В нескольких комментариях к обзору мне сказали, что хорошо бы зрительно отличать гарантированно неточное время, от правильного синхронизированного. Я дописал код, теперь эта возможность у пользователя есть.
Если возникнет ситуация, когда время не может быть получено ни от одного из источников, когда оно ещё явно не сихронизировано и является скомпрометированным, двоеточие между разрядами часов и минут будет мигать в тревожном, коротко-«рваном» ритме. Как только точное время будет получено со спутников, двоеточие станет мигать привычным образом: одно мигание в секунду.
Вот в этом коротком ролике я показал, как зрительно выглядит сначала недостоверное, а потом синхронизированное время. Прошу прощения за качество, яркий синий светодиодный свет очень трудно снимать…
Исходник в тексте обзора, а также в прилагаемом архиве обновлён.
Добавлено спустя полтора месяца:
Я откорректировал проект, полностью отказавшись от хранения времени в EEPROM, в пользу хранения его в RTC: в энергонезависимой памяти при отсутствии питания хранящееся время статично, а в часах реального времени оно всё равно идёт. Удорожание проекта на один доллар окупается гораздо более удобной и комфортной эксплуатацией и более широким функционалом. Исходник снова обновил. Текст обзора поправил.
Спасибо читателям за ценные идеи!
* Все ссылки по тексту выше — исключительно для иллюстрации. Скорее всего, сегодня аналогичные товары можно купить по другой цене и у другого продавца.
PS: Никто ничего для обзора не предоставлял и не спонсировал. Всё, что описано в конструкции, покупалось в разное время за свои собственные деньги или было найдено в собственных закромах.
Скажу сразу. Я, в общем, не планировал писать этот обзор.
Частью из-за того, что тема DIY-часов тут периодически поднимается и без меня, частью из-за того, что товара, из-за которого и стоит писать этот обзор, — а именно, самих индикаторов, на Али уже нет. Более того, даже магазин этот удалён.
Так бы и осталось это без внимания, если бы я в одном из комментариев не обмолвился о своей самоделке. В ответ я получил просьбы посетителей (и в комментариях и в личной переписке) рассказать об этой конструкции. Посему решился на написание этого текста. Меня извиняет лишь то, что
а) часы действительно имеют несколько функциональных «изюминок», отсутствующих у других,
б) что на этом ресурсе чаще обозреваются готовые наборы, а вот именно часов-самоделок, с публикацией исходного кода, не так и много, и
в) что управляющий код содержит немало полезного функционала, который может кому-то пригодиться в своих будущих конструкциях (например алгоритм пофазового опроса DS18B20 с порционным питанием, честный расчёт CRC термодатчика, корректную обработку скретчпада датчика на отрицательных температурах, работу с символьным потоком GPS и синхронизацию времени с коррекцией под часовые зоны).
О часах вцелом.
• Часы собраны на популярном контроллере Arduino. Алгоритмические задачи, реализуемые в данных часах, как раз подходят под вычислительные мощности ардуины.
• В качестве источника точного времени для синхронизации часы используют сигналы со спутников GPS.
• Отсутствие сигналов GPS не является препятствием к работе, поскольку часы имеют кнопки ручной установки времени и даже в самом худшем случае они будут просто классическими электронными часами с ручной установкой часов и минут.
•
• Часы хранят текущее время в специализированной микросхеме реального времени DS3231 с аварийным питанием от литиевой батарейки. Выход из строя (отсутствие) микросхемы реального времени или резервной батарейки не является препятствием к работе часов, они просто начнут терять время при сбоях по питанию, но автоматически восстанавливать его при синхронизации от спутника или при ручной установке.
• Отображение несинхронизированного неточного времени на дисплее визуально отличается от точного синхронизированного времени, если такая ситуация возникнет.
• Часы способны работать в любой часовой зоне. Коррекция часовой зоны производится с кнопок и не требует перекомпиляции или перезаливки кода.
• Часы умеют опрашивать один датчик температуры DS18B20 и периодически отображать температуру.
• Отсутствие или выход из строя датчика температуры не является препятствием к работе, часы просто не будут отображать экран с температурой.
• В часах отсутствует динамическая индикация. Часы не мерцают при отображении информации.
• В часах предусмотрен автоматический режим пониженной яркости для условий тёмной и ночной обстановки. Яркость изменяется аналоговым способом, что избавляет от мерцания индикаторов и в этом случае.
• По возможности, в конструкции я намеренно применял готовые унифицированные модули, что способствует более простому повторению и требует меньшей радиолюбительской подготовки от повторяющих.
Это не первые мои часы. Наверное каждый, кто научился держать паяльник, рано или поздно к этому приходит. Первые мои часы, тогда ещё с отцом, мы собрали в начале 80-х. На серии К155 и с К514ИД1 + АЛС304 на выходе. Потом было много часов «Старт 7176», сегодня уже не скажу, сколько их было собрано, — и себе, и другим. На КР145ИК1901 и с ИВЛ1-7/5, кто помнит. С различными модификациями, коими тогда изобиловал журнал «Радио». В самом начале двухтысячных я открыл для себя микроконтроллеры Атмел, и в ту же пору сделал часы на 2313 (тогда это было ещё не ATtiny, а AT90S) и кингбрайтовских дюймовых семисегментниках, кои вполне живы до сих пор. Описываемые тут часы являются, пожалуй, логичным продолжением этой цепочки. Ещё с самых первых часов я мечтал создать устройство, чтобы ему не надо было устанавливать каждый раз время, и чтобы оно (время) само восстанавливалось после сбоев по питанию. С появлением интернетов и NTP эта мечта стала вполне осуществимой. Однако технология GPS и доступность GPS-приёмников позволили создать устройство, максимально независящее от человека, максимально устойчивое к нештатным ситуациям и максимально самодостаточное.
Сначала о главном элементе часов.
Об индикаторах.
Судя по всему, это была какая-то индивидуальная разработка конкретного китайского подвала. Как я сказал выше, на Али уже нет ни самого лота, ни магазина, мне его продавшего. У меня остался снимок заказа, откуда я покажу фотографии продавца:
Вот так это выглядело на странице продавца
По сути, ничего особенного. Модуль собран на сдвиговом регистре 74HC595, который нагружен сегментами светодиодного индикатора. Сдвиговые регистры хороши тем, что позволяют «стекировать», «собирать» их в цепочки «друг за другом», и, последовательно вгружая цифровой код на вход первого, проталкивать его вдоль всей цепочки регистров до последнего. Поэтому, занимая от контроллера всего несколько пинов, мы можем управлять достаточно большим количеством независимых элементов; в данном случае, тридцатью двумя сегментами табло (семь сегментов + «точка», умножить на 4). Тем, кому хочется больше узнать про сдвиговые регистры и их применение, поисковик но запросу «74HC595 arduino» выдаст огромное количество информации и примеров.
Главной же интересной особенностью именно этих модулей было то, что питание самих сегментов было организовано не от общей линии питания регистров, а от отдельной колодочки на плате, — там простенькая схемка на паре транзисторов. Раздельное питание сдвиговых регистров и сегментов — довольно неплохая идея. Я этой особенностью попользовался вовсю, организовав ступенчатую регулировку яркости табло, не затрагивая питание регистров.
Я сумел подобрать примерно аналогичный модуль на площадке Таобао. Он стоит ¥8.00 за односимвольный модуль (это чуть больше доллара) плюс локальная доставка. Я не покупал эти модули и не держал их в руках. Но не вижу причин, почему бы они не заработали с описываемыми часами. Они отличаются от применённых мной, прежде всего, цветом свечения (тут красный, у меня синий) — но не проблема и перепаять, при необходимости. И отсутствием дополнительной линии питания. Но зато тут применён драйвер ULN2003A, что вселяет оптимизм в уверенности по нагрузочной способности схемы и в успешную доделку под разделение линий питания сдвигового регистра и сегментов индикатора, буде это кому-то понадобится.
На Таобао сейчас есть даже более прикольная платка — за пять долларов (включая локальную доставку) мы можем получить готовое красное табло с управляемым двоеточием; (подчеркну: это именно табло, без мозгов).
Вкратце познакомлю со своими модулями; тонкие подробности, очевидно, уже не актуальны.
Ширина модуля 29 мм
Высота модуля 40 мм
Высота символа: 30 мм
Питание цифрового интерфейса: 5V
Питание символов индикатора:7-12V
Модули приходят с защитной плёнкой на рабочей плоскости:
С обратной стороны:
Флюс, конечно, не отмыт.
Клеммная колодка установлена с перекосами.
Явно «хижина дядюшки Ляо».
Тем не менее, все надписи присутствуют, а внизу даже нарисована стрелка, показывающая вход и выход последовательного потока загружаемых данных.
Все четыре модуля-индикатора я закрепил на промежуточной пластине-шасси, оставив пробел в половину ширины символа между часами и минутами, чтобы зрительно будущее двоеточие между ними смотрелось более комфортно.
Двоеточие оформил так. Взял прямоугольный кусочек листового чёрного АБС-пластика, просверлил два отверстия, разметив их с тем же углом наклона, что и сегменты на индикаторах. Вклеил в эти отверстия пятимиллиметровые молочные светодиоды и аккуратно сошлифовал дремелем полукруглые линзы диодов. Получилась чёрная плашка с молочным двоеточием. Эту плашку просто приклеил между закреплёнными индикаторами.
Цвет пластика «двоеточия» чуть-чуть не совпадает с чёрным цветом индикаторов, но за тонированным стеклом это не имеет никакого значения. И это явно лучше, чем просто впаянные и открытые светодиоды: во-первых, не видны белые торцы индикаторов, во-вторых нет боковой засветки от светодиодов.
Принципиальная схема часов довольна проста и легко понимаема:
Несколько пояснений по схеме.
1. В качестве ардуины применено Arduino Pro Mini. Но подойдёт любая, хоть Nano, хоть Uno. Я люблю ProMini за то, что их не жалко оставлять в готовых конструкциях, это самая бюджетная модель из линейки ардуино. Покупаю их сразу пригоршню и всегда имею запас «в тумбочке». Новичкам же, наверное, больше подойдёт упомянутые выше Nano или Uno, потому что они сразу, без переходников и сложностей, умеют подключаться к USB «большого брата».
2. Токоограничительные резисторы светодиодов двоеточия надо подбирать так, чтобы при дневном освещении и за тонированным стеклом яркость двоеточия не отличалась от яркости остальных символов. В зависимости от применённых светодиодов, значения этих резисторов могут лежать в пределах от 100 Ом до 6кОм.
3. К пину 3 подключён узел ночного приглушения яркости. Приглушение обеспечивает одноваттный резистор 740 Ом. Его значение подбирается в зависимости от желаемой степени затемнения. Для дневного режима (т.е. режима полной яркости), этот резистор полностью блокируется p-канальным мосфетом, управляемым от пина микроконтроллера. IRF9Z24N применён потому, что он у меня был. Подойдёт и IRF9Z14N, и любой другой, подходящий по параметрам. Почему яркость меняется мощным резистором, а не ШИМ? Чтобы полностью исключить мерцание. Часы питаются не от батарей, а стационарно. В данном случае этот ход оправдан, глаза дороже.
Если вам опция ночного затемнения не нужна, можно просто этот узел не собирать.
4. В качестве датчика освещения применён недорогой модуль на фоторезисторе и компараторе LM393. Порог чувствительности между тёмным и светлым уровнем устанавливается движком подстроечного резистора на модуле. Фоторезистор надо располагать так, чтобы на него не попадал собственный свет от индикаторов часов. У меня он расположен на боковой грани корпуса.
5. В качестве часов реального времени я использовал модуль со встроенной батареей. Но, разумеется, подойдёт модуль в любом исполнении. Важно только убедиться, что обе сигнальные линии подтянуты к плюсу питания (в указанном модуле они уже подтянуты производителем). Чип DS3231 предпочтительнее, чем DS3107, поскольку имеет несравнимо более высокую точность хода.
6. О питании в схеме. В силу того, что моим индикаторам требовалось два питания (причём, одно — не очень-то стандартное), я поступил так. Для первой ступени применил замечательные понижающие мини DC-DC преобразователи. (вот лот сразу на 10 штук, можно и поштучно). Важно только сначала выставить движком требуемое напряжение, капелькой лака (цапона или лака для ногтей) зафиксировать движок подстроечного резистора, а уж потом впаивать модуль в схему. Применение DC-DC модуля позволило в качестве источника питания использовать любой ненужный сетевой адаптер в широком диапазоне питающих напряжений (от 9 до 21 вольта). У меня это двенадцативольтовый адаптер от какого-то мертвого сетевого хаба. Для второго стабильного напряжения +5V поставил 7805 (КР142ЕН5А). Потому что он у меня был. Но ничто не мешает поставить такой же DC-DC преобразователь, настроенный на 5 вольт.
7. В качестве приёмника GPS-сигналов используется модуль GY-NEO6MV2. У меня точное время с GPS ловится, пусть и не сразу, в метре от окна в панельном доме далеко не на верхнем этаже за пластиковыми окнами с внутренним металлизированным напылением. Но уже сегодня вполне доступны более современные GPS+ГЛОНАСС модули, те же Neo-M8N, там надо только чуть сконфигурировать их параметры для работы с данным скетчем.
К программной части.
Для тех, кто решит повторить описанную тут конструкцию, я приготовил архив с исходником и всеми необходимыми библиотеками. Из папки «libraries» внутри архива надо распаковать те библиотеки, которых не хватает в папке «libraries» вашей ArduinoIDE.
На случай, если архив протухнет, повторю код ещё и тут:
Исходный код
#include <TimeLib.h>
#include <SPI.h>
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <MsTimer2.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <Bounce.h>
#include <OneWire.h>
#include <EEPROM.h>
#define defaultTimezone 3; // Сюда установить часовую зону по умолчанию.
// Часовую зону всегда можно оперативно откорректировать. Для вызова меню установки часовой зоны,
// часы надо включить при одновременно зажатых кнопках перевода Часов и Минут.
// Для выхода из режима установки можно просто выключить часы и включить их снова в штатном режие.
// Одновременное нажатие кнопок часов и минут также приводит к выходу из режима установки часовой зоны
float LATITUDE = 55.5, LONGITUDE = 37.5; // первоначальная позиция для Москвы, район аэропорта Остафьево.
int MaxTimeToSync=500; // Синхронизация каждые 500 секунд
#define MaxScreenTimer 114 // С какой полусекунды каждой минуты будет отображаться температура. Значение 114 -> с 57-й секунды до конца минуты.
// Подключение часов реальноговремени
// DS3231 -> Arduino
// D (SDA) -> A4
// C (SCL) -> A5
#define HourPin 4 // Это контакт кнопки перевода часов
#define MinutePin 8 // Это контакт кнопки перевода минут
//
// |----/.---- pin 4
// |
// +----/.---- pin 8
// |
// Gnd
Bounce HourButt = Bounce(HourPin,40 );
Bounce MinuteButt = Bounce(MinutePin,40 );
#define DotPin 5 // К этому пину подключены светодиоды в виде двоеточия между часами и минутами
byte DotNightBright = 9; // Это значение яркости зажжённого двоеточия в ночном режиме.
//
// pin 5 o------+-----+
// |,, |,,
// V V
// — -
// | |
// | | | |
// |R| |R| Значения R подбираются в зависимости от яркости светодиодов, от 100 ом до 6кОм.
// | | | |
// | |
// | |
// Gnd o----------+-----+
enum { REG_SELECT = 10 }; // пин, управляющий защёлкой (SS в терминах SPI)
// 0
// =======
// || ||
// 5 || || 1
// || 6 ||
// =======
// || ||
// 4 || || 2
// || 3 ||
// ======= o 7
//
// Module Arduino
// Vcc o----------- +5v
// Gnd o----------- Gnd
// Clk o----------- pin 13 SCK (52)
// Stb o----------- pin 10 SS (53)
// S_in o----------- pin 11 MOSI (51)
//
#define BrightnessPin 3
// 10k
// --| R |---*---------------*-- + 7.5 V
// | | | _______ Узел изменения яркости дисплея.
// | |----- S | | \ o \ Питание семисегментных матриц подаётся
// o---*----||--^ IRF9Z14 |=| 740 \ ____\__ на клеммные колодки DC8V на платах индикаторов
//pin3 G |----- D | | \/\ \
// | | \ \ \
// | | \ \______\
// ---------------*--> +DC8v \/______/
// \ \ \
// ------------------> -DC8V G D S
// |
// — TinyGPS gps;
SoftwareSerial ss(9, 7); // К этим пинам подключается GPS-приёмник. Tx->9, Rx->7
// Module Arduino
// Vcc o----------- +5v
// Rx o----------- 7
// Tx o----------- 9
// Gnd o----------- Gnd
#define LightSensorPin 2
// Module Arduino Сенсор освещённости
// Vcc o----------- +5v
// Gnd o----------- Gnd
// D0 o----------- pin 2
#define DSdatapin 6 // К этому пину подключена линия данных датчика DS18B20
#define DSpowerpin 14 // С этого пина подаётся питание на датчик DS18B20
OneWire ds (DSdatapin);
int CurMins;
byte font[23] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000, // 0 — 9
0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, 0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, // 0. — 9.
0b10111111,0b10011100,0xff}; // -, °
char TIMEZONE = defaultTimezone;
byte Blinking = false;
byte TempPresent = false;
byte DSstatus,DSphase=0;
byte CRC;
byte tempdata[12];
unsigned int tempraw;
float CurrentTemp, DSTemp;
byte DarkNight = 0;
int Synced;
int TimeToSync=0;
int t = 0;
int sc,mm,hh,dd,mn,ye;
byte bb,bo=0;
byte dot=true;
char GPSchar;
float flat, flon;
unsigned long age;
int GPSyear;
char GPSmonth, GPSday, GPShour, GPSminute, GPSsecond, GPShundredths;
unsigned long GPSage;
byte GPSpresent = false;
byte NeedToShowScreen = false;
byte ScreenPage=0;
int ScreenTimer;
unsigned long dotstart;
byte sm[9];
void TickEvery05s() // Эта процедура вызывается каждые полсекунды
{
dotstart= millis();
if (dot==true)
{if (Blinking ==true) {Blinking=false;analogWrite(DotPin,0);} else {Blinking=true; if (DarkNight==1) analogWrite(DotPin,DotNightBright); else analogWrite(DotPin,255);}} else analogWrite(DotPin,0);
if (ScreenTimer<120) ScreenTimer++; else ScreenTimer=0;
NeedToShowScreen = true;
if (DSphase==0) {digitalWrite(DSpowerpin, HIGH); } else
if (DSphase==1) {
ds.reset();
ds.write(0xCC);
ds.write(0x44);} else
if (DSphase==4) {
DSstatus=ds.reset();
ds.write(0xCC);
ds.write(0xBE);
CRC=0;
for (byte i = 0; i < 9; i++) tempdata[i] = ds.read ();
digitalWrite(DSpowerpin, LOW);} else
if (DSphase==5) {CRC=ds.crc8(tempdata,9);} else
if (DSphase==6) {
tempraw = (tempdata[1] << 8) | tempdata[0]; // Пересчитываем в температуру
int signBit = tempraw & 0x8000; // Проверяем самый левый бит: 0x8000= 0b10000000 00000000
if (signBit) // Если там единица — число отрицательное и его надо преобразовать
{ // Стандартное преобразование отрицательного числа, которое в микроконтроллере в дополнительной кодировке
tempraw = (tempraw ^ 0xffff) + 1; // Путем исключающего ИЛИ плюс единица
}
float celsius = (float)tempraw / 16.0;
if (signBit) celsius=-celsius; // Если отрицательное число
CurrentTemp=celsius;
if (CRC==0) TempPresent=true; else TempPresent=false;
if (DSstatus==0) TempPresent=false;
}
DSphase++;
if (DSphase>20) DSphase=0;
}
int encodeDigit(char c)
{
int m;
if (c=='-') m=20; else
if ((c>='0') and (c<='9')) m=c-48; else
m=22;
return m;
}
void Screen()
{
String b;
char s[16];
if (TempPresent==true)
{
b = dtostrf(CurrentTemp, 3, 0, s);
if (b==" -0") b=" 0";
if (b!=" 0") { if (b.charAt(1)==' ') b.setCharAt(1,' '); else if ((b.charAt(0)==' ') && (b.charAt(1)!='-')) b.setCharAt(0,' ');}
} else
{
b="---";
ScreenPage=0;
}
switch(ScreenPage) {
case 1: {
dot=false;
analogWrite(DotPin,0);
sm[0]=font[encodeDigit(b.charAt(0))];
sm[1]=font[encodeDigit(b.charAt(1))];
sm[2]=font[encodeDigit(b.charAt(2))];
sm[3]=font[21];
break;}
case 0:{
dot=true;
sm[3]=font[(byte)minute()%10];
sm[2]=font[(byte)minute()/10];
sm[1]=font[(byte)hour()%10];
sm[0]=font[(byte)hour()/10];
break;}}
digitalWrite (BrightnessPin, DarkNight);
digitalWrite(REG_SELECT, LOW);
SPI.transfer(sm[3]);
SPI.transfer(sm[2]);
SPI.transfer(sm[1]);
SPI.transfer(sm[0]);
digitalWrite(REG_SELECT, HIGH);
NeedToShowScreen = false;
}
void ScreenTZ()
{
dot=false;
analogWrite(DotPin,0);
sm[3]=font[(byte)abs(TIMEZONE)%10];
sm[2]=font[(byte)abs(TIMEZONE)/10];
if (TIMEZONE<0) sm[1]=font[20]; else sm[1]=font[22];
sm[0]=font[22];
digitalWrite(REG_SELECT, LOW);
SPI.transfer(sm[3]);
SPI.transfer(sm[2]);
SPI.transfer(sm[1]);
SPI.transfer(sm[0]);
digitalWrite(REG_SELECT, HIGH);
}
void Synctime()
{
byte monthes [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // Сколько дней по месяцам в невисокосном году.
if (Synced>0) Synced=0;
gps.f_get_position(&flat, &flon, &GPSage);
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE)) {GPSpresent=true;} else GPSpresent=false;
gps.crack_datetime(&GPSyear, &GPSmonth, &GPSday, &GPShour, &GPSminute, &GPSsecond, &GPShundredths, &GPSage);
if ((GPSage!=TinyGPS::GPS_INVALID_AGE) && (GPSpresent==true) && ((GPShour+GPSminute)>6))
{
GPShour=GPShour+TIMEZONE;
if (GPShour>23) { // Корректируем время с GPS под часовые зоны восточной долготы.
GPShour=GPShour-24;
if (((GPSyear % 4 == 0) && (GPSyear % 100 != 0)) || (GPSyear % 400 == 0)) {monthes[2]=29;} // Корректируем февраль, если год високосный
GPSday++;
if (GPSday>monthes[GPSmonth])
{
GPSday=1;
GPSmonth++;
if (GPSmonth>12) {GPSmonth=1; GPSyear++;}
}
}
if (GPShour<0) { // Корректируем время с GPS под часовые зоны западной долготы.
GPShour=GPShour+24;
GPSday--;
if (GPSday<1)
{
GPSmonth--;
if (GPSmonth<1) {GPSmonth=12; GPSyear--;}
if (((GPSyear % 4 == 0) && (GPSyear % 100 != 0)) || (GPSyear % 400 == 0)) {monthes[2]=29;} // Корректируем февраль, если год високосный
GPSday=monthes[GPSmonth];
}
}
if (flat == TinyGPS::GPS_INVALID_F_ANGLE) {flat=0.0;} else {flat=round(flat*100); flat=flat/100;}
if (flon == TinyGPS::GPS_INVALID_F_ANGLE) {flon=0.0;} else {flon=round(flon*100); flon=flon/100;}
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE))
{
LATITUDE = flat, LONGITUDE = flon;
if (GPSage>1500) {;} else {
setTime(GPShour, GPSminute, GPSsecond, GPSday, GPSmonth, GPSyear);
RTC.set(now());
Synced=2;
}
}
}}
void setup()
{
setSyncProvider(RTC.get);
if(timeStatus() != timeSet) Synced=-1; else Synced=0;
byte TZ=EEPROM.read(5);
if (TZ>24) TIMEZONE=defaultTimezone else TIMEZONE=TZ-12;
EEPROM.write(5, TIMEZONE+12);
pinMode(DotPin, OUTPUT); analogWrite(DotPin,0);
pinMode(BrightnessPin, OUTPUT); digitalWrite (BrightnessPin, 1);
pinMode(LightSensorPin, INPUT);
SPI.begin();
pinMode(REG_SELECT, OUTPUT);
DarkNight=digitalRead(LightSensorPin);
Screen();
pinMode(HourPin, INPUT_PULLUP);
pinMode(MinutePin, INPUT_PULLUP);
pinMode(DSpowerpin, OUTPUT); digitalWrite(DSpowerpin, HIGH);
CurMins=hour()*60+minute();
DSphase=0;
ScreenPage=0;
ScreenTimer=0;
NeedToShowScreen = true;
CurrentTemp=85;
TempPresent=false;
MsTimer2::set(500, TickEvery05s); // 500ms period
MsTimer2::start();
ss.begin(9600);
HourButt.update();MinuteButt.update();
if ((HourButt.read()== LOW) && (MinuteButt.read()== LOW)) {
ScreenTZ();
while ((HourButt.read()== LOW) || (MinuteButt.read()== LOW)){ HourButt.update();MinuteButt.update();}
byte ExiteMenu=false;
while (ExiteMenu==false) {
ScreenTZ();
if (HourButt. update()) {if (HourButt. read()== LOW) {TIMEZONE++; if (TIMEZONE> 12) TIMEZONE= 12; EEPROM.write(5, TIMEZONE+12); ScreenTZ(); HourButt .rebounce(500);}}
if (MinuteButt.update()) {if (MinuteButt.read()== LOW) {TIMEZONE--; if (TIMEZONE<-12) TIMEZONE=-12; EEPROM.write(5, TIMEZONE+12); ScreenTZ(); MinuteButt.rebounce(500);}}
if ((HourButt.read()== LOW) && (MinuteButt.read()== LOW)) ExiteMenu=true;
delay(100);
}
}
}
time_t prevDisplay = 0;
void loop()
{
bool newData = false;
if (ss.available()){
char GPSchar = ss.read();
if (gps.encode(GPSchar)) newData = true;}
if (newData==true)
{
gps.f_get_position(&flat, &flon, &GPSage);
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE)) {GPSpresent=true; NeedToShowScreen=true;} else GPSpresent=false;
}
if (TempPresent==true) {if (ScreenTimer>=MaxScreenTimer) {ScreenPage=1; dot=false; analogWrite(DotPin,0);} else {ScreenPage=0; dot=true;}} else {ScreenPage=0; dot=true;}
// Опрос кнопок
if (HourButt. update()) {if (HourButt. read()== LOW) {hh=hour();mm=minute();sc=second();dd=day();mn=month();ye=year(); hh++; if (hh==24) hh=0; setTime(hh, mm, sc, dd, mn, ye); RTC.set(now()); Synced=1; ScreenTimer=0; ScreenPage=0; Screen(); HourButt .rebounce(500);}}
if (MinuteButt.update()) {if (MinuteButt.read()== LOW) {hh=hour();mm=minute();sc=second();dd=day();mn=month();ye=year(); mm++; if (mm==60) mm=0; setTime(hh, mm, sc, dd, mn, ye); RTC.set(now()); Synced=1; ScreenTimer=0; ScreenPage=0; Screen(); MinuteButt.rebounce(500);}}
if (now() != prevDisplay) {
prevDisplay = now();
CurMins=hour()*60+ minute();
TimeToSync++;
if (TimeToSync >= MaxTimeToSync) {
Synctime();
TimeToSync=0;}
}
if ((TimeToSync%10==0) && (Synced < 1)) Synctime(); // Если время ещё не синхронизировано, то пытаемся его синхронизировать чаще.
DarkNight=digitalRead(LightSensorPin);
if (NeedToShowScreen == true) Screen();
if (Synced<0) if (millis()-dotstart>30) analogWrite(DotPin,0);
delay(1);
}
#include <SPI.h>
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <MsTimer2.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <Bounce.h>
#include <OneWire.h>
#include <EEPROM.h>
#define defaultTimezone 3; // Сюда установить часовую зону по умолчанию.
// Часовую зону всегда можно оперативно откорректировать. Для вызова меню установки часовой зоны,
// часы надо включить при одновременно зажатых кнопках перевода Часов и Минут.
// Для выхода из режима установки можно просто выключить часы и включить их снова в штатном режие.
// Одновременное нажатие кнопок часов и минут также приводит к выходу из режима установки часовой зоны
float LATITUDE = 55.5, LONGITUDE = 37.5; // первоначальная позиция для Москвы, район аэропорта Остафьево.
int MaxTimeToSync=500; // Синхронизация каждые 500 секунд
#define MaxScreenTimer 114 // С какой полусекунды каждой минуты будет отображаться температура. Значение 114 -> с 57-й секунды до конца минуты.
// Подключение часов реальноговремени
// DS3231 -> Arduino
// D (SDA) -> A4
// C (SCL) -> A5
#define HourPin 4 // Это контакт кнопки перевода часов
#define MinutePin 8 // Это контакт кнопки перевода минут
//
// |----/.---- pin 4
// |
// +----/.---- pin 8
// |
// Gnd
Bounce HourButt = Bounce(HourPin,40 );
Bounce MinuteButt = Bounce(MinutePin,40 );
#define DotPin 5 // К этому пину подключены светодиоды в виде двоеточия между часами и минутами
byte DotNightBright = 9; // Это значение яркости зажжённого двоеточия в ночном режиме.
//
// pin 5 o------+-----+
// |,, |,,
// V V
// — -
// | |
// | | | |
// |R| |R| Значения R подбираются в зависимости от яркости светодиодов, от 100 ом до 6кОм.
// | | | |
// | |
// | |
// Gnd o----------+-----+
enum { REG_SELECT = 10 }; // пин, управляющий защёлкой (SS в терминах SPI)
// 0
// =======
// || ||
// 5 || || 1
// || 6 ||
// =======
// || ||
// 4 || || 2
// || 3 ||
// ======= o 7
//
// Module Arduino
// Vcc o----------- +5v
// Gnd o----------- Gnd
// Clk o----------- pin 13 SCK (52)
// Stb o----------- pin 10 SS (53)
// S_in o----------- pin 11 MOSI (51)
//
#define BrightnessPin 3
// 10k
// --| R |---*---------------*-- + 7.5 V
// | | | _______ Узел изменения яркости дисплея.
// | |----- S | | \ o \ Питание семисегментных матриц подаётся
// o---*----||--^ IRF9Z14 |=| 740 \ ____\__ на клеммные колодки DC8V на платах индикаторов
//pin3 G |----- D | | \/\ \
// | | \ \ \
// | | \ \______\
// ---------------*--> +DC8v \/______/
// \ \ \
// ------------------> -DC8V G D S
// |
// — TinyGPS gps;
SoftwareSerial ss(9, 7); // К этим пинам подключается GPS-приёмник. Tx->9, Rx->7
// Module Arduino
// Vcc o----------- +5v
// Rx o----------- 7
// Tx o----------- 9
// Gnd o----------- Gnd
#define LightSensorPin 2
// Module Arduino Сенсор освещённости
// Vcc o----------- +5v
// Gnd o----------- Gnd
// D0 o----------- pin 2
#define DSdatapin 6 // К этому пину подключена линия данных датчика DS18B20
#define DSpowerpin 14 // С этого пина подаётся питание на датчик DS18B20
OneWire ds (DSdatapin);
int CurMins;
byte font[23] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000, // 0 — 9
0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, 0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, // 0. — 9.
0b10111111,0b10011100,0xff}; // -, °
char TIMEZONE = defaultTimezone;
byte Blinking = false;
byte TempPresent = false;
byte DSstatus,DSphase=0;
byte CRC;
byte tempdata[12];
unsigned int tempraw;
float CurrentTemp, DSTemp;
byte DarkNight = 0;
int Synced;
int TimeToSync=0;
int t = 0;
int sc,mm,hh,dd,mn,ye;
byte bb,bo=0;
byte dot=true;
char GPSchar;
float flat, flon;
unsigned long age;
int GPSyear;
char GPSmonth, GPSday, GPShour, GPSminute, GPSsecond, GPShundredths;
unsigned long GPSage;
byte GPSpresent = false;
byte NeedToShowScreen = false;
byte ScreenPage=0;
int ScreenTimer;
unsigned long dotstart;
byte sm[9];
void TickEvery05s() // Эта процедура вызывается каждые полсекунды
{
dotstart= millis();
if (dot==true)
{if (Blinking ==true) {Blinking=false;analogWrite(DotPin,0);} else {Blinking=true; if (DarkNight==1) analogWrite(DotPin,DotNightBright); else analogWrite(DotPin,255);}} else analogWrite(DotPin,0);
if (ScreenTimer<120) ScreenTimer++; else ScreenTimer=0;
NeedToShowScreen = true;
if (DSphase==0) {digitalWrite(DSpowerpin, HIGH); } else
if (DSphase==1) {
ds.reset();
ds.write(0xCC);
ds.write(0x44);} else
if (DSphase==4) {
DSstatus=ds.reset();
ds.write(0xCC);
ds.write(0xBE);
CRC=0;
for (byte i = 0; i < 9; i++) tempdata[i] = ds.read ();
digitalWrite(DSpowerpin, LOW);} else
if (DSphase==5) {CRC=ds.crc8(tempdata,9);} else
if (DSphase==6) {
tempraw = (tempdata[1] << 8) | tempdata[0]; // Пересчитываем в температуру
int signBit = tempraw & 0x8000; // Проверяем самый левый бит: 0x8000= 0b10000000 00000000
if (signBit) // Если там единица — число отрицательное и его надо преобразовать
{ // Стандартное преобразование отрицательного числа, которое в микроконтроллере в дополнительной кодировке
tempraw = (tempraw ^ 0xffff) + 1; // Путем исключающего ИЛИ плюс единица
}
float celsius = (float)tempraw / 16.0;
if (signBit) celsius=-celsius; // Если отрицательное число
CurrentTemp=celsius;
if (CRC==0) TempPresent=true; else TempPresent=false;
if (DSstatus==0) TempPresent=false;
}
DSphase++;
if (DSphase>20) DSphase=0;
}
int encodeDigit(char c)
{
int m;
if (c=='-') m=20; else
if ((c>='0') and (c<='9')) m=c-48; else
m=22;
return m;
}
void Screen()
{
String b;
char s[16];
if (TempPresent==true)
{
b = dtostrf(CurrentTemp, 3, 0, s);
if (b==" -0") b=" 0";
if (b!=" 0") { if (b.charAt(1)==' ') b.setCharAt(1,' '); else if ((b.charAt(0)==' ') && (b.charAt(1)!='-')) b.setCharAt(0,' ');}
} else
{
b="---";
ScreenPage=0;
}
switch(ScreenPage) {
case 1: {
dot=false;
analogWrite(DotPin,0);
sm[0]=font[encodeDigit(b.charAt(0))];
sm[1]=font[encodeDigit(b.charAt(1))];
sm[2]=font[encodeDigit(b.charAt(2))];
sm[3]=font[21];
break;}
case 0:{
dot=true;
sm[3]=font[(byte)minute()%10];
sm[2]=font[(byte)minute()/10];
sm[1]=font[(byte)hour()%10];
sm[0]=font[(byte)hour()/10];
break;}}
digitalWrite (BrightnessPin, DarkNight);
digitalWrite(REG_SELECT, LOW);
SPI.transfer(sm[3]);
SPI.transfer(sm[2]);
SPI.transfer(sm[1]);
SPI.transfer(sm[0]);
digitalWrite(REG_SELECT, HIGH);
NeedToShowScreen = false;
}
void ScreenTZ()
{
dot=false;
analogWrite(DotPin,0);
sm[3]=font[(byte)abs(TIMEZONE)%10];
sm[2]=font[(byte)abs(TIMEZONE)/10];
if (TIMEZONE<0) sm[1]=font[20]; else sm[1]=font[22];
sm[0]=font[22];
digitalWrite(REG_SELECT, LOW);
SPI.transfer(sm[3]);
SPI.transfer(sm[2]);
SPI.transfer(sm[1]);
SPI.transfer(sm[0]);
digitalWrite(REG_SELECT, HIGH);
}
void Synctime()
{
byte monthes [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // Сколько дней по месяцам в невисокосном году.
if (Synced>0) Synced=0;
gps.f_get_position(&flat, &flon, &GPSage);
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE)) {GPSpresent=true;} else GPSpresent=false;
gps.crack_datetime(&GPSyear, &GPSmonth, &GPSday, &GPShour, &GPSminute, &GPSsecond, &GPShundredths, &GPSage);
if ((GPSage!=TinyGPS::GPS_INVALID_AGE) && (GPSpresent==true) && ((GPShour+GPSminute)>6))
{
GPShour=GPShour+TIMEZONE;
if (GPShour>23) { // Корректируем время с GPS под часовые зоны восточной долготы.
GPShour=GPShour-24;
if (((GPSyear % 4 == 0) && (GPSyear % 100 != 0)) || (GPSyear % 400 == 0)) {monthes[2]=29;} // Корректируем февраль, если год високосный
GPSday++;
if (GPSday>monthes[GPSmonth])
{
GPSday=1;
GPSmonth++;
if (GPSmonth>12) {GPSmonth=1; GPSyear++;}
}
}
if (GPShour<0) { // Корректируем время с GPS под часовые зоны западной долготы.
GPShour=GPShour+24;
GPSday--;
if (GPSday<1)
{
GPSmonth--;
if (GPSmonth<1) {GPSmonth=12; GPSyear--;}
if (((GPSyear % 4 == 0) && (GPSyear % 100 != 0)) || (GPSyear % 400 == 0)) {monthes[2]=29;} // Корректируем февраль, если год високосный
GPSday=monthes[GPSmonth];
}
}
if (flat == TinyGPS::GPS_INVALID_F_ANGLE) {flat=0.0;} else {flat=round(flat*100); flat=flat/100;}
if (flon == TinyGPS::GPS_INVALID_F_ANGLE) {flon=0.0;} else {flon=round(flon*100); flon=flon/100;}
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE))
{
LATITUDE = flat, LONGITUDE = flon;
if (GPSage>1500) {;} else {
setTime(GPShour, GPSminute, GPSsecond, GPSday, GPSmonth, GPSyear);
RTC.set(now());
Synced=2;
}
}
}}
void setup()
{
setSyncProvider(RTC.get);
if(timeStatus() != timeSet) Synced=-1; else Synced=0;
byte TZ=EEPROM.read(5);
if (TZ>24) TIMEZONE=defaultTimezone else TIMEZONE=TZ-12;
EEPROM.write(5, TIMEZONE+12);
pinMode(DotPin, OUTPUT); analogWrite(DotPin,0);
pinMode(BrightnessPin, OUTPUT); digitalWrite (BrightnessPin, 1);
pinMode(LightSensorPin, INPUT);
SPI.begin();
pinMode(REG_SELECT, OUTPUT);
DarkNight=digitalRead(LightSensorPin);
Screen();
pinMode(HourPin, INPUT_PULLUP);
pinMode(MinutePin, INPUT_PULLUP);
pinMode(DSpowerpin, OUTPUT); digitalWrite(DSpowerpin, HIGH);
CurMins=hour()*60+minute();
DSphase=0;
ScreenPage=0;
ScreenTimer=0;
NeedToShowScreen = true;
CurrentTemp=85;
TempPresent=false;
MsTimer2::set(500, TickEvery05s); // 500ms period
MsTimer2::start();
ss.begin(9600);
HourButt.update();MinuteButt.update();
if ((HourButt.read()== LOW) && (MinuteButt.read()== LOW)) {
ScreenTZ();
while ((HourButt.read()== LOW) || (MinuteButt.read()== LOW)){ HourButt.update();MinuteButt.update();}
byte ExiteMenu=false;
while (ExiteMenu==false) {
ScreenTZ();
if (HourButt. update()) {if (HourButt. read()== LOW) {TIMEZONE++; if (TIMEZONE> 12) TIMEZONE= 12; EEPROM.write(5, TIMEZONE+12); ScreenTZ(); HourButt .rebounce(500);}}
if (MinuteButt.update()) {if (MinuteButt.read()== LOW) {TIMEZONE--; if (TIMEZONE<-12) TIMEZONE=-12; EEPROM.write(5, TIMEZONE+12); ScreenTZ(); MinuteButt.rebounce(500);}}
if ((HourButt.read()== LOW) && (MinuteButt.read()== LOW)) ExiteMenu=true;
delay(100);
}
}
}
time_t prevDisplay = 0;
void loop()
{
bool newData = false;
if (ss.available()){
char GPSchar = ss.read();
if (gps.encode(GPSchar)) newData = true;}
if (newData==true)
{
gps.f_get_position(&flat, &flon, &GPSage);
if ((flat !=TinyGPS::GPS_INVALID_F_ANGLE) && (flon !=TinyGPS::GPS_INVALID_F_ANGLE)) {GPSpresent=true; NeedToShowScreen=true;} else GPSpresent=false;
}
if (TempPresent==true) {if (ScreenTimer>=MaxScreenTimer) {ScreenPage=1; dot=false; analogWrite(DotPin,0);} else {ScreenPage=0; dot=true;}} else {ScreenPage=0; dot=true;}
// Опрос кнопок
if (HourButt. update()) {if (HourButt. read()== LOW) {hh=hour();mm=minute();sc=second();dd=day();mn=month();ye=year(); hh++; if (hh==24) hh=0; setTime(hh, mm, sc, dd, mn, ye); RTC.set(now()); Synced=1; ScreenTimer=0; ScreenPage=0; Screen(); HourButt .rebounce(500);}}
if (MinuteButt.update()) {if (MinuteButt.read()== LOW) {hh=hour();mm=minute();sc=second();dd=day();mn=month();ye=year(); mm++; if (mm==60) mm=0; setTime(hh, mm, sc, dd, mn, ye); RTC.set(now()); Synced=1; ScreenTimer=0; ScreenPage=0; Screen(); MinuteButt.rebounce(500);}}
if (now() != prevDisplay) {
prevDisplay = now();
CurMins=hour()*60+ minute();
TimeToSync++;
if (TimeToSync >= MaxTimeToSync) {
Synctime();
TimeToSync=0;}
}
if ((TimeToSync%10==0) && (Synced < 1)) Synctime(); // Если время ещё не синхронизировано, то пытаемся его синхронизировать чаще.
DarkNight=digitalRead(LightSensorPin);
if (NeedToShowScreen == true) Screen();
if (Synced<0) if (millis()-dotstart>30) analogWrite(DotPin,0);
delay(1);
}
О работе с DS18B20. В моём решении питание датчику подаётся не постоянно, а только на требуемый для получения и считывания температуры период, оставляя всё остальное время датчик обесточенным. Такой подход сводит к минимуму самонагрев датчика, и, как следствие, завышение считываемых показаний. Вся работа по обслуживанию термодатчика содержится в процедуре, вызываемой по прерыванию таймера каждые полсекунды. Для того, чтобы не задерживать эту процедуру надолго, вся работа разбита на несколько тактов, т.е. каждые полсекунды делается один такт — маленький кусочек этой работы. Такой подход нисколько не задерживает основной цикл (в котором работают другие процессы) и полностью соответствует рекомендуемыми производителем временным интервалам. Так, в первом такте на датчик подаётся питание, в следующем такте (т.е. через полсекунды) датчику отправляется запрос на преобразование, ещё через полторы секунды готовое значение считывается из датчика и снимается питающее напряжение (оно больше не нужно до следующего цикла), в следующем такте рассчитывается контрольная сумма, ещё один такт тратится на пересчёт сырых данных в градусы Цельсия. Оставшиеся семь секунд десятисекундного цикла датчик отдыхает обесточенным.
Реализация расчёта контрольной суммы табличным методом, содержащаяся в стандартной библиотеке OneWire, взята из официального аппнота к DS18B20, но, как оказалось, мало кто сейчас читает официальные даташиты и аппноты. Бóльшая часть исходников к ардуино, доступных в сети, вообще не содержит какого-либо просчёта CRC, и, как следствие, такие «упрощённые» алгоритмы спотыкаются на неудобных значениях (+85°, 0°, +125°). Что довольно удивительно, на мой взгляд.
Вторая проблема, часто встречаемая в доступных исходниках по работе с DS18B20 — это пересчёт отрицательных значений температуры из дополнительной двоичной кодировки. Это удивительно, — ведь, вроде бы, обычная бинарная математика, но, такое впечатление, что половина авторов просто не проверяла свои скетчи на отрицательных температурах. Если ниже нуля ваша программа сразу показывает 65536 градусов, а вы не находитесь внутри Солнца, то гляньте в этот скетч, там всё в комментариях есть.
О синхронизации времени в часах. Как я уже сказал выше, текущее время я
получаю из RTC. В случае, если часы реального времени не обнаружены, системное время начинается с 00:00, но это время считается скомпрометированным, имеет наименьший приоритет и зрительно на дисплее будет отличаться от обычного. Как только время будет установлено вручную с кнопок, оно получит более высокий приоритет и уже будет считаться приемлемым. Ещё более приоритетным является время из RTC. Время, полученное с GPS и прошедшее проверку, считается наиболее точным и имеет наивысший приоритет. Оно корректирует показания, хранящиеся в RTC и, уж конечно, замещает собой установленное вручную с кнопок
О конструктивном оформлении часов.
Я использовал готовый корпус производства Gainta. Дремелем в передней плоскости вырезал прямоугольное окно под индикаторы. На одной боковой плоскости виден фоторезистор. На другую боковину выведены толкатели стандартных тактовых кнопок (установка часов и минут), и разъёмы для подключения термодатчика и адаптера питания (мой адаптер питания имеет штекер 5,5x2,1 и втыкается вот в такое гнездо).
Переднюю сторону корпуса, по хорошему, надо закрыть тоненьким тонированным стеклом.
С советских времён у меня хранилось тонированное в серый цвет оргстекло толщиной 1,5 мм. Его осталось очень мало и на данную площадь его, увы, не хватило. Но сейчас же другое время, чего сейчас нельзя найти? Оказалось, что вот тонированного оргстекла такой толщины сейчас нельзя найти. Судя по всему, его не существует. Возможно найти тонированный плексиглаc толщиной 3 мм — и это всё. Но в Москве никто не продаст тебе кусочек плексигласа 15x10 сантиметров. Покупай трёхметровый лист — и никаких гвоздей. Такой плексиглас (стандартными кусками формата A4) возможно купить на ebay, но это довольно дорого.
Решил проблему так. Заказал по размерам обычное прозрачное оргстекло 2 мм (оно-то вполне доступно) и оттонировал его парой слоёв (спереди и сзади) вот такой тонировочной плёнки свётло-серого цвета (покупал дешевле, были скидки). Оттонированное стекло приклеил прозрачным силиконовым герметиком к корпусу. Получилось, на мой взгляд, вполне смотрибельно.
Часы работают уже более года, проблем не выявлено. Было несколько сбоев времени из-за неустойчивого приёма GPS (у меня для приёма условия, всё-таки, довольно экстремальные), но время без вмешательств самовосстанавливалось со следующей синхронизацией. Это действительно конструкция «включил коробочку и забыл». А бóльшего от неё и не требуется.
Главное, ради чего всё это писáлось. Я искренне надеюсь, что моя статья предоставит достаточное количество идей, и информационной помощи тем, кому эта сфера интересна. А, возможно, кому-то послужит недостающим импульсом для начала собственного творчества и реализации собственных идей.
Так, даже в существующем виде данная конструкция предоставляет широкое поле для фантазии и творчества. Мы уже сейчас внутри алгоритма, помимо текущего времени, совершенно бесплатно имеем дату и свои координаты. Мало того, что можно просто выводить эту информацию, из неё ещё можно получать рассветы и закаты Солнца непосредственно для вашей местности, можно получать фазу Луны, день недели, високосность года, рассчитывать Пасхалию и т.д. Осталось ещё шесть свободных пинов, а, значит, можно подключать ещё какие-то датчики или исполнительные механизмы: звуковые сигнализаторы, реле, ключи коммутации, кнопки, беспроводные передатчики/приёмники и т.д.
Добавлено спустя сутки:
В нескольких комментариях к обзору мне сказали, что хорошо бы зрительно отличать гарантированно неточное время, от правильного синхронизированного. Я дописал код, теперь эта возможность у пользователя есть.
Если возникнет ситуация, когда время не может быть получено ни от одного из источников, когда оно ещё явно не сихронизировано и является скомпрометированным, двоеточие между разрядами часов и минут будет мигать в тревожном, коротко-«рваном» ритме. Как только точное время будет получено со спутников, двоеточие станет мигать привычным образом: одно мигание в секунду.
Вот в этом коротком ролике я показал, как зрительно выглядит сначала недостоверное, а потом синхронизированное время. Прошу прощения за качество, яркий синий светодиодный свет очень трудно снимать…
Исходник в тексте обзора, а также в прилагаемом архиве обновлён.
Добавлено спустя полтора месяца:
Я откорректировал проект, полностью отказавшись от хранения времени в EEPROM, в пользу хранения его в RTC: в энергонезависимой памяти при отсутствии питания хранящееся время статично, а в часах реального времени оно всё равно идёт. Удорожание проекта на один доллар окупается гораздо более удобной и комфортной эксплуатацией и более широким функционалом. Исходник снова обновил. Текст обзора поправил.
Спасибо читателям за ценные идеи!
* Все ссылки по тексту выше — исключительно для иллюстрации. Скорее всего, сегодня аналогичные товары можно купить по другой цене и у другого продавца.
PS: Никто ничего для обзора не предоставлял и не спонсировал. Всё, что описано в конструкции, покупалось в разное время за свои собственные деньги или было найдено в собственных закромах.
Самые обсуждаемые обзоры
+50 |
2312
82
|
+79 |
6168
207
|
Подключен по RJ45 к роутеру, грузится сразу в стендбай, яркость единожды отрегулирована на комфортную из меню.
Дисплей приятного зелёного цвета размером 65 х 40мм, день недели и дата в комплекте, шрифты и языки тоже легко меняются на нужные.
Из недостатков — долгое время загрузки линукса при пропадании электричества.
:)
Я не критикую. Но для себя бы делал без записи в постоянную память. Ведь если питание пропадёт на пару часов, то и время будет соответствующее. Да, я понимаю, что только лишь до следующей синхронизации. Но меня бы просто съедала постоянная мысль о том, что часы в данный момент могут лгать и надо их проверить.
Уж лучше бы они показывали просто нули до следующей синхронизации.
И снова, понимаю, Вы ответите, что это легко настраивается в коде. Не навязываю. Просто высказал свое мнение.
Не стал усложнять конструкцию, — это единственный повод. И RTC надо покупать, а EEPROM уже дана бесплатно. Жизнь батарейки при поданном напряжении неважна (только саморазряд), часы идут от Vcc, батарейка же расходуется только при отсутствии основного питания. Поэтому одной хватит на годы и годы.
Процедура синхронизация от источника образцового времени (у меня от GPS) после сбоя (т.е. когда часы конкретно знают, что время они показывают неточное) у меня долбится каждые 10 секунд. И горячий старт приёмника при хороших условиях — это минута, а то и меньше. Так что лгать они будут очень недолго.
Но чтобы избежать и этого периода, вполне возможно чуть доработать описанную выше конструкцию. (Вот! Об этом я и писал, начались идеи и творчество! Это и есть цель обзора!) Пины A4 и A5 свободны, подключаем DS1307 и в скетче чтение/сохранение в EEPROM заменяем на чтение/сохранение в часы реального времени. Библиотека DS1307RTC доступна, модули на Али в изобилии, чуть больше доллара с доставкой. :)
«Среднесуточная точность хода: +- 15 минут»
© прапорщик Гриша
:).
А для редкой синхронизации свою старую поделку (лет 8 валялась) ethernet-модуль на PIC18F258 использовал. Раз в месяц на сервере скрипт срабатывает и посылает UDP пакет с текущим временем часам.
1 герц, конечно, не нужно (оно и так 1 герц), но попробую реализовать в скважности мигания двоеточия, по характеру мигания пользователю будет понятно.
третий модуль семисегментника ставится вверх ногами. двоеточие готово без вставки дополнительных элементов ;)
Мне визуально не нравится.
Потому что такое «псевдо-двоеточие» будет очень длинным — точки будут на верхней и нижней границе высоты символов, это некрасиво. А то и ещё шире: выше и ниже границ символов, такое бывает.
В реальном же знаке двоеточия точки должны быть ближе к горизонтальной центральной оси табло.
И индикаторы тогда придётся ставить вплотную, и даже в этом случае точки этого «двоеточия» не встанут на одну линию. А красиво — это чтобы группы часов и минут были раздвинуты для знака двоеточия.
Я не поленился и нарисовал в векторе. Сравните, какой вариант зрительно красивее:
А вот еще мне режет глаз 62 минуты на картинке. )))
за труды в рисовании и обзор большое спасибо :)
Скетч и схемку сохранил, подвернутся хорошие индикаторы — займусь.
имелось ввиду, что все отображаемые символы (4 цифры и 2 точки) мигают как обычно мигает разделитель.
так в свое время делали многие устройства, включая «Электронику».
но там это нужно было в том числе для привлечения внимания пользователя с целью установки верного времени.
От «высокого» питания делаем резистивный делитель на пин с АЦП. (Выставляем максимальное для АЦП значение). И при снижении напряжения на этом «контролирующем» пине на 20% — резко сохраняем все в eeprom (поскольку это падение говорит о том, что напряжение на входе снижается, т.е. пропадает). А в остальное время — не трогаем ту eeprom-ку.
Смотрите. Время записи в EEPROM — 5-9 ms.
Время процесса разряда сглаживающих конденсаторов источника питания, конечно, невозможно сказать точно (зависит от ёмкости и потребляемого девайсом тока), но очевидно, что это лавинообразный экспоненциальный процесс. Не думаю, что сильно ошибусь, если назову период в 20-400 ms. В любом случае, снижение напряжения на 20% — это уже почти завершённый процесс, процентов 70-80 уже закончено, остаток напряжения свалится довольно быстро. В таких условиях время записи может ещё увеличиться, если оно вообще на таком запасе энергии способно успешно закончиться. А микроконтроллер ещё должен успеть понять, что напряжение падает и успеть принять решение к записи.
Так что, боюсь, не для этого случая. А вот в батарейном питании — да.
Это, разумеется, чисто теоретическое измышление, в данном случае переделывать не предлагаю и сам смысла не вижу. Ну и раз уж оставил коммент, то спасибо за обзор, всегда интересно почитать про самоделки. Результат понравился. Я вот свои часы, чтобы с синхронизацией, так и не собрался сделать, после прочтения опять задумался, что все-таки надо бы сделать :)
зачем ограничивать себя двумя?
mysku.club/blog/china-stores/31213.html
В общем и целом, да, отдаст.
Нагревается, но всё в пределах ожидаемого.
Лет 6 назад собрал на Атмеге 8 часики, с нормальным кварцем за месяц убегают секунд на 30. Куча режимов и видов индикации, два термодатчика d18b20 улица-дом, наборное поле из 3мм светодиодов (225 штук). 155 на индикации-пятница, 15 число. Очень доволен часами. Тоже подумываю собрать с GPS на кухню, там от окошка не далеко. Спасибо за интересную схему.
По цене около 90 центов за штуку.
Там же есть и большего размера.
Руки из нужного места — это плюс! Но минусов в этой идее и реализации столько, что доверять показаниям таких часов я бы не рискнул. Весьма слабое место — метод синхронизации. Ладно еще, если окна на юг, да и то на подоконнике. А периодические запись и восстановление времени из EEPROM при пропадании питания — это, извините, уж вообще ни в какие ворота!
EEPROM штука с ограниченным ресурсом и при частой перезаписи долго не протянет. А при редкой записи смысл ТОЧНОЕ ВРЕМЯ при сбое питания вообще теряется. Вы хотя бы добавьте светодиод, который горит/тухнет, если очередной сеанс синхронизации был успешным/неуспешным (и/или был сбой питания). Но, думаю, всю концепцию надо пересмотреть и все-таки DS3231 использовать.
В своем проекте я пошел другим путем. У меня используется DS3231, но ежесекундно в ардуине идет корректировка показаний из-за накапливаемой погрешности. Точная установка производится вручную по мере накопления ошибки, после этого автоматически расчитывается новый корректировочный коэффициент, в связи с чем точность хода увеличивается на порядок при каждой ручной установке времени. Так, весной я запустил часы и через месяц (они убежали примерно на 2 секунды) снова выставил точное время. На сегодня (15 декабря) разбежка 1 секунда. В следующем году, когда она достигнет 2-х секунд, снова выставлю точное время. Ну а следующей корректировки, думаю уже не будет (по крайней мере при моей жизни). Часы получились полностью автономными и не зависят от внешних источников синхронизации вообще.
Не стану спорить, но подискутировать — с удовольствием.
У меня окна не на юг. Часы в глубине комнаты примерно на метр от окна. Окно с внутренним напылением в стеклопакете. Современные приёмники весьма неплохо научились принимать GPS, поверьте. Ведь у каждого есть мобильник или планшет. И текущую позицию приложение с картами показывает, в общем и целом, в любой точке комнаты. А тут и триангуляция с нескольких спутников не нужна, достаточно только времени. Почему же вы считаете такую синхронизацию слабым местом? Время с GPS в общем случае точнее NTP, поскольку там ещё время жизни пакетов есть, на что многие забивают.
Идея интересная. Но она явно требует присутствия человека. Поскольку для того, чтобы устройство стало точным, кто-то должен отслеживать точность и несколько раз корректировать ход. Понимаю, три-четыре раза засечь и откорреткировать — это не такой великий труд. Но я принципиально хотел создать устройство, совсем-совсем отвязанное от участия человека.
И, да, прихожу к мнению, что поменяю я EEPROM на RTC.
На фоне количества труда по сборке, наладке часов это пренебрежительно малая величина, но сам факт — да, вручную время выставить придется 2-3 раза. Зато я всегда абсолютно уверен в показаниях часов, и все остальные часы в доме подвожу по ним, не сомневаясь совершенно. А для меня это очень важно.
Но точное время есть в каждом пакете, поэтому достаточно «видеть» один спутник, чтобы его получить.
Запустите любую программу, визуализирующую видимые спутники, и если будет хоть один, даже серым — время будет.
Так, что у всех условия разные.
По своему опыту: под диким ливнем с грозой, когда небо почернело, дождь заливает стекла так что стеклоочистители не справляются (судовые стеклочистители, не автомобильные, другая тема), видимость метров 100, радиолокатор ослеп полностью (9,5 ГГц очень хорошо поглощаются водой) — ГЛОНАСС и GPS только немного теряют уровень приёма, координаты рисует уверенно и кораблик на электронной карте показывается где надо. DOP вырастает на десяток метров.
Проверять прием телефоном не очень корректно, потому как в телефоне AGPS, альманах и эфемериды он грузит через интернет, кроме того, предварительно определяет место по сотовым станциям и wifi-точкам.
А в вашем проекте тоже есть вопросы. На кой черт заниматься коррекцией каждую секунду когда: 1. В атмеле есть таймеры с прерываниями и при вменяемом кварце с разовой или очень редкой калибровкой можно обеспечить более или менее точное измерение времени в течение часа, а может и суток. 2. У вас все равно под рукой модуль реального времени и вы упираетесь в его точность.
По мне дак при нормальном коде хватило бы синхронизации раз в минуту, можно даже реже.
А у автора идея хорошая, но реализация не понятная. Если есть GPS модуль, то нафига запоминать время. Разве нельзя просто получить время со спутника когда тебе угодно. Короче лишний огород. А так да, за основательный подход конечно плюс.
Не упираюсь. Для моей концепции нужен не точный модуль, а СТАБИЛЬНО врущий. Поэтому я мог бы применить и супер неточный DS1307 с тем же результатом, если бы в нем была термостабилизация, как у DS3231.
А часов типа «RTC на 7 сегментов» — их пруд пруди… Не вижу смысла; их китайцы штампуют всяко дешевле меня, в любом виде, — хоть в конструкторе, хоть готовые, любых цветов, размеров и форм.
Координаты GPS — это параметры физические. Их можно измерить, вычислить или определить. А часовая зона — это понятие политическое.
Условно говоря: есть государство и его политика говорит: «у нас на территории будет вот такая (или вот такие) часовые зоны». На одной и той же долготе могут быть разные государства с разной часовой политикой.
Вбить навороченную карту со всеми часовыми зонами и со всеми летними/змними политиками — это мозгов ардуины точно не хватит. И это всё ещё надо будет поддерживать в актуальном состоянии. В одной и той же точке поверхности планеты вполне может меняться часовая политика. Меняются государства, меняются премьер-министры… А на судах часовая зона вообще зависит исключительно от решения капитана :)
Если конструкционно применить переключалку со стрелочкой под отвёртку, как в некоторых блоках питания, и на корпусе написать "-2, -1, 0, +1, +2", то с местной подстройкой справится «любая домохозяйка».
Как-то он обратился ко мне «настрой мне часы в машине», я облазил там все. ну нет кнопок настройки часов, а часы идут, но неправильно. есть одна кнопка меняющая «час вперед или назад», в итоге гугление привело к тому, что время в этой машине под нас не настроить, его вообще в принципе не настроить, т.к. оно берется по GPS. и там забиты (захардкожены) только 2 часовых пояса, помоему +2 и +3, а нам надо было +6. Выхода нет, даже попыток перепрошивки в нэте не нашел, так и ездит с часами которые показывают на 4 часа меньше текущего, потому понравилась идея а не реализация, могли бы сделать настройку (коррекцию времени) от -24 часов до +24 и все.
Логику использования праворульных машин на леворуких дорогах они постичь не могут.
Если что-либо делается в какой либо стране, абсолютно не означает что это будет использоваться только в этой стране. Вот казалось бы есть наше «Жигули», скажите мне в какой стране их нет?)
Я больше поверю что это намеренное сокращение функционала.
Предлагаю в проект вариант настройки часового пояса.
1. Нажимаем обе кнопки и подаем питание на часы
2. Часы заходят в режим настройки часового пояса
3. Настраиваем часовой пояс кнопками часов и минут
4. Сохраняем настроенный часовой пояс нажатием обеих кнопок одновременно.
Реализовал это в новой версии кода. Исходник обновил.
Ну и я не представляю зачем такая точность в быту. Если только ради того что «я могу».
Вот ты сейчас долго и скучно рассказывал каким образом ты крутил алгоритмами, что бы повысить точность хода. И скомпенсировать погрешности. И ты достиг каких то хороших вариантов по точности. Но какая бы хорошая точность у тебя не была, она у тебя копится. Пусть по секунде в месяц. Пусть по секунде в год, но все равно копится. Профит с GPS в том, что погрешность не накапливается. У тебя есть какая то фиксировання погрешность связанная с задержками на обработку сигнала, на обновление экрана и т д. Вот все она есть и она фиксированная и измеряется в тысячных долях секунды. Все. Что через минуту после включения, что через 5 лет.
Хочется цветом ещё показывать, всё уже плохо или ещё более-менее.
А на RGB — это можно матричную панель взять. Но это уже совсем другая реализация будет.
P.S. Хранение неточного времени в EEPROM — это жесть! Уж лучше не знать никакого времени вообще, чем ошибаться и опоздать на поезд.
Wi-fi может пропадать при сбоях роутера. Пароль может (и должен!) периодически меняться. Wi-fi может быть не оплачено в текущем месяце :)
Дискуссионно, но я принимаю вашу точку зрения. По мне — нет. И оно очень быстро само станет точным.
Человек покупает Ваши часы и ставит их в спальне на тумбочке в 2 метрах от окна. Поскольку погода солнечная, GPS-сигнал ловит даже на таком расстоянии от окна.
И вот однажды ночью случается ужасная гроза, молния попадает в трансформаторную будку, электричество на 2 часа пропадает, а поскольку GPS-сигнал в такую погоду становится значительно хуже, то часы уже не могут синхронизироваться.
Человек спокойно просыпается и неспеша собирается на работу, поглядывая на Ваши часы. Приехав на работу, он узнает, что пропустил чрезвычайно важную встречу, подписание контракта сорвано, его увольняют с работы.
Лишившись работы, начинает пить, жена выгоняет с дому, жизнь на помойке и суицид через полгода.
Его дети подают многомиллионный иск о возмещении морального ущерба к производителю часов.Производитель банкротится, начинает пить, жена выгоняет с дому, жизнь на помойке и суицид через полгода.
Не такой уж этот вопрос и дискуссионный)))
Но в общем да, теоретически может случиться и типа такого. Такова плата за зависимость.
:)
Но я доделал проект.
Теперь, поглядывая на часы, наш многострадальный герой сумеет отличить, правильное ли они время показывают.
Поставить часы на DS3231 и синхронизировать их от GPS раз в 15-30 дней.
А также добавить 2 LED-модуля для отображения секунд.
www.gainta.com/g1034b.html
У него есть чуть небольшой уклон к дну, но это даже лучше. Резиновых самоклеящихся ножек сейчас полно, можно любой наклон к горизонтали организовать, смотря где они стоять будут.
В Чипе-дипе сейчас коммунизм на них, даже в розницу дешевле, чем в Вольтмастере.
Не подскажете где такое стекло можно взять? (может у китайцев где-то есть, сходу найти не смог). А то сейчас приходится колхозить с тонировочной пленкой :)
Всё так. Потому и сомневался, нужно ли писать эту статью. По мне, так DIY — благо, под любым способом.
Поверьте, это совсем не сложный язык. Примеров, справочников и уроков — море.
«Не надо звать, не надо ждать, а можно взять и почитать» © В.Берестов.
еще мало кто может его писать даже при всем желании научиться
это как с музыкой или рисованием — надо иметь талант к этому
Вполне себе бытовая технология. Я, например, дома, время от времени паяю какую-то SMD-деталюшку и вручную, хотя и паста, и флюс, и фен есть — иногда ведь так проще.
Почему же китайцу на продажу нельзя? :)
Приятно читать статьи с вменяемыми рассуждениями и прослеживать ход мысли. Ссылки на мануалы и оперирование данными из них — весьма похвальны :) За это — спасибо!
Но кое-что я покритикую.
Вы неверно используете термин «скомпрометированные данные». Первоначальный смысл — данные, ставшие известными тем, кому не следует знать. В данном случае лучше подошел бы термин «невалидные», «устаревшие» и т.п.
GPS\Глонасс как источник точного времени неплох, но например в моем доме ни один из современных приемников не берет сигнал внутри помещения. ТОлько будучи вплотную прислоненным к окну. Универсальный и пригодный всегда — инет через W-Fi.
КОМПРОМЕТАЦИЯ (от французского compromettre — подрывать репутацию). Данные, как и человек, могут считаться скомпрометированными, если к ним (к нему) подорвано доверие или если они не вызывают доверия.
Это и есть первоначальное словарное значение этого слова
Немножечко не так. Это не первоначальный смысл. Это применимость данного термина к области информационной безопасности и криптографии. Вот, применительно к этой сфере, вы совершенно и бесспорно правы.
Да, понимаю такую точку зрения, её озвучили выше. Я ответил так :)
Gate Threshold Voltage= 2-4в, значит полевик имеет полное право не закрыться, вопреки вашему желанию.
Кроме того, эти 7.5в постараются бесперебойно :) запитать МК, если его его питание подкачает.
Я бы добавил npn.
Есть готовая плата со статической индикацией (т.е. не мерцает!), но там туча проводов (около 30), поэтому сначала хочу попробовать запустить (прошить загрузчик) в бесплатную (сдутую откуда-то) Atmega 128, так чтоб она работала без кварца, и уже по I2C или RS-232 слать в неё с Ардуины цифры…
1. Что думаете, вообще возможно запустить Atmega 128 без кварца?
2. Каких ожидать задержек из-за обработки времени с GPS модуля аж через два преобразования RS-232 (~18кБит/сек) или I2C портами (50кГц)?
3. Будет ли работать в квартире (у окна) самый дешёвый GPS модуль, который купил «GY-NEO6MV2» или нужно что-то получше?
1. Отображение неправильного времени совершенно недопустимо. Поэтому все заморочки с сохранением в EPROM не имеют смысла.
2. Я что-то не до конца врубился, у вас время в коде программы считается вроде? Представляется не самым красивым решением, даже самый примитивный RTC даст большую энергоэффективность и имеет резервное питание.
3. Стремление избежать динамической индикации абсолютно не понятно.
geektimes.ru/post/289389/
В смысле, я не критикую. Просто разные конструкции.
Насчёт точек, у меня их три. Днём мигают две точки в центре, с 21.00 до 6.00 светится одна внизу. Чтобы не раздражало.
Вывод попеременно температуры и времени мне не понравился.
Так же как и он, начиная с 80-х каких только часов не делал из «Радио». Ну и без «Старта» — тоже не обошлось. До сих пор работают. Даже цифры не выгорели. Наверное из-за того, что сразу сделал в них авто регулятор яркости.
Не так давно стояла примерно такая же задача — получить часы с функционалом «поставил и забыл». Пошел по другому пути — планшет с битым тачскрином. Тач выбросил — и вот тебе готовый конструктив для часов мечты: коррекцию времени можно также сделать по GPS, но поскольку они стоят дома, а ситуация с GPS не менее критическая чем у автора, сделал от сети WiFi. Иными словами от роутера, который в свою очередь ничего не сбрасывает и плюс еще синхронизируется от NTP. А на 7 дюймах отображаются цифры очень даже комфортного размера. Можно менять цвет и размер. Единственное, что пришлось колхозить — выкинуть аккумулятор и запитать планшет от адаптера и сделать автонажималку кнопки «вкл» самого планшета при подаче питания. Все остальное — программа с самими часами, планировщик ее включения (после запуска это необходимо) и прочие вкусности — на то он и Андроид. Все это есть в свободном доступе.
Правда, буду переделывать и вставлю планшет с целым тачем — буду еще выжимать функционал. Пробовал одну программу, которая в определенные рамки времени приглушает яркость — не понравилась. Не то… Поставлю фотодатчик на драйвер подсветки — это проверенный путь.
Вот они в корпусе от фоторамки
yadi.sk/i/Ew0egvWq3Hg48u
yadi.sk/i/os1wRLuz3Hg493
База часов — sonoff (esp8266)
Комплектуха вся с али
Примерная стоимость одного комплекта <1000р (в нынешних ценах, даже с учетом корпусов)
Код тут.
github.com/pilnikov/ESP8266WeatherStations
Код писАл я сам.
Синхронизация по ntp (нужен инет), хотя gps прикрутить я думаю несложно, для меня просто не актуально было по gps.
Часики (все трое) работают второй год с периодическими (несущественными) апгрейдами
И особенно об этом — Матричный цветной дисплей 16х32 пикселей с интерфейсом HUB75 на отдельном контроллере MEGA2560.
Вот ссылка www.adafruit.com/product/420 это она?
Я так и не понял покупали где — на сайте adafruit или на ali? Если на ali дайте пожалуйста ссылку.
Почитал их статьи, посмотрел библиотеки/примеры кода, там все под матрицы 16х32 и 32х32 и у меня остался вопрос — а работа дух матриц 16х32 включенных друг за другом (чтобы получилась одна 16х64) возможна?
Сами случаем не пробовали?
И еще один вопрос, не совсем в тему-шрифт цифр для библиотеки adafruit сами написали или подкорректировали готовый?
Можете рассказать как это сделать, какие программы/редакторы нужны и т.д…
Внутри проекционного модуля там был дисплей, светодиод и линза.
В итоге я заменил диод на зеленый
А вот когда сломаются, можно и с их модулем поковыряться под ардуину. Там из геморроя — только регенерацию организовать для жк-матрицы. Зато бонус — простая смена диода позволит менять свет и яркость проекции.
видео не моё
А то я давно хочу часы на ИН-1 с синхронизацией по GPS, но в радиоэлектронике не разбираюсь от слова «совсем».
В смысле, имея готовую электронику для часов — оформить это в нормальном ретро-корпусе сумеете?
И почему ИН-1, а не популярные ИН-14? Или ИН-1 у вас уже есть физически?
Специально зарегистрировался на mysku, чтобы поблагодарить автора за такое замечательное подробное описание часов!
Уже пару лет как собираюсь сделать себе часы, продумываю детали, и тут вдруг натыкаюсь на практически свои часы! Которых пока еще нет, но как концепция и основные идеи практически полностью совпадают с идеями автора!
Есть небольшие различия: мои часы планируются более большими (1,2 дюйма для меня маловато, сейчас заказал платы и буду паять каждый 7-сегментник 5Х10см), плоскими, чтобы можно было их повесить на стену в рамочку. Не знаю, буду ли я включать туда градусник (и всякие датчики влажности, давления и т.п.), но все остальное — прямо мой проект один к одному как я его задумал!
Тот же самый neo6-m как GPS для синхронизации времени, та же адаптивная регулировка яркости, чтобы ночью часы светились еле-еле, а днем были яркими и тоже хорошо заметными, причем без всяких мерцающих ШИМ, та же самая ардуина про мини как самая дешевая для интеграции в готовое устройство.
Та же схема запитывания экрана от внешнего (ноутбучного) БП вольт на 19 с понижающим dc-dc для получения 5 вольт на ардуино и сколько надо вольт на светодиоды.
Экран хоть и самодельный, но на тех же сдвиговых 74HC595 и для управления более мощными светодиодами — ULN2003.
Вот модуль часов я себе заказал сразу DS3231, к чему в итоге пришел и автор.
Та же идея возможной экономии на модулях: если не вставить gps, то все будет работать, просто не будет синхронизации с ним, без градусника не будет температуры, благо предусмотреть это в коде несложно.
Про коррекцию часового пояса не думал, думал жестко забить +3, спасибо автору блога и комментаторам, за идею и реализованный код управления с кнопок, думаю теперь сделать так же.
Про токоограничительный блок для адаптивной подсветки — пока находился на стадии обдумывания (я вообще далек от радиотехники), а тут — готовое решение, возьму в свой проект в таком же виде.
Идея о скомпрометированном и корректном времени — тоже у меня созрела совершенно аналогично, правда когда время корректно — повторные синхронизации я планирую раз в несколько дней-недель-месяцев, а не минут. За идею выделения мигания двоеточия при скомпрометированном времени — тоже большое спасибо (хотя у меня двоеточия конструкцией пока и не предусмотрено).
Идея с прерывистым питанием для датчика температуры — шикарная, обязательно применю ее если не в часах, то в каком-нибудь другом проекте, где этот датчик задействую!
За идею про тонировочную пленку тоже спасибо! У меня завалялось несколько кусков цветного оргстекла, но как это будет выглядеть в готовом изделии — понятия не имею, очень может быть, что тонировочная пленка придется кстати.
Также спасибо за аккуратный, выверенный код с исправленными ошибками примеров из скетча! Я, имея отношение к it-сфере, представляю, сколько мелочей приходится выправлять в коде, чтобы все работало так, как надо. Ваш код, даже если и не брать целиком в свой проект (хотя почему бы и нет), то как минимум пригодится как хороший и рабочий пример для моего проекта.
Я не совсем понял, зачем нужен отдельный «дневной» режим, при котором блокируется резистор для адаптивной подсветки. Ведь в зависимости от освещенности помещения, яркость часов и так плавно регулируется. Или регулировка там не плавная, а либо ночь, либо день?
Сейчас меня попросили сделать аналог этих часов, только несколько крупнее. Поэтому эту версию часов делаю на ленте WS2812. Каждый сегмент цифры — это два светодиода от ленты. Ленту нарезал кусками, наклеил на базовую плоскость, соединил проводами, сверху маска для сегментов (от боковых засветок соседних светодиодов), сверху — тонированная плёнка. Наподобие вот такого, фото не моё, идея технологии взята вот отсюда. Но у меня масштабы чуть скромнее и исполнение немножечко другое…
Собственно, для такой реализации в скетче переписана только процедура Screen (поскольку вывод всего экрана осуществляется с одной ноги) и выкинут узел приглушения яркости — незачем это делать внешними ключами, я могу программно изменять яркость любого сегмента как угодно. Да и светодиоды на двоеточия не нужны — они тоже в составе той гирлянды из кусочков ленты.
Конструкция пока не готова, но базовые функции уже вполне работают. Домой бы такую конструкцию делать не стал (всё-таки лента ШИМит на неполной яркости), а вот для офиса — в самый раз. Никаких узоров делать не буду, ни к чему это для деловой атмосферы. Ну, разве что, время и температуру буду разными оттенками выводить.
Про тонированное оргстекло. Уже после публикации обзора наткнулся на вот такой лот. Покупал 2мм. Пришло, проблем нет. Нормальное тонированное оргстекло. Как и большинство листовых пластиков из Китая, пришло в защитной бумажной рубашке на обоих плоскостях. Так что кому надо — можно пользоваться.
Дневной и ночной режим — да, вы правы, они переключаются порогово (либо в комнате темно, либо светло). Там потому и стоит мосфет. Мне этого в функционале вполне достаточно. Т.е. питание на индикаторы подаётся либо через гасящий резистор (мосфет закрыт), либо мосфет открывается и, таким образом, блокирует сопротивление, т.е. питание подаётся полностью. Если хотите плавной регулировки, то это сделать совсем несложно — датчик освещённости брать с аналоговым выходом и подключать его не на пин 2, а на A1, скажем. И вместо ключа IRF9Z* ставить какой-то мощный p-n-p транзистор. Но сразу его оснащать радиатором, бо он будет греться как печка. И программно чуть подправить алгоритм, чтобы на пин 3 отравлять аналоговый сигнал, пропорциональный считанному от датчика освещённости.
Постепенно в голове начинают вырисовываться подробности моего будущего проекта.
Тот проект часов из светодиодных лент я смотрел пару лет назад, когда начинал обдумывать на чем делать часы. Решил, что табло выйдет все же слишком большим для меня, да и очень много возни с аккуратной нарезкой лент, приклеиванием их, прорезанием всяких трафаретов и т.п. Может быть потом к этому и приду, но пока у меня каждый сегмент — это 3 последовательно соединенных светодиода по 3мм. Пару лет назад осилил 3 7-сегментника по 2 светодиода в каждом сегменте, распаянные на макетке, это работало, пока припаянные мной провода не поотваливались. Зато хватило мощности обойтись без ULN2003…
Здорово, что у Вас проект получает дальнейшее развитие в виде новых заказов, это здорово!
Про плавную регулировку яркости — все-таки очень я далек от радиотехники, приходится второй день грызть гранит науки, Вы имеете в виду биполярный транзистор, включенный по схеме с общим коллектором для регулировки выходного тока? Какой-нибудь классический КТ815 должен подойти, если я уложусь суммарно в 1,5 ампера?
Либо там же пишут про КРЕН/LM317, что он еще лучше должен подойти?
Думал сделать именно так, а ток базы регулировать фоторезистором, даже без участия ардуины.
Но регулировка с аналогового пина ардуины будет еще лучше, например, захочется реализовать более «умное» снижение яркости за несколько минут, по мере того как глаза привыкают к темноте. Только же вроде, аналоговые выходы ардуины это ШИМ? Который спокойно «просочится» через любой транзистор, и на выходе получим изображение, которое будет «ШИМить»?
Кстати, вдогонку насчет температуры: оказывается, DS3231 сам по себе умеет измерять температуру. А значит, надо будет это дело как-то использовать в своих часах, не пропадать же такому полезному свойству датчика! А вот часовой пояс мне придется хранить где-нибудь в неиспользуемых ячейках памяти DS3231 и устанавливать каждый раз после замены батарейки, EEPROM-то у меня нет и не планируется…
1. Код в архиве соответствует тексту обзора. Т.е. да, все изменения, включая время из RTC и подстройку под все часовые зоны он содержит. После публикации код чуть правился, но к тексту статьи это отношения не имеет: часы дооснащались передающим радиомодулем, чтобы вся домашняя автоматизация, какая есть в доме (я очень осторожно отношусь к популярному термину «умный дом» — поэтому называю это «автоматизация»), и которой это надо, периодически получала точное время и дату от описываемых часов, — уж они-то совершенно определённо знают точное время…
2.
Надеюсь, что не ошибся :)
Но если что — в скетче в шрифтах абсолютно безболезненно поправите, это минута работы :)
D (SDA) -> пин A4
C (SCL) -> пин A5
Автоматический перевод реализовать невозможно, я говорил об этом выше. Мало получать координаты местности. Надо ещё держать базу привязки этих координат ко всем странам на плагете и базу часовых политик каждой страны. И обе эти базы придётся поддерживать в актуальности, поскольку неизменными тут являются лишь географические координаты конкретной точки планеты, всё остальное имеет шансы изменяться. Поскольку координаты — переменная физическая, а часовая зона и политика перевода времени — переменная политическая.
Режим установки зоны включается, когда оба пина притянуты к земле. Это могут делать только немытые контакты или неисправные кнопки. Ну, или, кнопки взяты нормально замкнутые, тоже быаает.
2. Из негатива получить правильное свечение очень просто. Поправьте шрифт.
В таблице в каждом из двадцати трёх значений, перечисленных через запятую, вам надо поменять после 0b все нули на единицы и единицы на нули.
Например первое значение 0b11000000 поменяется на 0b00111111, второе вместо 0b11111001 заменится на 0b00000110 и так далее. Для контроля: после 0b в каждом числе должно быть всегда восемь цифр. Последнее 0xff заменится на 0x00, или, попросту, на ноль.
Писать долго, а поправить, на самом деле, весьма быстро.
У меня не отображается, да и не должно :)
Проверьте, чему у вас равна переменная TempPresent без датчика… Она должна быть равна 0 (False).
Это должно происходить из того, что при разборе скретчпада DSstatus (как результат ds.reset) получается нулевым…
В самом начале секции setup(), первой же строчкой, проинициализируйте сериал-порт.
Собственно, 9600 — это так скорость, с которой потом будете читать из терминала.
В нужной точке кода нужную переменную отправляем в порт.
Собственно, для начала, я бы эту строчку вписал в самый конец процедуры Screen(), сразу перед закрывающей фигурной скобкой этой процедуры. Т.е. следующей строчкой после NeedToShowScreen = false;
Заливаете скетч и запускаете в работу ардуину. И в своей IDE открываете «Инструменты/Монитор порта». И смотрите, что ардуина вам пишет. Циклически, с каждым вызовом процедуры Screen, в порт будет прилетать значение интересующей вас переменной.
В настройках монитора порта (в самом низу окна) скорость должна быть такой же, какую вы проинициализировали в начале скетча ардуины. В данном случае 9600.
2. В скетче, в сетапе, INTUT_PULLUP не заменяли на INPUT?
Так почитайте из порта, что на тех пинах в реальности творится, я методику вам выше описал.
Можно даже специально новый простенький скетч написать и влить именно в эту ардуину, чтобы посмотреть. Какие состояния пинов в порту видете?
То ли у вас внутренние подтягивающие резисторы не работают, то ли по пути всё как-то садится на землю. Мультиметром потенциал на этих пинах мерили при нажатой и отпущенной кнопке? Каков результат?
Ищите проблему, фантастики быть не может, ни у кого из повторивших такой проблемы нет, да и неоткуда ей взяться, и ёмкость не при чём: там постоянный TTL уровень, пин либо подтянут резистором к плюсу, либо кнопкой прижат к земле.
Про показ температуры без датчика не сказали. Удалось исправить? Резистор между пином 6 и пином A0 не забыли поставить?
Всего-то и надо. В процедуре Screen найдите строку
и после неё вставьте вот такую строчку строчку:
У меня есть модуль GN-801 (NEO-8M), что с ним сделать, чтобы часы могли с ним работать?
Сейчас добыл neo-m8n, подключил к usb-ttl. В u-центре всё вижу, он точно так же работает на 9600. Ну, можно ему скорость выдачи поменять, с одного герца побыстрее, но не думаю, что для точного времени в часах это хоть сколько-нибудь важно.
Вечером подключу к ардуине и запущу пробный тест, тогда скажу наверняка. Но уже сейчас складывается впечатление, что ничего менять не надо, не вижу причин, чтобы оно не заработало «из коробки».
Поэтому, конечно, виснуть — не висла, но RMC-строки от NEO-8 отплёвывала, т.е. из потока данных от модуля полезного для себя не находила ничего.
Что надо сделать.
1. Зайти в папку с утановленной библиотекой TinyGPS
2. Открыть любым текстовым редактором файл «TinyGPS.cpp».
3. Найти строки (это в самом начале файла)
и в значениях вместо «GPRMC» и «GPGGA» написать «GNRMC» и «GNGGA» соответственно.
Т.е. получим такую картину:
4. Сохранить изменения.
5. Всё. После этого библиотека будет внимать потоку с NEO-8, можно заливать скетч.
Я только что проверил со скетчем часов, время подхватывается безо всяких проблем.
Ну, или другой путь: Взять u-center и сконфигурировать модуль так, чтобы он был не ГЛОНАСС+GPS (то, что по умолчанию при покупке), а чисто GPS. Тогда библиотека его опознает без модификаций. Но, честно говоря, в таком пути логичности я не вижу: это отнять у модуля половину его функциональности. Но, если надо, можно и так. Уроков по работе с u-center в интернете полно.
Да, нашёл, эти строки.
NEO-6 после такой правки перестанет работать?
в общем сейчас часы работают отлично :)
готовы :) только синий на фото не выходит, в реальности он красивый
Приятно по ходу ветки наблюдать, как разработка превращается в готовое изделие…
Молодца!
PS: Да, синий не удаётся сфоткать адекватно, у меня в обзоре та же проблема: синий на фотках выглядит не так красиво, как в реальности.
А вот «странное» время они начинают показывать в зоне неуверенного приёма. Т.е. это не проблема часов, а проблема GPS-приёмника, который в зоне неуверенного приёма отдаёт странные значения для синхронизации. Программно это, конечно же отсекается, но крайне редко, всё-таки что-то пролетает. Меняйте положение антенны. И, да, делать с этим ничего не надо: если приёмник получит сигнал от спутника, то с первой же синхронизацией время станет правильным.
У меня такое было несколько раз с одними часами (эксплуатируются полтора года). Время сбивалось, но в течение получаса-часа всегда само собой вставало правильно. Вторые часы (эксплуатируются полгода) живут спокойно, ещё ни разу не сбились. Либо модуль с антенной попался другой, либо в этом месте сигнал получше).
В вашем случае могу посоветовать оценить качество приёма по встроенному в GPS-модуль светодиоду, причём именно в выбранном месте для часов. Если он мигает с секундным интервалом, то делать ничего не надо, приём всё-таки работает и часы синхронизуются. Если мигания нет, то надо думать об улучшении приёма. Либо менять место, либо антенну.
Собственно, проще, (да и дешевле) сделать самому: возьмите четыре сдвиговых регистра 74HC595 и нагрузите их светодиодными семисегментными сборками любого размера и цвета, какими захотите, — выше в комментариях есть повторившие. Вы даже не привязаны к общему аноду или катоду: про переделку шрифта в инверс выше уже тоже всё написано.
Ну, либо переделывать скетч под тот экран, какой захотите в принципе; в смысле, вообще любой. Собственно, надо будет переписать под свои нужды лишь процедуру Screen(). Я, например, повторял эту конструкцию под ws2812b, нарезанную сегментами и наклеенную на подложку, по типу вот такого, но ведь и это не предел, тут всё ограничено вашей фантазией.
Ммм. А это-то вам зачем, если не секрет? Это просто листовая пластина, к которой прикручены четыре модуля-индикатора. Всё остальное просто размещено в корпусе: антенна GPS на верхней плоскости, фотосенсор и кнопки на боковой… Там секрета абсолютно нет никакого.
// Подключение часов реального времени
// DS3231 -> Arduino
// D (SDA) -> A4
// C (SCL) -> A5
Часы, действительно, включил в конструкцию по результатам обсуждения здесь, в исходной версии обзора их не было.
Вывод SСL чипа DS3231 — к пину A5 ардуины.
Вывод SDA чипа DS3231 — к пину A4 ардуины.
Выводы GND и VDD — соовтетсвенно к земле и питанию ардуины.
Если берёте не модуль DS3231, а голый чип, то ему обеспечиваете обвязку с батарейным питанием согласно аппноту. В китайском модуле всё уже сделано за вас, вышеуказанных четырёх линий достаточно.
Вы на заказ делаете?
Да сделайте сами, если хоть немного радиолюбительских знаний есть, там нет ничего сложного. :)
1. Для работы без датчика температуры ничего корректировать не надо. Если алгоритм этот датчик не увидит в исправном и работающем виде, то экран с температурой просто не будет никогда показываться. На работу алгоритма отсутсвие датчика никак не влияет, вполне штатный режим. Зато если когда-нибудь решитесь его подключить, то часы заработают сами по себе с полным функционалом.
2. Pro mini, согласен, программировать — это нужен переходник. А почему не хотите взять Arduino Nano V3, это полтора-два доллара, но программируются через обычные miniUSB (или microUSB, зависит от исполнения у продавца). Ничего в исходнике абсолютно переделывать не надо, все выводы, все сигналы совпадают абсолютно. Программируются в том же софте и на том же языке. Не пойдёт этот проект — используете ардуину под какой-то другой… Перепрошивать можно очень-очень много раз.
Индикаторы на схеме располагаются от единиц минут до десятков часов?
От подключения линий ввода: десятки часов, единицы часов, десятки минут, единицы минут (они самые дальние от ввода).
Собственно, проще, (да и дешевле) сделать самому: возьмите четыре сдвиговых регистра 74HC595 и нагрузите их светодиодными семисегментными сборками любого размера и цвета, какими захотите, — выше в комментариях есть повторившие. Вы даже не привязаны к общему аноду или катоду: про переделку шрифта в инверс выше уже тоже всё написано.
Так как правильно подключить четыре сдвиговых регистра 74HC595 со светодиодными сборками к вашему устройству?
Наверное это тоже, что представил на схемах olegmacovod, но он давно не отвечает.
По-моему, всё вполне очевидно. Откройте в поисковике примеры включения 74HC595, думаю, именно к тому же самому вы и придёте. В той или иной вариации.
Различие в двух его схемах — только в наличие умощняющих ключей. Определять, какую из двух схем выбрать, нужно исключительно исходя из того, какие индикаторы у вас будут применяться. Если сегменты вашего индикатора светятся с достаточной интенсивностью от трёх вольт, то можно выбрать более простую схему с питанием сегментов непосредственно от ног микросхем. Если же падение на сегментах выше, то без применения ключей не обойтись.
Вполне отвечает :)
Да, собственно, что тут отвечать. На мой взгляд, он всё достаточно полно осветил в этой ветке комментов…
Мне было удобнее крепить металлическим кожухом в небо. Всё ловится…
Ни с аппаратной, ни с программной точки зрения проблем нет. Алгоритм позволяет обрабатывать и показывать все темпервтуры, от –55°C до +125°C. Желающие без проблем доделают, при необходимости; ведь исхдник доступен…
Для питания пятивольтовой части схемы конечно же можно (а для случая, если в конструкции требуется только одно напряжение, то даже и логично) использовать пятивольтовую зарядку.
1. Подключить к переходнику UART-TTL и почитать из Com-порта, что он возвращает.
2. Подключить к переходнику UART-TTL и запустить uCenter с чтением из этого порта
3. Подключить к ардуине, влить в неё пример из библиотеки TinyGPS и почитать в мониторе порта.
Но, очевиднее всего будет так:
1. Отключаете модуль RTC.
2. Часы при подаче питания начинают время с 00:00. Двоеточие будет мигать неравномерно. Но часы будут идти.
3. Ждёте минут 15. Или меньше (если уверенный приём, то хватит и минуты). Если время само установилось и стало нормальным, то всё работает.
4. Возвращаете RTC.
Светодиод на самом модуле мигает с секундным интервалом, если модуль видит спутники.
Кстати, моё первое знакомство с Arduino.
СПАСИБО Dimon_ !!!
Дорогу осилит идущий :)
Можно вкратце написать, как происходит синхронизация времени и где находится это время, синхронизируются секунды или минуты?
GPS модуль поймал спутники? Что сам GPS-модуль выдаёт в порт? Сможете прислать кусок сырого потока с модуля типа вот такого?
Нет, конечно, это ненормально. Время должно быть точным.
Я отвечал на аналогичный вопрос ниже, посмотрите, пожалуйста. Боюсь, что полнее я уже не смогу ответить :)
Не могу сказать, поймал ли GPS модуль спутники, но светодиод на плате модуля мигает.
В какой порт GPS-модуль что-то выдаёт?
Что нужно сделать, чтобы получить кусок сырого потока с модуля типа того, что Вы представили?
Ничего в схеме не меняйте. Оставьте всё, как есть.
Убедитесь, что на GPS-модуле мигает лампочка.
Временно вместо скетча часов влейте в ардуину такой скетч:
Открываете в IDE монитор порта (только внизу его окна в настройках убедитесь, что он на 9600). Смотрите, что прилетело в порт.
Копипастите сюда.
Прямо от первого до последнего слова это относится к вам.
Правьте библиотеку, заливайте скетч заново, проверяйте.
Всё должно решиться.
По второй половине вопроса я как-то уже отвечал… Скажу честно. Сейчас у меня нет необходимости и ресурсов заниматься вторым датчиком. Из ресурсов для этого надо иметь разобранные часы на столе, физически второй датчик и кучу свободного времени. Ну и «заочно» такие вещи, конечно, не пишутся; всё-таки надо иметь реальное железо на столе.
Но вместо рыбы могу дать удочку :) В принципе, ничего принципиально нового в скетче не допишется, да он усложниться в объёме, но не алгоритмически. Питайте второй датчик от той же шестой ноги, только не забудьте: со своим подтягивающим резистором. Заводите в свободный пин данные, допустим в A1. В кейсе порционного опроса допишите чтение второго скретчпада, расчёт второго CRC и вычисление второй температуры: время там для этого есть, там половину шагов оно спит. Чуть больше трудностей будет с выводом ещё одного экрана со второй температурой, но и это вполне посильно. Остаётся в шрифтах нарисовать ещё один символ и чуть усложнить механизм смены экранов. И задача решена.
Регистры на али в ассортименте, и крупные индикаторы тоже встречаются.
Но, судя по фоткам примененных в проекте модулей индикаторов, или вот этих, там в обвязках присутствуют резисторы и, вроде, конденсаторы.
Можно меня носом ткнуть в необходимую схему обвязки, или все же можно все напрямую соединять по указанной выше схеме?
Или есть еще вариант упростить изготовление обвязки: на модулях сдуть мелкие индикаторы и припаять отдельно купленные крупные индикаторы (1,8"). Вот только потянут ли модули в плане нагрузки?
Вторая схема — это как раз то, о чём вы говорите.
Уверен, что то, что вы привели по ссылке на маленькие модули с Али — это как раз вторая схема; там вариантов особенно быть не может. Ну отдельные резисторы только собраны в резисторные сборки.
Первая схема отличается от второй только наличием умощняющих ключей. Определять, какую из двух схем выбрать, нужно исключительно исходя из того, какие индикаторы у вас будут применяться. Если сегменты вашего индикатора светятся с достаточной интенсивностью от трёх вольт, то можно выбрать более простую схему с питанием сегментов непосредственно от ног микросхем. В этом случае прокатит и сдувание+замена.
Если же падение на сегментах выше, то без применения ключей не обойтись. Т.е. тут надо отталкиваться не столько от токов нагрузки на регистры, сколько от падения на сегментах конкретно вашего индикатора. Да и токи-то у конкретного индикатора и померить можно, невелика проблема.
Если с транзисторами нет желания возиться, а умощение всё-таки нужно, (наверное, самый правильный вариант), то я бы вторую схему чуть модифицировал, введя в неё ключи ULN2003A.
Очень хорошие часы.
Хотел сделать, но не очень силён в Arduino. IDE выдаёт ошибки «неверная библиотека» и «нет заголовочных файлов (.h)», хотя они все лежат в libraries.
Может быть не ту версию Arduino IDE выбрал, хотя пробовал несколько 1.6.5, 1.8.5, 1.8.9.
Если не секрет, подскажите Вы с какой версией IDE работаете?
Или я что то нето делаю?
Попытаться найти версию IDE и libraries выпуска того года, когда скетч писал автор.
Заранее благодарен.
sch04s04v
А на какую библиотеку ругается-то? Что видите оранжевым текстом на чёрном фоне в окне IDE?
Установил рекомендованную, Вами, версию 1.8.3:
— компилируется без ошибок;
— библиотеки <TimeLib.h> и <Bounce.h> в скетче подсвечены не ярко красным цветом,
а бледно-красным, думаю, что библиотеки установлены неверно т. к. при загрузке
библиотек была ошибка, попробую их переустановить;
— если я не прав, пожалуйста подскажите.
Спасибо.
Я говорил про цвет не в окне скетча, а в окне компилятора, он ниже, там белым на чёрном фоне. Если там нет красного/оранжевого, то всё в порядке.
При компиляции ошибок нет:
— белым шрифтом на чёрном фоне пишет о количестве занятой памяти.
При загрузке в плату появляются ошибки:
— «Проблема при загрузке в плату». это высвечивается красным цветом после
счёта от 1-го до 10-ти.
Бегущей дорожки из знаков # # # # # нет.
Буду всё перепроверять на работоспособность по отдельности:
— порт СОМ 3;
— преобразователь интерфейса СН 340;
— плату Arduino Pro Mini.
Попробую залить скетч без периферии. Если получится буду подключать GPS, время и т.д… Или нельзя бед периферии заливать, как Вы считаете?
Если, Вы, разрешите, похвастаюсь результатом, а может быть, хвастать нечем будет.
Рассказывайте о результатах.
был СОМ3. После переустановки конвертера СН340 в СОМ5 скетч стал заливаться за 13 секунд. Причину отказа СОМ3 не выяснил.
Для движения дальше нужна Ваша консультация.
LED индикаторы, рекомендованные автором, DC/DC преобразователи и фотосенсор пока не приобрёл.
В наличии есть 7- <-->сегментный четырёхразрядный последовательный дисплей СОМ-11442 с SPI последовательным входом (библиотеки «SPI» и «SoftwareSerial» в скетче имеются.
Подключаю Дисплей <--> Ардуино:
— SS <--> pin 10;
— SDI <--> pin 11;
— SCK <--> pin 13;
— SDO не подключен;
— VCC <--> VCC;
— GND <--> GND.
Индикации нет никакой.
Как Вы считаете: в СОМ-11442 необходимо отдельный скетч заливать или он должен работать от библиотек Ардуино?
Dimon_, с дисплеем СОМ-11442 я вышел за рамки проекта определённого автором идеи, поэтому если Вам мои отступления не интересны на мои сторонние вопросы можете не отвечать.
Заранее благодарен.
Берите скетч из обзора и модифицируйте его под свой индикатор.
Дорогу покажу.
В мета-смысле, вам надо изменять только процедуру Screen().
Эта процедура, несмотря на свою громоздкость, по сути делает одно: значения системных переменных hour() и minute() (а раз в минуту ещё и переменной CurrentTemp) переводит в сигналы визуализирующего устройства. И всё. Т.е. весь остальной скетч ничего не знает о том, какое у вас визуализирующее устройство; скетчу это по барабану.
Визуализирующим устройством может быть любой семисегментный дисплей (комментарии выше это показывают), куски светодиодной ленты метровой длины, наклеенные на лист картона, моторы с чернильной ручкой, клапаны водопроводной магистрали и всё, что угодно. Просто в процедуре Screen() опишите выходному экрану понятным ему протоколом, что ему надо делать.
Нет ничего удивительного, что даже правильно (в электрическом смысле) подключив своё устройство с интерфейсом SPI, вы ничего не увидели: процедура Screen() не знает, что именно надо пулять в порт SPI для вашего дисплея. Эта процедура посылает сигналы для другого типа дисплея. Просто исправьте её под своё устройство и дисплей заработает. Обычно для этого даются примеры, чтобы можно было подсмотреть, как и что требуется конкретному устройству.
Сожалею, но теоретически — это всё, чем я могу помочь. Большее сможет сделать только тот, у кого есть такая железка на столе…
PS: Вот уже год работает версия этого скетча, с модифицированной процедурой Screen() под дисплей из ленты ws2812b. За исключением содержимого этой процедуры ничего другого в скетче почти не поменялось. Ну, только от светодиодного двоеточия я отказался, да от модуля приглушения яркости: в самой светодиодной ленте всё это есть от рождения, бессмысленно это делать внешними радиодеталями…
Пока я разбирался с подключением СОМ-11442 к плате по почте прислали, рекомендованные Вами, 2х разрядные семисегментные LED индикаторы с регистрами SN74HC595N, поэтому я переключился на «проторенную дорожку»
и в настоящий момент исследую собранную конструкцию.
Прошу, Вас, помочь мне в правильности определения возможностей данных часов.
1. Вы пишите, что синхронизация со спутником происходит в течении получаса-часа, но пытаясь это проверить выяснил, что часы идут очень точно (в течении 2-х недель) от выставленного времени кнопками, с заведомо неправильным временем (на 3-4 минуты вперёд или назад).
2. Может быть схема с программным обеспечением корректирует только секунды, которые я не отслеживаю, или минуты с часами, как задумано?
3. Зелёный светодиод на GPS модуле моргает: сам модуль проверял программой u-Center (модуль видит до 5-ти спутников).
4. Блок реального времени RTS так же проверил через COM- порт: выдаёт время и температуру.
5. Датчик температуры DS18B20 работает.
6. Пока не сделал регулировку яркости индикаторов.
7. Отключая поочереди блоки RTS и GPS, пытался выяснить кто приоритетней из них, так ничего и не понял как часы синхронизируются по спутнику.
8. Отключил RTS и GPS: часы всё равно идут и довольно точно!?
Заранее благодарен.
Скажу лишь, что полностью и легко ваши часы под этот проект не переделать: MEGA48 в их составе не перешьётся в полноценную ардуину. Хотя в неё можно заливать код из-под ArduinoIDE внешним программатором. Но, даже при таком раскладе, весь приведённый в статье исходник придётся хорошенько перелопатить.
Если вы настроены на переделку, логичнее порезать дорожки возле 25, 26, 27 и 28 ноги процессора и использовать от этих часов только цепочки stp08dp05 и индикаторы, оставив всю остальную их электронику мёртвым грузом. Ну, ещё отрезать дорожку от ноги 1 и использовать светодиоды двоеточия и сигналы кнопок снимать с J5.
Но, опять же, я не могу, не имея этой платы вживую, заочно написать процедуру вывода на экран под эти светодиодные драйверы. Надо гуглить библиотеки или примеры работы с stp08dp05 и, по аналогии, переписывать процедуру Screen() именно под этот экран. А саму ардуину довешивать на проводах.
Ещё один путь: перепаять на ваших часах MEGA48 на MEGA168. Эту мегу уже можно будет прошить ардуиновским загрузчиком и тогда останется только в скетче из обзора переправить названия всех пинов на соответствующие по схеме платы и, теоретически, всё заработает. Т.е. внешне плата не изменится, просто проапгрейдится по железу, и, таким образом, станет способна быть ардуиной и воспринимать заливаемые скетчи. Но процедуру Screen() всё равно придётся сочинять и переписывать под драйверы stp08dp05.
Главное, без паники поделить большую задачу на кучу мелких шагов и постепенно их решать.
Просто этот конструктор в текущем виде бесперспективен: там за время отвечает DS1307, а это тупиковый путь: такие часы никогда не будут ходить точно. Если, вдобавок, эта плата у вас ещё и оформлена в хорошем корпусе, то переделка точно стóит свеч.
Для начала я бы перепаял (или нашёл того, кто перепаяет) на этой плате ATMEGA48 на ATMEGA168 (по выводам они абсолютно совместимы) и программатором (самодельным или копеечным китайским) влил бы в неё ардуиновский загрузчик. Вы получили бы разведённую, готовую и и настроенную плату часов с ардуиной на борту. Что уже само по себе весьма неплохо.
0
Уважаемый, Dimon_, спасибо Вам за уделённое внимание к проблеме подключения цифрового индикатора СОМ-11442 к Arduino.
Пока я разбирался с подключением СОМ-11442 к плате по почте прислали, рекомендованные Вами, 2х разрядные семисегментные LED индикаторы с регистрами SN74HC595N, поэтому я переключился на «проторенную дорожку»
и в настоящий момент исследую собранную конструкцию.
Прошу, Вас, помочь мне в правильности определения возможностей данных часов.
1. Вы пишите, что синхронизация со спутником происходит в течении получаса-часа, но пытаясь это проверить выяснил, что часы идут очень точно (в течении 2-х недель) от выставленного времени кнопками, с заведомо неправильным временем (на 3-4 минуты вперёд или назад).
2. Может быть схема с программным обеспечением корректирует только секунды, которые я не отслеживаю, или минуты с часами, как задумано?
3. Зелёный светодиод на GPS модуле моргает: сам модуль проверял программой u-Center (модуль видит до 5-ти спутников).
4. Блок реального времени RTS так же проверил через COM- порт: выдаёт время и температуру.
5. Датчик температуры DS18B20 работает.
6. Пока не сделал регулировку яркости индикаторов.
7. Отключая поочереди блоки RTS и GPS, пытался выяснить кто приоритетней из них, так ничего и не понял как часы синхронизируются по спутнику.
8. Отключил RTS и GPS: часы всё равно идут и довольно точно!?
Заранее благодарен.
Алгоритмы синхронизации прослеживаются из кода, но кратко могу и тут описать:
Со спутников время синхронизируется согласно переменной MaxTimeToSync. Например, если значение этой переменной равно 500 секунд, то время синхронизируется каждые восемь с чем-то минут, это если часы понимают, что они показывают достоверное время. Если часы понимают, что достоверность времени под вопросом (например, после сразу включения, после неудачной попытки синхронизации, при молчании GPS-модуля) попытки синхронизации предпринимаются чаще. Каждые 10 секунд. Это что касается синхронизации с GPS.
Но неудачная синхронизация с GPS — ещё не значит, что надо сбрасывать время. Часы продолжают идти. Отсчсёт осуществляется программно внутри чипа ардуины, у неё есть тактовый кварц. Дайте часам один раз синхронизоваться с GPS и, не отключая питания, заблокируйте GPS-модуль — они вполне успешно будут работать месяцами, хотя и постоянно предпринимая попытки синхронизироваться с GPS. И при первой же предоставленной возможности синхронизируются.
Системное время (вне зависимости, синхронизировалось оно со спутников или нет), синхронизируется с RTC. Если со спутников удалось получить время, часы его считают самым точным и его же вносят в RTC. Если со спутников время получить не удалось, то часы идут с тем временем, которое уже хранится в RTC.
Итого.
а) Даже если у часов нет ничего, они будут идти исключительно на программных средствах системного времени ардуины довольно точно (с точностью кварца в ардуине), просто при включении они будут начинать время с 00:00.
б) Если им дать только RTC, то они будут при включении сразу продолжать показывать то время, которое течёт в RTC.
в) Если им дать только GPS, при включении они будут начинать время с 00:00, но постоянно предпринимать поиск времени со спутников и при первой же возможности начнут показывать точное время.
г) Если им дать и GPS и RTC, то они будут получить точное время со спутников и заботиться о том, чтобы и в RTC всегда было точное время. При включении они продолжат с того времени, которое течёт в RTC и при первой же возможности обновят его с GPS.
е) Пропадание GPS или RTC в процессе работы (т.е. без потери питания) считается временным неудобством и в этот момент время отсчитывается программным системным временем ардуины, определяемым точностью её кварца.
Слои приоритета точности: если при включении часы не обнаруживают RTC, то время начинается с 00:00 и такое время считается самым недостоверным. Если установить время с кнопок, оно считается более достоверным, но всё ещё недостаточно точным. Ещё более достоверное — то время, которое получено с RTC, Время со спутника считается максимально точным.
Более точное время имеет приоритет над менее точным: более точное принимается во внимание, менее точное отбрасывается.
Вы русским языком, очень понятно, нарисовали логическую блок-схему работы программы.
К сожалению собранное мной аппаратное обеспечение с Вашим программным обеспечением работает не так как Вы описываете (в кодах я не силён, если с ним разбираться то на это полгода уйдёт).
Буду искать неисправность в «железе».
Отправная точка поиска:
1. Прошло 30 минут после подачи питания:
а) часы показывают 0:30 минут;
б) двоеточие промаргивает через 1 секунду;
в) зелёный светодиод на GPS моргает;
г) температуру показывают 21 гр.;
д) отдельно каждой кнопкой часы и минуты переводятся;
е) выставленное, до отключения питания, время не восстановилось не по RTS ни по GPS.
2. После нажатия на обе кнопки:
а) двоеточие заработало нормально мигая 1 раз в секунду;
б) зелёный светодиод на GPS моргает;
в) на RTS горит светодиод «Питание подано»;
г) часы показывают 2:17;
д) синхронизации не от RTS ни от GPS не происходит.
О результатах поиска неисправностей, в блоках или в межблочных соединениях,
Вам напишу или буду вновь у Вас просить консультации.
Устранил плохой контакт в разъёме RTS (облудил побольше ножки разъёма).
От RTS часы стали работать так как Вы пишите: помнят текущее время после снятия питания.
Осталось исследовать GPS.
Из описанных Вами приоритетов синхронизации (вероятно без детального исследования ПО, а я в этом не силён) всё равно не понятно, что должен синхронизировать блок GPS: часы, минуты или секунды, если да, то в каких пределах ведётся захват неточности хода и приведение его к полученной информации от GPS.
Спасибо.
Когда у вашей конструкции не было ни RTC из-за плохого контакта, ни GPS, они визуально показывали, что время явно неточное. Это я про описываемое вами странное поведение двоеточия. Первое же нажатие на кнопку считалось фактом ручной установки времени. Поскольку сравнить его не с чем, часы принимали его как условно точное. И двоеточие начинало мигать в правильном режиме.
Теперь у ваших часов есть RTC. И они уже с момента включения должны мигать правильно.
Но у них нет GPS. Могу предположить две версии. Первая и самая очевидная: перепутаны линии Rx и Tx, идущие к GPS-модулю. Поменяйте местами провода, идущие к пинам 7 и 9. И подождите несколько минут, при условии, что на GPS мигает светодиод.
Если это не помогло, то есть другая версия. Для её проверки пришлите сюда, пожалуста, пару десятков строк сырого потока с модуля. Вы же подключали его к uCenter, там есть для этого окно.
При изменении линий Rx и Tx, идущие к GPS-модулю, при условии, что на GPS мигает светодиод: положительных результатов не получил.
Единственное, что изменилось это осциллограммы:
— при штатном включении на Тх импульсы с частотой 1 Гц и высокочастотным
заполнением амплитудой 3 В (частоту замерить не смог: меняется);
— на Rx = 4,3 В.
До Arduino эти сигналы доходят.
При замене линий Rx и Tx:
— Тх = 4,3 В и заполнено ВЧ с амплитудой 0,3 В (т.е на уровне пульсаций питающего
напряжения).
— Rx= 3,5 В (упало на 1 В) без частоты.
С роликом в u-Center что то не заладилось поэтому высылаю скриншоты двух програм u-Center и Terminal COM порта.
И скриншоты не могу прикрепить: ошибка #1003.
Может быть почту свою дадите и на неё вышлю.
Спасибо.
15:26:20 $GPGSV,4,2,14,12,10,009,,14,45,068,21,17,23,297,26,18,27,180,10*73
15:26:20 $GPGSV,4,3,14,19,22,313,15,22,81,207,27,23,30,234,27,25,13,049,*75
15:26:20 $GPGSV,4,4,14,31,47,099,17,32,21,065,*7A
15:26:20 $BDGSV,1,1,02,19,11,273,34,20,62,269,39*62
15:26:20 $GNRMC,152620.000,A,5702.2585,N,04057.4177,E,0.00,0.00,200819,,,A*79
15:26:20 $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
15:26:20 $GNZDA,152620.000,20,08,2019,00,00*4A
15:26:20 $GPTXT,01,01,01,ANTENNA OK*35
15:26:21 $GNGGA,152621.000,5702.2586,N,04057.4177,E,1,09,3.1,162.1,M,0.0,M,,*74
15:26:21 $GNGLL,5702.2586,N,04057.4177,E,152621.000,A,A*4E
15:26:21 $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,4.0,3.1,2.6*3D
15:26:21 $BDGSA,A,3,20,19,,,,,,,,,,,4.0,3.1,2.6*2B
15:26:21 $GPGSV,4,1,14,01,49,200,34,03,65,278,36,06,05,325,,11,22,207,28*70
15:26:21 $GPGSV,4,2,14,12,10,009,,14,45,068,21,17,23,297,26,18,27,180,10*73
15:26:21 $GPGSV,4,3,14,19,22,313,15,22,81,207,27,23,30,234,27,25,13,049,*75
15:26:21 $GPGSV,4,4,14,31,47,099,17,32,21,065,*7A
15:26:21 $BDGSV,1,1,02,19,11,273,34,20,62,269,39*62
15:26:21 $GNRMC,152621.000,A,5702.2586,N,04057.4177,E,0.00,0.00,200819,,,A*7B
15:26:21 $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
15:26:21 $GNZDA,152621.000,20,08,2019,00,00*4B
15:26:21 $GPTXT,01,01,01,ANTENNA OK*35
15:26:22 $GNGGA,152622.000,5702.2586,N,04057.4177,E,1,09,3.1,162.1,M,0.0,M,,*77
15:26:22 $GNGLL,5702.2586,N,04057.4177,E,152622.000,A,A*4D
15:26:22 $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,4.0,3.1,2.6*3D
15:26:22 $BDGSA,A,3,20,19,,,,,,,,,,,4.0,3.1,2.6*2B
15:26:22 $GPGSV,4,1,14,01,49,200,34,03,65,278,36,06,05,325,,11,22,207,28*70
15:26:22 $GPGSV,4,2,14,12,10,009,,14,45,068,21,17,23,297,26,18,27,180,10*73
15:26:22 $GPGSV,4,3,14,19,22,313,17,22,81,207,27,23,30,234,27,25,13,049,*77
15:26:22 $GPGSV,4,4,14,31,47,099,17,32,21,065,*7A
15:26:22 $BDGSV,1,1,02,19,11,273,34,20,62,269,39*62
15:26:22 $GNRMC,152622.000,A,5702.2586,N,04057.4177,E,0.00,0.00,200819,,,A*78
15:26:22 $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
15:26:22 $GNZDA,152622.000,20,08,2019,00,00*48
15:26:22 $GPTXT,01,01,01,ANTENNA OK*35
15:26:23 $GNGGA,152623.000,5702.2586,N,04057.4176,E,1,09,3.1,162.1,M,0.0,M,,*77
15:26:23 $GNGLL,5702.2586,N,04057.4176,E,152623.000,A,A*4D
15:26:23 $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,4.0,3.1,2.6*3D
15:26:23 $BDGSA,A,3,20,19,,,,,,,,,,,4.0,3.1,2.6*2B
15:26:23 $GPGSV,4,1,14,01,49,200,34,03,65,278,36,06,05,325,,11,22,207,28*70
15:26:23 $GPGSV,4,2,14,12,10,009,,14,45,068,21,17,23,297,26,18,27,180,10*73
15:26:23 $GPGSV,4,3,14,19,22,313,17,22,81,207,27,23,30,234,27,25,13,049,*77
15:26:23 $GPGSV,4,4,14,31,47,099,17,32,21,065,*7A
15:26:23 $BDGSV,1,1,02,19,11,273,34,20,62,269,39*62
15:26:23 $GNRMC,152623.000,A,5702.2586,N,04057.4176,E,0.00,0.00,200819,,,A*78
15:26:23 $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
15:26:23 $GNZDA,152623.000,20,08,2019,00,00*49
15:26:23 $GPTXT,01,01,01,ANTENNA OK*35
15:26:24 $GNGGA,152624.000,5702.2586,N,04057.4176,E,1,09,3.1,162.0,M,0.0,M,,*71
15:26:24 $GNGLL,5702.2586,N,04057.4176,E,152624.000,A,A*4A
15:26:24 $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,4.0,3.1,2.6*3D
15:26:24 $BDGSA,A,3,20,19,,,,,,,,,,,4.0,3.1,2.6*2B
15:26:24 $GPGSV,4,1,14,01,49,200,34,03,65,278,36,06,05,325,,11,22,207,28*70
15:26:24 $GPGSV,4,2,14,12,10,009,,14,45,068,19,17,23,297,26,18,27,180,10*78
15:26:24 $GPGSV,4,3,14,19,22,313,17,22,81,207,27,23,30,234,28,25,13,049,*78
15:26:24 $GPGSV,4,4,14,31,47,099,17,32,21,065,*7A
15:26:24 $BDGSV,1,1,02,19,11,273,34,20,62,269,39*62
Может быть вот эта информация пригодится из Terminal v 1.9b, хотя это по моему одно и тоже, только в разных программах.
18:30:10.081> $BDGSV,1,1,02,19,12,274,27,20,63,270,36*62
18:30:10.206> $GNRMC,153012.000,A,5702.2585,N,04057.4174,E,0.00,0.00,200819,,,A*7C
18:30:10.275> $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
18:30:10.275> $GNZDA,153012.000,20,08,2019,00,00*4C
18:30:10.330> $GPTXT,01,01,01,ANTENNA OK*35
18:30:10.710> $GNGGA,153013.000,5702.2585,N,04057.4174,E,1,09,3.0,159.9,M,0.0,M,,*73
18:30:10.710> $GNGLL,5702.2585,N,04057.4174,E,153013.000,A,A*48
18:30:10.830> $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,3.9,3.0,2.5*31
18:30:10.830> $BDGSA,A,3,20,19,,,,,,,,,,,3.9,3.0,2.5*27
18:30:10.892> $GPGSV,4,1,14,01,47,198,33,03,67,277,35,06,06,325,,11,21,206,28*74
18:30:11.016> $GPGSV,4,2,14,12,10,008,,14,43,068,13,17,23,295,23,18,25,180,13*73
18:30:11.078> $GPGSV,4,3,14,19,22,312,24,22,81,196,23,23,32,234,31,25,14,047,*75
18:30:11.078> $GPGSV,4,4,14,31,47,097,21,32,20,065,*70
18:30:11.147> $BDGSV,1,1,02,19,12,274,27,20,63,270,36*62
18:30:11.265> $GNRMC,153013.000,A,5702.2585,N,04057.4174,E,0.00,0.00,200819,,,A*7D
18:30:11.265> $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
18:30:11.327> $GNZDA,153013.000,20,08,2019,00,00*4D
18:30:11.327> $GPTXT,01,01,01,ANTENNA OK*35
18:30:11.704> $GNGGA,153014.000,5702.2585,N,04057.4174,E,1,09,3.0,159.9,M,0.0,M,,*74
18:30:11.704> $GNGLL,5702.2585,N,04057.4174,E,153014.000,A,A*4F
18:30:11.828> $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,3.9,3.0,2.5*31
18:30:11.828> $BDGSA,A,3,20,19,,,,,,,,,,,3.9,3.0,2.5*27
18:30:11.890> $GPGSV,4,1,14,01,47,198,33,03,67,277,35,06,06,325,,11,21,206,28*74
18:30:12.022> $GPGSV,4,2,14,12,10,008,,14,43,068,13,17,23,295,23,18,25,180,13*73
18:30:12.076> $GPGSV,4,3,14,19,22,312,24,22,81,196,23,23,32,234,31,25,14,047,*75
18:30:12.076> $GPGSV,4,4,14,31,47,097,21,32,20,065,*70
18:30:12.141> $BDGSV,1,1,02,19,12,274,27,20,63,270,36*62
18:30:12.203> $GNRMC,153014.000,A,5702.2585,N,04057.4174,E,0.00,0.00,200819,,,A*7A
18:30:12.264> $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
18:30:12.326> $GNZDA,153014.000,20,08,2019,00,00*4A
18:30:12.326> $GPTXT,01,01,01,ANTENNA OK*35
18:30:12.701> $GNGGA,153015.000,5702.2585,N,04057.4173,E,1,09,3.0,159.9,M,0.0,M,,*72
18:30:12.701> $GNGLL,5702.2585,N,04057.4173,E,153015.000,A,A*49
18:30:12.763> $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,3.9,3.0,2.5*31
18:30:12.827> $BDGSA,A,3,20,19,,,,,,,,,,,3.9,3.0,2.5*27
18:30:12.897> $GPGSV,4,1,14,01,47,198,32,03,67,277,35,06,06,325,,11,21,206,28*75
18:30:13.014> $GPGSV,4,2,14,12,10,008,,14,43,068,13,17,23,295,23,18,25,180,13*73
18:30:13.076> $GPGSV,4,3,14,19,22,312,24,22,81,196,23,23,32,234,30,25,14,047,*74
18:30:13.076> $GPGSV,4,4,14,31,47,097,21,32,20,065,*70
18:30:13.138> $BDGSV,1,1,02,19,12,274,27,20,63,270,36*62
18:30:13.200> $GNRMC,153015.000,A,5702.2585,N,04057.4173,E,0.00,0.00,200819,,,A*7C
18:30:13.262> $GNVTG,0.00,T,,M,0.00,N,0.00,K,A*23
18:30:13.262> $GNZDA,153015.000,20,08,2019,00,00*4B
18:30:13.332> $GPTXT,01,01,01,ANTENNA OK*35
18:30:13.698> $GNGGA,153016.000,5702.2585,N,04057.4173,E,1,09,3.0,159.9,M,0.0,M,,*71
18:30:13.771> $GNGLL,5702.2585,N,04057.4173,E,153016.000,A,A*4A
18:30:13.825> $GPGSA,A,3,03,23,01,17,22,19,11,,,,,,3.9,3.0,2.5*31
18:30:13.825> $BDGSA,A,3,20,19,,,,,,,,,,,3.9,3.0,2.5*27
18:30:13.886> $GPGSV,4,1,14,01,47,198,32,03,67,277,35,06,06,325,,11,21,206,28*75
18:30:14.011> $GPGSV,4,2,14,12,10,008,,14,43,068,13,17,23,295,23,18,25,180,14*74
18:30:14.073> $GPGSV,4,3,14,19,22,312,23,22,81,196,23,23,32,234,30,25,14,047,*73
$GPGSV,4,4,14,31,47,097,2
Всё у вас было правильно распаяно по контактам 9 и 7. Возвращайте правильное подключение, если меняли пины местами.
Что ж вы сразу-то не сказали, что у вас модуль не чисто GPS, а GPS+ГЛОНАСС? :) Ну да ладно, точнее будет итог.
Выше я уже рассказывал, как решить эту ситуацию. Вот прямо от первого до последнего слова это относится к вам. Правьте библиотеку, заливайте скетч заново, проверяйте. Всё должно решиться.
PS: Кстати, привет в Иваново :) В гости ждёте?
за такие консультации «стопку чая» наливать надо…
Буду воплощать в жизнь Ваши рекомендации.
По результатам нововведений в библиотеку «Tiny GPS.cpp» извещу Вас обязательно.
Всё синхронизируется.
Причём синхронизация происходит нас только быстро, что я не успеваю отследить
характерное промаргивание двоеточия.
Попробую отследить синхронизацию с маленькой антенной, может быть так успею
отследить, а если нет то и не надо лишь бы часики шли верно.
Спасибо.
Буду доделывать регулировку яркости и не до конца доделал LED индикацию с высотой знака 1,8 ".
Если опять забуксую Буду Вам писать.
Часы прекрасно работали с большими индикаторами.
Устранил инверсию цифр и доработал библиотеку TegGPS.cpp согласно Ваших рекомендаций.
Точно не помню: 2 — 2,5 месяца назад часы перестали синхронизироваться по GPS?
После замены блоков Arduino и GPS на новые синхронизация не восстановилась.
Доработанную библиотеку TegGPS.cpp вернул наместо то есть ГЛОНАС + GPS и опять всё заработало!?
Что могло это быть я не понял, может быть Вы объясните.
Заранее благодарен.
Что я должен объяснить?
Честно говоря, совершенно нет времени всем этим заниматься…
Модуль GPS отвечает? Что видите в сыром потоке?
Вот вам отправлная точка: вместо скетча часов временно влейте из стандарных примеров к библиотеке TinyGPS простенький скетчик, который читает в softwareserial данные из модуля GPS и отправляет в serial, посмотрите, от модуля в пины 7 и 9 вообще поток идёт и что конкретно в этом потоке.
d:\temp\arduino_modified_sketch_318618\sketch_jan08a.ino: In function 'void Synctime()':
sketch_jan08a:266: error: 'gps' was not declared in this scope
gps.f_get_position(&flat, &flon, &GPSage);
d:\temp\arduino_modified_sketch_318618\sketch_jan08a.ino: In function 'void loop()':
sketch_jan08a:357: error: 'gps' was not declared in this scope
if (gps.encode(GPSchar)) newData = true;}
sketch_jan08a:360: error: 'gps' was not declared in this scope
gps.f_get_position(&flat, &flon, &GPSage);
перепробовал иде 1.8.2, 1.8.3, 1.8.10
платформио тоже ругается в этих же № строк на идентификатор 'gps'
народ, код точно рабочий? или что-то поправить надо?
далее для тех чайников, кто столкнется с этой же проблемой:
скетч из скачанного архива компилируется без ошибок. я же копировал код с этой страницы — при компиляции выдаются ошибки. не знаю в чем причина — или код немного разный, или при копи-пасте где-то теряется форматирование. имейте ввиду
Такого быть не должно, всё должно стартовать при подаче питания.
Спасибо.
и поставить один единственный восклицательный знак:
Примененные Вами индикаторы с общим анодом или с общим катодом?
Как происходит управление разрядами индикаторов? Можете разрисовать эту часть схемы более подробно?
Информация необходима для повторения конструкции на самодельных семисегментных индикаторах большого размера…
По пунктам.
1. Как я уже писал выше, часы давно сданы в эксплуатацию, доступа к ним я уже не имею, но работают они у владельцев до сих пор. Поэтому вскрыть и разрисовать схему конкретно тех модулей я не смогу при всём желании. Всё что повторялось, как мной (я повторял эту конструкцию на лентах), так и многочисленными пользователями, делалось на самодельных индикаторах.Уверен, что и у вас всё получится.
2. Для данных часов абсолютно непринципиально, общий катод или анод будет у индикаторов. Первоначально в проекте применялся общий анод, именно под это текущий исходник. Если же ваша конструкция будет с общим катодом, всего-навсего в исходнике проинвертируйте шрифт собственными силами, это несложно, я выше рассказывал (п.2).
2. Управление разрядами очевидно из логики работы сдвиговых регистров. Возьмите четыре сдвиговых регистра 74HC595 и нагрузите их светодиодными семисегментными сборками любого размера и цвета, какими захотите.
Допустим, у вас индикаторы с общим анодом. На эти аноды подаётся своё положительное питание (если будете менять ночную яркость), на 16-е ноги самих HC595 — своё, (т.е.стабильные пять вольт). Катоды индикаторов — на выходы сдвиговых регистров, напрямую или через ключи. Привязку сегментов к выходам я приводил.
3. Выше пользователь olegmacovod привёл две схемы, отличающиеся тем, что первая с умощнением транзисторами для сегментов на 6 вольт, а вторая — для сегментов на 3 вольта. Помимо наличия ключей, схемы ничем не отличаются. Чуть ниже он привёл фотку готовых часов по этой схеме. У него, как видно из схемы, тоже был общий анод.
Вот собрал по вашей схеме часики. Работают отлично. Синхронизация по GPS проходит нормально, модуль GPS NEO-M8N. Кое что доработал в вашей схеме, я применил большие индикаторы FJS18101BH, корпус использовал Фирмы Gainta GG368. Вот такие получились часики. Автору огромное спасибо за схему и скетчь.
drive.google.com/file/d/1KZ_SLXReBhljLYkOMo1RAYdKzNkDArDX/view?usp=share_link
drive.google.com/file/d/1KZ_SLXReBhljLYkOMo1RAYdKzNkDArDX/view?usp=sharing
drive.google.com/file/d/1GoO0kKdkI9m2FE59P7gCcVaMgzJE_fGd/view?usp=sharing
drive.google.com/file/d/1-ymDs6PmuqcPe5LW-H52s_KOsSBFi6tr/view?usp=sharing
https://aliexpress.ru/item/4000493307654.html
https://aliexpress.ru/item/4000492079472.html
https://aliexpress.ru/item/4000493371185.html
https://aliexpress.ru/item/4000493372676.html
iarduino.ru/shop/Expansion-payments/7-segmentnyy-displey-86-65mm-krasnyy.html
iarduino.ru/shop/Expansion-payments/7-segmentnyy-displey-86-65mm-siniy.html
iarduino.ru/shop/Expansion-payments/7-segmentnyy-displey-86-65mm-zelenyy.html
Единственное замечание:
Внение подтягивающие резисторы там не подразумевались, поскольку программно подключены внутренние подтягивающие резисторы.
Но если уж их поставили, то так даже лучше. Только отключите внутреннюю подтяжку.
Для этого, в скетче найдите фрагмент
И вместо двух INPUT_PULLUP напищите INPUT
Чтобы получилось
И влейте скетч ещё раз.
Сейчас у вас подтягивают и внутренние и внешние резисторы, нагрузка получается великовата.
PS: А вообще — отличный результат! Искренние поздравления :)
Нет никаких проблем переделать скетч под ТМ1637.
Взять подходящую библиотеку (коих в достатке).
Переписать, очевидно, всю процедуру Screen(). Она совсем незначительно усложнится, и то не факт.
Поправить инициализвцию в секции Setup().
Всё.