Talaan ng mga Nilalaman:

BBQ Pi (With Data Visualization!): 4 Hakbang (na may Mga Larawan)
BBQ Pi (With Data Visualization!): 4 Hakbang (na may Mga Larawan)

Video: BBQ Pi (With Data Visualization!): 4 Hakbang (na may Mga Larawan)

Video: BBQ Pi (With Data Visualization!): 4 Hakbang (na may Mga Larawan)
Video: Chia 2.0 GPU Plotting and Farming 2023: THE ULTIMATE GUIDE 2024, Nobyembre
Anonim
BBQ Pi (Sa Data Visualization!)
BBQ Pi (Sa Data Visualization!)
BBQ Pi (Sa Data Visualization!)
BBQ Pi (Sa Data Visualization!)
BBQ Pi (Sa Data Visualization!)
BBQ Pi (Sa Data Visualization!)

Panimula

Ang Barbecuing ay karaniwang tumutukoy sa mabagal na proseso ng paggamit ng hindi direktang init upang lutuin ang iyong mga paboritong karne. Kahit na ang pamamaraang ito ng pagluluto ay napakapopular - lalo na sa Estados Unidos - mayroon itong kung ano ang maaaring isaalang-alang ng ilan na isang seryosong kahinaan: nangangailangan ito ng mga oras ng semi-matalinong pansin na gugugol sa pagsubaybay sa temperatura ng iyong hukay at pagkain. Ipasok: Raspberry Pi.

Ang Orihinal na Proyekto

Ang orihinal na mapagkukunan para sa proyektong ito ay matatagpuan dito: https://old.reddit.com/r/raspberry_pi/comments/a0… Ang diwa nito ay ang gumagamit ng reddit na Produkt na nakapag-relay ng data ng pagkain at hukay ng temperatura mula sa medyo mura, magagamit na komersyal na mga wireless thermometer sa isang Raspberry Pi (na naka-attach sa mga GPIO pin nito isang maliit na module ng RF). Sa orihinal na proyekto (naka-link sa itaas), ang Produkt ay mayroong kanyang data na nakaimbak sa isang database ng sqlite at ipinakita sa isang lokal na naka-host na website na apache2 php.

Nalulutas na ng solusyon na ito ang orihinal na problemang hinawakan sa pagpapakilala ng blog na ito: maaari mo nang subaybayan ang iyong temperatura ng pagkain at hukay nang malayuan sa isang web browser. Ngunit paano kung nais naming lumawak dito? Ipasok: GridDB.

Mga gamit

Raspberry Pi4

SUNKEE 433Mhz Superheterodyne Wireless Receiver Module

Hakbang 1: GridDB Web API & FluentD

GridDB Web API & FluentD
GridDB Web API & FluentD

Sa pagtingin sa proyektong ito, ang aking unang naisip - pagkatapos ng paunang alon ng kaguluhan - ay nag-iisip ng mga paraan na pinalawak ko ang pagpapaandar. Sa pamamagitan ng paggamit ng GridDB at ang Grafana plugin nito, hinanap ko upang mailarawan ang aking data sa pagkain at hukay. Higit pa rito, nais kong i-set up ang mga anotasyon ng Grafana upang maghanap ng anumang anomalya na mga puntos ng data - hindi maaaring magkaroon ng anumang sinusunog na karne!

Upang makapagsimula, kailangan kong gamitin ang C code mula sa orihinal na proyekto upang mabasa ang data na nagmumula sa wireless thermometer at mai-post ang data sa aking server ng GridDB. Upang maisagawa ito, tumatakbo ako sa isang GridDB Server sa Azure gamit ang isang CentOS virtual machine. Ang pinakamadaling paraan upang maibahagi ang data mula sa aming edge machine (Raspberry Pi) sa aming cloud server ay sa pamamagitan ng GridDB Web API. Kaya, sa vm na iyon, na-set up ko ang WebAPI ng GridDB kasama ang Fluentd at ang kasamang konektor ng GridDB.

Bago talaga magpadala ng data hanggang sa cloud, kailangan kong lumikha ng pangunahing iskema para sa aking lalagyan na BBQ Pi. Ang dataset na papasok ay napaka-simple: mayroon kaming dalawang mga sensor ng temperatura, isang luto ng id, at syempre, ang timestamp. Kaya ganito ang aming iskema:

timeseries = gridstore.put_container ("bbqpi", [("oras", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_CONTAINER_TIME_SERIES)

Upang likhain ang lalagyan na ito ng mga orasan, ginamit ko lang ang WebAPI (port 8080):

curl -X POST --basic -u admin: admin -H "Uri ng nilalaman: application / json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": totoo, "mga haligi": [ {"name": "time", "type": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type": "INTEGER"}]} '\ https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / public / container

Gamit ang lalagyan na nilikha, kailangan kong gumamit ng Fluentd (port 8888) upang mag-post ng aktwal na data sa aming lalagyan. Narito ang isang utos ng CURL na nag-post ng ilang data ng dummy:

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

Mula doon, kailangan kong idagdag ang orihinal na code upang magpadala ng isang Hiling sa HTTP POST tuwing ang aming Pi ay nagbabasa ng data mula sa aming hukay (halos isang beses bawat ~ 12 segundo).

Bilang isang tala sa gilid: ang pagsulat ng code na ito ay nagturo sa akin na pahalagahan kung paano ang wika ng C na wika ay maaaring:

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

{CURL * curl; CURLcode res; / * Sa mga bintana, magpapainit ito ng mga bagay na winsock * / curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; ahente ng char [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"% s.112Z / ", \" cookid / ": \"% d / ", \" probe1 / ": \"% d / ", / "probe2 \": / "% d \"} ", oras, cookid, probe1, probe2); / * kumuha ng hawakan ng curl * / curl = curl_easy_init (); kung (curl) {/ * Itakda muna ang URL na malapit nang matanggap ang aming POST. Ang URL na ito ay maaari ding maging isang https:// URL kung iyon ang dapat tumanggap ng data. * / snprintf (ahente, sizeof ahente, "libcurl /% s", curl_version_info (CURLVERSION_NOW) -> bersyon); ahente [sizeof agent - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, ahente); 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); / * Gawin ang kahilingan, makukuha ng res ang return code * / res = curl_easy_perform (curl); kung (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (% d)", res); kung (len) fprintf (stderr, "% s% s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "% s / n / n", curl_easy_strerror (res)); paglilinis ng goto; } paglilinis: curl_easy_cleanup (curl); curl_global_cleanup (); ibalik ang 0; }}

Na nakasulat ang pagpapaandar na ito, kailangan ko lamang itong patakbuhin nang sabay-sabay na nai-post ang data ng sqlite:

kung (goodData == 1) {

kung (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO readings (cookid, time, probe1, probe2) VALUES (% d, '% s',% d, % d); ", cookID, buff, probe1, probe2); printf ("% s / n", sql); rc = sqlite3_exec (db, sql, callback, 0, & zErrMsg); kung (rc! = SQLITE_OK) {printf ("SQL error:% s / n", zErrMsg); } iba pa {last_db_write = secs; } char url = "https://xx.xx.xx.xx: 8888 / griddb"; postData (buff, cookID, probe1, probe2, url); }}

Upang matiyak na ang iyong data ay talagang naipapasok sa iyong server, maaari mong patakbuhin ang sumusunod na utos upang magtanong sa iyong database at tingnan ang mga resulta:

curl -X POST --basic -u admin: admin -H "Type-content: application / json" -d '{"limit": 1000}' https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / pampubliko / lalagyan / bbqpi / row

Hakbang 2: Grafana

Grafana
Grafana
Grafana
Grafana

Gamit ang code na nasa lugar, ngayon kapag ginamit namin ang orihinal na web portal upang magsimula ng isang "lutuin", sabay naming maiimbak ang aming data ng temperatura sa aming GridDB server.

Ang susunod na hakbang ay upang mailarawan ang aming data gamit ang Grafana. Upang magawa ito, sinundan namin ang impormasyon mula sa blog na ito: dito. Ang magandang bagay tungkol sa pagpapatupad na ito ay napakadali na makita ang aming data na na-chart sa isang magandang graph. Nagdadagdag din ito ng mga anotasyon.

Ang mga anotasyon na tinalakay sa blog ay ginagawang madali para sa amin na subaybayan kung may mali sa alinman sa aming pagkain o sa hukay mismo. Sa aking kaso, nagluluto ako ng maliliit na buto ng baka. Sa mga iyon, hindi ko nais na ang temperatura sa hukay na lumago nang lampas sa 275 degree Fahrenheit. Kung nakita ko ang temperatura na lampas doon, maaari kong patayin ang isang burner at payagan ang init na muling lumubog:

Mayroon akong isang katulad na panuntunan para sa sensor na talagang pinapanatili ang mga tab sa mismong pagkain: kung ang pagkain ay nakuha sa isang panloob na temp na 203 degree fahrenheit, handa na ang mga buto-buto. Maaari mong makita ang nag-iisang anotasyon sa dulo ng lutuin dito:

Sa kabuuan, kinuha lamang ako ng tagapagluto ng mga ~ 4 na oras o higit pa, ngunit ang ganitong uri ng pag-set up ay tunay na magagaling kung nagluluto ako ng isang bagay na nangangailangan ng mas maraming oras sa grill (isipin ang isang mabagal na usok na tumatagal ~ 12 oras). Sa kabila nito, naniniwala ako na ang halaga kung ang tool na ito ay madaling maliwanag: ang pag-log ng mga resulta ng iyong mga pagkain at pagkatapos ihambing ito sa mga nakaraang lutuin nangangahulugan na ang iyong BBQing ay dahan-dahang magiging mas mahusay sa paglipas ng panahon dahil maaari mong gamitin ang data upang makita kung ano ang gumagana at kung ano ang hindi 't

Hakbang 3: Ang Pagkain

Ang pagkain
Ang pagkain
Ang pagkain
Ang pagkain
Ang pagkain
Ang pagkain

Ito ang kauna-unahang pagkakataon na gumawa ako ng maiikling buto ng baka; para sa pampalasa, simpleng ginamit ko ang asin, itim na paminta, at pulbos ng bawang. Sa kabila ng ilang mga isyu sa burner na nakakakuha ng masyadong mataas para sa isang maliit na bata doon sa simula, ang mga buto-buto ay lumabas na kamangha-manghang. Mangyaring tingnan:

Hakbang 4: Konklusyon

Sa huli, ang pagkain ay lumabas na kakila-kilabot, ang mga sensor, GridDB, at Grafana lahat ay nagtrabaho nang mahusay sa konsyerto, at nakakuha kami ng ilang mahalagang data sa kung paano lutuin muli ang mga bagay na ito sa susunod na nais naming mapahanga ang ilang mga kaibigan.

Inirerekumendang: