← На главную

Эмуляция GPS для ESP8266-часов провалилась — исходники на GitHub

02.06.2026 14:30 · hackernews

Кто‑то попытался сделать точные WiFi‑часы на ESP8266, эмулируя GPS‑модуль и выдавая NMEA‑строки с PPS‑сигналом. Получилось неплохо, но для прецизионных часов этого недостаточно. Расчёт времени был неточным — до миллисекундной погрешности далеко. PPS дёргали как попало, например, пока искали WiFi, хотя импульс должен идти только при точном времени. Зато лишние сигналы и серийный интерфейс никому не сдались.

Собрано всё на Arduino для ESP8266. Среда страшная и раздутая, но начать легко. Встроенная NTP‑библиотека вообще ужас — она меряет время, вызывая delay(10) в цикле, так что точность максимум 10ms. А ещё в примерах бездумно копируют мусор в NTP‑заголовки. На самом деле для рабочего запроса достаточно одного ненулевого байта.

Пришлось разобраться с endianness: ESP8266 — little‑endian, а NTP требует big‑endian. Атрибут scalar_storage_order("big-endian") из gcc не заработал — Arduino использует g++ без поддержки этого расширения и молча игнорирует.

Для измерений взяли настоящий GPS как эталон и логический анализатор за 5 фунтов на чипе Cypress FX2. Через sigrok и декодер "Jitter" сравнивали PPS GPS с PPS ESP8266. Команда sigrok-cli собирала данные, перл‑скрипт чистил, а gnuplot рисовал в реальном времени. Каждые 15 минут ждали результаты.

Первый график показал кучи выбросов и среднее смещение в 3ms. Домашний WiFi оказался адским — десятки перекрывающихся сетей. Пакеты хаотично задерживались. После отбрасывания выбросов график стал ровнее, но drift неподстроенного осциллятора оставался.

Тогда выяснили две вещи. Во‑первых, NTP‑пул — это добровольцы без высокой точности, а time.cloudflare.com даёт гораздо лучше. Во‑вторых, на чужой сети результаты были намного стабильнее. Но часы должны работать дома.

Попытались настроить управляющий контур для подстройки осциллятора и уменьшения опросов NTP. Сначала была неустойчивость — перекомпенсация, потом красивые синусоиды с периодом 20 минут. Иногда контур работал час‑два, а потом срывался. Автор пришёл к выводу, что изобретает велосипед — проще было воткнуть TCXO и не париться. В конце концов проект заброшен, исходники выложены на GitHub.

Читать оригинал →