Turinys:

BBQ Pi (su duomenų vizualizavimu!): 4 žingsniai (su nuotraukomis)
BBQ Pi (su duomenų vizualizavimu!): 4 žingsniai (su nuotraukomis)

Video: BBQ Pi (su duomenų vizualizavimu!): 4 žingsniai (su nuotraukomis)

Video: BBQ Pi (su duomenų vizualizavimu!): 4 žingsniai (su nuotraukomis)
Video: Одним словом, Фрида полнейшая ► 17 Прохождение Dark Souls 3 2024, Lapkritis
Anonim
BBQ Pi (su duomenų vizualizacija!)
BBQ Pi (su duomenų vizualizacija!)
BBQ Pi (su duomenų vizualizacija!)
BBQ Pi (su duomenų vizualizacija!)
BBQ Pi (su duomenų vizualizacija!)
BBQ Pi (su duomenų vizualizacija!)

Įvadas

Kepimas ant grotelių dažniausiai reiškia lėtą netiesioginės šilumos panaudojimo procesą mėgstamai mėsai kepti. Nors šis maisto gaminimo būdas yra labai populiarus, ypač JAV, jis turi tai, ką kai kurie gali laikyti gana rimta silpnybe: tam reikia valandų pusiau skaidraus dėmesio, skirto jūsų duobės ir maisto temperatūrai stebėti. Įveskite: Raspberry Pi.

Originalus projektas

Originalų šio projekto šaltinį rasite čia: https://old.reddit.com/r/raspberry_pi/comments/a0… Esmė ta, kad „reddit“vartotojas „Produkt“galėjo palyginti nebrangiai perduoti maisto ir duobių temperatūros duomenis., parduodami belaidžiai termometrai prie „Raspberry Pi“(kuris prie GPIO kaiščių buvo prijungęs nedidelį RF modulį). Pradiniame projekte (susietas aukščiau) „Produkt“duomenys buvo saugomi „sqlite“duomenų bazėje ir rodomi vietoje priegloboje esančioje „apache2 php“svetainėje.

Šis sprendimas jau išsprendžia pradinę šio tinklaraščio įžangoje aptartą problemą: dabar galite nuotoliniu būdu stebėti savo maisto ir duobių temperatūrą naudodami interneto naršyklę. O kas, jei norėtume tai išplėsti? Įveskite: GridDB.

Prekės

Raspberry Pi4

„SUNKEE 433Mhz Superheterodyne“belaidžio imtuvo modulis

1 veiksmas: „GridDB Web API“ir „FluentD“

„GridDB Web API“ir „FluentD“
„GridDB Web API“ir „FluentD“

Pamačius šį projektą, mano pirmoji mintis - po pradinės jaudulio bangos - buvo galvoti apie būdus, kaip išplėsti funkcionalumą. Naudodamas „GridDB“ir jo „Grafana“papildinį, aš siekiau vizualizuoti savo maisto ir duobės duomenis. Be to, norėjau nustatyti „Grafana“anotacijas, kad galėčiau rasti bet kokių nenormalių duomenų taškų - negali būti jokios apdegusios mėsos!

Norėdami pradėti, turėjau naudoti pradinio projekto C kodą, kad galėčiau perskaityti duomenis, gaunamus iš belaidžio termometro, ir paskelbti tuos duomenis savo „GridDB“serveryje. Norėdami tai padaryti, aš sukūriau „GridDB“serverį „Azure“naudodami „CentOS“virtualią mašiną. Lengviausias būdas bendrinti duomenis iš krašto mašinos („Raspberry Pi“) į mūsų debesies serverį buvo naudojant „GridDB Web API“. Taigi, tame vm, aš sukūriau „GridDB“WebAPI kartu su „Fluentd“ir pridedama „GridDB“jungtimi.

Prieš iš tikrųjų siunčiant duomenis į debesį, turėjau sukurti pagrindinę savo BBQ Pi konteinerio schemą. Duomenų rinkinys yra labai paprastas: turime du temperatūros jutiklius, vieną virėjo ID ir, žinoma, laiko žymę. Taigi mūsų schema atrodo taip:

timeseries = gridstore.put_container ("bbqpi", [("laikas", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("zondas1", griddb. GS_TYPE_INT), ("zondas2", griddb. GS_TYPE_INT)], griddb. GS_CONTAINER_)

Norėdami sukurti šį laiko serijos sudėtinį rodinį, tiesiog naudojau WebAPI (8080 prievadas):

curl -X POST -pagrindinis -u admin: admin -H "Turinio tipas: application/json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "stulpeliai": [{"name": "time", "type": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "zondas1", "tipas": "INTEGER"}, {"name": "zondas2", "tipas": "INTEGER"}]} '\ https:// localhost: 8080/griddb/v2/defaultCluster/dbs/public/container

Sukūręs konteinerį, turėjau naudoti „Fluentd“(8888 prievadas), kad galėčiau paskelbti faktinius duomenis į mūsų konteinerį. Štai CURL komanda, paskelbianti tam tikrus netikrus duomenis:

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

Iš ten turėjau pridėti pradinį kodą, kad galėčiau išsiųsti HTTP POST užklausą, kai mūsų „Pi“skaito duomenis iš mūsų duobės (maždaug kartą per ~ 12 sekundžių).

Kaip šalutinė pastaba: šio kodo rašymas išmokė mane įvertinti, kokia daugiakalbė gali būti C kalba:

int postData (char laikas , int cookid, int zondas1, int zondas2, char url )

{CURL *curl; CURLcode res; / * „Windows“tai inicijuos „Winsock“medžiagą */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; anglies agentas [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" data / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" zondas1 / ": \"%d / ", / "zondas2 \": / "%d \"} ", laikas, virėjas, zondas1, zondas2); / * gaukite garbanojimo rankeną */ curl = curl_easy_init (); if (curl) { /* Pirmiausia nustatykite URL, kuris netrukus gaus mūsų POST. Šis URL taip pat gali būti https:// URL, jei būtent tai turėtų gauti duomenis. */ snprintf (agentas, agento dydis, „libcurl/%s“, curl_version_info (CURLVERSION_NOW)-> versija); agentas [agento dydis - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, agentas); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "admin"); curl_easy_setopt (curl, CURLOPT_PASSWORD, "admin"); curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, json); / * Vykdykite užklausą, res gaus grąžinimo kodą */ 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)); eiti valyti; } valymas: curl_easy_cleanup (curl); curl_global_cleanup (); grįžti 0; }}

Kai ši funkcija parašyta, man tiesiog reikėjo ją paleisti tuo pačiu metu, kai buvo paskelbti „sqlite“duomenys:

jei (geri duomenys == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO rodmenys (cookid, time, probe1, probe2) VALUES (%d, '%s',%d, %d); ", cookID, buff, zondas1, zondas2); printf ("%s / n", sql); rc = sqlite3_exec (db, sql, atgalinis skambutis, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("SQL klaida: %s / n", zErrMsg); } else {last_db_write = sek; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, zondas1, zondas2, url); }}

Norėdami įsitikinti, kad jūsų duomenys iš tikrųjų įterpiami į jūsų serverį, galite paleisti šią komandą, norėdami užklausti savo duomenų bazę ir peržiūrėti rezultatus:

curl -X POST --basic -u admin: admin -H "Turinio tipas: application/json" -d '{"limit": 1000}' https:// localhost: 8080/griddb/v2/defaultCluster/dbs/ public/konteineriai/bbqpi/eilės

2 žingsnis: Grafana

Grafana
Grafana
Grafana
Grafana

Turėdami kodą, dabar, kai pradėsime gaminti maistą naudodami pradinį žiniatinklio portalą, vienu metu išsaugosime savo temperatūros duomenis savo „GridDB“serveryje.

Kitas žingsnis bus vizualizuoti mūsų duomenis naudojant „Grafana“. Norėdami tai padaryti, sekėme šio tinklaraščio informaciją: čia. Gražus šio diegimo dalykas yra tai, kad labai lengva matyti mūsų duomenis, išdėstytus gražioje diagramoje. Tai taip pat prideda komentarus.

Dienoraštyje aptartos anotacijos leidžia mums labai lengvai stebėti, ar kažkas negerai su maistu ar pačia duobe. Mano atveju viriau jautienos trumpus šonkaulius. Dėl to nenorėjau, kad duobės temperatūra pakiltų virš 275 laipsnių pagal Celsijų. Jei pamačiau, kad temperatūra viršija šią temperatūrą, galiu išjungti degiklį ir leisti šilumai vėl nusileisti:

Aš turėjau panašią taisyklę, kad jutiklis iš tikrųjų stebėtų patį maistą: jei maistas pasiekė 203 laipsnių Fahrenheito vidinę temperatūrą, šonkauliai buvo paruošti. Vienišą komentarą virėjo pabaigoje galite pamatyti čia:

Apskritai virėjas man užtruko tik apie ~ 4 valandas, tačiau tokia sąranka tikrai puikiai tiktų, jei ruoščiau ką nors, kas būtų pareikalavusi dar daugiau laiko kepsninėje (pagalvokite, kad dūmai lėtai užtrunka ~ 12 val. valandos). Nepaisant to, manau, kad šis įrankis yra lengvai pastebimas: jei galite užregistruoti savo maisto produktų rezultatus ir palyginti juos su ankstesniais virėjais, tai reiškia, kad jūsų kepsnys laikui bėgant pamažu gerės, nes galėsite naudoti duomenis, kad pamatytumėte, kas veikia ir kas ne 't.

3 žingsnis: maistas

Maistas
Maistas
Maistas
Maistas
Maistas
Maistas

Tai buvo pirmas kartas, kai aš gaminu trumpus jautienos šonkaulius; prieskoniams tiesiog naudojau druską, juodus pipirus ir česnako miltelius. Nepaisant kai kurių problemų, kai degiklis iš pradžių šiek tiek pakilo, šonkauliai pasirodė fantastiški. Prašau pažiūrėkite:

4 žingsnis: Išvada

Galų gale maistas pasirodė nuostabus, jutikliai, „GridDB“ir „Grafana“puikiai dirbo kartu, ir mes gavome vertingų duomenų, kaip vėl gaminti šiuos patiekalus, kai kitą kartą norime padaryti įspūdį kai kuriems draugams.

Rekomenduojamas: