Синхронизируем время на модуле DS3231 с компьютером


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

Зачем всё это нужно?

Начну с вопроса, ответ на который очевиден: что самое важное в любых часах? Разумеется, это точность хода. Какими бы многофункциональными и эстетичными не были любые часы, они – барахло, если идут неточно. Поэтому, если говорить о точности, ни для кого не секрет, что на данный момент модуль DS3231 – один из самых конкурентоспособных модулей на рынке: он относительно дёшев, достаточно точен, в отличие от, например, «доисторического» DS3107, и относительно невелик. Поэтому применение этого модуля в самоделках – абсолютно логичный и предсказуемый шаг. Осталась мелочь – научиться выставлять на нём время достаточно точно и с минимальными трудозатратами. Этим я и хочу поделиться.

Если часы – точные, как часто понадобится синхронизация?

Давайте прикинем: модуль часов имеет заявленную точность до 2 ppm в диапазоне температур от 0 до 40 градусов Цельсия (а в большинстве жилищ температура именно такая).

Что такое «ppm»? PPM – аббревиатура от «Parts Per Million» – «частей на миллион». Возьмём за единицу измерения секунду и посчитаем:

60сек * 60мин *24 часа * 365 дней = 31 536 000 секунд в году.

На каждый из этих миллионов 2 секунды может уходить в ту или иную сторону. 31,5 миллион делим на миллион и умножаем на 2: получаем 63 секунды в год (максимум). Приемлемый вариант? Весьма. Но 1 раз в полгода я бы синхронизировал время, чтобы оно укладывалось в 1 минуту.

Какими способами вообще можно устанавливать время на часах модуля?

Традиционно, начиная с модуля DS3107, время устанавливалось при помощи скетча для Arduino из числа примеров использования библиотеки. Алгоритм такой: открываем скетч, жмём «компилировать и закачать», и при первом запуске контроллера время устанавливается. Остался вопрос: какое время? Откуда Arduino может узнать, какое именно время устанавливать? А очень просто – время компиляции скетча. Однако с таким подходом я вижу несколько недостатков:

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

Что ещё можно придумать? Можно, например, выставлять требуемое время в скетче вручную, предусмотреть кнопку, нажатие на которую в нужный момент выставит «руками» указанное время, например, через 2 минуты от текущего момента: пока «зальётся» скетч, пока подготовимся отследить вручную тот самый нужный момент нажатия кнопки, как раз та пара минут и пройдёт. А дальше, глядя на часы в компьютере, дожидаться «того самого» момента, чтобы нажать кнопку. Плюсы – сложнее предыдущего способа, но всё ещё относительно просто, однако точнее, чем первый способ. Минусы – этот способ ещё неудобнее, дольше, всё равно скетч «одноразовый».

Кто виноват и что делать?

Задав себе эти два риторических вопроса, я полез в Интернет искать, кто уже написал синхронизацию времени модуля часов с компьютером. И, как известно, кто ищет – тот всегда находит. Нашёлся вариант с Instructables. В теории всё просто: обычный «батник» парсит текущее полное время, полученное «первым» способом (потому что кроме самого времени нужна ещё и дата), увеличивает время на 2 секунды, и «гоняет» пустой цикл до момента, когда настанет это новое, «плюс_две_секундное», время, чтобы «вышвырнуть» данные в COM порт. Причём «новое плюс_две_секундное» время отслеживается другим способом (через %time%, если кому интересно). Но о «косяках» такого решения позже. Данные, «вышвырнутые» в COM порт, Arduino парсит и после этого устанавливает время в модуле. Вроде всё просто, логично и удобно. Но есть очень нехорошее слово «НО». Всё это писал вроде бы немец, и региональные стандарты в Windows у него отличаются от «наших», а в частности, дробная часть отделяется точкой, а не запятой. При запуске с отечественными региональными стандартами «батник» не работает, потому что в нём время выхода из пустого цикла описывается условием сравнения с XX:XX:XX.xxx. Ну так надо вместо точки поставить запятую – и всё, «я всё починил». А вот и не всё (можете проверить, кто ещё помнит, что за такое зло – программировать в «батниках»). Нужно исправлять «батник» более серьёзно. И я его исправил, используя «маты-перематы» и «мануалку» для DOS. «Батник» исправил, но скетч всё равно не работал – время не устанавливалось. То есть данные в порт слались, Arduino их видел, но «что-то пошло не так».

Давайте взглянем, что шлёт «батник» в Arduino и в каком формате (справочно).

case 83:   //S = second
case 68:   //D = Minute  (Daghigheh in Persian)
case 72:   //H = Hour
case 84:   //T = Day Of Month (Tag in German)
case 77:   /// M = Month
case 74:   /// J = Year (Jahr in German)

Данные шлются в формате S**~D**~H**~T*~M**~J****~, где ~ — 2 байта перевода каретки. Итого, 31 байт. Вроде немного, пришлются данные быстро.

Однако есть и неудобство – как видим, не шлётся день недели. Только день месяца. Для реализации часов с будильниками, зависящими от дней недели, будет «косяк». День недели придётся выставлять «ручками» в скетче, что опять намекает на некоторую «одноразовость» скетча, его неполноценность.

Складывая факторы – неполноценность скетча «с завода», его отказ нормально работать, необходимость исправления «батника» для «наших» широт – я решил разрабатывать всё свое. А раз так, то я могу устранять недостатки и оптимизировать формат данных.

Software и hardware.

Для того, чтобы всё заработало, нужны 2 составляющие: программа для Windows и аппаратно-программная связка Arduino.

Сначала общие данные по протоколу обмена. Коль скоро я стал волен выбирать формат данных для пересылки, я решил, что пересылка 31 байта информации не рациональна, и сократил передаваемые данные до 4 байт. И что, хватило? Что можно поместить в 4 байта? Да, хватило. Поместилось все, что надо. Уверен, многие догадались, что это за 4 байта. Кто не догадался – процитирую фрагмент статьи из Википедии:

UNIX-время (POSIX-время) — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг).
UNIX-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты для удобства восприятия человеком. Современное UNIX-время согласуется с UTC — отсчет происходит в секундах СИ.


Итак, целое число, хранящее UNIX время, занимает 4 байта, чего хватит до 2 147 483 648 секунд. А потом возможны потенциальные проблемы. Почему потенциальные? Потому что это порог, при достижении которого число может быть интерпретировано, как отрицательное (что и произошло с айфонами многих любопытных товарищей в своё время). Может, но не обязательно будет – зависит от того, растут ли руки программистов из места, предусмотренного природой. Указанное число секунд соответствует 03:14:08 19-янв-2038. До этого времени можно неспешно переходить на 64-битную версию ОС, где время станет храниться в 8-байтной переменной, чего без проблем хватит на следующие 292 миллиарда лет. Существует вероятность, что на наш век этого хватит. А потом придётся обновляться до 128-битной версии UNIX.

Какие проблемы я решил, придя к такому варианту? Первое, сильно снизил количество передаваемых байт, что на миллисекунды увеличивает точность установки времени. Здорово, правда? И второе: я (вероятно) облегчил совместимость с Linux. К моему стыду, я никак не могу привыкнуть к Linux, и пользуюсь в основном только Windows. Для этой самой Windows я могу написать программу пересылки, а для Linux – нет. Но полагаю, что в Linux можно получить значение UNIX-времени намного легче, чем в Windows, и переслать это число в COM порт.

Никаких дополнительных данных, вроде дня недели и так далее, передавать не требуется. Только UNIX время. Всё остальное делается в Arduino.

Теперь немного конкретики непосредственно о первой составляющей – программе для Windows. Программа написана в старой-доброй Delphi. При запуске всплывающее окно просит выбрать COM порт для отправки данных. Выбираем. Остальные настройки следует оставить «дефолтными».

Как работает программа? Она пересчитывает из формата времени Windows данные для формата UNIX, то есть число секунд с полуночи 1 января 1970 года. Затем добавляет 3 секунды и «впадает» в пустой цикл (очевидно, длительностью уже менее тех самых добавочных 3 секунд), выход из которого происходит в нужное количество секунд, как можно ближе к 000 миллисекундам. Иначе говоря, отслеживается наступление самого начала той секунды времени, значение которого должно будет переслаться в Arduino. Согласитесь, пересылать данные о том, что, например, сейчас XXXXXXXXX5 секунд тогда, когда на самом деле уже, например, XXXXXXXXX5 и 756 тысячных (например) секунд, было бы не правильным. Именно для этого нужно отслеживать самое начало секунды для старта передачи данных. После передачи данных программа дружелюбно сообщает статус «Done :)». На этом миссия программы завершается.


Вторая составляющая – аппаратно-программная часть – Arduino. Существует 2 разновидности «железа» для этого проекта: «полная» версия с экраном и кнопкой, и «урезанная» версия для быстрой установки времени модуля, собранная из «г**на и палок». Про их отличия – ниже. «Полная» версия состоит из Arduino Nano, экрана 1602 с «переходником» с I2C в экран, опциональной кнопкой ресета Arduino и пин-хедера(female) для подключения модуля часов. Также, опционально, из корпуса девайса с «няшной» наклейкой. «Урезанная» версия состоит из Arduino (Uno, Nano, Pro Mini + «правильный» переходник на USB с DTR) и 4 проводов для подключения модуля часов.


Как видно из схем, «полная» версия, в дополнение к «урезанной», содержит кнопку для reset'а и экран 1602 с «переходником». Обе версии абсолютно одинаковы по основному функционалу – устанавливать время. Экран нужен лишь для отображения этапов процесса и, по окончании процесса установки времени, отображения свежеустановленных времени, даты и дня недели. Причём данные к тому времени будут уже считываться из самого модуля часов. В «урезанной» версии роль экрана выполняет встроенный в плату Arduino светодиод: по окончании процесса установки нового времени он начнет светиться. Вот и вся индикация.

Для чего же кнопка ресет? Для того, что в полной версии после установки времени Arduino войдёт в бесконечный цикл по отображению того самого свежеустановленного времени, то есть, по сути, станет часами. Причём часами, сделанными на скорую руку, в связи с чем они не смогут заменить нормальные часы в силу нескольких причин (выборка секунд реализована через delay, пропадёт отображение времени при отключении питания). Ведь цель – убедиться, что время синхронизировано верно, не более того. Следовательно, для синхронизации следующего модуля часов без ресета не обойтись (точнее, можно обойтись, если «передёрнуть» USB кабель). Другими словами, назначение кнопки – сугубо утилитарное. При желании, можно обойтись и без неё.

Как же прошивать Arduino, ведь версии «железа» две, а скетч один? Для компиляции «правильной» версии прошивки в заголовке скетча нужно установить желаемое значение параметра fullVersion: true для «полной» версии, или false — для «урезанной». Компилятор таким образом определит, для какой версии «железа» компилировать прошивку.

Итак, схема подключения есть, нужен код скетча. Обратите внимание, что для нормальной работы скетча с «полной» версией нужна библиотека LiquidCrystal I2C by Frank de Brabander (устанавливается из репозитория при помощи Менеджера Библиотек). Также нужна библиотека для поддержки модуля часов, причём не любая :). Качать здесь: https://github.com/jarzebski/Arduino-DS3231. С библиотеками разобрались.

Вот код скетча:

//======================================== настройка, доступная для изменения ========================================

#define fullVersion true    //true = "полная" версия с экраном;  false = "урезанная" версия со встроенным светодиодом

//================================= используемые библиотеки и объявление переменных ==================================

#include <Wire.h>
#include <DS3231.h>

#if (fullVersion)
  #include <LiquidCrystal_I2C.h>
#endif

unsigned long t1 = 0;   //переменная для полученного времени
unsigned long t2 = 0;   //переменная для полученного времени
byte b[4];              //буфер для получения данных из COM порта

#if (fullVersion)
  byte day = 0;
#endif

DS3231 clock;
RTCDateTime dat1;

#if (fullVersion)
  LiquidCrystal_I2C lcd(0x3F,16,2); //китайси полюбили новый адрес для "переходников" с i2c в экран
#endif

//====================================================================================================================

void setup(){
  #if (!fullVersion)        //актуально только для "урезанной" версии - начало участка кода
    pinMode(13, OUTPUT);
    digitalWrite(13,LOW);
  #endif                    //актуально только для "урезанной" версии - конец участка кода

  clock.begin();
  Serial.begin(9600);

  #if (fullVersion)         //актуально только для "полной" версии - начало участка кода
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("COMport 9600 8N1");  //подсказка, какие параметры COM порта выбирать в программе
    lcd.setCursor(0,1);
    lcd.print("Ready to sync");     //сообщение статуса - готовы к синхронизации
    delay(1000);
  #endif                    //актуально только для "полной" версии - конец участка кода
}

void loop(){
  if (Serial.available()){  //если есть "порох в пороховницах" COM порта
    Serial.readBytes(b,4);  //считаем все 4 байта (другого мы и не ждём)

    t1=b[0];
    t2=(t1<<24);            //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево
    t1=b[1];
    t2+=(t1<<16);           //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево
    t1=b[2];
    t2+=(t1<<8);            //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево
    t2+=b[3];               //поместить значение байта в 4-байтную переменную

    clock.setDateTime(t2);  //установить полученное время на DS3231

    #if (fullVersion)       //актуально только для "полной" версии - начало участка кода
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Done:)    :  :");

      while (true){         //начало бесконечного цикла по отображению свежеустановленных времени и даты

        dat1 = clock.getDateTime();

        if (dat1.day != day){
          day = dat1.day;
          lcd.setCursor(0,1);
          if (dat1.day < 10) lcd.print("0");
          lcd.print(day);
          lcd.print("-");

          switch (dat1.month){  //выбираем буквенное соответствие месяца по цифре
            case 1:{
              lcd.print("Jan");
              break;
            }
            case 2:{
              lcd.print("Feb");
              break;
            }
            case 3:{
              lcd.print("Mar");
              break;
            }
            case 4:{
              lcd.print("Apr");
              break;
            }
            case 5:{
              lcd.print("May");
              break;
            }
            case 6:{
              lcd.print("Jun");
              break;
            }
            case 7:{
              lcd.print("Jul");
              break;
            }
            case 8:{
              lcd.print("Aug");
              break;
            }
            case 9:{
              lcd.print("Sep");
              break;
            }
            case 10:{
              lcd.print("Oct");
              break;
            }
            case 11:{
              lcd.print("Nov");
              break;
            }
            case 12:{
              lcd.print("Dec");
              break;
            }
            default:{
              lcd.print("???");
              break;
            }
          }//switch month

          lcd.print("-");
          lcd.print(dat1.year);
          lcd.print(" ");

          switch(dat1.dayOfWeek){   //выбираем буквенное соответствие дня недели по цифре
            case 1:{
              lcd.print("Mon");
              break;
            }
            case 2:{
              lcd.print("Tue");
              break;
            }
            case 3:{
              lcd.print("Wed");
              break;
            }
            case 4:{
              lcd.print("Thu");
              break;
            }
            case 5:{
              lcd.print("Fri");
              break;
            }
            case 6:{
              lcd.print("Sat");
              break;
            }
            case 7:{
              lcd.print("Sun");
              break;
            }
            default:{
              lcd.print("???");
              break;
            }
          }//switch dayOfWeek
        }//if date changed

        lcd.setCursor(8,0);
        if (dat1.hour < 10) lcd.print("0");
        lcd.print(dat1.hour);

        lcd.setCursor(11,0);
        if (dat1.minute < 10) lcd.print("0");
        lcd.print(dat1.minute);

        lcd.setCursor(14,0);
        if (dat1.second < 10) lcd.print("0");
        lcd.print(dat1.second);

        delay(995);
      }//while
    #else                       //актуально только для "урезанной" версии - начало участка кода
      digitalWrite(13, HIGH);
      delay(3000);
      digitalWrite(13, LOW);
    #endif                      //актуально только для "полной" версии - конец участка кода
  }//if Serial
}//loop

Пара фото «полной» версии готового девайса.


Ну и, наконец, видео работы девайса «в бою»:


Где скачать скетч и программу?

Скетч качать здесь (Dropbox).
Программу для Windows качать здесь (Dropbox).

«Плюсы» и «минусы».

Сформулировать «плюсы» и «минусы» в данном случае тяжело. Следовательно, каждый решает для себя сам, что – хорошо, а что – плохо.


Итого.

Мне очень понравилось, как теперь устанавливается время в модулях! При необходимости установить время мне не приходится вспоминать каждый раз, какой же там скетч мне нужен и задумываться, насколько точно будет установлено время в модуле. Более того, скоро будет обзор самодельных часов, куда я встроил такой метод синхронизации – настолько метод мне понравился. Надеюсь, кому-то из читателей метод также придётся кстати.

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

Всем добра.
+
avatar
  • sshiva
  • 01 февраля 2017, 08:47
+8
Не очень полезно, но качественно и грамотно :)
+
avatar
+1
обалдеть, сколько материала изучено и любезно вывалено по такой казалось бы простой задаче — выставить часам верное время.

Я ограничился подключением дисплея параллельно часам + 3 кнопки чтобы выставить время ручками. когда допривинчиваю WiFi, время будет само синхронизирвоаться с каким нить сервером, ну а пока кнопки.
+
avatar
+14
Ставим модуль esp8266 подключаем к нему модуль часов, есп устанавливает время интернета в модуль часов. Бинго))

Можно просто прибор собрать на есп, тогда он сам будет синхронизиррватся если есть wifi.
+
avatar
0
где бы поучиться работе с этим модулем? Если с ардуинкой ещё кое как работается и инфы структурированной много от начального уровня до более менее сложных проектов, то на ЕСП я вижу только уже сложное. может подскажете чего?
+
avatar
+4
wifi-iot.com

Конструктор прошивок на esp8266

С простыми модулями бесплатный, с эксклюзивными экранами 100р. но это того стоит.

тут были обзоры esp8266 с прошивками и пошаговой инструкцией главное залить первую прошивку. остальные заливаются по wifi))
+
avatar
0
ооо, класс. у них теперь поддерживаются модули nrf24l01, супер! Спасибо.
+
avatar
  • Vipeg
  • 10 февраля 2017, 08:36
0
wifi-iot.com
Ознакомился с указанным сайтом. Что ж, хорошо, что люди развиваются, но:
1) Не люблю программирование «мышкой» вместо клавиатуры
2) В основном всё — коммерческое. Бесплатно — только «игрушки» для «побаловаться».
3) В контексте модуля для синхронизации часов — не мой вариант однозначно. И вот почему.
Для начала давайте согласимся, что сам по себе модуль часов — вещь не самодостаточная. В любом случае это «кирпичик» чего-то большего — своего проекта, например. И тут возможны 2 варианта: либо этот самый новый проект будет тоже «напрограммирован мышкой за деньги», либо код будет написан самостоятельно. Если самостоятельно, то использовать промежуточным этапом «чужую» платформу (разово, ибо всё более или менее стоящее — платное) — нерационально, лучше самостоятельно попытаться решить проблему, в результате получив новые опыт и знания. Более того, будучи программистом, мне хочется самому писать код, а не программировать, ставя галки в чужом коде. Суть именно в самостоятельной разработке алгоритма и написании кода. Думаю, это тяжело понять тем, кто не сидит над кодом днями, не «загружает» мозг до состояния, когда к концу дня чувствуешь себя овощем, не старается написать действительно качественный код. И тем, кто не получает громадное удовольствие, когда код закончен, цель достигнута и работает прекрасно. И в итоге поделиться идеей и её реализацией в коде со всеми, кому это может пригодиться. Бесплатно. «Накликать» прошивку и разработать её — это как разные миры. Я однозначно только за второе, если есть такой вариант.
+
avatar
  • Angrim
  • 01 февраля 2017, 09:40
+3
Под esp8266 есть ардуино ide, раз уж так нравится ардуино, esp8266.ru там все есть. Рабоется с ними как с теми же ардуино в той же оболочке
+
avatar
0
спасибо!
+
avatar
  • sav13
  • 01 февраля 2017, 12:14
0
Ну так и работаете через Arduino IDE с ESP.
Половина библиотек работает без проблем. Другая потихоньку портируется.
+
avatar
  • Reaper5
  • 01 февраля 2017, 12:46
0
Если взять модуль и прошить nodemcu, то, кажется, даже на C не надо программировать, для синхронизации по NTP и операций с DS3231 там модули для LUA есть. Залить в модуль скрипт — и готово.
Если хотите, могу вечером проверить.
+
avatar
  • Sprite
  • 01 февраля 2017, 09:40
0
Можно поподробнее?
+
avatar
  • Sanja
  • 01 февраля 2017, 18:01
0
+
avatar
  • Sprite
  • 01 февраля 2017, 19:47
0
Благодарю.
+
avatar
0
Кажется пародоксальным, но пример есть в стандартных примерах а ардуиноиде(при установке пакетов есп).
+
avatar
  • Sprite
  • 02 февраля 2017, 13:18
0
Вы правы, даже не подумал туда посмотреть. Поскольку думал, что библиотеки не подключал, а значит и примеров нет.
+
avatar
  • jenya
  • 01 февраля 2017, 08:56
+5
date '+%s' >/dev/ttyS0 (ну или какой там номер порта )
+
avatar
  • sir0ta
  • 01 февраля 2017, 09:26
+3
Скетчки выкладывать надо на гитхабе и иже с ними. С дропбокса завтра 100 человек скачают (а то и меньше на фришном ТП) и заблокируют файл…
+
avatar
  • iDDD
  • 01 февраля 2017, 09:28
+29
Помнится, в какой-то советской еще книжке для юных радиолюбителей, за тысяча девятьсот восемьдесят лохматый год, попадалась схема электронных часов (что по тем временам уже само по себе было уровнем, скажем так, выше среднего) с синхронизацией (!) по сигналам точного времени радиостанции «Маяк».

Ежедневно, незадолго до 12 часов дня схема включала приемник и слушала эфир. Конструкцией из монструозных RC-фильтров и логических счетчиков, собранных едва ли не на реле и лампах, выделяла «начало шестого сигнала соответствует 12ти часам московского времени», по которому и корректировала часы.

Тогда это казалось вершиной прогресса и творческой мысли, в целом решение весьма изящное и привлекательное своей автономностью. И я, будучи школотой, у которой элементная база состояла лишь из того, что удавалось выпаять из притащенного с помойки хлама, взирал на нее с благоговением и мечтал, что когда стану взрослым дяденькой, всенепременно соберу такие часы. Сейчас попробовал загуглить ту схему, а поисковик выдал современный аналог из микроконтроллера и пары резисторов — скукота, тоска и увеличение тлена, где мои теплые ламповые лампы и МП42, я вас спрашиваю? Да и если у тебя в детстве не было велосипеда, а сейчас есть порш, то все равно у тебя в детстве не было велосипеда.

К чему все это, да просто минутки ностальгии камент. Передаю радиолюбительский привет всем пионерам, чье детство прошло под запах канифоли)
+
avatar
  • Dimon_
  • 01 февраля 2017, 09:36
+5
и МП42
Так ведь МП26Б же, они были распространённее :). И МП37, без npn никуда.
А у 42-х спиливали шляпку, чтобы получить фототранзистор :)
+
avatar
  • gaudin2
  • 01 февраля 2017, 14:51
0
Тоже спиливал шляпку, правда чувствительность была не очень только на фонарик реагировала.
+
avatar
  • kalobyte
  • 01 февраля 2017, 09:39
0
теперь у тебя есть шанс собрать супергетеродин на 75кгц для приема цифрового сигнала точного времени
приемник прямого усиления работает только в пределах германии и то не всегда
+
avatar
  • ABATAPA
  • 01 февраля 2017, 09:41
0
Даже сейчас есть часы (в том числе и наручные), синхронизирующиеся по DCF77. Даже тут обзоры были, ищутся поиском.
+
avatar
  • Vipeg
  • 01 февраля 2017, 10:12
+4
Да и если у тебя в детстве не было велосипеда, а сейчас есть порш, то все равно у тебя в детстве не было велосипеда.
Прекрасно сформулировано. Пожалуй, запишу это выражение где-нибудь на память :)
+
avatar
  • iDDD
  • 01 февраля 2017, 10:53
+2
Это не мое, достаточно известный мем)
+
avatar
+2
У меня в детстве небыло велосипеда, да и сейчас нет(
+
avatar
  • Bloop
  • 01 февраля 2017, 13:39
+1
Зато у Вас есть уникальный опыт — стоять ногами сразу в двух эпохах: первобытной, с её электронными лампами, резонансными реле и шаговыми искателями, и в эпохе начала техногенной цивилизации с её микросхемами, цифровыми технологиями и искусственным интеллектом!
+
avatar
  • iDDD
  • 01 февраля 2017, 14:40
0
Это да, прогресс дал вещи, о которых всего лишь 20-30 лет назад мы могли только мечтать. В удивительное время живем.
+
avatar
0
Я просто напомню, что транзистор изобрели в 1953 году, а атомную бомбу в 1945. А уже в 1957 году запустили спутник. Вот это были прорывы, а не то что сейчас.
+
avatar
  • sim31r
  • 02 февраля 2017, 14:52
+1
Эти открытия были очень далеки от людей. А сейчас новый процессор в разы быстрее предыдущего в продаже в течение года после исследований. Запустили спутник и тут же доступны сотни спутниковых каналов.

Это скорее мы избаловались, и вошли в перенасыщение, уже ни чем не удивить. Открытия делаются, но они столь сложны, что большинству непонятны и специфичны. Пример искуственная живая ДНК из нестандартных оснований, это раньше было ненаучной фантастикой. Снимки Плутона в HD качестве. БАК и бозон Хигса…

Спутник первый тоже не сразу был сделан, методичная работа начиная с немецких ФАУ. К атомной бомбе еще супруги Кюри шли косвенно.
+
avatar
0
И все же не согласен. Из последних прорывов только генетика, но и ее изучали активно последние лет 50. Ну еще Интернет сильно повлиял на общество. А вот значение изобретения транзистора и лазера очень трудно переоценить. Это две технологии на которых стоит вся современная промышленность. Когда меняешь один смартфон на другой, то ощущения уже не те что были при замене ЧБ телевизора на цветной.
+
avatar
  • sim31r
  • 02 февраля 2017, 21:14
+1
Когда меняешь один смартфон на другой, то ощущения уже не те
Ощущения не имеют особого отношения к реальности, раньше всё было лучше :)

+
avatar
  • Bloop
  • 03 февраля 2017, 10:06
+1
И тем не менее, прогресс был очень вялым. Достаточно сказать, аж в начале девяностых, я еще всерьез изучал ремонт телевизоров, в которых единственными полупроводниковыми элементами были выпрямительные диоды блока питания!
+
avatar
  • SerjNSK
  • 01 февраля 2017, 17:11
+1
Держите ссылку. Думаю это то что вы искали.
+
avatar
  • iDDD
  • 01 февраля 2017, 17:15
0
Да, похоже оно, спасибо.

Собирать эту схему я, конечно же, не буду)
+
avatar
  • Dimon_
  • 01 февраля 2017, 17:35
+1
Самое жуткое в этой схеме — это узел подсчёта шестого импульса.
Нет, не на триггерах. И не на счётчиках, нет.
Ужас и жуть заключается в том, что это реализовано на накопительных ёмкостях.
Детектированные и отфильтрованные импульсы последовательно заряжают ёмкости, и шестой дозарядит до нужного порога.
Мне было непонятно — зачем так? Ведь всё остальное в часах реализовано уже на дискретной логике 155-й серии. Это же всё равно, что заниматься любовью в гамаке стоя! Электролитические ёмкости — вещь далеко непостоянная во времени.
+
avatar
  • Oregu
  • 01 февраля 2017, 17:55
0
Там еще нюанс вроде был — 5 сигналов частотой 1 кГц шли с длительностью 0,1с и паузой 0,9с, а длительность шестого сигнала была различной в зависимости от времени, вроде как 100 мс и плюс по 20 мс на каждый час текущего времени.
+
avatar
  • iDDD
  • 02 февраля 2017, 14:13
0
Судя по всему, автор не мог в дискретную схемотехнику, поэтому схему часов просто взял из журнала, ну а модуль синхронизации лепил уже по своему разумению из привычной аналоговой компонентной базы.
+
avatar
0
Да он там прямо пишет, что сначала часы собирал по чужой схеме, а синхронизатор прикрутил позже.
+
avatar
  • Dimon_
  • 01 февраля 2017, 09:33
+11
между модулем часов и компьютером – чуть ли не единственным способом выставить время более или менее точно.
Мягко говоря, это не очень так :)
Уже проектах в пяти я реализовал для себя простой и действенный способ: я забираю время с GPS. Точность такого времени значительно выше, чем точность NTP. Дешёвейший модуль с Али ловит спутниковое время даже в центре панельного дома в глухих бетонных городских дебрях. Ардуиной разбираю символьный поток, оцениваю ошибку и, если она меньше заданного порога, синхронизирую время. Полная автономность и независимость от компьютера. И от скачков и провалов питания, кстати.

что самое важное в любых часах? Разумеется, это точность хода.
Помнится, меня на этом ресурсе как-то люто заминусовали за это утверждение в одном из многотысячных обзоров наручных часов :)
Мне доказывали, что сейчас, йоу, часы — это чисса модный аксессуар, что их главная функция — имиджевость и стильность, а время для наручных часов — ващще не главное.
+
avatar
0
Дешёвейший модуль с Али
«Дешевейший» — это насколько? Дешевле десятки не вижу, может плохо ищу? ESP8266 стоит пару баксов, если что.
И можно узнать, какой именно у вас видит сигнал в глубине квартиры? Брал поиграться какой-то UBLOX, он лочил спутники только на подоконнике.
+
avatar
  • akaivp
  • 01 февраля 2017, 11:53
+1
+
avatar
  • Dimon_
  • 01 февраля 2017, 13:04
+1
И можно узнать, какой именно у вас видит сигнал в глубине квартиры?
У меня под это дело всегда покупаются GY-NEO6MV2. В разное время у разных продавцов, но проблем не было ни с одним модулем.
Да, и хочу подчеркнуть, я написал «ловят спутниковое время» в глубине квартиры. Это не значит, что ловит достаточное количество спутников для навигации. Хотя, на удивление, эти модули ловят и спутники в глубине квартиры. Я был удивлён, когда, играясь с этим модулем и просто параллельно в терминал отправив символьный поток, принимаемый с приёмника, минут через 15-20 после подачи напряжения вдруг обнаружил, что модуль увидел достаточное количество спутников, чтобы определить свои координаты.
+
avatar
  • sav13
  • 01 февраля 2017, 12:17
0
Точность такого времени значительно выше, чем точность NTP
Если учесть, что типовой GPS приемник плюет в порт информацию 1 раз в секунду, то точность явно будет пониже, чем при хорошем интернете.
+
avatar
  • Dimon_
  • 01 февраля 2017, 12:51
0
Именно поэтому в символьном потоке ещё есть и такая штука, как величина старости данных, (GPSage, по-моему). Мы получаем не только данные, но и их актуальность. И для точной синхронизации надо анализировать, тут уже вопросы исключительно к алгоритму обработки (апоксимации, скорее всего) этих данных. Я, например, принимаю к синхронизации часов только такие данные, которые не тухлее нужного мне порога. Точность времени из GPS — это точность вычислений: каждый ведь выбирает баланс между желаемой точностью и затрачиваемыми на это ресурсами.
+
avatar
  • sav13
  • 01 февраля 2017, 13:04
+1
Как это влияет на точность считывания данных с медленного UART?
Что, эта точность будет меняться, пока данные ожидают считывания в буфере порта?
У NTP тоже корректировка есть на задержку пакетов. Миллисикунд можно добиться, микросекунд нет. Главный плюс GPS — независимость от интернета. Минус — плохой прием спутников в помещении.
+
avatar
  • Bloop
  • 01 февраля 2017, 13:46
+1
У модулей GPS часто есть выход высокоточного 1-секундного тика. Взяв его и повесив на прерывание в целевом устройстве, можно впредь не беспокоиться о запаздываниях информации, идущей через UART.
+
avatar
  • Dimon_
  • 01 февраля 2017, 14:19
0
Спасибо. Действительно полезно.
+
avatar
  • klop
  • 01 февраля 2017, 09:34
+2
Тоже раньше так делал, когда впервые познакомился с RTC на DS3107. Жутко неудобно. Теперь просто сделал часы (4x-разрядный индикатор + 8 резисторов (60 руб), arduino mini (100 руб), IR датчик (4 руб) и DS3231(31 руб)), написал скетч и выставляю время с IR пульта. Кроме того ввел автовычисление погрешности по 2-м замерам и получил мегаточность (причем коррекция времени ежесекундная). Теоретическая точность 1 сек в 68 лет (практическая зависит от интервала между замерами, стабильности кварца и жизни батарейки). Кстати, в моих часах можно использовать и древний DS3107 (лишь бы тот врал стабильно) примерно с таким же результатом.
+
avatar
  • mooni73
  • 01 февраля 2017, 11:25
+1
А ведь самое то!
+
avatar
0
А можно про автовычисление погрешности поподробнее? Или где почитать?
+
avatar
  • klop
  • 01 февраля 2017, 15:19
+1
У меня этот механизм работает так: Есть дата-время T1 предыдущей корректировки (хранится в EEPROM). Когда проводим очередную коррекцию Т2 — вычисляем сколько сек прошло со времени T1 и делим на кол-во секунд, на которые подводим часы. Получаем кол-во секунд, через которое надо скорректировать выводимое время на 1 сек ТС. Запоминаем в EEPROM и ТС и Т2 (которое при следующей корректировке станет Т1), При нормальной работе каждую секунду высчитывается кол-во секунд со времени корректировки и делится на ТС. Получаем — на сколько сек сдвинуть время для отображения.
В жизни это выглядит так: видим, что часы ошибаются на сколько-то сек и просто снова выставляем точное время по эталонным часам. Все остальное делается автоматом и часы идут гораздо точнее.
+
avatar
  • Varicap
  • 01 февраля 2017, 11:19
+1
Vipeg:
Какими бы многофункциональными и эстетичными не были любые часы, они – барахло, если идут неточно.


sir0ta:
Скетчки выкладывать надо на гитхабе и иже с ними.
Для тех, кто не успел:
скачать в одном архиве
+
avatar
-1
Такие же часы работают полгода. Расхождение 20 секунд. Сам такого не ждал. Правда в комнате. Температура 22 — 25.
+
avatar
  • Moguchev
  • 01 февраля 2017, 11:44
0
а можно код для «урезанной» версии отдельно? пасиб.
+
avatar
  • Vipeg
  • 01 февраля 2017, 11:58
+1
Скомпилируется именно урезанный код, если выберите
#define fullVersion false

Или Вам для только для «эстетики» исходного кода?
+
avatar
  • Moguchev
  • 01 февраля 2017, 12:43
0
а такие куски? или я что-то путаю?

#if (!fullVersion)        //актуально только для "урезанной" версии - начало участка кода
+
avatar
  • Vipeg
  • 01 февраля 2017, 13:01
+1
В отличие от простого «if», условия которого проверяются по ходу кода, #if проверяется компилятором, и все «куски», что не подходят, не добавляются в код. Это условное компилирование.
Другими словами, если «выпилить» все упоминания «полной» версии, оставив только «урезанную», и скомпилировать, код и размер скомпилированной прошивки будет абсолютно такой же, как при выставлении #define fullVersion false.
Попробуйте скомпилировать с «fullVersion false» и «fullVersion true», и посмотрите на размер скомпилированных прошивок.

+
avatar
  • Moguchev
  • 01 февраля 2017, 13:06
0
Спасибо за инфу, может статейка есть какая, где можно про это почитать подробнее?
+
avatar
  • Vipeg
  • 01 февраля 2017, 13:22
0
Вкратце могу описать, как это работает.
Всё, что начинается с # — данные для компилятора.
Первое, что я сделал, это сопоставил fullVersion значению false. То есть компилятор сам «расставит» везде вместо слова fullVersion слово false, если так можно выразиться.

Далее, есть конструкции:
#if одно_условие
  //что делать при этом условии
#endif

и
#if одно_условие
  //что делать при этом условии
#else
  //что делать, если условие не соблюдено
#endif

Это самые общеупотребительные конструкции. Поскольку они тоже начинаются с #, они — для компилятора. Это позволяет убирать неподходящие_для_указанного_случая_куски из кода на этапе компиляции.
+
avatar
  • Reaper5
  • 01 февраля 2017, 13:23
0
А что там подробничать? Ищете что понравится по запросу «C условная компиляция»
Например, вот
+
avatar
  • wd40
  • 01 февраля 2017, 12:03
0
"… переходить на 64-битную версию ОС", «придётся обновляться до 128-битной версии UNIX».
К слову, разрядность хранения времени к разрядности ОС никакого отношения не имеет. =)
+
avatar
  • Vipeg
  • 01 февраля 2017, 13:12
0
К сожалению, я не являюсь юниксоидом, ввиду чего мне сложно подтвердить или опровергнуть это утверждение. Я воспользовался общедоступным источником информации и, как мне кажется, не без оснований предположил, что 64-битные переменные вполне свойственны для 64-битных систем. Не исключаю, что они доступны и в 32-битный системах. Выражение про 128 бит систему содержит некоторое количество иронии :)
Но спасибо за замечание.
+
avatar
0
А для модуля ds1307 возможность повторить такое же? Было бы полный охват синхронизации часов для радиолюбителей.
+
avatar
  • sav13
  • 01 февраля 2017, 12:19
0
DS1307 совместим по I2C командам с DS3231. Только точность этого модуля оставляет желать лучшего
+
avatar
+1
А вроде на этом модуле еще память установлена, для часов-то она ведь не нужна?
Лучше взять тогда такое

Ибо в разы компактней.
+
avatar
  • akaivp
  • 01 февраля 2017, 12:33
0
Ваш дороже. Обозреваемый обычно по $0.46 продается, сейчас только что-то цены поднялись.
+
avatar
0
Ну он и компактней, а обозреваемый дешевле 0.7 не нашел :(
+
avatar
  • akaivp
  • 01 февраля 2017, 13:13
0
Я думаю, что после праздников цены опять вернуться.
+
avatar
-6
+
avatar
  • Pakos
  • 01 февраля 2017, 13:12
0
у меня кстати только в СЗАО часы нормально синкаются, ито только в одном месте. Забил на германию, поставил апп на телефон.
+
avatar
  • Aostspb
  • 01 февраля 2017, 15:03
0
Во-первых, зависит от места, где Вы живете: в Сибири — не факт, что будет работать. Во-вторых, надо учитывать, что в Германии первая таймзона.
+
avatar
  • m13ale
  • 01 февраля 2017, 13:35
0
Неее, лишнее это. Вполне хватает — дату/время грубо выставлять типовым скетчем, а секунды обнулять подключенной к ардуине тактовой кнопкой по сигналу точного времени. Делать это 1-2 раза в год — не проблема.
+
avatar
  • SEM
  • 01 февраля 2017, 15:25
0
Что трудно сделать в bat-нике — то м.б. проще в vbs…
+
avatar
  • X7Desu
  • 01 февраля 2017, 18:11
0
Бессмысленное безумие какое-то.

1) Есть NTP. Серьезно.

2) DS3231 не тянет на взрослый frequency reference.

3) DS3231 не получает поправку. Ручная установка? Хех.
Даже специально обученные задроты не могут нажать кнопку с точностью выше сотни (!) мс. aim400kg.com/pr/top/
Какой толк от точного относительного значения, если нет точного абсолютного?

4) Уж если делать по-хорошему, то надо делать источник времени Stratum-1 хотя бы на GPS модуле и Малинке. Будет честная микросекундная точность.
www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
+
avatar
  • Vipeg
  • 01 февраля 2017, 19:28
0
Приятно услышать мнение уважаемого человека. Пользуясь случаем, хочу выразить Вам признательность за Ваши Nixie-проекты. Впечатляющая вещь. Теперь к делу.
По сути, в данном контексте связку компьютер+Arduino можно рассматривать как «переходник» с NTP на модуль часов :) Если серьёзно, то выше в комментариях товарищ Wap-tolik упомянул, что есть «укороченный» вариант синхронизации часов с NTP. Так esp-шка подключается посредством WiFi к серверу времени и устанавливает время в модулях. Вариант, безусловно интересный и я рад, что поднял эту тему, поскольку в комментариях часто можно найти весьма ценную информацию.
Теперь к точности синхронизации. Я прекрасно отдаю себе отчёт в том, что миллисекундной точности предложенным мною способом добиться не получится. Кратко резюмируя обзор, я хочу сказать следующее. Из доступных способов, имея лишь собранное «на коленке» на «скорую руку» оборудование, это — относительно менее трудозатратный и менее зависящий от человеческого фактора вариант при большей точности установки. Всё мои действия в попытке увеличить точность — это лишь способ не ухудшить по возможности точность установки времени. Другими словами, не делать хуже там, где этого возможно.
+
avatar
  • X7Desu
  • 01 февраля 2017, 20:30
+1
не делать хуже
Но так хуже же. Погрешность NTP через интернет ±5 мс, что недостижимо какой-либо ручной настройкой.
+
avatar
  • klop
  • 01 февраля 2017, 20:17
0
Уж если делать по-хорошему, то надо делать источник времени Stratum-1 хотя бы на GPS модуле и Малинке.
Ну, GPS не далеко не везде и не всегда ловится. Я уж не говорю о возможной искусственной временной погрешности GPS (как было во время войны в заливе). Так что ваш вариант не всем подойдет.
Будет честная микросекундная точность.
Микросекундная точность, т.е. 1 микросекунда в секунду это 2.5 секунды в месяц. Ее обеспечивают обычные бытовые часы. Мой вариант, описанный выше, обеспечивает точность, на порядки выше, хотя время и выставляется пальцем с точностью, в пределах 1 секунды.
+
avatar
  • X7Desu
  • 01 февраля 2017, 20:39
0
Ну, GPS не далеко не везде и не всегда ловится.
Не могу представить жилья, где GPS не ловится хоть где-нибудь. Даже из ядерного бункера можно выкинуть антенну наружу. Не нравится GPS — можно использовать любую другую GNSS.
Микросекундная точность, т.е. 1 микросекунда в секунду это 2.5 секунды в месяц.
Микросекундная точность это ± n мкс дрифт от Stratum 0. Точнее могут быть только личные атомные часы.
Никакого накопления погрешности нет и быть не может, ибо относительные величины тут вообще не используются.
Мой вариант, описанный выше, обеспечивает точность, на порядки выше
Не обеспечивает.
+
avatar
  • klop
  • 01 февраля 2017, 21:00
0
Не могу представить жилья, где GPS не ловится хоть где-нибудь
С воображением проблемы? Спросите об этом, к примеру, подводников :)
Не обеспечивает.
Мы обсуждаем сабж. Это микросхема RTC, которая выдает время с точностью до секунды (о микросекундах речь не идет). Задача — сделать на нем максимально точные часы. Мой вариант эту задачу решает. А ваш
дрифт от Stratum 0
никакого отношения к теме не имеет.
+
avatar
0
К сожалению, «место где не ловится GPS» — это почти любое помещение.
И вы будете смеяться — я использую DS3231+Arduino как раз для эмуляции времени с GPS. Ну а как иначе? Приема GPS нет, Интернета нет, бюджета на эталонные часы нет — а время синхронизировать надо (ибо регламент времени реакции на события, и само событие фиксируется в «чужом» журнале, а реакция на него — в «местном»; если местные часы спешат — прощай, премия).
+
avatar
  • sim31r
  • 02 февраля 2017, 04:37
0
Файлы в Dropbox, они в марте уничтожат вроде как все публичные ссылки, к сожалению. А удобно было.
+
avatar
  • Vipeg
  • 02 февраля 2017, 08:19
0
Если не секрет, откуда такая информация?
Факт, что на сегодняшний день при шаринге файла автоматически выставляется истечение лимита на «никогда». И нигде никаких официальных «сносок-звёздочек» нет. Где можно прочитать о планах Dropbox и о марте в частности?
+
avatar
  • sim31r
  • 02 февраля 2017, 14:42
0
Рассылка у них была
Hi ser,

We’re always looking to improve the Dropbox sharing experience. The Public folder was the first sharing method we introduced, and since then, we’ve built even better ways for you to share securely and work together with your team.

As a result, we’ll soon be ending support for the Public folder. Dropbox Basic users will be able to use the Public folder until March 15, 2017. After that date the files in your Public folder will become private, and links to these files will be deactivated. Your files will remain safe in Dropbox.

If you’d like to keep sharing files in your Public folder, you can create new shared links. Just make sure to send the new URLs to your collaborators.

In addition to shared links, we have a number of sharing options designed to make collaboration easier and give you more control. To learn more, visit our Help Center.

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

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

Если вы хотите сохранить файлы общего доступа в вашей общей папке, вы можете создать новые общие ссылки. Просто убедитесь, что для отправки новых URL-адресов для ваших сотрудников.

В дополнение к общим ссылкам, у нас есть целый ряд вариантов совместного использования частот, предназначенных для облегчить совместную работу и дать вам больше контроля. Чтобы узнать больше, посетите наш Справочный центр.
+
avatar
  • Vipeg
  • 02 февраля 2017, 15:51
+1
Перевод был ни к чему :), но тоже спасибо.
По сути — вроде бы ничего страшного — просто выпилят вообще все ссылки, которые сразу же после это можно создать заново. Это такой метод чистки у них, как я понимаю. А так как свои обзоры периодически мониторю — без проблем обновлю ссылки.
Спасибо за ценную инфу.
+
avatar
  • Hector
  • 02 февраля 2017, 11:45
0
Klop, не поделитесь своим проектом часов?
+
avatar
  • klop
  • 02 февраля 2017, 19:35
0
Возможно, сделаю обзор. Хочу полгодика потестить сначала. Навесить будильники на mp3-модуле, вставить мое ноу-хау из этого обзора, чтобы обучить любой домашний пульт к этим часам. Еще есть интересная идея. Посмотрим, как со временем будет. Но если вам нужны простые часы с автокоррекцией, пишите в личку. Да, яркость индикатора у них регулируется программно, также с пульта.
+
avatar
  • Harwest
  • 02 февраля 2017, 14:24
+1
Пользую такие модули давно, на RPI / Orange / ESP8266. На первых модуль синхронизируется парой команд
sudo ntpd -gq
sudo hwclock -w

малина сама выполняется расчет девиации и усреднит ошибку
На ESP8266 как тут писали WiFi-IoT — все вообще тривиально.

Но есть еще одна фишка — DS3231 имеет в своем составе магазин переключаемых конденсаторов для подстройки частоты осциллятора, те можно вычислить поправку для конкретного экземпляра чипа и записать в регистры. Точность существенно увеличится.
Плюс к этому есть температурная компенсация: встроенный цифровой термометр (доступный для чтения) управляет переключением этих самых конденсаторов.
+
avatar
  • Hector
  • 02 февраля 2017, 15:35
0
Начальная точность (с завода) DS3231 — никуда не годится, некоторое время еще идет процесс ее «старения». После чего и следует подстраивать ее точность регистрами (для того они и введены в её состав)
+
avatar
-1
Спасибо за обзор!
Себе сделал «синхронизатор» на ардуино + ethernet на w5100. В штатных примерах есть пример работы с ntp, в котором сразу получается unix-время.
+
avatar
  • leelou
  • 05 февраля 2017, 11:02
0
поподробнее можно?..