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

Данный урок создан для версии 3.1.4, которая сейчас находится в предрелизовом тестировании. Скачать её можно здесь. Более подробно о проекте FLProg можно узнать из блога компании на хабре, сайта проекта и форума. Кроме того на канале ArduinoProm можно посмотреть огромное множество видео уроков.

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

Для начала создадим в три системных пользовательских параметра, в которых будет хранится текущее системное время контролера, часовой пояс, и адрес сервера точного времени, с которым будем синхронизироваться. Для этого находим ветку «Добавить параметр» в дереве проекта в узле “Пользовательские параметры”.



Откроется окно диалога добавления нового системного параметра. Заполним его.



В поле “Имя” введём имя параметра. Выберем тип параметра – “String”. Значение этого параметра будет динамически изменяться в процессе работы, поэтому отключим сохранение значение параметра в EEPROM. Поэтому же не задаем значение по умолчанию. Максимальную длину строки оставим 20 (вывод будет в виде 01:01:01 01-01-2018 то есть 19 символов).

Таким же образом добавим второй параметр



Только оставим сохранение в EEPROM, что бы контроллер запоминал введённый нами сервер, и зададим сервер по умолчанию.

И наконец, создадим третий параметр, значение часового пояса, для корректного отображения времени.



Тип параметра Integer, Обязательно сохранять в EEPROM, значение по умолчанию, на Ваш выбор (у меня это 4 часа).

В результате мы получили три пользовательских параметра



Переходим к схеме прошивки.

В библиотеке функциональных блоков находим блок “Получение времени с NTP сервера” и претаскиваем его на рабочую область схемы



Двойной клик по этому блоку открывает редактор параметров блока.



Рассмотрим настройки поподробнее.
NTP сервер — адрес сервера с которого будет браться точное время. Можно задать как константу. Можно выбрать из списка стандартных. Я все проверял – работают. Для выбора нажмите кнопку “Стандартные сервера”.



Но поскольку мы хотим “по взрослому” задавать адрес сервера из web интерфейса ставим галочку в чек бокс “Вход

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

Период запроса после получения первого ответа — как часто контроллер будет уточнять время у сервера. Оставляем по умолчанию, раз в полчаса. Так же можно задавать через вход, в миллисекундах.

Часовой пояс – Поскольку сервер отдаёт время по Гринвичу, этим параметром задаем смещение часового пояса в часах. Мы решили задавать этот параметр через web интерфейс, поэтому ставим галочку в чек бокс “Вход

Выход “Год”, Выход “Месяц”, Выход “День”, Выход “Час”, Выход “Минута”, Выход “Секунда” – в данном уроке они нам не нужны, поэтому галочки не устанавливаем.

Выход “Unix Time” – этот выход нам не нужен, галочку не ставим (если честно я пока не придумал User Case для него. Но на всякий случай сделал, вдруг, кому то пригодится).

Итого у нас получилась такая настройка блока



Соответственно изменился и блок на схеме прошивки



Найдем в библиотеке блок “Чтение системного параметра” и перетаскиваем его на схему.



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

Сначала нажимаем кнопку выбора системного параметра.



Открывается окно выбора системного параметра. Выбираем параметр “Сервер точного времени



На этом настройка блока закончена.

Располагаем удобно блоки и соединяем выход блока “Чтение системного параметра” со входом “Server” блока “Получение времени с NTP сервера



Перетаскиваем на схему ещё один блок “Чтение системного параметра” и настраиваем его на чтение параметра “Часовой пояс”.



Соединяем выход этого блока со входом “TimeZone” блока “Получение времени с NTP сервера



Добавляем на схему новую плату. Для этого нажимаем кнопку “Добавить плату



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



Вытаскиваем на схему на вторую плату блок “Получение данных с часов точного времени



Двойным кликом по нему вызываем диалог настройки блока. Нажав кнопку “New” вызываем диалог выбора часов и выбираем “Системные часы контроллера”.





Затем ставим галочку “Выход “Часы”



И заканчиваем редактирование блока.

Затем копируем этот блок ещё пять раз, переставляя в настройках каждого из них галочку выхода в последовательности Минута – Секунда – День — Месяц – Год.



Теперь вытаскиваем на схему из библиотеки блок “Конвертация строк”.



И в его настройках выбираем тип конвертации “Время



Копируем блок ещё пять раз, и собираем схему



Переносим на схему из библиотеки блок “Сложение строк



В настройках блока задаём 11 входов.



И соединяем блоки согласно схеме



На свободных входах блока задаём константы

Вход 2 — “:”
Вход 4 — “:”
Вход 6 – Пробел
Вход 8 — “-”
Вход 10 – “-”

Для задания константы производим клик правой кнопкой мыши на свободном входе и из выпавшего меню выбираем “Вставить константу



Откроется окно ввода константы, где в поле “Значение по умолчанию” вводится необходимая константа



Теперь вытаскиваем из библиотеки на схему блок “Запись системного параметра



В настройках блока снимаем галочку “Вход разрешения записи” и выбираем параметр “Дата — Время



Соединяем выход блока “Сложение строк” со входом блока “Запись системного параметра



В результате у нас должна получится такая схема (Для наглядности развернём первую плату).



Со схемой прошивки закончили, возвращаемся к дереву проекта.

На главную страницу Web интерфейса добавим три параметра (как это сделать смотри в предыдущем уроке).

Параметр 1 – Системный параметр “Дата — Время”, тип параметра – “Текст”, лейбла – “Время

Параметр 2 – Системный параметр “Сервер точного времени”, тип параметра – “Поле ввода”, лейбла – “Сервер

Параметр 3 – Системный параметр “Часовой пояс”, тип параметра – “Поле ввода”, лейбла – “Часовой пояс



Включаем на странице кнопку “Save



Заливаем программу в контроллер, и смотрим, что у нас получилось на главной странице (как это сделать, смотри предыдущий урок)

Сразу после подключения – с сервером точного времени ещё не синхронизировались



Через минуту (обновили страницу) – прошла синхронизация



Сменили часовой пояс и нажали кнопку сохранить



Проект, созданный на уроке можно скачать здесь.

Комментарии (6)


  1. smart_alex
    06.09.2018 08:28

    Всё это можно назвать руководством по работе в системе FLProg и наверное это полезная и кому-то нужная информация. Мне лично было бы гораздо интереснее почитать о принципах работы самой программы FLProg: методы генерации кода, методы компоновки скетча и согласования его блоков, принципы работы с подсистемами на уровне кода (EEPROM, сеть, дисплеи и т. д. ).

    То есть мне интересна не сама программа FLProg, а её внутренняя кухня (принципы работы с кодом скетча). Не знаю, правда, насколько это будет интересно публике, но я с удовольствием почитал бы такой цикл статей.


    1. totuin Автор
      06.09.2018 09:50
      +1

      Скорее всего, такой серии не будет, и я объясню почему.
      Дело в том, что я не программист. Я инженер, и подход к программированию у меня в корне отличается от классического.
      Вот пример. Основной алгоритм анализа схемы, который располагает блоки в определённой последовательности для компиляции.
      Как я думаю, рассуждал бы настоящий программист.
      Схема = это в принципе дерево, в конце концов граф. Значит, основываясь на полученных в институте знаниях, применяем теорию графов и разбираем схему (во какие умные слова я знаю, нахватался по верхам))) ).
      Честно скажу, я даже поискал в интернете эту самую теорию графов и алгоритм обхода деревьев и понял, что там мне делать нечего.
      Как рассуждал я.
      Сжема – это 2D, нам надо растянуть её в ниточку 1D. Значит, берём блоки по очереди, находим блоки, которые подключены к его входам и находящиеся в коллекции после себя и переносим их перед собой. И так в рекурсии (я и это слово знаю)))) ) до тех пока такой ситуации не будет.

      Там конечно есть ещё тонкости связанные с тем, что на одной плате могут быть несколько логических цепочек, нахождением средней линии отдельных цепочек – но это мелочи.
      Возможно, я открыл велосипед, возможно за такой подход настоящие программисты меня разопнут на столбе, но инженерный подход в программировании работает, и существование проекта FLProg это подтверждает.
      Но вот описывать свои решения я не буду, потому что прекрасно понимаю какую кучу негатива и плевков я получу, например, озвучив свою твердую уверенность в том, что автоматизированное тестирование в ряде случаев (и проект FLProg в эти случаи входит) – зло! Почему, то же не буду объяснять – это будет дискуссия на полгода.
      Вообще я очень жалею, что убили Гиктайм, поскольку его создание было одним из самых верных решений Хабра. Разделили людей по интересам. На хабре остались матёрые программисты, и сюда заходили только профессионалы, которым он был интересен. Я, например, за время существования гиктайма пару раз заглянул на хабр, перекрестился (поскольку понял лишь десять процентов написанных здесь слов), и быстренько закрыл. Зато гиктайм был для обычных людей, для самодельщиков, просто любителей разной электроники, да и для всех людей интересующихся техникой, IT на любительском уровне. То есть для всех. Ну и я там свои уроки писал, люди заходили, читали, и их интересовали не потроха программы, а именно то, что можно было сделать с её помощью (для чего она собственно и создавалась). После убийства гиктайма, руководители проекта хабр наверно надеялись, что весь это народ перейдет на хабр. Но это не произошло. Ему здесь просто не интересно, как не заходили они сюда при жизни гиктайма, так и не заходят после его смерти. В их понимании, площадку просто закрыли, и они ушли в другие места (по крайней мере, так считают те люди, с которыми я общаюсь). Ну а хабр так и остался клубом академических программистов, где обычный человек понимает меньше половины слов.
      Жаль……


      1. smart_alex
        06.09.2018 10:09
        +1

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

        На оголтелых критиков с кармой 0 и количеством статей 0 я бы тоже не рекомендовал обращать внимание — адекватных людей на Хабре всегда значительно больше.

        А что касается цикла статей — мне ваш комментарий было интереснее читать, чем всю статью. Так что подумайте, многим то, как работает ваша система будет очень интересно узнать. Ведь тема автогенерации кода — это очень интересная (с академической точки зрения) и актуальная (с практической точки зрения) тема.


        1. totuin Автор
          06.09.2018 10:37

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


  1. renat85
    06.09.2018 09:15

    Будет ли реализована аналогичная поддержка сети и данного функционала на контроллерах arduino и сетевом шилде w5100? Функционал очень востребован на arduino по причине большего количество GPIO, нежели на ESP.


  1. totuin Автор
    06.09.2018 09:16

    В планах есть, но когда это будет реализовано, пока сказать не могу