Isi kandungan:

BBQ Pi (Dengan Visualisasi Data!): 4 Langkah (dengan Gambar)
BBQ Pi (Dengan Visualisasi Data!): 4 Langkah (dengan Gambar)

Video: BBQ Pi (Dengan Visualisasi Data!): 4 Langkah (dengan Gambar)

Video: BBQ Pi (Dengan Visualisasi Data!): 4 Langkah (dengan Gambar)
Video: Visualisasi dan Deskripsi Data #4 | Bagaimana Mendeskripsikan Pie Chart? 2024, November
Anonim
BBQ Pi (Dengan Visualisasi Data!)
BBQ Pi (Dengan Visualisasi Data!)
BBQ Pi (Dengan Visualisasi Data!)
BBQ Pi (Dengan Visualisasi Data!)
BBQ Pi (Dengan Visualisasi Data!)
BBQ Pi (Dengan Visualisasi Data!)

Pengenalan

Barbeku biasanya merujuk kepada proses lambat menggunakan haba tidak langsung untuk memasak daging kegemaran anda. Walaupun kaedah memasak ini sangat popular - terutama di AS - ia memang mempunyai beberapa yang mungkin dianggap sebagai kelemahan yang agak serius: ia memerlukan perhatian berjam-jam untuk menghabiskan masa untuk memantau suhu lubang dan makanan anda. Masukkan: Raspberry Pi.

Projek Asal

Sumber asal untuk projek ini boleh didapati di sini: https://old.reddit.com/r/raspberry_pi/comments/a0… Intinya adalah bahawa pengguna reddit Produkt dapat menyampaikan data suhu makanan dan lubang dari harga yang agak murah, termometer wayarles yang tersedia secara komersial pada Raspberry Pi (yang telah dipasang pada pin GPIO modul RF kecil). Dalam projek asal (dihubungkan di atas), Produkt menyimpan datanya dalam pangkalan data sqlite dan dipaparkan ke laman web apache2 php yang dihoskan secara tempatan.

Penyelesaian ini telah menyelesaikan masalah asal yang disentuh dalam pengenalan blog ini: anda kini dapat memantau suhu makanan & lubang anda dari jauh dengan penyemak imbas web. Tetapi bagaimana jika kita ingin memperluas ini? Masukkan: GridDB.

Bekalan

Raspberry Pi4

Modul Penerima Tanpa Wayar SUNKEE 433Mhz Superheterodyne

Langkah 1: API Web GridDB & FluentD

API Web & FluentD GridDB
API Web & FluentD GridDB

Setelah melihat projek ini, pemikiran pertama saya - setelah gelombang kegembiraan awal - memikirkan cara saya memperluas fungsi. Dengan menggunakan GridDB dan plugin Grafananya, saya berusaha untuk memvisualisasikan data makanan & pit saya. Di luar itu, saya ingin menyediakan anotasi Grafana untuk mencari titik data yang tidak normal - tidak boleh mempunyai daging hangus!

Untuk memulakan, saya perlu menggunakan kod C dari projek asal untuk membaca data yang masuk dari termometer tanpa wayar dan memasukkan data tersebut ke pelayan GridDB saya. Untuk menghidupkan dan menjalankannya, saya memutar pelayan GridDB di Azure menggunakan mesin maya CentOS. Kaedah termudah untuk berkongsi data dari mesin tepi kami (Raspberry Pi) ke pelayan awan kami adalah melalui API Web GridDB. Oleh itu, pada vm itu, saya menyediakan WebAPI GridDB bersama dengan Fluentd dan penyambung GridDB yang menyertainya.

Sebelum benar-benar menghantar data ke awan, saya perlu membuat skema asas untuk bekas BBQ Pi saya. Set data yang masuk sangat mudah: kami mempunyai dua sensor suhu, satu id memasak, dan tentu saja, cap waktu. Jadi skema kami kelihatan seperti ini:

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

Untuk membuat bekas kali ini, saya hanya menggunakan WebAPI (port 8080):

curl -X POST --basic -u admin: admin -H "Content-type: application / json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "columns": [{"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

Dengan bekas yang dibuat, saya perlu menggunakan Fluentd (port 8888) untuk menghantar data sebenar ke dalam bekas kami. Berikut adalah arahan CURL yang memuatkan beberapa data palsu:

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

Dari sana, saya perlu menambahkan kod asal untuk menghantar Permintaan POST HTTP setiap kali Pi kami membaca data dari lubang kami (kira-kira sekali setiap ~ 12 saat).

Sebagai catatan: menulis kod ini mengajar saya untuk menghargai betapa verbal bahasa C dapat:

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

{CURL * keriting; Res kod CURL; / * Di tingkap, ini akan memasukkan barang winsock * / curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; ejen char [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"% s.112Z / ", \" cookid / ": \"% d / ", \" probe1 / ": \"% d / ", / "probe2 \": / "% d \"} ", masa, cookid, probe1, probe2); / * dapatkan pemegang curl * / curl = curl_easy_init (); if (curl) {/ * Tetapkan dahulu URL yang akan menerima POST kami. URL ini juga boleh menjadi URL https:// jika itulah yang seharusnya menerima data. * / snprintf (ejen, ejen sizeof, "libcurl /% s", curl_version_info (CURLVERSION_NOW) -> versi); ejen [sizeof ejen - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, ejen); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "pentadbir"); 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); / * Lakukan permintaan, res akan mendapat kod pengembalian * / res = curl_easy_perform (curl); jika (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (% d)", res); jika (len) fprintf (stderr, "% s% s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "% s / n / n", curl_easy_strerror (res)); goto pembersihan; } pembersihan: curl_easy_cleanup (curl); curl_global_cleanup (); pulangan 0; }}

Dengan fungsi ini ditulis, saya hanya perlu menjalankannya pada masa yang sama dengan data sqlite disiarkan:

jika (goodData == 1) {

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

Untuk memastikan data anda benar-benar dimasukkan ke pelayan anda, anda dapat menjalankan perintah berikut untuk membuat pertanyaan pada pangkalan data anda dan melihat hasilnya:

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

Langkah 2: Grafana

Grafana
Grafana
Grafana
Grafana

Dengan kod yang ada, sekarang apabila kita menggunakan portal web yang asli untuk memulakan "masak", kita akan menyimpan data suhu ke dalam pelayan GridDB secara serentak.

Langkah seterusnya adalah memvisualisasikan data kita menggunakan Grafana. Untuk melakukannya, kami mengikuti maklumat dari blog ini: di sini. Perkara yang baik mengenai pelaksanaan ini adalah bahawa sangat mudah untuk melihat data kami dipetakan ke dalam grafik yang bagus. Ia juga menambah penjelasan.

Anotasi yang dibincangkan di dalam blog menjadikan kita sangat mudah untuk memantau bila ada yang tidak kena dengan makanan kita atau lubang itu sendiri. Dalam kes saya, saya memasak tulang rusuk pendek daging lembu. Dengan itu, saya tidak mahu suhu di dalam lubang meningkat melebihi 275 darjah Fahrenheit. Sekiranya saya melihat suhu melebihi itu, saya boleh mematikan pembakar dan membiarkan panas merosot lagi:

Saya mempunyai peraturan yang sama kerana sensor benar-benar mengawasi makanan itu sendiri: jika makanan mencapai suhu dalaman 203 darjah fahrenheit, tulang rusuk sudah siap. Anda dapat melihat anotasi sendirian di hujung tukang masak di sini:

Secara keseluruhan, tukang masak itu hanya memerlukan saya sekitar ~ 4 jam, tetapi persediaan seperti ini akan sangat unggul jika saya memasak sesuatu yang memerlukan lebih banyak masa di panggangan (fikirkan asap rendah perlahan yang boleh bertahan ~ 12 Jam). Walaupun begitu, saya yakin nilainya jika alat ini mudah dilihat: dapat mencatat hasil makanan anda dan kemudian membandingkannya dengan tukang masak sebelumnya bermakna BBQ anda perlahan-lahan akan bertambah baik dari masa ke masa kerana anda dapat menggunakan data untuk melihat apa yang berfungsi dan apa yang tidak t.

Langkah 3: Makanan

Makanan
Makanan
Makanan
Makanan
Makanan
Makanan

Ini adalah kali pertama saya membuat tulang rusuk pendek daging lembu; untuk perasa, saya hanya menggunakan garam, lada hitam, dan serbuk bawang putih. Walaupun terdapat beberapa masalah dengan pembakar terlalu tinggi untuk sedikit pada awalnya, tulang rusuknya keluar dengan hebat. Sila lihat:

Langkah 4: Kesimpulannya

Pada akhirnya, makanannya keluar dengan hebat, sensor, GridDB, dan Grafana semuanya bekerja dalam konsert dengan indah, dan kami mendapat beberapa data berharga tentang cara memasak kembali ini untuk kali berikutnya kami ingin menarik perhatian beberapa rakan.

Disyorkan: