Визуализация данных в виде графика — SFMonitor

Визуализация данных в виде графика — SFMonitor

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

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

Такой подход хорош, когда нам достаточно оценить показания датчиков уже после проведения эксперимента. Если же график нужно строить в режиме реального времени потребуется специальное приложение для визуализации потоков данных. Например, это можно сделать с помощью известного пакета MatLab. В одной из послежний версий Arduino IDE также появилась возможность строить простые графики.

На этом уроке мы поговорим еще про один инструмент для визуализации — приложение SFMonitor. Это монитор последовательного порта с открытыми исходными кодами, который я разработал пару лет назад для работы над системой стабилизации беспилотников. В основе SFMonitor лежит проект Eli Bendersky написанный на языке python и библиотеки PyQt. Монитор позволяет строить сразу несколько графиков, используя для передачи данных библиотеку SerialFlow. Обо всем этом я расскажу далее.

Строим простой график в SFMonitor

Для того, чтобы построить в SFMonitor самый простой тип графика, потребуется несложная программа, которая будет отправлять в COM-порт показания какого-нибудь датчика. Для примера используем фоторезистор, подключенный к аналоговому порту Ардуино.

Важно отметить, что мы будем передавать всего один байт за раз, а это число от 0 до 255. АЦП же нам дает число от 0 до 1023. Мы используем функцию map, чтобы нормировать результат АЦП в 1 байт.

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

Теперь включим монитор и настроим параметры. Первое, что нужно будет выбрать — это тип графика. В выпадающем меню выбираем «Простой».

Затем настраиваем формат данных в пакете. Для этого зайдем в пункт меню «Данные/Настройка потоков».

На вкладке «Общие» выбираем размер чисел в пакете — 1 байт.

Переходим на вкладку «Поток №1» и ставим галку «Беззнаковые значения». Это означает, что мы будем принимать строго положительные числа от 0 до 255.

Теперь выбираем COM-порт Ардуино и скорость передачи данных.

Наконец, запускаем монитор и наблюдаем график.

Пакетная передача данных

Что делать, если нам нужно строить график по шкале от 0 до 1024? или еще больше, от -1 000 000 до 1 000 000. А еще интересно, как сразу передавать данные с двух, или с трех датчиков? Нужен другой способ передачи данных. Способ, при котором данные складываются в некий виртуальный пакет в заданном порядке, затем отправляются адресату, который разворачивает пакет. Собственно, такой метод передачи данных и называют пакетным. На основе пакетов работает весь интернет и большинство промышленных линий связи.

В SFMonitor для пакетной передачи используется библиотека SerialFlow. Эта библиотека позволяет задать формат пакета и предоставляет функции для упаковки данных в пакет и для их распаковки обратно.

Напишем программу для Ардуино, которая будет передавать показания акселерометра ADXL345 для всех трех осей в диапазоне от -32768 до 32767.

Чтобы SFMonitor смог отобразить три графика настроим следующие параметры:

  • Формат данных — выбираем v(t);
  • Потоки — ставим галку для всех трех;
  • Размер значения в пакете — 2 байта;
  • Беззнаковые значения — ставим для всех трех потоков.

После запуска монитора получим такие вот три графика:

Построение графиков в Arduino IDE

Начиная с версии 1.6.6 в среде Arduino IDE появилось штатное средство для построения графиков. Немного изменим программу, чтобы Ардуино смогла корректно передавать данные с акселерометра для встроенного монитора.

Используем обычный println. Загружаем программу на Ардуино и запускаем встроенный монитор через меню «Инструменты/ Плоттер по последовательному соединению». Результат ниже.

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

Заключение

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

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

📎📎📎📎📎📎📎📎📎📎