Могу ли я использовать внутренние часы на Wemos D1 Mini?

У меня есть работающая установка Wemos D1 Mini, которая измеряет температуру и отправляет ее по Wi-Fi на мой сервер. Теперь я использую устройство с батарейным питанием и экспериментирую с оптимизацией энергопотребления и способами его снижения.

Одна вещь, которая мне нужна, это время (текущее, либо эпоха, либо летнее время). Поэтому я внедрил NTP, но каждый раз, когда мой ESP просыпается после глубокого сна, ему нужно повторно подключаться к Wi-Fi, собирать время, измерять температуру, отправлять результаты. .

В этом pdf указано, что ESP8266 имеет внутренние часы. У меня проблемы с поиском чего-либо, кроме "RTC Shields на Wemos/Arduino" или «NTP на ESP8266»; в интернете о чем-то похожем на внутренние часы. Что-то должно быть, потому что иначе это не могло бы работать (мои представления о часах и оборудовании пока ограничены).

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

Любые подсказки приветствуются!

, 👍1

Обсуждение

это не ответ, но я хочу показать вам, как просто получить время NTP в esp8266 Arduino: время во внутренних RTC (другого пути нет), @Juraj


1 ответ


Лучший ответ:

3

Я думаю, что ответ на ваш вопрос лучше всего выразить одним словом: "Вроде".

Лучшим аргументом является документация NodeMCU Lua, в которой говорится:

Учет времени на ESP8266 технически довольно сложен. Несмотря на название RTC, RTC на самом деле не являются часами реального времени в обычном смысле этого слова. Хотя счетчик продолжает тикать, пока модуль находится в спящем режиме, точность, с которой он это делает, сильно зависит от температуры чипа. Упомянутая температура значительно меняется между тем, когда чип работает, и когда он находится в спящем режиме, а это означает, что любая калибровка, выполняемая во время работы чипа, становится бесполезной через несколько мгновений после того, как чип перешел в спящий режим. Таким образом, калибровочные значения должны быть выведены по циклам сна, чтобы обеспечить точное отслеживание времени. [...]

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

Вы можете получить доступ к текущему счетчику RTC с помощью функции Non OS SDK.

uint32_t system_get_rtc_time()

Вы можете комбинировать это с

uint32_t system_rtc_clock_cali_proc()

что дает вам количество микросекунд за тик таймера RTC.

Нельзя изменить счетчик таймера RTC, поэтому вам придется прибегнуть к «дельта-магии». чтобы обновить собственное внутреннее значение времени (проще всего значение эпохи) из разницы между последовательными вызовами для получения счетчика RTC.

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

Но это может дать вам "приблизительное представление" как долго вы спали и т. д.

Вам нужно будет провести несколько экспериментов, чтобы узнать, насколько отличается время по сравнению со значением NTP при реальном использовании.

,

Типа, если не вызывать deepSleep. Цитируя Справочник API SDK 3.0.2: «Если внешнее оборудование сбрасывает чип через EXT_RST или CHIP_EN (например, выход из глубокого сна по времени), таймер RTC будет сброшен». Arduino [скетч] (https://github.com/DarioGHub/embedded/blob/main/sleep/SDK.RTC.Time.Demo.ino), перенесенный из упомянутой ссылки., @DWB