Оглавление:
Видео: BBQ Pi (с визуализацией данных!): 4 шага (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:49
Вступление
Приготовление на гриле чаще всего относится к медленному процессу использования непрямого нагрева для приготовления любимого мяса. Хотя этот метод приготовления очень популярен, особенно в США, у него есть то, что некоторые могут посчитать довольно серьезным недостатком: он требует часов полуосознанного внимания, которые нужно потратить на мониторинг температуры вашей ямы и еды. Введите: Raspberry Pi.
Оригинальный проект
Первоисточник этого проекта можно найти здесь: https://old.reddit.com/r/raspberry_pi/comments/a0 … Суть в том, что пользователь Reddit Produkt смог передать данные о температуре еды и ямы по относительно дешевым ценам., коммерчески доступные беспроводные термометры к Raspberry Pi (к выводам GPIO которого был прикреплен небольшой радиочастотный модуль). В исходном проекте (ссылка приведена выше) данные Produkt хранились в базе данных sqlite и отображались на локальном веб-сайте apache2 php.
Это решение уже решает первоначальную проблему, затронутую во введении к этому блогу: теперь вы можете удаленно контролировать температуру продуктов и ям с помощью веб-браузера. Но что, если бы мы хотели подробнее остановиться на этом? Введите: GridDB.
Запасы
Малина Pi4
Модуль беспроводного супергетеродинного приемника SUNKEE 433 МГц
Шаг 1. Веб-API GridDB и FluentD
Увидев этот проект, моя первая мысль - после первой волны ажиотажа - была думать о способах расширения функциональности. Используя GridDB и его плагин Grafana, я стремился визуализировать свои данные о еде и ямах. Помимо этого, я хотел настроить аннотации Grafana для поиска любых аномальных точек данных - не может быть обугленного мяса!
Для начала мне нужно было использовать код C из исходного проекта, чтобы прочитать данные, поступающие с беспроводного термометра, и разместить эти данные на моем сервере GridDB. Чтобы запустить его, я развернул сервер GridDB в Azure с помощью виртуальной машины CentOS. Самый простой способ передать данные с нашего пограничного компьютера (Raspberry Pi) на наш облачный сервер - через веб-API GridDB. Итак, на этой виртуальной машине я установил WebAPI GridDB вместе с Fluentd и сопутствующим коннектором GridDB.
Перед фактической отправкой данных в облако мне нужно было создать базовую схему для моего контейнера BBQ Pi. Набор данных предельно прост: у нас есть два датчика температуры, один идентификатор готовки и, конечно же, временная метка. Итак, наша схема выглядит так:
timeseries = gridstore.put_container ("bbqpi", [("время", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_IMECONTAINER_INT)
Чтобы создать этот контейнер таймсерий, я просто использовал WebAPI (порт 8080):
curl -X POST --basic -u admin: admin -H "Content-type: application / json" -d
'{"имя_контейнера": "bbqpi", "тип_контейнера": "СЕРИИ_ВРЕМЕНИ", / "ключ строки": true, "столбцы": [{"имя": "время", "тип": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type": "INTEGER"}]} '\ https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / public / container
После создания контейнера мне нужно было использовать Fluentd (порт 8888) для отправки фактических данных в наш контейнер. Вот команда CURL, отправляющая фиктивные данные:
curl -X POST -d 'json = {"date": "2020-01-01T12: 08: 21.112Z", "cookid": "1", "probe1": "150", "probe2": "140" } 'https:// localhost: 8888 / griddb
Оттуда мне нужно было добавить исходный код для отправки HTTP-запроса POST всякий раз, когда наш Pi считывал данные из нашей ямы (примерно раз в ~ 12 секунд).
В качестве примечания: написание этого кода научило меня ценить, насколько многословным может быть язык C:
int postData (char time , int cookid, int probe1, int probe2, char url ))
{CURL * curl; CURLcode res; / * В Windows это запустит материал winsock * / curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; символ агента [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"% s.112Z / ", \" cookid / ": \"% d / ", \" probe1 / ": \"% d / ", / "проба2 \": / "% d \"} ", время, cookid, проба1, проба2); / * получаем дескриптор curl * / curl = curl_easy_init (); if (curl) {/ * Сначала установите URL-адрес, по которому будет получен POST. Этот URL-адрес может также быть URL-адресом https://, если именно он должен получать данные. * / snprintf (агент, размер агента, "libcurl /% s", curl_version_info (CURLVERSION_NOW) -> версия); агент [размер агента - 1] = 0; curl_easy_setopt (завиток, CURLOPT_USERAGENT, агент); curl_easy_setopt (завиток, CURLOPT_URL, URL); curl_easy_setopt (завиток, CURLOPT_USERNAME, «админ»); curl_easy_setopt (завиток, CURLOPT_PASSWORD, «админ»); curl_easy_setopt (завиток, CURLOPT_VERBOSE, 1L); curl_easy_setopt (завиток, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (завиток, CURLOPT_POSTFIELDS, json); / * Выполняем запрос, res получит код возврата * / res = curl_easy_perform (curl); если (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (% d)", res); if (len) fprintf (stderr, "% s% s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "% s / n / n", curl_easy_strerror (res)); goto cleanup; } очистка: curl_easy_cleanup (завиток); curl_global_cleanup (); возврат 0; }}
Когда эта функция была написана, мне просто нужно было запустить ее одновременно с публикацией данных sqlite:
if (goodData == 1) {
if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "ВСТАВИТЬ показания (cookid, time, probe1, probe2) ЗНАЧЕНИЯ (% d, '% s',% d, % d); ", cookID, buff, probe1, probe2); printf ("% s / n", sql); rc = sqlite3_exec (база данных, sql, обратный вызов, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("Ошибка SQL:% s / n", zErrMsg); } еще {last_db_write = сек; } char url = "https://xx.xx.xx.xx: 8888 / griddb"; postData (бафф, cookID, проба1, проба2, URL); }}
Чтобы убедиться, что ваши данные действительно вставляются на ваш сервер, вы можете выполнить следующую команду, чтобы запросить вашу базу данных и просмотреть результаты:
curl -X POST --basic -u admin: admin -H "Content-type: application / json" -d '{"limit": 1000}' https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / общедоступные / контейнеры / bbqpi / строки
Шаг 2: Графана
Имея код на месте, теперь, когда мы используем исходный веб-портал для запуска «готовки», мы одновременно будем сохранять данные о температуре на нашем сервере GridDB.
Следующим шагом будет визуализация наших данных с помощью Grafana. Для этого мы следовали информации из этого блога: здесь. Хорошая вещь в этой реализации состоит в том, что наши данные очень легко представить в виде красивой диаграммы. Он также добавляет аннотации.
Аннотации, обсуждаемые в блоге, позволяют нам очень легко отслеживать, когда что-то идет не так с нашей едой или самой косточкой. В моем случае я готовил короткие говяжьи ребрышки. С ними я не хотел, чтобы температура в яме превышала 275 градусов по Фаренгейту. Если бы я увидел, что температура превышает это значение, я мог бы выключить конфорку и позволить теплу снова опуститься:
У меня было аналогичное правило для датчика, который следил за самой едой: если температура внутри еды достигала 203 градусов по Фаренгейту, ребра были готовы. Здесь вы можете увидеть аннотацию в конце повара:
В общем, на приготовление у меня ушло около ~ 4 часов или около того, но такая установка была бы действительно отличной, если бы я готовил что-то, что потребовало бы еще больше времени на гриле (подумайте о низко-медленном копчении, которое длится ~ 12 часы). Несмотря на это, я считаю, что ценность этого инструмента очевидна: возможность регистрировать результаты ваших блюд, а затем сравнивать их с результатами предыдущих поваров, означает, что ваше барбекю будет постепенно улучшаться со временем, поскольку вы можете использовать данные, чтобы увидеть, что работает, а что нет. т.
Шаг 3: Еда
Это был первый раз, когда я делал короткие говяжьи ребрышки; в качестве приправы я просто использовала соль, черный перец и чесночный порошок. Несмотря на некоторые проблемы с слишком высокой горелкой вначале, ребра вышли фантастическими. Пожалуйста, взгляните:
Шаг 4: Заключение
В конце концов, еда вышла потрясающей, датчики, GridDB и Grafana прекрасно работали вместе, и мы получили ценные данные о том, как приготовить эти вещи снова, чтобы в следующий раз произвести впечатление на некоторых друзей.
Рекомендуемые:
Отправка данных из Arduino в Excel (и их построение): 3 шага (с изображениями)
Отправка данных из Arduino в Excel (и их построение): я много искал способ построить график показаний датчика Arduino в реальном времени. Не только строить, но также отображать и сохранять данные для дальнейших экспериментов и исправлений. Самым простым решением, которое я нашел, было использование Excel, но с
Как сделать регистратор данных влажности и температуры в реальном времени с Arduino UNO и SD-картой - Моделирование регистратора данных DHT11 в Proteus: 5 шагов
Как сделать регистратор данных влажности и температуры в реальном времени с Arduino UNO и SD-картой | Моделирование регистратора данных DHT11 в Proteus: Введение: привет, это Liono Maker, вот ссылка на YouTube. Мы делаем творческий проект с Arduino и работаем над встраиваемыми системами. Регистратор данных: Регистратор данных (также регистратор данных или регистратор данных) - это электронное устройство, которое записывает данные с течением времени
ПЕРЕДАЧА ДАННЫХ ЧЕРЕЗ СВЕТ !!!: 4 шага (с изображениями)
ПЕРЕДАЧА ДАННЫХ ЧЕРЕЗ СВЕТ !!!: Привет, ребята, спустя долгое время я снова вернулся, чтобы поделиться новым и простым проектом. В этом проекте я покажу вам, как с помощью света можно передавать сигналы данных из одного места в другое. Отправка данных по свету - не новая концепция, но в последнее время она
Монитор данных о зубной щетке на базе Arduino: 4 шага (с изображениями)
Монитор данных зубной щетки на базе Arduino: эта зубная щетка на базе Arduino позволяет отслеживать закономерности, используя данные 3-осевого ускорения
Создание регистратора данных на Raspberry Pi: 3 шага (с изображениями)
Создание регистратора данных с помощью Raspberry Pi: этот простой регистратор данных выполняет регулярные измерения освещенности с помощью аналогового LDR (фоторезистора) и сохраняет их в текстовом файле на вашем Raspberry Pi. Этот регистратор данных будет измерять и записывать уровень освещенности каждые 60 секунд, позволяя вам контролировать