Визуализация данных в виде графика — 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 полностью открытое, и мы приветствуем любую помощь по доработке!