Синхронизация DS3231 с сервером точного времени

a5021
Offline
Зарегистрирован: 07.07.2013

Возникла потребность выставить часики (модуль) DS3231 поточнее, насколько это возможно. Первое, что приходит на ум -- сдернуть точное время с какого-нибудь NTP-сервера в интернете и залить его в RTC-модуль. В интернетах полно описаний, как это делается, но в этот раз мне категорически не хотелось возиться с ethernet-платами для подключения ардуины (а с помощью него я и расчитывал инициализировать DS3231) к интернету и сочинять громоздкие скетчи. Подумалось, что хорошо бы переложить весь интернет-функционал на более интеллектуальное устройство, а ардуину использовать только в качестве адаптера к I2C интерфейсу часов реального времени.

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

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

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

#!/usr/bin/env perl

open(S, "+>>/dev/ttyUSB0") or die "unable to open serial device\n";

while(<S>) {
  print;  # display received string
  if (/\*\*GET\*\*TIME\*\*/) {            # check for the trigger sequence
    print "Requesting network time...\n";
    system "ntpdate", "pool.ntp.org";     # sync time with NTP-server
    # parse system time
    my($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
    $mon++;   # increment month to match DC3231 calendar representation
    $wday++;  # increment week day to match DC3231 calendar representation
    if ($year > 99) { # change 21-st century date representation
      $mon += 80;     # set DS3231's century bit high
      $year -= 100;   # set year to 00..99 format
    }
    # send clock and calendar data through serial device
    printf S "%02u%02u%02u%02u%02u%02u%02u\n", $sec, $min, $hour, $wday, $mday, $mon, $year;
  }
}

Скетч для ардуины:


#include "Wire.h"
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define     DS3231_I2C_ADDRESS     0x68

// * converts BCD (Binary Coded Decimal) to decimal
unsigned char bcd2dec(unsigned char bcd) {
  return (unsigned char) (bcd & 0x0F) + 10 * ((bcd >> 4) & 0x0F);
}

void USART_Transmit(unsigned char data) {
  /* Wait for empty transmit buffer */
  while (!( UCSR0A & (1<<UDRE0)));
  /* Put data into buffer, sends the data */
  UDR0 = data;
}

unsigned char USART_Receive(void) {
  /* Wait for data to be received */
  while (!(UCSR0A & (1<<RXC0)));
  /* Get and return received data from buffer */
  return UDR0;
}

unsigned char inline hex2dec(unsigned char h) {
  return (h < 'A') ? h - '0' : h - 'A' + 10;
}

void print_str(unsigned char *s) {
  while(*s != 0) {
    USART_Transmit(*s++);
  }
}

void print_num(unsigned long int  c) {
  unsigned long int  d = c;
  unsigned long int  e = 1000000000;

  if (c < 10) USART_Transmit('0');

  while (e > 10 - 1) {
    if (c > e - 1) {
      unsigned char a = c / e;
      USART_Transmit(a + '0');
      c = c - a * e;
    } else if (d > e - 1) {
      USART_Transmit('0');
    }
    e /= 10;
  }
  USART_Transmit(c % 10 + '0');
}

void haltCPU(void) {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  cli();
  sleep_enable();
  sleep_bod_disable();
  sleep_cpu();
}

void setup() {

  // Configure USART to send and receive data
  // at 115200 baud

  UCSR0A = ( // USART Control and Status Register A
    (0 << RXC0)    |  // Receive Complete
    (0 << TXC0)    |  // Transmit Complete
    (0 << UDRE0)   |  // Data Register Empty
    (0 << FE0)     |  // Frame Error
    (0 << DOR0)    |  // Data OverRun
    (0 << UPE0)    |  // Parity Error
    (0 << U2X0)    |  // Double Transmission Speed
    (0 << MPCM0)      // Multi-processor Communication Mode
  );
  
  UCSR0B = ( // USART Control and Status Register B
    (0 << RXCIE0)  |  // RX Complete Interrupt Enable
    (0 << TXCIE0)  |  // TX Complete Interrupt Enable
    (0 << UDRIE0)  |  // Data Register Empty Interrupt Enable
    (1 << RXEN0)   |  // Receiver Enable
    (1 << TXEN0)   |  // Transmitter Enable
    (0 << UCSZ02)  |  // Character Size Bit 2
    (0 << RXB80)   |  // Receive Data Bit 8
    (0 << TXB80)      // Transmit Data Bit 8
  );
  
  UCSR0C = ( // USART Control and Status Register C
    (0 << UMSEL01) |  // USART Mode Select Bit 1
    (0 << UMSEL00) |  // USART Mode Select Bit 0
    (0 << UPM01)   |  // Parity Mode Bit 1
    (0 << UPM00)   |  // Parity Mode Bit 0
    (0 << USBS0)   |  // Stop Bit Select
    (1 << UCSZ01)  |  // Character Size Bit 1
    (1 << UCSZ00)  |  // Character Size Bit 0
    (0 << UCPOL0)     // Clock Polarity
  );

    // Set baudrate 115200
  UBRR0H=0x00;
  UBRR0L=0x08; 

  Wire.begin();       // Initialize I2C interface
}

void loop() {
  unsigned char s, m, h, dow, day, mon;
  unsigned int year;
  
  print_str("**GET**TIME**\n");                // send timesync request

  Wire.beginTransmission(DS3231_I2C_ADDRESS); // start i2c writing
    Wire.write(0);                            // start writing to reg. 0 
    for (int i = 0; i < 7; i++) {             // process clock and calendar data
      s = hex2dec(USART_Receive()) << 4;      // get high nibble
      s |= (hex2dec(USART_Receive()) & 0x0F); // get low nibble and make byte
      Wire.write(s);                          // send it to ds3231
    }
  Wire.endTransmission();
    
  if (10 == USART_Receive()) {                // check for trailing LF
    print_str("Timesync performed.\n");
  }

  Wire.beginTransmission(DS3231_I2C_ADDRESS); // prepare to read data from DS3231
    Wire.write(0);                            // read from register 0
  Wire.endTransmission();                     // 
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);    // request 7 bytes of clock and calendar data
  while (7 != Wire.available());              // wait till data becomes available
       // retrieve data from DS3231
  s = bcd2dec(Wire.read());                   // read secons
  m = bcd2dec(Wire.read());                   // read minutes
  h = bcd2dec(Wire.read());                   // read hours
  dow = bcd2dec(Wire.read());                 // read day of week
  day = bcd2dec(Wire.read());                 // read day of month
  mon = bcd2dec(Wire.read());                 // read month
  year = 1900 + bcd2dec(Wire.read());         // read year
  if (mon > 80) {                             // if century bit is set
    mon -= 80;                                // clear century bit
    year += 100;                              // change year data
  }
       // print retrieved data
  print_str("Date: ");
  print_num(day);
  print_str(".");
  print_num(mon);
  print_str(".");
  print_num(year);
  print_str("\n");

  print_str("Time: ");
  print_num(h);
  print_str(":");
  print_num(m);
  print_str(":");
  print_num(s);
  print_str("\n\n");
  
  delay(10);                                  // wait serial output complete
  haltCPU();                                  // halt 
}

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

Вот так процесс синхронизации выглядит в терминале линукса:

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

IMHO Arduino + Ethernet Shield выигрывает у связки Arduino + Ноутбук по всем параметрам:

- по цене,

- по экономичности,

- по простоте реализации,

- по времени выхода на режим после включения.

a5021
Offline
Зарегистрирован: 07.07.2013

andriano пишет:
IMHO Arduino + Ethernet Shield выигрывает у связки Arduino + Ноутбук по всем параметрам:

Довольно неожиданное и весьма спорное утверждение. Особенно на фоне, когда предлагаемый здесь вариант как раз и задумывался в качестве более простого, легкого и главное универсального способа получения точного времени и инициализации им модуля RTC.

Цитата:
по цене,

Вы стоимость ноутбука сюда хотите включить что-ли ? Так можно и без ноутбука обойтись. Настольный компьютер тоже вполне подойдет. Грузимся с любого Live-CD линукса и в несколько простых действий получаем желаемое. В принципе, даже никаких особых знаний линукса не требуется.

А вот на эзернет-шилде, как раз, можно сэкономить. Так что в абсолютных показателях экономности предложенный здесь способ выигрывает.

Цитата:
- по экономичности,

Как будем экономичность считать?

Цитата:
- по простоте реализации,

В описанном в этой ветке способе ардуина выполняет по сути только одно действие -- пробрасывает байты из последовательного порта в i2c. По сути, все необходимые действия выполняются вот таким нехитрым фрагментом ранее приведенного скетча.

Wire.beginTransmission(DS3231_I2C_ADDRESS); // start i2c writing
    Wire.write(0);                            // start writing to reg. 0
    for (int i = 0; i < 7; i++) {             // process clock and calendar data
      s = hex2dec(USART_Receive()) << 4;      // get high nibble
      s |= (hex2dec(USART_Receive()) & 0x0F); // get low nibble and make byte
      Wire.write(s);                          // send it to ds3231
    }
Wire.endTransmission();

А вот с "простотой реализации" в варианте с эзернет-шилдом все гораздо хуже. Там ардуине приходится генерировать специфический интернет-трафик и рулить стеком протоколов, плюс самим шилдом. Сложнее все на порядки. Гадаю, где вы там простоту увидели.

Цитата:
- по времени выхода на режим после включения.

В варианте синхронизации "через ноутбук", "выход на режим" случается непосредственно после подключения ардуины к USB-порту. С учетом, что железа тут инитить меньше, "выход на режим" произойдет быстрее.

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

Не нравится вам ноутбук? Можно к телефону с андроидом через USB-OTG подключится. Для ардуины и тут ничего не изменится. Для него, по большому счету, вообще пофиг, кто с той стороны кабеля. Один и тот же скетч будет выставлять на DC3231 время не особо даже вникая, кто его прислал. А с андроидом вообще можно расширить ассортимент "сигналов точного времени", т.к. внутри андроида время можно брать с тех же NTP-серверов в интернете, из сети соторого оператора (NITZ) или вовсе с GPS-приемника. Последний вариант будет покруче NTP в плане точности. Ну и куда против всего этого с эзернет-шилдом переть? Не серьезно.

lean_74
Offline
Зарегистрирован: 22.12.2015

на ESP8266 думаю еще проще и дещевле http://samopal.pro/download/ntp-clock.ino тут в коде есть как получить время, осталось его только записать

a5021
Offline
Зарегистрирован: 07.07.2013

lean_74 пишет:
на ESP8266 думаю еще проще и дещевле

Оценивая "дешевизну" вы тоже исходите из предположения, что для заливки скетча компьютер есть, а для инициализации RTC его уже нет и быть не может?

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

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a5021 пишет:

Довольно неожиданное и весьма спорное утверждение. Особенно на фоне, когда предлагаемый здесь вариант как раз и задумывался в качестве более простого, легкого и главное универсального способа получения точного времени и инициализации им модуля RTC.

Именно это "задумывалось в качестве..." меня и удивило.

Цитата:

Вы стоимость ноутбука сюда хотите включить что-ли ? Так можно и без ноутбука обойтись. Настольный компьютер тоже вполне подойдет. Грузимся с любого Live-CD линукса и в несколько простых действий получаем желаемое. В принципе, даже никаких особых знаний линукса не требуется.

Если для работы нужен ноутбук/настольный/смартфон, занчит, его и учитываем.

Что используется, то и включается в стоимость.

Цитата:

Как будем экономичность считать?

Как обычно - по электросчетчику.

Цитата:

В описанном в этой ветке способе ардуина выполняет по сути только одно действие -- пробрасывает байты из последовательного порта в i2c. По сути, все необходимые действия выполняются вот таким нехитрым фрагментом ранее приведенного скетча.

Одно дело одна программа для одного устройства и другое - две для двух разных. Да при этом еще и с обеспечением их взаимодействия между собой.

Я не говорю, что написать две программы и настроить их взаимодействие сложно. Но написать одну - еще проще.

Цитата:

В варианте синхронизации "через ноутбук", "выход на режим" случается непосредственно после подключения ардуины к USB-порту. С учетом, что железа тут инитить меньше, "выход на режим" произойдет быстрее.

Считаем от момента включения вилки в розетку.

Ну и заодно учитываем, какие еще манипуляции ручками приходитсмя совершать. В случае Ардуина+шилд - никаких. После подключения к розетке все заработает без нашего участия.

Цитата:

Итого, по всем обозначенным вами пунктам имеются серьезные возражения.

Но неубедительные.

a5021
Offline
Зарегистрирован: 07.07.2013

andriano пишет:
Именно это "задумывалось в качестве..." меня и удивило.

Вообще-то цель была достигнута и более простой, плюс более универсальный способ показал свою эффективность.

Цитата:
Если для работы нужен ноутбук/настольный/смартфон, занчит, его и учитываем.

Да ради Бога. Ноут или телефон стоимостью 20 тыс. руб. со сроком полной аммортизации 5 лет имеет стоимость машинного времени равную 0.76 коп/мин. Все цифры я привожу с "округлением" в вашу пользу, т.к. ноут или телефон может стоить дешевле, срок эксплуатации иметь больший, а минуты явно много для выполнения синхронизации. Вы на самом деле считатете, что эти пол-копейки могут быть серьезным аргументом?

Цитата:
Как обычно - по электросчетчику.

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

Цитата:
Одно дело одна программа для одного устройства и другое - две для двух разных.

Это какое-то универсальное правило или вам просто хочется все представить именно таким образом?

Цитата:
Да при этом еще и с обеспечением их взаимодействия между собой.

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

Цитата:
Я не говорю, что написать две программы и настроить их взаимодействие сложно. Но написать одну - еще проще.

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

Цитата:
Считаем от момента включения вилки в розетку.Ну и заодно учитываем, какие еще манипуляции ручками приходитсмя совершать. В случае Ардуина+шилд - никаких. После подключения к розетке все заработает без нашего участия.

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

Цитата:
Но неубедительные.

0.76 копейки куда, как убедительнее, ага.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a5021 пишет:

Такая сказочная картина может наблюдаться только в случае, если у вас имеется ардуина + шилд + блок питания в полностью снаряженном виде, которые иначе никак не используются. Но тогда как-то дороговато получается

Вот и я о том.

И у меня используется именно в таком виде (равно как и все остальные поделки на Ардуино у меня используются именно в таком законченном виде). По деталям получеатся того же порядка, что и часы из магазина. Только хотят точнее.

А у Вас вместе с ноутом получается совсем другой расклад.

Цитата:

для разовой задачки, возникающей не столь уж и часто.

У меня эта разовая задачка (синхронизация с NTP) происходит 4 раза в сутки. Это, конечно, не очень часто, но разовой ее я бы не назвал.

Цитата:

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

То есть цена ноута - доли копеек? Да и места он прилично занимает - мои часы гораздо компактнее.

 

Я рассуждаю с точки зрения изготовления устройства, которым удобно пользоваться: органов управления - ноль. Все, что нужно - включить в розетку. А у Вас, похоже, какие-то другие критерии. Даже на отдельном блоке питания пытаетесь сэкономить.

a5021
Offline
Зарегистрирован: 07.07.2013

andriano пишет:
И у меня используется именно в таком виде (равно как и все остальные поделки на Ардуино у меня используются именно в таком законченном виде). По деталям получеатся того же порядка, что и часы из магазина. Только хотят точнее.

Использование модуля DS3231 одновременно с возможностью выполнять синхронизацию часов по интернету с произвольной периодичностью имеет не много смысла. Я не видел вашего кода, но если это что-то из той же оперы, как это представлено в большинстве примеров, касающихся NTP (в том числе на сайте arduino.cc и у авторов библиотек), когда клиент, запросив время у сервера и получив таким образом ответ, просто заносит полученные цифры в соответствующие регистры своих часов, то по факту получается, что модуль DS3231, имеющий большую точность хода, корректируется данными, имеющими точность заведомо меньшую. Нельзя исключать, что с разумным объяснением необходимости таких действий могут возникнуть некоторые сложности.

Цитата:
У меня эта разовая задачка (синхронизация с NTP) происходит 4 раза в сутки. Это, конечно, не очень часто, но разовой ее я бы не назвал.

За сутки DS3231 в худшем случае "уходит" не более, чем на 173 миллисекунды, если верить данным производителя. Тем способом, каким используют NTP ардуиновские библиотеки, добиться точности лучше 1с, определенно представляет проблему. При подобной точности не имеет смысла корректировать RTC чаще раза в неделю, т.к. более частые корректировки выглядят скорее, как инициализация часов всякий раз случайным значением, находящимся на некоем, приблизительно одинаковом, удалении от эталона.

К слову сказать, ардуина с "железным" кварцем на борту (точность 20ppm), реализующий часы программно, будет уходить на 1,73с в сутки. Корректировка его через NTP дважды в сутки будет давать точность хода неотличимую от связки ардуина + DS3231, где время считается аппаратно. При такой схеме синхронизации, смысл использования отдельного модуля DS3231 в конструкции часов полностью утрачивается. Т.е. либо ардуина + шилд, либо ардуина + ds3231, но никак не все три вместе.

Цитата:
То есть цена ноута - доли копеек? Да и места он прилично занимает - мои часы гораздо компактнее.

Использовать ноут в качестве элемента конструкции часов? Мне до сих пор казалось, что это вряд ли может прийти в голову кому-либо в обычных условиях.

Цитата:
Я рассуждаю с точки зрения изготовления устройства, которым удобно пользоваться

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

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

В свое время делал конструкцию часов, которая предусматривает возможность синхронизации времени путем подключения внешнего модуля ENC28J60 c запросом NTP-данных через него, но данное решение как-то не впечатлило при эксплуатации. Оказалось, что часы удобнее подводить или с пульта от телека или путем замены модуля DS3231 из своего рода "обменного фонда", с предустановленным на нем точным временем, благо конструкция предусматривает его простую замену без использования инструментов.

Цитата:
А у Вас, похоже, какие-то другие критерии.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a5021 пишет:

Использовать ноут в качестве элемента конструкции часов? Мне до сих пор казалось, что это вряд ли может прийти в голову кому-либо в обычных условиях.

Ну Вам же пришла...

 

Если интересно, у меня модуль RTC предыдущего поколения, сейчас лень выяснять, как называется. Уход примерно секунду в сутки. Сами часы ни разу не корректировались - как были запущены при прошивке первой итерации скетча, так и идут. С показаниями NTP вычисляется разница, которая затем просто добавляется при индикации.

По поводу комфорта - не согласен, мне с точностью до минуты не комфортно. Комфортно - в пределах 5-10 секунд.

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

 

Ну а так - мы свои мнения высказали. Выяснилось, что подходы у нас различаются. Для меня лично несущественна цена модуля W5100, но обременительно даже раз в год (а с моим модулем RTC и моими запросами - раз в неделю) корректировать часы. У Вас - ниже требования к точности и жестче - к цене. Тут каждый волен поступать в соответствии со своими пристрастиями. Меня просто шокировало, что для часов, оказывается, необходим ноутбук, и что это решение предлагается как более простое и дешевое по сравнению с решением без ноутбука. Ну - каждому свое. Вам - проще так, мне - иначе.

a5021
Offline
Зарегистрирован: 07.07.2013

andriano пишет:
Ну Вам же пришла...

Я вообще-то никаких конкретных конструкций не описывал и идей на сей счет не высказывал. Вы о чем?

Цитата:
Если интересно, у меня модуль RTC предыдущего поколения, сейчас лень выяснять, как называется. Уход примерно секунду в сутки.

Я уже упоминал, что возможнось оперативной корректировки значений точного времени посредством синхронизации через NTP делает отдельный модуль RTC избыточным элементом конструкции часов. Тем более, если это модуль "предыдущего поколения", у которого точность хода ничуть не лучше, чем можно получить на софтовых часах самого ардуины.

Цитата:
По поводу комфорта - не согласен, мне с точностью до минуты не комфортно. Комфортно - в пределах 5-10 секунд.

А какие, вы говорите, действия в быту, будучи свершенными с опозданием на 5 секунд, могут создавать неудобства? Я бы понял, если бы речь шла о лабораторных или хотя бы кухонных часах, но для обычных часов на полке или столе это явный перебор. Кроме того, для попадания в 5-10 секундный интервал, проверять, не настало ли время, придется с периодичностью не меньшей. Какое-то сомнительное удовольствие -- сидеть и отлавливать начало пятисекундного интервала.

Я начал в уме перебирать, где у себя дома я могу найти часы, которые бы в обычном режиме отображали секунды. На кухне насчитал четыре прибора укомплектованных часами, но ни одни не показывает секунды. Посмотрел на мобильники. Тоже скунд нет. На тв-тюнере тоже. Телеканалы, которые выводят часики в какой-нибудь части экрана, тоже дают время без секунд. Обшарил взглядом все углы в доме, но секунд так и не нашел. Даже часы на приборке в машине вспомнил, правда тоже без секнуд. Странно все это. Похоже на какой-то глобальный заговор с целью лишения обывателя ощущения комфорта.

Цитата:
Поэтому следующую итерацию (когда дойдут руки, а дойдут они не скоро) собирась сделать по WiFi.

Из пушки по воробьям. Я еще где-то в начале года прикрутил к консоли домашнего роутера под OpenWRT копеешный МК с копеешным же NRF24L01. Первоначально это планировалось под задачу прокидывания данных от неких устройств домашней автоматизации в интернет. Поже мне придумалось нагрузить эту примочку передачей точного времени в обратную сторону. Таким нехитрым образом, все устройства нуждающиеся в информации о точном времени, могут получать его, прослушивая определенный канал через NRF24L01. То же самое может касаться и часов. Если бы мне приспичило их делать сейчас, то я возможно вообще бы не стал реализовывать в них традиционный часовой функционал, запилив лишь прием и отображение тех самых "сигналов точного времени", получаемых прямиком от демона ntpd.

Кстати сказать, тот самый скрипт на перле, который вы посчитали за вторую программу и сочли мнимым недостатком, с минимальными изменениями обеспечивает функционал вещателя сигналов точного времени по описанной мной схеме. Нужно только изменить имя устройства вывода с /dev/ttyUSB0 на /dev/ttyS0 и сменить запускающий триггер. Такая вот универсальность и масштабируемость.

Цитата:
Выяснилось, что подходы у нас различаются. Для меня лично несущественна цена модуля W5100

Еще неожиданно выяснилось, что подходы существенно различаются не только у нас с вами, но и персонально у вас, в зависимости от того, идет ли речь о ваших творениях или чьих-то еще. Поясняю: в самом первом своем сообщении в этой ветке вы сходу назвали два недостатка описываемого мной метода -- цену и экономичность, даже еще толком не представляя, откуда эту цену брать и к чему экономичность отнести. Теперь же вдруг выясняется, что цена может и не иметь существенного значения, правда если речь  идет о каких-то ваших решениях. Ну и чего тогда стоит ваша критика при таком-то "гибком" подходе?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a5021 пишет:

Я уже упоминал, что возможнось оперативной корректировки значений точного времени посредством синхронизации через NTP делает отдельный модуль RTC избыточным элементом конструкции часов. Тем более, если это модуль "предыдущего поколения", у которого точность хода ничуть не лучше, чем можно получить на софтовых часах самого ардуины.

Может, в гоубокой теории оно так и есть, но на практике вазникают самые неожиданные препятствия.

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

NTP нет, RTC нет, откуда бедной ардуине после включения питания узнать, какое следует показывать время?

Цитата:

А какие, вы говорите, действия в быту, будучи свершенными с опозданием на 5 секунд, могут создавать неудобства? Я бы понял, если бы речь шла о лабораторных или хотя бы кухонных часах, но для обычных часов на полке или столе это явный перебор. Кроме того, для попадания в 5-10 секундный интервал, проверять, не настало ли время, придется с периодичностью не меньшей. Какое-то сомнительное удовольствие -- сидеть и отлавливать начало пятисекундного интервала.

Если хорошенько задуматься, можно выдумать еще ерундее.

Вы всерьез ожидаете некоторого важного для Вас момента времени, не отходя от часов?

Навскидку два варианта:

1. Вы обожаете смотреть новости, а они, как известно, начинаются в строго определенное время. Притом, самая важная новость дня идет в самом начале. Опоздали на минуту - пропустили самую важную новость.

И совершенно необязательно сидеть перед часами и ждать. Обычно, бросил взгляд: если 59:55 - не отходишь от телевизора, а если только 59:05 - еще можно успеть сходить в другую комнату за очками.

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

Да, с собой часы на Ардуино я не беру. Но удобно, когда дома есть часы, по которым всегда можно проверить свои наручные.

Цитата:

Я начал в уме перебирать, где у себя дома я могу найти часы, которые бы в обычном режиме отображали секунды. На кухне насчитал четыре прибора укомплектованных часами, но ни одни не показывает секунды. Посмотрел на мобильники. Тоже скунд нет. На тв-тюнере тоже. Телеканалы, которые выводят часики в какой-нибудь части экрана, тоже дают время без секунд. Обшарил взглядом все углы в доме, но секунд так и не нашел. Даже часы на приборке в машине вспомнил, правда тоже без секнуд. Странно все это. Похоже на какой-то глобальный заговор с целью лишения обывателя ощущения комфорта.

Отнюдь.

Обычное грамотное конструкторское решение: раз часы все равно показывают время плюс-минус две минуты, индикация секунд бессмысленна.

Цитата:

Кстати сказать, тот самый скрипт на перле, который вы посчитали за вторую программу и сочли мнимым недостатком, с минимальными изменениями обеспечивает функционал вещателя сигналов точного времени по описанной мной схеме. Нужно только изменить имя устройства вывода с /dev/ttyUSB0 на /dev/ttyS0 и сменить запускающий триггер. Такая вот универсальность и масштабируемость.

Как всегда выяснятеся, что для того, чтобы что-то универсальное и масштабируемое работало, неизменно необходимо вмешательство ручками.

Цитата:

Еще неожиданно выяснилось, что подходы существенно различаются не только у нас с вами, но и персонально у вас, в зависимости от того, идет ли речь о ваших творениях или чьих-то еще. Поясняю: в самом первом своем сообщении в этой ветке вы сходу назвали два недостатка описываемого мной метода -- цену и экономичность, даже еще толком не представляя, откуда эту цену брать и к чему экономичность отнести. Теперь же вдруг выясняется, что цена может и не иметь существенного значения, правда если речь  идет о каких-то ваших решениях. Ну и чего тогда стоит ваша критика при таком-то "гибком" подходе?

Не надо передергивать.

Я и тогда и сейчас утверждаю, что W5100 шилд дешевле ноутбука и потребляет меньше электроэнергии.

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

macros
Offline
Зарегистрирован: 07.11.2016

andriano пишет:

Я и тогда и сейчас утверждаю, что W5100 шилд дешевле ноутбука и потребляет меньше электроэнергии.

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

Не понятно о чем спор.

Тема для задачи, в которой нужно один раз в 5 лет синхронизировать время для самодельного мобильного устройства с минимумом функций, разве нет?

Свободного W5100 нет, долго ждать, лень покупать. Но есть универсальное устройство ноутбук. Если же имеется свободный W5100, тогда проще на нем выполнить.

Кстати не встречались ли вам готовые часы для ардуины с возможностью синхронизации по радио сигналу точного времени? Речь о таком сигнале: https://olegon.ru/showthread.php?t=13018

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Но Андриано! Вы просто не поняли о чем речь!

Речь об инициализации модуля, ПЕРЕД тем, как его поставить в какое-нибудь устройство. А Вы сравниваете с коррекцией В СОСТАВЕ устройства. Которая, чаще всего, не нужна. Если есть возможность коррекции, то нахрена DS3231 в устройстве? Только на случай пропадания инета?

Речь только о том, как выставить точно часы, затем их где нибудь использовать. DS3231 настолько точны, что, если не вынимать батарейку, то можно их год в полке держать ... ну или в устройстве.

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

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

a5021
Offline
Зарегистрирован: 07.07.2013

andriano пишет:
Может, в гоубокой теории оно так и есть, но на практике вазникают самые неожиданные препятствия.

И чем богаче фантазия рассказчика, тем более они неожиданные. Фантазии.

Цитата:
Например, на пару минут отключили свет. Потом включили, но, как показывает практика, нередко после этого провайдеру нужно около двух часов, чтобы прийти в себя.

Во первых, даже если такое случилось, то ардуино-часы не главный хронометр галактики, чтобы стать причиной глобального хаоса. Хрен-то с ними, с этими часами. В условиях современного быта -- это никак не может привести к каким-то заметным неприятностям. Узнать точное время можно включив телек, компьютер, планшет, посмотрев на наручные часы или в телефон и всякими прочими способами. Проблема надуманная, а значение ее сильно преувеличено.

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

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

Цитата:
Если хорошенько задуматься, можно выдумать еще ерундее.

Как то вы уж больно усердствуете в данном направлении.

Цитата:
1. Вы обожаете смотреть новости, а они, как известно, начинаются в строго определенное время.

Включите телек за несколько минут до их начала. Услышите, когда пойдет отбивка. Или это какой-то фетишь, чтобы успеть телек включить ровно за пять секунд до появления диктора на экране?

Цитата:
2. Представьие, бывают предприятия, где время прохода через проходную автоматически фиксируется с точностью до секунды.

Какое отношение ваши домашние часы имеют к проходной предприятия с таким суровым режимом?

В общем, примеры вам не удались и вы не смогли объяснить, зачем вам необходимо наблюдать пятисекундную точность постоянно.

Цитата:
Обычное грамотное конструкторское решение: раз часы все равно показывают время плюс-минус две минуты, индикация секунд бессмысленна.

Кому нужны часы, которые "показывают время плюс-минус две минуты", если остро-восстребованным является требование к точности на уровне 5-10 секунд? Кто такие часы покупает? Почему предложение на рынке таких недо-часов зашкаливает? Собственно, это лучшая иллюстрация реальных требований к  точности бытовых часов, а не всяких вымыслов в угоду сомнительным доводам.

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

Вы еще не устали? Я ведь вам уже говорил (и это легко проверить), что никаких приборов иже конструкций я тут не изобретал и их устройства не описывал, ни полного, ни по частям. О чем все эти ваши фантазии?

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Уважаемый Wdrakula. Вы писали

Цитата:

Кстати, один из примеров библиотеки у меня сам настроил модуль по системному времени

Не можете ли Вы дать ссылку на эту библу. Пжалста.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Dmitriy49 пишет:

Уважаемый Wdrakula. Вы писали

Цитата:

Кстати, один из примеров библиотеки у меня сам настроил модуль по системному времени

Не можете ли Вы дать ссылку на эту библу. Пжалста.

"Rtc by Makuna" самая обычная. Если часы не настроены, то она настраивает по времени компиляции. Это 2-3 секунды задержки. Пример - "DS3231_Simple". Можно посмотреть - сколько именно задержки для своей платы и переделать скетч.

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Спасибо. Я воспользовался способом из этого источника. http://cxem.net/arduino/arduino108.php

vb
Offline
Зарегистрирован: 15.09.2016

Можете тут почитать как синхронизировать датчик через Arduino через ПК http://ngin.pro/arduino/197-sinhronizirovat-ds3231-rtc-s-pk-cherez-arduino.html

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Спасибо. А вы сами этот способ пробывали? Если да, то какую библу для RTC использовали, а то у меня скопились несколько библиотек для DS3121 и каждый раз путаюсь, ибо забываю какую использовал для того или иного проекта часов.

a5021
Offline
Зарегистрирован: 07.07.2013

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

AABBCCDDEEFFGG, где

AA -- значение секунд 00..59;

BB -- значение минут 00..59;

CC -- значение часов 00..23;

DD -- номер дня недели 01..07;

EE -- число месяца 01..31;

FF -- месяц 01..12. Из-за особенности хранения данных в DS3231, если дата относится к текущему столетию, то к номеру месяца нужно прибавить значение 80. Т.е. январь будет соответствовать числу 81, а декабрь 92;

GG -- год 00..99.

Каждое поле должно содержать ровно две цифры.

В принципе, модуль можно проинициализровать даже из встроенного терминала Arduino IDE:

После заливки скетча или нажатия на RESET, ардуина выводит в терминал приглашение/запрос "**GET**TIME**". Сие означает, что он готов принять последовательность и проинициализировать ею модуль. Пишем нужную последовательность слева от кнопки "Отправить" и нажимаем саму кнопку. Теоретически, строка должна бы заканчиваться символом LF (перевод строки), но в ардуиновском терминале данный символ ввести затруднительно, т.ч. можно добавить любой, главное, чтобы он был. Ардуина ответит чем-то наподобие:

В терминал выводятся данные, которые после заливки считываются из DS3231 для контроля.

Наконец, можно воспользоваться пакетным файл для Windows, который инициализирует DS3231 текущим временем с компа:

@echo off
SET COM_PORT=COM8
mode %COM_PORT% BAUD=115200 PARITY=n DATA=8
for /f %%a in ('WMIC Path Win32_LocalTime Get DayOfWeek ^| findstr ^[0-9]') do set /a WDAY=%%a + 1
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do set d=%%a
set SEC=%d:~12,2%
set MIN=%d:~10,2%
set HOUR=%d:~8,2%
set WDAY=0%WDAY%
set DAY=%d:~6,2%
set /A MONTH=%d:~4,2%+80
set YEAR=%d:~2,2%
echo on
echo %SEC%%MIN%%HOUR%%WDAY%%DAY%%MONTH%%YEAR% >%COM_PORT%

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

a5021
Offline
Зарегистрирован: 07.07.2013

Еще стоит упомянуть способ чтения и/или редактирования регистров DS3231 c помощью универсального адаптера-программатора на базе китайского чипа CH341A.

Как соединять видно по картинке и тут особых объяснений, по-моему, не нужно. Обращаю внимания на джампер внизу фото, который должен быть установлен в крайне-правое положение.

Софт для работы с адаптером можно сдернуть, например, отсюда. В данном случае интересна программа из архива под названием USB2I2C_DEMO_VBEN.exe

Чтобы прочитать время из модуля нужно в поле Length рамки Data to Write вставить цифру 2, в окне Data значение d000, а в поле Length рамки Data to Read цифру 7. После нажатия на кнопку Write\Read в окне Data появятся семь цифр текущего времени в формате описанном в предыдущем сообщении.

Установка времени в DS3231 может быть выполнена следующим образом:

d0 -- это I2C адрес модуля, следущие два ноля это с какого регистра начинать запись, оставшиеся семь пар знаков -- это данные о времени.

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

Yurakha
Offline
Зарегистрирован: 05.04.2017

wdrakula пишет:

Dmitriy49 пишет:

Уважаемый Wdrakula. Вы писали

Цитата:

Кстати, один из примеров библиотеки у меня сам настроил модуль по системному времени

Не можете ли Вы дать ссылку на эту библу. Пжалста.

"Rtc by Makuna" самая обычная. Если часы не настроены, то она настраивает по времени компиляции. Это 2-3 секунды задержки. Пример - "DS3231_Simple". Можно посмотреть - сколько именно задержки для своей платы и переделать скетч.

Всем привет. Понимаю, что давно это было, но может кто подскажет ?

Использую эту библиотеку и пример для установки часов по времени компиляции, так вот сразу устанавливается время минус 10 секунд, где в этой библиотеке чего то подправить, что бы время устанавливалось точно?, т.е. где то нужно добавит +10, только не знаю где. Кроме того, день недели устанавливается на дин день раньше, т.е. если сегоня среда, то устанавливается вторник, может это тоже можно где то в библиотеке исправить? Ну и раз такое дело, спрошу еще по поводу самого модуля RTS, на DS3231SN, вот такой https://www.google.com.ua/search?q=модуль+rtc+ds3231&prmd=ivn&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjp84ncho7TAhUJhywKHWGTDMwQ_AUIBygB&biw=1280&bih=800#imgrc=oUljtEkmACeK_M: т.е. без всяких кварцев, диодов и т.д., может за это время нашлись у крго то причины , короче отсают примерно на 2 сек в сутки, но только когда работают от батарейки, если есть внешнее питание, идут секунда в секунду. Батарейка свежая 3,06В. Модуль работает автономно, т.е. без ардуины, основной скетч только запрашивает текущее время.

Вот сама библиотека, на всякий случай http://www.arduinolibraries.info/libraries/rtc-by-makuna . Заранее благодарен .

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yurakha пишет:

Использую эту библиотеку и пример для установки часов по времени компиляции, так вот сразу устанавливается время минус 10 секунд, где в этой библиотеке чего то подправить, что бы время устанавливалось точно?

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

У Вас получается, что если все это просуммировать для конкретного скетча, около 10 секунд. Но никто не знает, сколько времени понадобится тому же компилятору в следующий раз, когда в многозадачной среден, например, будет работать антивирус, или насколько увеличится время загрузки, если Вы добавите в скетч еще одну строку. Поэтому "точно" без машины времени - никак.

Ну а если Вас устраивает поправочная константа 10 секунд, переустанавливайте время на Вашем ПК перед началом компиляции на 10 секунд вперед, а после завершения загрузки скетча, возвращайте в исходное состояние.

Цитата:

Кроме того, день недели устанавливается на дин день раньше, т.е. если сегоня среда, то устанавливается вторник,

Прямо так и пишет - "вторник"? Или возвращает номер дня недели, который нумеруется с 0, а Вы трактуете это число так, как будто нумерация идет с 1?

Yurakha
Offline
Зарегистрирован: 05.04.2017

Машину времени изобретать не будем! А если серьезно, меня вполне устроит точность не абсолютная, а в пределах секунды, используя поправочную константу, только не шаманить с системным временем, а где то добавить константу в библиотеку. Эта константа, за пять минут, может быть получена экспериментальным путем для конкретных условий. Системное время синхронизируется с какого то сервера по сети, не берусь утверждать, что это супер точное время, важно что бы несколько модулей RTC были настроенны относительно точно, идентично и этот процесс был максимально автоматизирован, что бы любой человек сел за рабочее место, выполнил некоторые не сложные и не интеллектуальные операции и получил требуемый результат. По поводу дня недели, не знаю что возвращает эта библиотека, ее пример не выводит в монитор день недели, но когда я запускаю простенький скетч, который просто читает и выводит в монитор дату и время, день недели установлен не правильно.

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

К стати вот очень хорошая библиотека http://iarduino.ru/file/235.html только она устанавливает время и дату вручную и не совсем это удобно и есть еще некоторые нюансы.

Yurakha
Offline
Зарегистрирован: 05.04.2017

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

Может кому пригодится http://cxem.net/arduino/arduino108.php