IoT Prime — Эксперимент 02: Способы визуализации данных
Введение
Хотя отправка данных в терминал — хороший способ увидеть, что происходит на плате, существуют другие способы просмотра данных, которые помогут лучше понять информацию. Построение графиков — очень мощный инструмент для достижения лучшего понимания того, что происходит с данными. В процессе разработки этого проекта вы познакомитесь с двумя различными техниками построения графиков на основе реальных данных, поступающих с вашей платы.
Первая техника предполагает использование классического редактора Arduino, который включает простой инструмент для построения графиков из данных по мере их поступления через последовательный порт. Вторая техника будет использовать внешнюю программу для сохранения данных в файл CSV (значения, разделённые запятыми), который вы сможете импортировать в табличный редактор, такой как LibreOffice Calc, Microsoft Excel или Google Sheets.
Цели обучения
Цели этого упражнения:
Построение графиков данных в реальном времени с помощью редактора Arduino
Чтение точек данных и сохранение их в файлы на компьютере
Понимание того, как работает формат файлов CSV
Изучение датчиков влажности
Сложность упражнения
Для выполнения этого упражнения необходимы предварительные знания в:
Использовании офлайн-редактора кода Arduino
Управлении файлами на компьютере
Установке и использовании сторонних приложений
Используемые компоненты
MKR1010
Arduino MKR1010 (читается «мэйкер тен тен») — это плата микроконтроллера с чипом, который позволяет устанавливать беспроводное соединение WiFi или Bluetooth с другими платами или компьютерами. Мы увидим некоторые из этих возможностей в действии в этой серии упражнений.
Начало работы с платой
Вы можете узнать, как подключить эту плату к компьютеру, ознакомившись с Руководством по началу работы. Вы можете использовать это руководство для установки офлайн-версии Arduino IDE, которая будет работать на вашем компьютере, и для того, чтобы научиться устранять возможные проблемы при написании первых программ. Вы также можете начать использовать онлайн-версию редактора кода Arduino, которую найдёте по адресу: https://create.arduino.cc. Обратите внимание, что для использования онлайн-редактора необходимо стать зарегистрированным пользователем Arduino.
MKR ENV Shield
Shield (плата расширения) — это плата, которую вы добавляете к плате микроконтроллера Arduino для расширения функциональности. ENV Shield оснащён следующими датчиками:
Температура
Влажность
Атмосферное давление
Освещённость (Lux)
УФ-излучение A и B
Различные датчики взаимодействуют с MKR1010 по протоколам SPI или I2C — стандартным механизмам связи внутри электронных плат.
ENV Shield оснащён слотом для карты microSD. Он может использоваться для локального хранения данных, собранных датчиками. Это может быть полезно при проектировании систем, которые могут быть не подключены к сети, или когда сбор данных происходит с такой скоростью, что невозможно передать все данные по сети из-за ограничений пропускной способности.
Библиотека ENV Shield
Эти новые возможности поставляются с соответствующим программным обеспечением, которое необходимо установить. Программное обеспечение, позволяющее использовать определённый shield, мы называем библиотекой. Следуйте этому пошаговому руководству по установке любой библиотеки, выберите нужную библиотеку ENV Shield, введя её название в поле поиска — это даст вам доступ к различным датчикам на плате расширения.
MKR Relay Proto Shield
MKR Relay Proto Shield — это плата, предоставляющая вашей плате MKR1010 два реле — электромеханических переключателя, которые можно использовать для управления любыми электрическими устройствами, активируемыми переключателем вкл/выкл: лампами, вентиляторами, водяными насосами, электродвигателями, обогревателями и т. д. Активация реле так же проста, как активация одного из управляющих пинов — это позволит электричеству протекать.
Плата имеет область прототипирования, которую можно использовать для пайки собственных компонентов и, таким образом, создания более окончательной установки. Это то, что мы не будем рассматривать в данном курсе, но вы должны знать о такой возможности.
Сборка плат
Мы рекомендуем собрать три платы вместе уже сейчас и оставить их в таком виде на протяжении всего курса. Конфигурация сборки проста в монтаже и обеспечивает надёжное крепление компонентов.
Рисунок 1: MKR1010 + ENV и Relay Shields
Собираемые данные
В этом упражнении мы будем работать с двумя датчиками одновременно. Вместе с датчиком температуры, который вы использовали в предыдущем упражнении, вы познакомитесь с датчиком влажности на ENV Shield.
Рисунок 2: ENV Shield с выделенными датчиками температуры и влажности
ENV Shield имеет датчик температуры и влажности HTS221. Это датчик, произведённый компанией ST microelectronics. Вы можете посмотреть его даташит здесь. Библиотека предоставляет доступ к датчику через методы readTemperature() и readHumidity(). Вы можете вызывать эти методы через объект ENV, который создаётся и предоставляется при подключении библиотеки. Другими словами, все датчики на плате расширения доступны через вызов ENV.readSensor(), где readSensor должен соответствовать конкретному проверяемому датчику. В нашем случае это температура и влажность, поэтому методы называются readTemperature() и readHumidity().
Подробнее о специфике датчика температуры читайте в предыдущем упражнении. Датчик влажности, с другой стороны, возвращает относительную влажность — научную единицу, выраженную в процентах, которая для данного объёма воздуха учитывает количество воды в газообразном состоянии по сравнению с общим количеством, которое данный объём воздуха мог бы содержать. Измерение влажности таким образом является результатом давления воды и температуры.
Диапазон и точность датчика делают его подходящим для множества интересных экспериментальных установок. Диапазон влажности составляет ±3,5% отн. вл. при 20 (°C) до +80% отн. вл. Чувствительность по относительной влажности составляет 0,004% отн. вл.
Как данные потребляются напрямую из последовательного порта
В этом эксперименте наша цель — представить данные в виде графика. Графики помогают визуализировать информацию из необработанных данных. Вместо просмотра потоков чисел с помощью графиков мы можем увидеть, с одного взгляда, возникновение событий в данных и то, как информация соотносится с другими переменными, такими как, например, время. Давайте начнём с простого построения графика данных, поступающих с последовательного порта для показаний температуры, используя код из предыдущего упражнения. В этом случае вы будете использовать классический редактор Arduino, который поставляется с инструментом для автоматического построения графиков. Используя код из предыдущего эксперимента, просто перейдите в редактор и вместо открытия монитора последовательного порта откройте инструмент Serial Plotter, доступный в меню Tools редактора.
Рисунок 3: Выбор меню Tools
Тот же скрипт, который ранее выводил текст в терминале, теперь будет создавать график при использовании этого инструмента. Примечание: только один из двух инструментов может работать одновременно. Вы можете использовать либо плоттер, либо терминал для проверки результатов работы вашей Arduino.
Рисунок 4: Serial Plotter из офлайн Arduino IDE
Эта техника даёт вам способ строить графики данных по мере их поступления, но они теряются со временем. Нас интересует анализ исторических данных с ваших датчиков, что требует сохранения их в файлы или, альтернативно, в облако. Во второй части этого упражнения вы будете сохранять данные в файл и затем открывать его в табличном программном обеспечении.
Как данные можно сохранять в файлы из последовательного порта
Стандартный последовательный терминал в классическом редакторе Arduino не сохраняет данные, поступающие с порта, в файлы. Для этого можно использовать различные техники:
Использовать сторонний монитор последовательного порта, такой как: Bray Terminal (Windows), Zterm (OSX) или CuteCom (Linux). Мы сосредоточимся на использовании CoolTerm — кроссплатформенной альтернативы. Для Chromebook вы можете изучить использование Putty
Использовать командную строку (OSX / Linux) или PowerShell (Windows) для чтения данных и отправки входящих байтов в файл, как объясняется в этом руководстве
Создать собственную исполняемую программу, способную читать данные с последовательного порта и отправлять их в файл
Вариант, который мы выберем в данном случае, как наиболее простой на данном этапе, — это загрузить и запустить CoolTerm — стороннее программное обеспечение, которое упрощает процесс получения данных с последовательного порта и отправки их в файл. Вы должны обратиться к загруженному файлу CoolTerm за инструкциями по установке программного обеспечения в вашей операционной системе. После запуска оно должно выглядеть следующим образом:
Рисунок 5: CoolTerm открыт, захватывает данные из последовательного терминала
Это программное обеспечение имеет опцию в меню Connection - Capture to text file - Start, которая активирует запись данных, поступающих через порт, непосредственно в текстовый файл.
Рисунок 6: Начало захвата порта
Однако есть задача, касающаяся того, как информация должна храниться. В нашем случае мы хотим, чтобы информация попала в файл типа CSV, который можно было бы напрямую импортировать в табличное программное обеспечение. Формат CSV устанавливает, что данные могут быть разделены любым маркером, таким как запятая, точка, звёздочка и т. д. И что различные записи хранятся в строках. Другими словами, файл CSV будет выглядеть примерно следующим образом:
Рисунок 7: Текстовый редактор с данными в формате CSV
В данном случае мы будем заставлять нашу плату Arduino отправлять данные через последовательный порт для воспроизведения этого формата, так что импорт данных в выбранное табличное программное обеспечение будет почти автоматическим.
Схема
В этом проекте схема предельно проста — поскольку датчик, который мы собираемся использовать, является частью ENV Shield, нет необходимости использовать макетную плату.
Рисунок 8: Иллюстрация печатной платы
Фотография конструкции
Рисунок 9: MKR1010 и shields соединены вместе
Пошаговое написание кода
Перед началом программирования, после подключения платы к компьютеру, убедитесь, что вы выбрали правильную плату и порт связи в меню Tools офлайн IDE (или в выпадающем списке онлайн-версии). Вам не нужно будет отключать плату в процессе, который следует далее.
Начальный код
Начните с создания новой программы и дайте ей хорошее имя. Например: 01_two_sensors_reader_v0001. Это имя отражает то, что это вторая программа курса (01), её название (two_sensors_reader) и номер версии. Вы можете разработать собственную технику именования файлов, но пока давайте следовать показанной здесь.
/*
01 Two Sensors Reader v0001
Read information from the temperature and humidity sensors
on the MKR ENV Shield and send it back to the computer
via the USB Cable in order to create a CSV file using a
serial port monitor with logging option (e.g. CoolTerm)
(c) 2019 D. Cuartielles for Arduino
This code is Free Software licensed under GPLv3
*/
#include <Arduino_MKRENV.h>
float temperature = 0;
float humidity = 0;
void setup() {
Serial.begin(9600);
while (!Serial);
if (!ENV.begin()) {
Serial.println("Failed to initialize MKR ENV shield!");
while (1);
}
// init the CSV file with headers
Serial.println("temperature,humidity");
}
void loop() {
// read the sensors values
temperature = ENV.readTemperature();
humidity = ENV.readHumidity();
// print each of the sensor values
Serial.print(temperature);
Serial.print(",");
Serial.println(humidity);
// wait 1 second to print again
delay(1000);
}
Рисунок 10: Листинг кода для скетча 01_two_sensors_reader_v0001
Для использования библиотеки ENV Shield вызовите:
#include <Arduino_MKRENV.h>
Использование последовательного порта
Вы можете увидеть, как последовательный порт инициализируется на плате вызовом Serial.begin(9600), одновременно следующая строка while (!Serial) указывает программе не продолжать, пока терминал не будет открыт на компьютере. Это важно, поскольку мы будем сохранять данные в файл, и файл не будет инициализирован до тех пор, пока не будет запущено программное обеспечение последовательного терминала.
Вызов ENV.begin() одновременно инициализирует датчики на плате и проверяет, что shield подключён к плате MKR1010 и датчики работают правильно.
Получение данных датчика
Показания всех датчиков имеют тип float, поэтому объявления переменных выглядят как float temperature = 0 и float humidity = 0.
При вызове temperature = ENV.readTemperature() и humidity = ENV.readHumidity() программа запрашивает информацию об этих датчиках с платы расширения и сохраняет их в соответствующих переменных. Ключевой аспект заключается в том, как упаковать эту информацию для отправки обратно на компьютер, который извлечёт её и поместит в файл.
Как вы видели в примере файла CSV, информация разделяется запятыми (вы можете использовать другие разделители) и каждая запись хранится в отдельных строках. Важная особенность заключается в том, что вы можете использовать первую строку файла CSV в качестве индикаторов типа сохраняемых данных. Таким образом, если вы хотите сохранять температуру первой, а влажность второй, вы можете просто убедиться, что первая строка данных, отправляемых на компьютер, содержит строку: «temperature,humidity» (если вам нужно использовать пробелы в строках, следует использовать другой разделитель). Эта первая строка должна быть включена только один раз, для чего вы добавляете Serial.println("temperature,humidity") непосредственно в setup программы, после того как последовательный порт стал доступен.
В цикле loop, после запроса данных с датчиков, вам нужно будет последовательно вывести каждый элемент данных в последовательный порт, включая запятую между информацией каждого датчика:
Serial.print(temperature); Serial.print(","); Serial.println(humidity);
Обратите внимание, как программа в конце вызывает Serial.println() для включения конца строки после печати данных.
Отображение данных
Помимо построения графиков с помощью плоттера, включённого в редактор Arduino, графическое представление данных из файла CSV выполняется путём импорта данных в табличное программное обеспечение и создания графиков. Загрузите код на плату Arduino, откройте CoolTerm с предварительно настроенной опцией сохранения в файл, запишите данные некоторое время и давайте поработаем с полученным файлом.
Создание файла
При вызове опции использования файла в CoolTerm вам будет предложено выбрать, где записать файл на компьютере и как его назвать. Для удобства сохраните файл на рабочем столе и назовите его datalog.csv.
Рисунок 11: Меню CoolTerm и выбор опций
Рисунок 12: Выбор имени файла в CoolTerm
Открытие порта и захват данных
Нажмите кнопку Connect в интерфейсе CoolTerm — вы увидите, как данные отображаются, в то время как в фоновом режиме они сохраняются в созданный вами файл. Не держите слишком долго — мы записываем данные раз в секунду, если вы подождёте пару минут, у вас будет достаточно данных для получения значимых результатов. Поскольку вы работаете с температурой и влажностью, попробуйте накрыть датчик рукой, подуть на него воздухом, поместить плату рядом с чашкой с горячей жидкостью (не внутрь!!) — собранные данные будут непосредственно видны на графике, который вы создадите позже.
Рисунок 13: Данные поступают в CoolTerm
Закрытие порта и проверка файла
Нажмите кнопку Disconnect в интерфейсе CoolTerm — это закроет соединение с платой. Нажмите Stop в меню, чтобы остановить запись. Файл будет на вашем рабочем столе. Это обычный текстовый файл, что означает, что вы можете открыть его с помощью обычного текстового редактора. Если файл не слишком большой, вы можете открыть его и заглянуть внутрь.
Рисунок 14: CoolTerm, нажатие на disconnect
Рисунок 15: CoolTerm, нажатие на stop
Как вы видите, файл будет иметь размер в десятки килобайт после записи данных в течение 5 минут. Чем больше файл, тем сложнее будет открыть его в текстовом редакторе. Например, если ваш файл превышает 100 КБ, лучше не открывать его таким программным обеспечением, а вместо этого напрямую импортировать в табличную программу.
Рисунок 16: Рабочий стол с отображением свойств файла
Рисунок 17: Файл, открытый в текстовом редакторе
Импорт файла в табличный редактор
В этом примере мы будем использовать LibreOffice Calc — свободный табличный редактор, который вы можете скачать здесь вместе с другими бесплатными инструментами от The Document Foundation, такими как текстовый редактор или редактор презентаций. Calc для целей этого эксперимента эквивалентен Microsoft Excel или Google Sheets (особенно если вы используете Chromebook). Не стесняйтесь попробовать это с любым инструментом, который вы используете в повседневной работе.
Рисунок 18: Навигационное меню в LibreOffice для открытия CSV файла
Вам нужно будет импортировать документ, выбрав пункт меню File - Open. CSV — один из доступных форматов файлов. Программа откроет меню с опциями, где вы сможете настроить способ импорта данных в таблицу. Опции используются для определения разделителя данных (запятая в нашем случае), размера ячеек в таблице и т. д.
Рисунок 19: LibreOffice, инструмент импорта CSV
Вы увидите предварительный просмотр в инструменте импорта. Имейте в виду, что предварительный просмотр и результаты не всегда совпадают. Скорее всего, для типа данных, с которыми мы работаем, они будут выглядеть одинаково.
Рисунок 20: LibreOffice, таблица с данными
Создание простого графика
У нас есть два различных потока данных: температура и влажность. Далее мы создадим график для отображения одного из них. Вы можете повторить шаги для построения графика другого набора данных. Просто следуйте этим шагам:
1. Выберите столбец, соответствующий данным, которые вы собираетесь отобразить графически
2. Нажмите на значок Создать гистограмму
3. Выберите тип графика, который хотите создать — мы рекомендуем линии
4. Подтвердите диапазон данных, которые будете представлять
5. Подтвердите, что первая строка — это название данных
6. Наслаждайтесь вашим графиком
Рисунок 21: Видео, показывающее предыдущий процесс шаг за шагом
Задание: добавить временную метку
На данный момент мы просто записывали данные. Мы знаем — потому что мы написали программу — что данные захватываются раз в секунду, но вспомните ли вы об этом, когда будете проверять данные, возможно, через несколько месяцев? Хорошей практикой является добавление временной метки к данным — это поможет вам вспомнить частоту захвата данных. Для этого вы должны использовать функцию millis(), которая сообщает, сколько времени прошло с момента запуска программы, вместе с Serial.print() для добавления ещё одного столбца к вашим данным. Позже вы можете использовать этот новый столбец для добавления дополнительной информации на ось X вашего графика.
Рисунок 22: График с временем на оси X
Если вы хотите получать абсолютную временную метку, поскольку мы используем MKR1010, должна быть возможность подключить вашу плату к интернету, получить текущую дату и время и начать использовать их в вашей программе. Вы можете ознакомиться с этим примером и попробовать решить проект, который будет:
1. Получать дату и время из интернета
2. Добавлять временную метку к данным
3. Сохранять данные в файл
4. Строить графики данных с использованием реального времени
Подведение итогов
В этом проекте вы научились получать данные с датчиков, отправлять их на компьютер через кабель, соединяющий компьютер с платой, и либо строить графики напрямую, либо сохранять данные в файл CSV, который можно использовать в табличном программном обеспечении. В процессе вы увидели, что существуют сторонние инструменты, которые можно использовать как для захвата данных, так и для их анализа.
Эти шаги являются базовыми, если вы хотите использовать свою плату в каком-либо научном проекте, где нужно собирать данные и строить графики для того, чтобы прийти к выводам о том, что происходит с данными. Мы дали вам задание добавить временную метку к вашим данным. Вы можете использовать как относительные, так и абсолютные временные метки. Возможно получить дату и время из интернета, поскольку MKR1010 имеет беспроводное подключение и может подключаться к другим системам для сбора этой информации. Более простое решение с использованием внутреннего счётчика времени также возможно и может работать даже при отсутствии интернета.