Mundarija:

Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!): 4 qadam (rasmlar bilan)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!): 4 qadam (rasmlar bilan)

Video: Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!): 4 qadam (rasmlar bilan)

Video: Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!): 4 qadam (rasmlar bilan)
Video: С лёгким паром! №11 Сауна Венеция - малый зал 2024, Noyabr
Anonim
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)
Barbekyu Pi (ma'lumotlar vizualizatsiyasi bilan!)

Kirish

Barbekyu odatda sevimli go'shtni pishirish uchun bilvosita issiqlikni ishlatishning sekin jarayonini anglatadi. Ovqat pishirishning bu usuli juda mashhur bo'lsa-da, ayniqsa AQShda-bu, ba'zi jiddiy zaiflik deb hisoblaydigan narsaga ega: u sizning chuquringiz va ovqatingizning haroratini kuzatish uchun yarim soatlik aniq e'tiborni talab qiladi. Kirish: Raspberry Pi.

Original loyiha

Loyihaning asl manbasini bu erda topish mumkin: https://old.reddit.com/r/raspberry_pi/comments/a0… Buning mohiyati shundaki, reddit foydalanuvchisi Produkt oziq -ovqat va chuqur harorati ma'lumotlarini nisbatan arzon narxlarda uzatishga muvaffaq bo'lgan., tijoratda mavjud bo'lgan Raspberry Pi simsiz termometrlari (GPIO pinlariga kichik chastotali RF modulini ulagan). Dastlabki loyihada (yuqorida bog'langan), Produkt o'z ma'lumotlarini sqlite ma'lumotlar bazasida saqlagan va mahalliy apache2 php veb -saytida ko'rsatgan.

Bu yechim blogning kirish qismida ko'rib chiqilgan muammoni hal qiladi: endi siz veb -brauzer yordamida ovqat va chuqur haroratini masofadan kuzatib borishingiz mumkin. Ammo, agar biz buni kengaytirmoqchi bo'lsak nima bo'ladi? Kirish: GridDB.

Ta'minotlar

Raspberry Pi4

SUNKEE 433 MGts Superheterodin simsiz qabul qilish moduli

1 -qadam: GridDB Web API va FluentD

GridDB Web API va FluentD
GridDB Web API va FluentD

Loyihani ko'rib, birinchi hayajon to'lqinidan so'ng, men uning imkoniyatlarini kengaytirish yo'llari haqida o'yladim. GridDB va uning Grafana plaginidan foydalanib, men oziq -ovqat va pit ma'lumotlarini ingl. Bundan tashqari, men Grafana izohlarini o'rnatib, g'ayritabiiy ma'lumotlar punktlarini qidirib topishni xohlardim - hech qanday kuygan go'sht bo'lishi mumkin emas!

Ishni boshlash uchun men simsiz termometrdan kelgan ma'lumotlarni o'qish va GridDB serverimga joylashtirish uchun asl loyihadagi C kodidan foydalanishim kerak edi. Buni ishga tushirish uchun men CentOS virtual mashinasi yordamida Azure -da GridDB serverini ishga tushirdim. Bizning Raspberry Pi -dan ma'lumotlarni bulutli serverimizga almashishning eng oson yo'li GridDB Web API orqali amalga oshirildi. Shunday qilib, o'sha vmda men GridDB ning WebAPI -ni Fluentd va unga tegishli GridDB ulagichi bilan birga o'rnatdim.

Ma'lumotni bulutga yuborishdan oldin, men BBQ Pi konteynerining asosiy sxemasini tuzishim kerak edi. Ma'lumotlar to'plami juda oddiy: bizda ikkita harorat sensori, bitta oshpaz identifikatori va, albatta, vaqt tamg'asi bor. Shunday qilib, bizning sxemamiz quyidagicha ko'rinadi:

vaqtlar = gridstore.put_container ("bbqpi", [("vaqt", griddb. GS_TYPE_TIMESTAMP), ("pishiriq", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("prob2", griddb. GS_TYPE_INT)], griddb. GS_TON

Ushbu konteyner konteynerini yaratish uchun men faqat WebAPI (port 8080) dan foydalanardim:

curl -X POST --basic -u admin: admin -H "Kontent turi: application/json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "ustunlar": [ {"nomi": "vaqt", "turi": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "prob2", "type": "INTEGER"}]} '\ https:// localhost: 8080/griddb/v2/defaultCluster/dbs/public/container

Yaratilgan konteyner bilan men haqiqiy ma'lumotlarni bizning konteynerga joylashtirish uchun Fluentd (port 8888) dan foydalanishim kerak edi. Mana, ba'zi qo'g'irchoq ma'lumotlarni joylashtiradigan CURL buyrug'i:

curl -X POST -d 'json = {"sana": "2020-01-01T12: 08: 21.112Z", "cookid": "1", "probe1": "150", "prob2": "140" } "https:// localhost: 8888/griddb

U erdan, men PI bizning chuqurchamizdan ma'lumotlarni o'qiyotganida (taxminan har 12 sekundda) HTTP POST so'rovini yuborish uchun asl kodni qo'shishim kerak edi.

Yon eslatma sifatida: bu kodni yozish menga C tili qanchalik aniq bo'lishi mumkinligini tushunishga o'rgatdi:

int postData (char vaqti , int cookid, int probe1, int probe2, char url )

{CURL *burish; CURLcode rez; / * Oynalarda, bu winsock narsalarni ishga tushiradi */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; char agenti [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" sana / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", vaqt, cookid, prob1, prob2)); / * jingalak tutqichni oling */ curl = curl_easy_init (); if (curl) { /* Avval bizning POSTni qabul qilmoqchi bo'lgan URLni o'rnating. Agar bu ma'lumotni olish kerak bo'lsa, bu URL xuddi https:// URL bo'lishi mumkin. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> versiya); agent [agentof hajmi - 1] = 0; curl_easy_setopt (jingalak, CURLOPT_USERAGENT, agent); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "admin"); curl_easy_setopt (curl, CURLOPT_PASSWORD, "admin"); curl_easy_setopt (burish, CURLOPT_VERBOSE, 1L); curl_easy_setopt (burish, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, json); / * So'rovni bajaring, res qaytish kodini oladi */ res = curl_easy_perform (curl); if (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)); tozalash kerak; } tozalash: curl_easy_cleanup (burish); curl_global_cleanup (); qaytarish 0; }}

Bu funksiya yozilganida, men uni sqlite ma'lumotlari joylashtirilgan vaqtda ishga tushirishim kerak edi:

agar (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO o'qishlari (cookid, time, probe1, prob2)) VALUES (%d, '%s',%d, %d); ", cookID, buff, prob1, prob2); printf ("%s / n", sql); rc = sqlite3_exec (db, sql, qayta qo'ng'iroq, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("SQL xatosi: %s / n", zErrMsg); } boshqa {last_db_write = sek; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, prob1, prob2, url); }}

Ma'lumotlar serverga kiritilganiga ishonch hosil qilish uchun ma'lumotlar bazasini so'rash va natijalarni ko'rish uchun quyidagi buyruqni bajarishingiz mumkin:

curl -X POST --basic -u admin: admin -H "Content -type: application/json" -d '{"limit": 1000}' https:// localhost: 8080/griddb/v2/defaultCluster/dbs/ ommaviy/konteynerlar/bbqpi/qatorlar

2 -qadam: Grafana

Grafana
Grafana
Grafana
Grafana

Kod mavjud bo'lganda, biz "oshpaz" ni ishga tushirish uchun asl veb -portaldan foydalansak, biz bir vaqtning o'zida harorat ma'lumotlarini GridDB serverimizda saqlaymiz.

Keyingi qadam, bizning ma'lumotlarimizni Grafana yordamida vizualizatsiya qilish bo'ladi. Buning uchun biz ushbu blog ma'lumotlarini kuzatdik: bu erda. Ushbu dasturning yaxshi tomoni shundaki, bizning ma'lumotlarimizni chiroyli grafikda ko'rish juda oson. Shuningdek, izohlar qo'shiladi.

Blogda muhokama qilingan izohlar bizning ovqatimiz yoki chuqurning o'zida biror narsa noto'g'ri ketayotganini kuzatishni juda osonlashtiradi. Mening holatimda, men mol go'shti qisqa qovurg'a pishirardim. Ular bilan men chuqurdagi harorat Farengeytning 275 darajasidan oshib ketishini xohlamadim. Agar men harorat bundan oshib ketganini ko'rsam, yondirgichni o'chirib, yana issiqlikni pasayishiga yo'l qo'ygan bo'lardim:

Menda xuddi shunday qoida bor edi, sensori ovqatni o'zi kuzatib turadi: agar ovqat 203 daraja farenheit haroratga yetgan bo'lsa, qovurg'alar tayyor edi. Siz oshpazning oxirida yolg'iz izohni ko'rishingiz mumkin:

Umuman olganda, oshpaz menga taxminan 4 soat vaqt sarfladi, lekin agar men panjara ichida ko'proq vaqt talab qiladigan narsani pishirgan bo'lsam, bunday sozlash juda yaxshi bo'lardi (past tutun haqida o'ylang ~ 12) soat). Shunga qaramay, menimcha, agar bu vosita oson ko'rinadigan bo'lsa: ovqatlaringizning natijalarini qayd qilib, keyin ularni oldingi oshpazlar bilan taqqoslash, vaqt o'tishi bilan sizning barbekingiz asta -sekin yaxshilanadi, chunki siz ma'lumotlardan foydalanib, nima ishlayotganini va nima ishlamasligini bilib olasiz. 't.

3 -qadam: Oziq -ovqat

Ovqat
Ovqat
Ovqat
Ovqat
Ovqat
Ovqat

Bu men birinchi marta mol go'shti kalta qovurg'asini yasashim edi; ziravorlar uchun men shunchaki tuz, qora murch va sarimsoq kukunidan foydalandim. Boshida burner biroz ko'tarilib ketishi bilan bog'liq ba'zi muammolarga qaramay, qovurg'alar juda ajoyib chiqdi. Iltimos, ko'rib chiqing:

4 -qadam: Xulosa

Oxir -oqibat, taom juda ajoyib bo'lib chiqdi, sensorlar, GridDB va Grafana hammasi yaxshi konsertda ishladilar va biz bu narsalarni qanday tayyorlash mumkinligi haqida qimmatli ma'lumotlarga ega bo'ldik.

Tavsiya: