Сегодня хочу сделать небольшой обзор как можно использовать Arduino и Processing для сбора статистических данных, а также обрабатывать их с помощью R.
Для демонстрации сбора статистики я с помощью ультразвукового датчика HC-SR04 фиксирую, когда коллеги проходят перед моим рабочим столом. Некоторую полезную информацию как скрестить Arduino, Processing и R я взял отсюда.
Arduino
Вот схема для Arduino Uno
Если кто-то проходит перед столом срабатывает спикер (и лампочка).
Скетч для Arduino находится здесь.
Нужно учесть несколько моментов
- Используется библиотека NewPing, ее нужно проинсталлировать в вашу Arduino среду и перезапустить IDE
- Чтобы минимизировать ложные срабатывания, я проверяю наличие сигнала несколько раз. См. функцию pingConfirms. В общем-то надежность срабатывания все еще не идеальна, то срабатывает по нескольку раз за один проход, то пропускает проходы. Но для нашей цели это не очень важно
- Обратите внимание на константу MAX_DISTANCE, она задает максимальное расстояние до которого срабатывает датчик.
- Самый важный момент: данные на компьютер передаются через серийный порт. Чтобы отличить дебажный вывод перед данными я вывожу "$data:", этот текст я воспринимаю как маркер данных, которые будут добавляться к CSV файлу, поэтому если данных несколько, можно их разделить запятой
- В нашем случае в качестве данных передается расстояние в сантиметрах, но рельно нас это значение не будет интересовать, мы будем группировать по количеству
Processing
В этом проекте Processing 2 я буду использовать исключительно для считывания данных с серийного порта (USB) и дописывание их в CSV файл. Вы можете также использовать Processing для визуализации своих данных, но здесь графики я буду рисовать с помощью R.
Среда Processing очень похожа на среду Arduino, но язык Java-подобный. Универсальный скетч для считывания данных с Arduino здесь.
Вам нужно сначала запустить скетч, он выведет в консоль список всех доступных сериальных портов, найдите порт, на котором работает Arduino, возьмите его порядковый номер (нумерация начинается с нуля) и пропишите его в константу mySerialPort. Обратите также внимание, куда пишутся данные
String filePath = sketchPath("../../data/data.csv");
Функция sketchPath создаст путь относительно папки в которой находится скетч. Если файл нет он создастся, если уже есть в него будут добавляться строки. Автоматически первым элементом в каждой строке CSV файла будеть timestamp (колличество миллисекунд после 1970-01-01).
R
Для обработки данных и отображения графиков я использую статистический пакет R.
После инсталляции R системы можно войти в интерактивный режим с помощью однобуквенной комманды R. (Чтобы выйти с интеактивного режима введите q().
Я написал небольшой скрипт, который
- Считывает данные с CSV файла в память.
- Вырезает данные нужного временного интервала. Для этого подкорректируйте переменные startDate и endDate
- Подсчитывает колличество прохождений в каждый из 10-минутных интервалов. Можна интервал изменить с помощью переменной period, она задается в секундах
- Рисует столбиковый график.
Для запуска всего этого сделайте следующее:
- С консоли запустите комманду R
- Задайте путь к каталогу, в котором находится ваш data.csv файл:
setwd("/home/solvek/projects/electronics/counter/data")
- Запустите R скрипт:
source("../plotchart.R")
Здесь путь к скрипту относительно вышезаданного каталогоа данных
Новогодний бонус
Возможно вы обратили внимание на то, что спикер издает сигнал с тональностью, зависящей от расстояния проходящего от датчика. Таким образом с Arduino можно создать примитивный музыкальный инструмент:
Всех с Новым Годом!
Автор: sergi