Taxitaxitaxi.ru

Эволюшн
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Добавление часов реального времени (с синхронизацией по ком порту) в метеостанцию

Добавление часов реального времени (с синхронизацией по ком порту) в метеостанцию

1. Размер: 38 мм (длина) * 22 мм (ширина) * 14 мм (высота)
2. Вес: 8 г
3. Рабочее напряжение: 3.3-5.5 В
4. Микросхемы памяти: AT24C32 (емкость 32 К)
5. Шина IIC интерфейса, (рабочее напряжение 5 В)
6. I2C адрес может быть изменен замыканием A0/A1/A2, по умолчанию адрес 0x57

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

Вот так выглядит моя схема соединений.


Таки решил освоить эту программу, кое как понарисовывал модули, как соберусь допилить — выложу файл.

Код это немного изменный пример из библиотеки часов. Особенность примера на мой взгляд в том, что происходит (в теории, не знаю как проверить) синхронизация часов ардуины с модулем RTC (setSyncProvider(RTC.get);), и уже на дисплей выводится время ардуины и модуль не дергается каждую секунду, наверно так экономичнее. Изменения коснулись добавления модулей, а также синхронизация ожидается в любой момент времени и с изменным для удобности форматом d,m,yy,h,m,s. Каждую секунду на экране обновляется время и каждых 5 секунд обновляются показания датчиков. После убирания lcd.clear() экран перестал мерзко мигать и, если данные по экрану не скачут (а в данном случае так и есть), они просто красиво обновляются.
Решил никакой истории давления не вести, лично мне достаточно того, что сейчас и того что было вчера.

Батник для синхронизации часов

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

Читайте так же:
Карбюратор 21073 1107010 регулировка уровня топлива

Кстати потребляет метеостанция после переделки 0,04 А, в сутки потребляет 960 мАч. Я ее без расчетов запитал от повербанка около 2 Ач и через двое суток все благополучно потухло) Сейчас запитано от БП от LG MCS-04ED (5,26 В/1,8A), все работает чинно.

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

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

В общем, судя по комментариям и этой статье в этом модуле возможны некоторые доработки:

1) можно убрать светодиод индикации питания
2) можно убрать подтягивающие резисторы шины I2c
3) можно и даже нужно выпаять что то из цепи подзарядки батареи, которая в принципе не должна заряжаться, а даже если поставить аккумулятор, то не будет никакого контроля заряда, да и у аккумулятора намного меньше емкость и больше стоимость

Как сделать сервер времени (NTP) на Arduino

GPS/GLONASS приёмник с UART GPS/GLONASS приёмник с UART

Модуль с часами реального времени DS1307 Модуль с часами реального времени DS1307

И, конечно же, нам понадобится модуль с сетевым интерфейсом или т.н. Ethernet-шилд. Этот модуль позволит подключить Arduino к локальной сети или к компьютеру по Ethernet.

Ethernet-шилд с микросхемой Wiznet W5100 Ethernet-шилд с микросхемой Wiznet W5100

В качестве альтернативы можно использовать Wi-Fi модуль, разумеется. Лишь бы ваши устройства, время на которых необходимо синхронизировать с сервером времени, находились в одной локальной сети с сервером времени на Arduino.

Теперь соединим все наши части воедино. Для этого сначала соберём «бутерброд» из Arduino и сетевого шилда, который выполнен в виде мезонинной платы. Далее подключим модуль часов DS1307 к выводам A4 и A5, а это шина I2C, как мы помним. Следовательно, пин A4 – это SDA, пин A5 – SCL. Приёмник сигналов ГНСС необходимо подключить к UART. Для этого можно подключить его к стандартным выводам RX и TX Arduino (пины 0 и 1, соответственно). Но тогда мы не сможем одновременно работать с приёмником и отлаживаться с выводом отладочных сообщений в последовательный порт. Поэтому рекомендую реализовать программный UART с помощью штатной библиотеки SoftwareSerial. Для этого подключим GPS приёмник к любым цифровым выводам (кроме 0 и 1), например, к 10 и 11.

Общий вид NTP сервера на Arduino Общий вид NTP сервера на Arduino

Читайте так же:
Индикатор для регулировки фаз грм

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

2 Скетч NTP сервера для Arduino

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

Формат пакета NMEA с данными о времени Формат пакета NMEA с данными о времени

В конце статьи приложена программа для тестирования связи с NTP сервером.

Скетч сервера времени NTP и Arduino (разворачивается)

Проверка NMEA пакетов осуществляется в функции decodeTime().

Несколько слов о функции dec2hex(). В ней несколько извращённо число переводится из десятичного представления в 16-ное. Точнее, так. Модуль часов показывает время в виде, например, 16:52:08. Но здесь каждое из этих чисел не десятичное, а 16-ное. То есть, в действительности это время в RTC хранится так: 0x16:0x52:0x08. А с GPS-приёмника мы получаем время в десятичном формате. И чтобы записать те же 16 часов в модуль RTC, нужно преобразовать десятичное 16 в шестнадцатеричное 0x16, что является десятичным 22. А полное время 0x16:0x52:0x08 будет в десятичном представлении 22:82:08. Хм, 82 минуты, странно, да? 🙂 Но такое уж надо сделать преобразование, чтобы модуль часов реального времени запомнил правильное время.

3 Программа для тестирования NTP сервера на Arduino

В приложении к статье имеется архив с программой тестирования NTP .

Главное окно программы тестирования NTP/SNTP Главное окно программы тестирования NTP/SNTP

Всё, что требуется для проверки NTP сервера – это ввести адрес сервера и нажать кнопку «Отправить запрос». Соответственно, нужно знать адрес вашего NTP сервера на Arduino. Можно выбрать сервер из списка предложенных в меню («Выбрать сервер»).

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

Настройка модуля часов реального времени RTC для Arduino

Все, что вам нужно сделать, так это сконфигурировать RTC-чип в соответствии с текущей датой и временем … и сегодняшний проект поможет вам это сделать!

Проект

RTCSetup состоит из двух элементов:

  • графический интерфейс пользователя (GUI), написанный на языке C# и запущенный на ПК
  • скетч, запущенный на Arduino, к которому подключен модуль RTC

Графический интерфейс пользователя и скетч соединены по последовательному интерфейсу с помощью несложного протокола. Исходный код для них доступен в моем хранилище данных Github.

Arduino и часы реального времени

Для связи с чипом DS1307 я выбрал библиотеку RTClib хранилища Adafruit. Данный чип наиболее часто используется в модулях RTC энтузиастами со всего мира. Соединение между ИС и Arduino устанавливается с помощью шины I2C:

На рисунке показано соединение, организованное с помощью “новых” выводов I2C платы Arduino Uno; естественно вы можете использовать выводы A4 и A5.

Скетч Arduino получает команды от ПК, выполняет их и посылает назад ответный сигнал.

Читайте так же:
Регулировка карбюратора таврия славута

Протокол

Как я указал ранее, для связи между графическим интерфейсом пользователя и Arduino используется несложный протокол, созданный с помощью только 4-х команд:

Команда: ##

Первая команда, отправленная после установления соединения, используется ПК для подтверждения “совместимости” модуля, подключенного к последовательному порту. Arduino должен ответить командой «!!«

Команда: ?V

Данная команда используется для получения версии скетча. Arduino отвечает строковым параметром, определенным как константа в начале скетча:

#define VERSION «1.0»

Команда: ?T

Данная команда, используемая для получения фактической даты и времени, считывается из модуля RTC. Плата Arduino отвечает строковым параметром в формате: dd/MM/yyyy hh:mm:ss.

Команда: !TddMMyyyyhhmmss

Данная команда используется для установки времени RTC. Arduino отвечает командой «OK».

Графический интерфейс пользователя (GUI)

Графический интерфейс пользователя, разработанный на C#, общается с Arduino по вышеуказанному протоколу и выполняет три функции:

  • устанавливает текущую дату и время
  • устанавливает требуемую дату и время, которые определяет пользователь
  • получает и отображает фактическую дату и время модуля RTC.

Сначала вам необходимо выбрать последовательный порт Arduino для установки соединения и нажать кнопку CONNECT. Если соединение установлено (команды ## и ?V), тогда в строке состояния будет отображаться версия скетча.

В первом окне будет показано фактическое время ПК. После нажатия правой кнопки мыши (на красной стрелке) вы сможете сконфигурировать модуль RTC с данным временем :

С помощью кнопки с зеленой стрелкой вы сможете получить фактическое время, хранимое в модуле RTC:

И, наконец, с помощью выпадающего списка даты в центре, вы сможете выбрать требуемое значение даты и времени, и затем отправить эти значения в модуль RTC:

Технические данные

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

Я измерил время (около 150 мс), которое необходимо скетчу для установки времени, после того как команда отправлена графическим интерфейсом пользователя: это причина почему в коде, который вы видите, команда !T отправляется, когда действительное число миллисекунд составляет 850 и пройденное время – это фактическое время + 1 секунда.

Получение даты и времени от NTP сервера с помощью ESP8266 NodeMCU

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

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

Решение в этом случае – использовать протокол сетевого времени (NTP). Если у вашего проекта на ESP8266 есть доступ к Интернету, вы можете бесплатно получить дату и время (с точностью до нескольких миллисекунд от UTC). Дополнительное оборудование не требуется.

Читайте так же:
Чем отрегулировать свет фар на ланосе

Получение даты и времени от NTP сервера с помощью ESP8266 NodeMCU Получение даты и времени от NTP сервера с помощью ESP8266 NodeMCU

Что такое NTP?

NTP означает Network Time Protocol (протокол сетевого времени). Это стандартный интернет-протокол для синхронизации часов компьютера с неким эталоном в сети.

Данный протокол может использоваться для синхронизации всех сетевых устройств с всемирным координированным временем (UTC) с точностью до нескольких миллисекунд (50 миллисекунд в общедоступном Интернете и менее 5 миллисекунд в среде LAN).

Всемирное координированное время (UTC) – это всемирный стандарт времени, тесно связанный с GMT (средним временем по Гринвичу). UTC не меняется, оно одинаково во всем мире.

NTP устанавливает часы компьютеров в формате UTC, любое смещение местного часового пояса или смещение летнего времени применяется уже клиентом. Таким образом, клиенты могут синхронизироваться с серверами независимо от местоположения и разницы часовых поясов.

Архитектура NTP

NTP использует иерархическую архитектуру. Каждый уровень иерархии известен как слой (англ. stratum).

На самом верху находятся высокоточные устройства для измерения времени, известные как аппаратные часы уровня 0; это, например, атомные часы, GPS или радиочасы.

Серверы слоя 1 имеют прямое соединение с аппаратными часами слоя 0 и поэтому имеют наиболее точное время.

Рисунок 1 Иерархическая архитектура NTP со слоями Рисунок 1 – Иерархическая архитектура NTP со слоями

Каждый слой в иерархии синхронизируется с уровнем выше и действует как серверы для компьютеров нижнего слоя.

Как работает NTP?

NTP может работать разными способами. Наиболее распространенная конфигурация – работа в режиме клиент-сервер. Основной принцип работы следующий:

  1. клиентское устройство, такое как ESP8266, подключается к серверу с помощью протокола пользовательских датаграмм (UDP) через порт 123;
  2. затем клиент передает пакет запроса на сервер NTP;
  3. в ответ на этот запрос сервер NTP отправляет пакет с меткой времени;
  4. пакет с меткой времени содержит множество информации, такой как метка времени UNIX, точность, задержка или часовой пояс;
  5. затем клиент может проанализировать текущие значения даты и времени.

Подготовка IDE Arduino

Хватит теории, приступим к практике!

Но прежде чем углубляться в данное руководство, вы должны установить в вашу Arduino IDE дополнение для ESP8266. Чтобы подготовить Arduino IDE к работе с ESP8266 (если вы еще этого не сделали) следуйте инструкциям из статьи по ссылке ниже:

Установка библиотеки NTP-клиента

Самый простой способ получить дату и время с сервера NTP – это использовать клиент NTP из библиотек Arduino. Выполните следующие шаги, чтобы установить эту библиотеку в свою Arduino IDE.

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

Отфильтруйте результаты поиска, набрав «ntpclient». Должна остаться пара записей. Ищите NTPClient by Fabrice Weinberg. Щелкните на эту запись и выберите «Установить».

Рисунок 3 Установка библиотеки NTP-клиента в Arduino IDE Рисунок 3 – Установка библиотеки NTP-клиента в Arduino IDE

Читайте так же:
Регулировка потенциометра дроссельной заслонки гольф

Получение текущих дня недели и времени от NTP-сервера

Следующий скетч даст вам полное представление о том, как получить текущие день недели и время с NTP-сервера.

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

  • Чтобы ESP8266 мог установить соединение с существующей сетью WiFi, вам необходимо изменить следующие две переменные в соответствии с учетными данными вашей сети.
  • Вам необходимо настроить смещение UTC для вашего часового пояса в секундах. Смотрите список часовых поясов относительно UTC. Вот несколько примеров для разных часовых поясов:
    • для UTC -5.00: -5 * 60 * 60: -18000
    • для UTC +1.00: 1 * 60 * 60: 3600
    • для UTC +0.00: 0 * 60 * 60: 0

    Как только вы закончите, загрузите скетч в ESP8266.

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

    Рисунок 4 ESP8266 считывает день недели и время из ответа NTP-сервера и выводит их монитор последовательного порта Рисунок 4 – ESP8266 считывает день недели и время из ответа NTP-сервера и выводит их монитор последовательного порта

    Объяснение кода

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

    • NTPClient.h – это библиотека работы со временем, которая выполняет синхронизацию с NTP-сервером;
    • библиотека ESP8266WiFi.h предоставляет специальные методы для работы ESP8266 с WiFi, которые мы вызываем для подключения к сети;
    • библиотека WiFiUdp.h обрабатывает протокол UDP, например открытие порта UDP, отправку и получение пакетов UDP и т.д.

    Затем мы настраиваем несколько констант, таких как SSID, пароль WiFi и смещение UTC, о которых вы уже знаете. Мы также определяем двумерный массив daysOfTheWeek .

    Теперь, прежде чем инициализировать объект NTP-клиента, нам нужно указать адрес NTP-сервера, который мы хотим использовать. pool.ntp.org – это открытый проект NTP, отлично подходящий для подобных вещей.

    pool.ntp.org автоматически выбирает серверы времени, которые географически близки к вам. Но если вы хотите сделать выбор явно, используйте одну из подзон pool.ntp.org.

    ЗонаАдрес сервера
    Весь мирpool.ntp.org
    Азияasia.pool.ntp.org
    Европаeurope.pool.ntp.org
    Северная Америкаnorth-america.pool.ntp.org
    Океанияoceania.pool.ntp.org
    Южная Америкаsouth-america.pool.ntp.org

    В функции setup() мы сначала инициализируем последовательную связь с ПК и подключаемся к сети WiFi с помощью функции WiFi.begin() .

    Когда ESP8266 подключится к сети, мы инициализируем NTP-клиент с помощью функции begin() .

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

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

    голоса
    Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector