Խորոված Pi (տվյալների արտացոլմամբ): 4 քայլ (նկարներով)
Խորոված Pi (տվյալների արտացոլմամբ): 4 քայլ (նկարներով)
BBQ Pi (Տվյալների արտացոլմամբ)
BBQ Pi (Տվյալների արտացոլմամբ)
BBQ Pi (Տվյալների արտացոլմամբ)
BBQ Pi (Տվյալների արտացոլմամբ)
BBQ Pi (Տվյալների արտացոլմամբ)
BBQ Pi (Տվյալների արտացոլմամբ)

Ներածություն

Խորովածը սովորաբար վերաբերում է ձեր սիրած միսը եփելու համար անուղղակի ջերմության օգտագործման դանդաղ գործընթացին: Թեև խոհարարության այս մեթոդը մեծ ժողովրդականություն է վայելում, հատկապես ԱՄՆ-ում, այն ունի այն, ինչը ոմանք կարող են համարել բավականին լուրջ թուլություն. Դա պահանջում է ժամեր շարունակ կիսաթափանցիկ ուշադրություն դարձնել ձեր փոսի և սննդի ջերմաստիճանը վերահսկելու համար: Մուտքագրեք ՝ Raspberry Pi:

Օրիգինալ նախագիծ

Այս նախագծի սկզբնաղբյուրը կարելի է գտնել այստեղ ՝ https://old.reddit.com/r/raspberry_pi/comments/a0… Դրա հիմնական էությունն այն է, որ reddit օգտվող Produkt- ը կարողացել է համեմատաբար էժան փոխանցել սննդի և փոսի ջերմաստիճանի տվյալները:, առևտրային հասանելի անլար ջերմաչափեր Raspberry Pi- ի համար (որը կցված էր GPIO- ի կապում փոքր ՌԴ մոդուլ): Սկզբնական նախագծում (վերը նշված հղումով) Պրոդուկտը իր տվյալները պահում էր sqlite տվյալների շտեմարանում և ցուցադրվում տեղական apache2 php վեբ կայքում:

Այս լուծումն արդեն լուծում է օրիգինալ խնդիրը, որին անդրադարձել է այս բլոգի ներդրումը. Այժմ կարող եք վեբ դիտարկիչով հեռակա վերահսկել ձեր սննդի և փոսի ջերմաստիճանը: Բայց ի՞նչ կլիներ, եթե մենք ցանկանայինք ընդլայնել սա: Մուտքագրեք ՝ GridDB:

Պարագաներ

Ազնվամորի Pi4

SUNKEE 433Mhz Superheterodyne անլար ընդունիչ մոդուլ

Քայլ 1: GridDB Web API և FluentD

GridDB Web API և FluentD
GridDB Web API և FluentD

Այս նախագիծը տեսնելուն պես, իմ առաջին միտքը `հուզմունքի սկզբնական ալիքից հետո, մտածում էր, թե ինչպես կարող եմ ընդլայնել ֆունկցիոնալությունը: Օգտագործելով GridDB- ն և դրա Grafana հավելվածը, ես ձգտեցի պատկերացնել իմ սննդի և փոսի տվյալները: Դրանից դուրս, ես ցանկանում էի Grafana- ի ծանոթագրություններ տեղադրել `անոմալ տվյալների ցանկացած կետ գտնելու համար. Չի կարող ածխած միս ունենալ:

Սկսելու համար ես պետք է օգտագործեի սկզբնական նախագծի C կոդը `անլար ջերմաչափից եկող տվյալները կարդալու և այդ տվյալները տեղադրելու իմ GridDB սերվերում: Այս ամենը գործարկելու համար ես պտտեցի GridDB սերվերը Azure- ում ՝ օգտագործելով CentOS վիրտուալ մեքենա: Մեր եզրային մեքենայից (Raspberry Pi) մեր ամպային սերվերին տվյալներ կիսելու ամենահեշտ ձևը GridDB Web API- ն էր: Այսպիսով, այդ vm- ի վրա ես ստեղծեցի GridDB- ի WebAPI- ն ՝ Fluentd- ի և ուղեկցող GridDB միակցիչի հետ միասին:

Նախքան տվյալների ամպ ուղարկելը, ես պետք է ստեղծեի իմ BBQ Pi կոնտեյների հիմնական սխեման: Տվյալների հավաքածուն չափազանց պարզ է. Մենք ունենք երկու ջերմաստիճանի տվիչ, մեկ խոհարարի ID և, իհարկե, ժամանակային նշան: Այսպիսով, մեր սխեման ունի հետևյալ տեսքը.

timeseries = gridstore.put_container ("bbqpi", [(«ժամանակ», griddb. GS_TYPE_TIMESTAMP), («cookid», griddb. GS_TYPE_INT), («probe1», griddb. GS_TYPE_INT), («probe2», griddb. GS_TYPE_INT)_TIME

Timesամկետների այս կոնտեյները ստեղծելու համար ես պարզապես օգտագործեցի WebAPI (նավահանգիստ 8080).

curl -X POST -հիմնական -u admin: admin -H "Content -type: application/json" -d

'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "colunns": [{"name": "time", "type": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type" ՝ "INTEGER"}]} '\ https:// localhost: 8080/griddb/v2/defaultCluster/dbs/public/բեռնարկղեր

Ստեղծված կոնտեյներով, ես պետք է օգտագործեի 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 (լիցքավորման ժամանակ , int cookid, int probe1, int probe2, char url )

{CURL *curl; CURL կոդ res; / * Windows- ում սա նախաստորագրում է վիզոկի իրերը */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; char գործակալ [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", ժամանակը, cookid, probe1, probe2); / * ստանալ գանգուր բռնակ */ curl = curl_easy_init (); if (curl) { /* Նախ նշեք այն URL- ը, որը պատրաստվում է ստանալ մեր POST- ը: Այս URL- ը կարող է լինել նաև https:// URL, եթե դա այն է, ինչ պետք է ստանա տվյալները: */ snprintf (գործակալ, sizeof գործակալ, «libcurl/%s», curl_version_info (CURLVERSION_NOW)-> տարբերակ); գործակալ [sizeofent - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, գործակալ); 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); / * Կատարեք հարցումը, 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)); գնալ մաքրման; } մաքրում. curl_easy_cleanup (curl); curl_global_cleanup (); վերադարձ 0; }}

Այս ֆունկցիան գրված լինելով, ինձ պարզապես անհրաժեշտ էր, որ այն աշխատեր միաժամանակ, երբ տեղադրվում էին sqlite տվյալները.

եթե (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "ՄՏԱԵՔ ընթերցումների մեջ (խաշած, ժամանակ, հետաքննիչ 1, զոնդ 2) ԱՐUԵՔՆԵՐ (%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 ("SQL սխալ. %s / n", zErrMsg); } else {last_db_write = վայրկյաններ; } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}

Որպեսզի համոզվեք, որ ձեր տվյալները իրականում տեղադրվում են ձեր սերվերի մեջ, կարող եք գործարկել հետևյալ հրամանը ՝ ձեր տվյալների բազան հարցնելու և արդյունքները դիտելու համար.

curl -X POST -հիմնական -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 ֆունտ) ժամեր). Չնայած դրան, ես կարծում եմ, որ արժեքը, եթե այս գործիքը հեշտությամբ երևում է. Կարողանալ գրանցել ձեր սննդի արդյունքները և այն համեմատել նախորդ խոհարարների հետ, նշանակում է, որ ձեր խորովածը ժամանակի ընթացքում կամաց -կամաց կբարելավվի, քանի որ կարող եք օգտագործել տվյալները ՝ տեսնելու, թե ինչն է աշխատում և ինչը ՝ ոչ: 't

Քայլ 3: Սնունդ

Սնունդը
Սնունդը
Սնունդը
Սնունդը
Սնունդը
Սնունդը

Սա առաջին անգամն էր, երբ ես երբևէ տավարի կարճ կողիկներ էի պատրաստում. համեմունքների համար ես պարզապես օգտագործում էի աղ, սև պղպեղ և սխտորի փոշի: Չնայած որոշ խնդիրներին, որ այրիչը չափազանց բարձր էր դառնում սկզբում այնտեղ, կողերը ֆանտաստիկ էին դուրս գալիս: Խնդրում ենք դիտել.

Քայլ 4: Եզրակացություն

Ի վերջո, սնունդը հոյակապ դուրս եկավ, սենսորները, GridDB- ն և Գրաֆանան բոլորը համերաշխ աշխատում էին գեղեցիկ, և մենք ստացանք որոշ արժեքավոր տվյալներ այն մասին, թե ինչպես կարելի է նորից պատրաստել այս իրերը հաջորդ անգամ, երբ ցանկանում ենք տպավորություն թողնել որոշ ընկերների վրա:

Խորհուրդ ենք տալիս: