جدول المحتويات:

BBQ Pi (مع تصور البيانات!): 4 خطوات (بالصور)
BBQ Pi (مع تصور البيانات!): 4 خطوات (بالصور)

فيديو: BBQ Pi (مع تصور البيانات!): 4 خطوات (بالصور)

فيديو: BBQ Pi (مع تصور البيانات!): 4 خطوات (بالصور)
فيديو: Deutsch lernen (A1): Ganzer Film auf Deutsch - "Nicos Weg" | Deutsch lernen mit Videos | Untertitel 2024, شهر نوفمبر
Anonim
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 بوحدة RF صغيرة). في المشروع الأصلي (المرتبط أعلاه) ، تم تخزين بيانات Produkt في قاعدة بيانات 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 هذا ، قمت بإعداد WebAPI الخاص بـ GridDB مع Fluentd وموصل GridDB المصاحب.

قبل إرسال البيانات فعليًا إلى السحابة ، كنت بحاجة إلى إنشاء مخطط أساسي لحاوية BBQ Pi الخاصة بي. مجموعة البيانات الواردة بسيطة للغاية: لدينا مستشعران لدرجة الحرارة ، ومعرف طباخ واحد ، وبالطبع الطابع الزمني. لذلك يبدو مخططنا كما يلي:

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_CONTAINER_T)]

لإنشاء حاوية السلسلة الزمنية هذه ، استخدمت ببساطة WebAPI (المنفذ 8080):

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

'{"container_name": "bbqpi"، "container_type": "TIME_SERIES"، / "rowkey": صحيح ، "أعمدة": [{"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

مع إنشاء الحاوية ، كنت بحاجة إلى استخدام 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 (char time ، int cookid، int probe1، int probe2، char url )

{CURL * curl ؛ الدقة CURLcode ؛ / * في الويندوز ، سيؤدي هذا إلى تشغيل winsock stuff * / curl_global_init (CURL_GLOBAL_ALL) ؛ char errbuf [CURL_ERROR_SIZE] = {0،} ، وكيل شار [1024] = {0،} ؛ شار جسون [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 (وكيل ، حجم الوكيل ، "libcurl /٪ s" ، curl_version_info (CURLVERSION_NOW) -> الإصدار) ؛ الوكيل [حجم الوكيل - 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 = curl_easy_perform (curl) ؛ إذا (الدقة! = 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، "INSERT INTO readings (cookid، time، probe1، probe2) VALUES (٪ d، '٪ s'،٪ d، ٪ d) ؛ "، cookID ، buff ، مسبار 1 ، مسبار 2) ؛ printf ("٪ s / n"، sql) ؛ rc = sqlite3_exec (ديسيبل ، SQL ، رد الاتصال ، 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 --basic -u admin: admin -H "Content-type: application / json" -d '{"limit": 1000}' https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / عام / حاويات / شواء / صفوف

الخطوة 2: جرافانا

جرافانا
جرافانا
جرافانا
جرافانا

مع وجود الكود في مكانه ، الآن عندما نستخدم بوابة الويب الأصلية لبدء "الطهي" ، سنقوم في نفس الوقت بتخزين بيانات درجة الحرارة الخاصة بنا في خادم GridDB الخاص بنا.

ستكون الخطوة التالية هي تصور بياناتنا باستخدام Grafana. للقيام بذلك ، تابعنا المعلومات من هذه المدونة: هنا. الشيء الجميل في هذا التنفيذ هو أنه من السهل للغاية رؤية بياناتنا مخططة في رسم بياني جميل. كما يضيف التعليقات التوضيحية.

تجعل التعليقات التوضيحية التي تمت مناقشتها في المدونة من السهل جدًا علينا مراقبة ما إذا حدث خطأ ما في طعامنا أو الحفرة نفسها. في حالتي ، كنت أطهو أضلاع لحم البقر القصيرة. مع هؤلاء ، لم أكن أريد أن تزيد درجة الحرارة في الحفرة عن 275 درجة فهرنهايت. إذا رأيت درجة الحرارة تتجاوز ذلك ، يمكنني إيقاف تشغيل الموقد والسماح للحرارة بالانخفاض مرة أخرى:

كان لديّ قاعدة مماثلة لجهاز الاستشعار الذي يحتفظ بعلامات تبويب على الطعام نفسه: إذا وصل الطعام إلى درجة حرارة داخلية تبلغ 203 درجة فهرنهايت ، فإن الأضلاع كانت جاهزة. يمكنك مشاهدة التعليق التوضيحي الوحيد في نهاية الطباخ هنا:

الكل في الكل ، أخذني الطاهي حوالي 4 ساعات تقريبًا أو نحو ذلك ، لكن هذا النوع من الإعداد سوف يتفوق حقًا إذا كنت أطبخ شيئًا كان سيتطلب مزيدًا من الوقت في الشواية (فكر في دخان بطيء منخفض يستمر ~ 12 ساعات). على الرغم من ذلك ، أعتقد أن القيمة إذا كانت هذه الأداة واضحة بسهولة: القدرة على تسجيل نتائج الأطعمة الخاصة بك ثم مقارنتها مع الطهاة السابقين يعني أن عملية الشواء الخاصة بك ستتحسن ببطء بمرور الوقت حيث يمكنك استخدام البيانات لمعرفة ما الذي ينجح وما الذي لا يصلح. ر.

الخطوة الثالثة: الطعام

الطعام
الطعام
الطعام
الطعام
الطعام
الطعام

كانت هذه هي المرة الأولى التي أصنع فيها أضلاعًا قصيرة من اللحم البقري ؛ بالنسبة للتوابل ، استخدمت الملح والفلفل الأسود ومسحوق الثوم. على الرغم من بعض المشكلات المتعلقة بارتفاع الموقد بدرجة كبيرة قليلاً في البداية ، فقد خرجت الأضلاع بشكل رائع. من فضلك الق نظرة:

الخطوة 4: الخاتمة

في النهاية ، جاء الطعام رائعًا ، وعملت المستشعرات و GridDB و Grafana جميعًا في حفلة موسيقية بشكل جميل ، وحصلنا على بعض البيانات القيمة حول كيفية طهي هذه الأشياء مرة أخرى في المرة القادمة التي نريد إقناع بعض الأصدقاء بها.

موصى به: