IoT Prime — Эксперимент 03: Хранение данных на картах памяти
Введение
Этот эксперимент познакомит вас с использованием карт памяти SD с вашим ENV Shield для хранения данных в файлах, которые вы сможете позже перенести на компьютер и использовать, как было объяснено в предыдущем эксперименте. В данном случае мы представим оставшиеся датчики на плате расширения: атмосферное давление и различные типы светового излучения, соберём данные со всех датчиков и сохраним их в файл на SD-карте для последующего анализа.
Существуют сценарии, когда невозможно отправить данные в другое место через WiFi или Bluetooth (как можно было бы сделать с MKR1010), но вы всё равно заинтересованы в сборе данных для офлайн-анализа. Также может быть случай, когда вы можете передавать в реальном времени только небольшие объёмы данных, но заинтересованы в сборе максимально возможного количества для последующего углублённого изучения. Существует также ситуация, когда вы хотите иметь локальную резервную копию данных на случай сбоя связи в любой момент. Все эти сценарии поддерживаются использованием слота SD-карты в ENV Shield — всё, что вам понадобится, это карта micro SD.
Цели обучения
Цели этого эксперимента:
Изучение библиотеки SD для Arduino
Создание файлов на SD-карте, чтение их на компьютере
Изучение датчиков атмосферного давления
Изучение датчиков УФ-излучения и освещённости
Сложность упражнения
Для выполнения этого упражнения необходимы предварительные знания в:
Использовании библиотек
Использовании файлов CSV
Используемые компоненты
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
SD-карта и картридер
Обратите внимание, что карта памяти не входит в комплект набора — вам нужно будет найти её отдельно. Также, если ваш компьютер не имеет картридера, вам понадобится внешний картридер или вы можете научиться использовать плату Arduino и программу последовательного терминала (CoolTerm) для переноса файла на компьютер.
Рисунок 2: Карта Micro SD
Собираемые данные
В этом упражнении мы будем собирать данные со всех датчиков ENV Shield. Помимо датчиков температуры и влажности, которые вы использовали в предыдущих упражнениях, вы познакомитесь с датчиками атмосферного давления и освещённости на плате расширения.
Датчик давления
Рисунок 3: ENV Shield с выделенным датчиком давления
ENV Shield имеет датчик атмосферного давления LPS22HB. Это датчик, произведённый компанией ST microelectronics. Вы можете посмотреть его даташит здесь. Библиотека предоставляет доступ к датчику через метод readPressure(), который может принимать либо отсутствие параметров, либо один из следующих трёх, определяющих единицы измерения давления:
PSI — датчик возвращает данные в фунтах на квадратный дюйм
MILLIBAR — датчик возвращает данные в миллибарах
KILOPASCAL — датчик возвращает данные в килопаскалях, это опция по умолчанию
Вы можете вызывать этот метод через объект ENV, который создаётся и предоставляется при подключении библиотеки. Другими словами, все датчики на плате расширения доступны через вызов ENV.readSensor(), где readSensor должен соответствовать конкретному проверяемому датчику. В нашем случае это атмосферное давление, поэтому метод называется readPressure().
Датчик абсолютного давления работает как цифровой барометр — он обрабатывает данные, полученные от движения подвешенной кремниевой мембраны. Изменение давления на мембрану влияет на мост Уитстона, где пьезосопротивления измеряются аналого-цифровым преобразователем и обрабатываются в цифровом виде. Датчик также способен считывать температуру, однако эта функция не представлена в библиотеке ENV Shield, поскольку мы считываем температуру с датчика температуры + влажности.
Диапазон и точность датчика делают его подходящим для множества научных экспериментов. Диапазон давления составляет от 260 до 1260 гПа с точностью ±0,1 гПа в диапазоне температур от 0 °C до +65 °C. Однако датчик может работать в более ограниченном диапазоне давления при расширенном диапазоне температур от -40 °C до +85 °C.
Датчики освещённости
Рисунок 4: ENV Shield с выделенным датчиком освещённости
ENV Shield имеет два датчика освещённости: VEML6075 (даташит здесь) и TEMT6000 (даташит здесь). Оба датчика производятся компанией Vishay Semiconductors. Библиотека предоставляет доступ к датчикам через методы readUVA(), readUVB(), readUVIndex() и readUVIlluminance(). Первые три метода работают с датчиком VEML6075, а последний — с TEMT6000.
Солнечное излучение имеет преимущественно оптическую природу. Оно состоит из ультрафиолетовых (УФ), видимых и инфракрасных (ИК) компонентов. Есть и другие компоненты, но они не могут быть измерены датчиками на ENV Shield. УФ-излучение можно разделить на UVA, UVB и UVC в зависимости от длины волны. Из-за атмосферы не все компоненты ультрафиолетового света достигают поверхности Земли — только длинноволновое ультрафиолетовое излучение (UVA) и коротковолновое ультрафиолетовое излучение (UVB) проходят через атмосферу и достигают нас. Общее УФ-излучение состоит из 95% излучения типа UVA и 5% типа UVB. В прошлом единственным УФ-излучением, воздействующим на нас — людей, животных и растения — было излучение от солнца. В настоящее время существуют другие источники УФ-излучения от искусственного оборудования.
УФ-индекс — это инструмент, предназначенный для информирования широкой общественности об УФ-излучении. Он был предложен Всемирной организацией здравоохранения, Организацией Объединённых Наций и другими организациями. УФ-индекс — это безразмерная величина, полученная из общего количества излучения, измеренного в ваттах на квадратный метр (Вт/м²). УФ-индекс на поверхности Земли должен находиться в диапазоне от 0 до 12, при этом значения выше 11 считаются экстремальными. УФ-индекс рассчитывается с использованием значений излучения UVA и UVB в качестве параметров.
Подробнее об расчёте УФ-индекса и формах УФ-излучения.
Диапазон и точность УФ-датчика делают его подходящим для множества научных экспериментов. Диапазон рабочих температур составляет от -40 °C до +85 °C.
С другой стороны, освещённость, которую может регистрировать датчик TEMT6000, выражает интенсивность света в видимой части светового спектра. Другими словами, он может измерять, насколько интенсивен свет, который мы видим своими глазами (помните, что УФ и ИК свет невидимы). Вызов readUVIlluminance() может иметь три различных параметра в зависимости от выбранных единиц измерения для ожидаемого результата:
FOOTCANDLE
METERCANDLE
LUX — это опция по умолчанию
Давайте сосредоточимся на единице LUX, поскольку остальные можно получить математическим расчётом из неё. Эта единица представляет один люмен на квадратный метр. В отличие от измерения в ваттах на квадратный метр, которое по-разному взвешивает мощность сигналов на различных частотах спектра, люмены рассчитываются путём анализа математической реакции человеческого глаза на различные длины волн. Таким образом, LUX является мерой того, насколько интенсивен свет для человеческого глаза.
На техническом уровне датчик TEMT6000 представляет собой фототранзистор — компонент, который по-разному пропускает электроны в зависимости от количества падающего на него света. Он рассчитан для адаптации к чувствительности человеческого глаза. Другими словами, этот датчик сообщает вам, насколько интенсивен свет для ваших глаз. Диапазон и точность датчика делают его подходящим для множества научных экспериментов. Угол раскрытия датчика составляет ±60°, и хотя он достигает максимума на 570 нм, он обнаруживает свет в диапазоне от 440 нм до 800 нм при температуре от -40 °C до +100 °C.
Другие датчики
Подробнее о специфике датчиков температуры и влажности читайте в предыдущем упражнении.
Как потребляются данные
В этом примере данные будут храниться на SD-карте, которую затем можно подключить к компьютеру, где мы сможем построить графики информации непосредственно из файла CSV, сгенерированного платой Arduino. В идеале вы соберёте схему с внешним источником питания, таким как батарейный блок или аналогичное устройство, и дадите ей поработать некоторое время. После захвата данных вы либо извлечёте SD-карту и подключите её к компьютеру с помощью картридера, либо используете скетч на плате Arduino, который прочитает данные с платы и отправит их обратно на компьютер, где вы создадите файл с помощью программы последовательного терминала, например CoolTerm.
Схема
В этом проекте схема предельно проста — поскольку мы будем использовать только датчики ENV Shield, нет необходимости использовать макетную плату.
Рисунок 5: Иллюстрация печатной платы с использованием модели Fritzing
Фотография конструкции
Рисунок 6: MKR1010 и Shields соединены вместе
Пошаговое написание кода
Перед началом программирования, после подключения платы к компьютеру, убедитесь, что вы выбрали правильную плату и порт связи в меню Tools офлайн IDE (или в выпадающем списке онлайн-версии). Вам не нужно будет отключать плату в процессе, который следует далее.
Начальный код
Начните с создания новой программы и дайте ей хорошее имя. Например: 02_sensors_to_SD_v0001. Это имя отражает то, что это третья программа курса (02), её название (sensors_to_SD) и номер версии. Вы можете разработать собственную технику именования файлов, но пока давайте следовать показанной здесь.
/*
02 Sensors to SD v0001
Read information from the all of the sensors
on the MKR ENV Shield and store it on a
CSV file inside an SD card. Connect the SD
card to the slot on the ENV Shield
(c) 2019 D. Cuartielles for Arduino
This code is Free Software licensed under GPLv3
*/
#include <Arduino_MKRENV.h>
#include <SPI.h>
#include <SD.h>
// chip select for SD card
const int SD_CS_PIN = 4;
// variables
float temperature = 0;
float humidity = 0;
float pressure = 0;
float UVA = 0;
float UVB = 0;
float UVIndex = 0;
// file object
File dataFile;
void setup() {
Serial.begin(9600);
// init the ENV Shield
if (!ENV.begin()) {
Serial.println("Failed to initialize MKR ENV shield!");
while (1);
}
// init SPI
SPI.begin();
delay(100);
// init SD card
if(!SD.begin(SD_CS_PIN)) {
Serial.println("Failed to initialize SD card!");
while (1);
}
// init the logfile
dataFile = SD.open("log-0000.csv", FILE_WRITE);
delay(1000);
// init the CSV file with headers
dataFile.println("temperature,humidity,pressure,UVA,UVB,UVindex");
// close the file
dataFile.close();
delay(100);
}
void loop() {
// init the logfile
dataFile = SD.open("log-0000.csv", FILE_WRITE);
delay(1000);
// read the sensors values
temperature = ENV.readTemperature();
humidity = ENV.readHumidity();
pressure = ENV.readPressure();
UVA = ENV.readUVA();
UVB = ENV.readUVB();
UVIndex = ENV.readUVIndex();
// print each of the sensor values
dataFile.print(temperature);
dataFile.print(",");
dataFile.print(humidity);
dataFile.print(",");
dataFile.print(pressure);
dataFile.print(",");
dataFile.print(UVA);
dataFile.print(",");
dataFile.print(UVB);
dataFile.print(",");
dataFile.println(UVIndex);
// close the file
dataFile.close();
// wait 1 second to print again
delay(1000);
}
Рисунок 7: Листинг кода 02_sensors_to_SD_v0001
Для использования библиотеки ENV Shield вызовите:
#include <Arduino_MKRENV.h>
Вызов ENV.begin() одновременно инициализирует датчики на плате и проверяет, что shield подключён к плате MKR1010 и датчики работают правильно.
Использование SD-карты
Arduino имеет официальную библиотеку, которую можно использовать для записи и чтения файлов с SD-карт, создания каталогов и т. д. Ознакомьтесь со справочником по этой библиотеке здесь. Для её использования необходимо вызвать:
#include <SPI.h>
а также:
#include <SD.h>
плюс инициализировать библиотеку в методе setup вашего скетча. SD-карты управляются через SPI-коммуникацию, поэтому необходимо импортировать эту библиотеку.
В методе setup мы проверяем, была ли SD-карта правильно инициализирована, проверяя результат вызова SD.begin(), которому в качестве параметра нужен пин, к которому подключён пин выбора слота SD-карты. В нашем случае это пин номер 4. Если ответ от SD.begin() был неудовлетворительным, программа не продолжит работу.
Строка File dataFile = SD.open("log-0000.csv", FILE_WRITE) создаст текстовый файл с именем «log-0000.csv» и откроет его для записи. Это позволит последующим вызовам dataFile.print() и dataFile.println() отправлять данные в файл так, как если бы вы использовали последовательный порт.
Использование последовательного порта — НЕТ
В отличие от предыдущих примеров, где мы отправляли данные через последовательный порт обратно на компьютер, в данном случае мы НЕ ДОЛЖНЫ использовать вызов ни Serial.begin(9600), ни while (!Serial). Это заблокировало бы нашу программу, и она не начала бы записывать данные, поскольку мы не будем использовать последовательный порт при развёртывании платы.
Получение данных датчиков
Показания всех датчиков имеют тип float, поэтому объявления переменных выглядят как float temperature = 0, float humidity = 0, float pressure = 0, float UVA = 0, float UVB = 0, float UVIndex = 0.
При вызове temperature = ENV.readTemperature(), humidity = ENV.readHumidity() и так далее, программа запрашивает информацию о датчиках с платы расширения и сохраняет их в соответствующих переменных. Ключевой аспект заключается в том, как упаковать эту информацию для сохранения в файл на SD-карте.
Как вы видели в примере файла CSV в предыдущем эксперименте, информация разделяется запятыми (вы можете использовать другие разделители) и каждая запись хранится в отдельных строках. Также первая строка файла CSV может быть заполнена строками, указывающими тип сохраняемых данных. Поэтому мы начнём с отправки строки: «temperature,humidity,pressure,UVA,UVB,UVindex» на карту. Эта первая строка должна быть включена только один раз, непосредственно в setup программы, после того как SD-карта стала доступна.
В цикле loop, после запроса данных с датчиков, вам нужно будет последовательно записать каждый элемент данных на карту, включая запятую между информацией каждого датчика:
datafile.print(temperature); datafile.print(","); [...] datafile.print(UVIndex);
Обратите внимание, как программа в конце вызывает datafile.println() для включения конца строки после записи данных.
Отображение данных
Данные не отображаются, поскольку они просто хранятся на SD-карте, но все данные захватываются. Далее вы можете использовать технику, описанную в предыдущей программе, чтобы открыть полученный файл CSV в табличном редакторе и построить графики различных столбцов данных.
Рисунок 8: Все датчики отображены на графике с помощью LibreOffice
Что делать, если у вас нет SD-картридера
В случае, если у вас нет картридера для SD-карт, вы всё равно можете выгрузить данные из файла на SD-карте в последовательный терминал, подключив плату к компьютеру, и использовать CoolTerm, как было объяснено в предыдущем эксперименте, для переноса данных непосредственно в файл на вашем компьютере. Просто запрограммируйте плату Arduino примером DumpFile из библиотеки SD-карты, настройте CoolTerm на сохранение данных в файл и откройте соединение в программе последовательного терминала.
Задание
Существует бесконечное количество возможностей для улучшения этого эксперимента. Например, вы можете добавить механизм для запуска и остановки записи данных по желанию. Вы можете, например, добавить кнопку для переключения состояния записи.
Рисунок 9: Проект с добавлением кнопки
Другая техника, которая могла бы улучшить ваш процесс, — это создание системы логирования, которая будет назначать новые имена файлам журналов при каждом запуске программы. Для этого потребуется проверка существующих файлов и увеличение счётчика файлов. Это чисто программная задача — дерзайте!
Подведение итогов
В этом эксперименте вы увидели, как использовать SD-карту для хранения данных с датчиков. В мире IoT не всегда возможно обеспечить высокую скорость передачи данных, но при этом необходимо захватывать все данные, передавая только часть из них. Наличие локальных резервных копий данных на любых устройствах флеш-памяти — хорошая техника для этого.
Вы увидели, как использовать все возможности ENV Shield в этом примере. Мы использовали все доступные сенсорные чипы для измерения температуры, влажности, атмосферного давления, интенсивности освещения и светового излучения, а также слот SD-карты для записи и чтения данных с внешних карт.
Вы получили два возможных задания: одно — добавить кнопку к проекту для запуска и остановки записи, и второе — создавать разные файлы при каждом запуске программы. Если вы реализовали любое из них, они станут очень полезными при проведении офлайн-экспериментов в будущем.
Давайте перейдём к последнему эксперименту серии и рассмотрим, как отправлять данные в Arduino Cloud.