Недавно Стивен Вольфрам анонсировал сервис Wolfram Data Drop, который является отличным инструментом для загрузки любых типов данных с любого устройства. Я покажу как можно использовать Wolfram Data Drop с самодельной метеостанцией, для создания которой нам понадобятся лишь простое железо и несколько строчек кода. Эта метеостанция будет производить измерения температуры каждую секунду, и каждую минуту производить выгрузку среднего за эту минуту значения в Wolfram Data Drop. Таким образом, будет получаться 60 точек на графике температура– время каждый час, 1440 точек в сутки. Используя эти данные и Wolfram Programming Cloud, можно изучать изменения температуры с течением времени. К примеру, можно выяснить, сколько раз за день температура достигала определённых минимальных и максимальных значений, когда температура изменялась наиболее быстро. С помощью этих данных можно даже составлять прогнозы. Быть может, у кого-то даже получится сделать более точные предсказания, чем у местной метеостанции!
Как построить собственную метеостанцию
Для этого эксперимента Вам понадобятся:
1) Arduino Yún (или эквивалент, но обязательно с Wi-Fi);
2) датчик температуры TMP36;
3) макетная плата и провода.
Здесь представлена схема сборки. Подключите 5V на левый вывод TMP36, заземление на правый вывод TMP36, и A0 на средний вывод TMP36.
Как только всё подключено и включено, сенсор начинает передавать напряжение на вывод А0. Если растёт температура, то растёт и напряжение, а если температура падает, то и напряжение, соответственно, тоже падает. Таким образом, мы можем снимать показатели напряжения и интерпретировать их как температуру. К счастью, в этом эксперименте нам понадобится только три небольших провода, что позволяет избежать ситуации как на картинке ниже с этим несчастным:
Программирование Arduino
Теперь мы готовы написать код для Arduino, который будет загружать записанные данные о температуре на Wolfram Cloud. Убедитесь, что ваш Arduino Yun настроен для подключения к Интернету. Затем, с помощью приложения Arduino, загрузить следующий код на Arduino после замены текста “YOUR_BIN_ID” на “Short ID», который выводится как результат выполнения функции CreateDatabin[].
Небольшое разъяснение касательно того, что делает код: переменная р используется для вызова инструмента под названием curl, который позволяет создавать HTTP-запросы с Arduino.
В нашем случае мы задаем конкретный URL для Wolfram Data Drop, который позволяет загружать данные о температуре. В цикле loop(), который можно увидеть в коде, можно наблюдать, как переменная val читается из аналогового входа (A0), и как val затем преобразуется из начальных значений в значение температуры temperature.
Эту температуру затем добавляют к среднему значению average ровно 60 раз, но на 60-й раз программа вычислит второй блок с If[].
Этот блок кода инициализирует код загрузки данных, который отправляет среднее значение 60 измерений.
Это также сбрасывает все счетчики, так что все начнется снова.
Далее следует 1000-милисекундная задержка, которая упорядочит записанные за секунду даннные:
#include < Bridge.h >
Process p;
int val, count;
float voltage, temperature, average;
void setup () {
count = 0;
average = 0;
Bridge.begin ();
Serial.begin (9600);
}
void loop () {
val = analogRead (0);
voltage = val * 5.0;
voltage = voltage/1024.0;
temperature = (voltage - 0.5)*100;
average += temperature;
count++;
if ( count > 59 ) {
p.begin ("/usr/bin/curl");
p.addParameter ("--insecure");
p.addParameter ("--location");
p.addParameter ("https://datadrop.wolframcloud.com/api/v1.0/Add?bin=YOUR_BIN_ID&temperature=" + String (average/60));
p.run ();
while (p.available () > 0) {
char c = p.read ();
Serial.print (c);
}
Serial.println ();
Serial.flush ();
count = 0;
average = 0;
}
delay (1000);
}
Чтобы убедиться, что всё работает, можно открыть встроенный монитор Arduino; в случае, если всё идет как надо, Вы увидете сообщения наподобие того, что ниже, которые будут появляться каждую минуту (или около того):
<|"Message" -> "The data was successfully added.", "Bin" -> "DD7051e03ace9-a194-44c1-9864-8fcef8ea9af3", "Data" -> <|"temperature" -> "34"|>, "Timestamp" -> {2015, 2, 9, 16, 18, 39.99526`8.354583502904967}, "Information" -> {"EntryCount" -> 1, "LatestTimestamp" -> 3632487520, "Size" -> 288}|>
Теперь самое время поместить наше устройство во что-то герметичное (в моем случае – Hefty bag), и поместить в место, которое весь день находится в тени (допустим, на веранде):
Анализ данных о температуре
Теперь мы готовы сделать несколько интересных вещей с полученными данными о температуре. Лучше всего будет собрать данных, как минимум, за один день, прежде чем начать анализ, однако код позволяет работать и с меньшим количеством данных. Сперва нам нужно получить данные из databin, который мы использовали для загрузки данных по температуре.
Программа на Arduino передает температуру в виде параметра URL, что мы и используем в нашей программе. В моем примере databin собрал данные за 20 дней (для проведения эксперимента необходимо заменить “YOUR_BIN_ID” на bin ID, который был получен в результате выполнения CreateDatabin ранее:
Теперь нам необходимо будет преобразовать данные по температуре (temperature event series) с помощью еще нескольких шагов.
Во-первых, посредством TimeSeriesShift нужно внести данные по часовому поясу.
Далее следует откалибровать датчик, опираясь на данные с ближайших крупных метеостанций. Лично я калибровал свой двухдолларовый TMP36, опираясь на данные с одной из метеостанций национального управления океанических и атмосферных исследований (NOAA KCMI), где располагается несравнимо более дорогое и точное оборудование. Калибровка – очень важный шаг; мне пришлось в результате калибровки править свои данные примерно на 5 градусов, чтобы они соответствовали официальным. Есть еще один хороший способ калибровки: поместить датчик в ледяную воду с температурой 0 градусов, а затем в стакан кипятка (100 градусов), и скорректировать полученные данные.
Далее необходимо выбрать интересующий временной интервал. В моём случае точка отсчёта есть 22 января 9 часов утра. Вам, соответственно, следует заменить эту дату на ту, которая соответствует началу Ваших измерений.
Наконец, следует переразбить данные на интервалы по 15 минут, то есть для построения будем использовать в 15 раз меньше точек. Дело в том, что что этих данных будет вполне достаточно для работы с интервалами, которые измеряются в днях.
Тут можно сделать быструю проверку – корректно ли выглядят данные по температуре:
На этом работа с данными не заканчивается, и мы можем сделать весьма занятные и полезные вещи, используя их. Можно написать функцию, которая будет собирать минимальные/максимальные значения температуры в каждый конкретный день, или любые другие примечательные значения:
Функция, представленная ниже, создает новый ряд событий (EventSeries) из заданного и собирает те точки, которые удовлетворяют определенной функции для данного дня.
Теперь можно проделать то же самое для ежедневных максимумов температур:
Теперь мы можем отобразить температурные данные (фиолетовый) на графике с дневными максимумами (красные точки) и минимумами (синие точки):
Заключение
Теперь у нас имеется собственная рабочая метеостанция и поступающие данные, которые можно легко анализировать. Изменяя представленный код, можно визуализировать дневные, недельные либо месячные средние значения температуры. Так же можно попробовать прогнозировать температуру на завтра, опираясь на замеченные ранее зависимости и, возможно, объединяя данные по температуре с какими-то дополнительными: влажность, давление и тому подобное.
Перевод поста Arnoud Buzing, «Build Your Own Weather Station in a Snap with the Wolfram Cloud!».
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье можно здесь.
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.
Автор: OsipovRoman