جدول المحتويات:
- اللوازم
- الخطوة 1: GridDB Web API & FluentD
- الخطوة 2: جرافانا
- الخطوة الثالثة: الطعام
- الخطوة 4: الخاتمة
فيديو: BBQ Pi (مع تصور البيانات!): 4 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:37
مقدمة
عادةً ما يشير الشواء إلى العملية البطيئة لاستخدام الحرارة غير المباشرة لطهي اللحوم المفضلة لديك. على الرغم من أن طريقة الطهي هذه تحظى بشعبية كبيرة - خاصة في الولايات المتحدة - إلا أنها تحتوي على ما قد يعتبره البعض ضعفًا خطيرًا إلى حد ما: فهي تتطلب ساعات من الاهتمام شبه الواضح لقضاءها في مراقبة درجة حرارة الحفرة والطعام. أدخل: 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 والمكوِّن الإضافي 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 جميعًا في حفلة موسيقية بشكل جميل ، وحصلنا على بعض البيانات القيمة حول كيفية طهي هذه الأشياء مرة أخرى في المرة القادمة التي نريد إقناع بعض الأصدقاء بها.
موصى به:
تصور البيانات من Magicbit في AWS: 5 خطوات
تصور البيانات من Magicbit في AWS: سيتم نشر البيانات التي تم جمعها من أجهزة الاستشعار المتصلة بـ Magicbit إلى AWS IOT core من خلال MQTT ليتم تصورها بيانياً في الوقت الفعلي. نحن نستخدم Magicbit كلوحة تطوير في هذا المشروع الذي يعتمد على ESP32. لذلك أي ESP32 د
إنترنت الأشياء: تصور بيانات مستشعر الضوء باستخدام Node-RED: 7 خطوات
إنترنت الأشياء: تصور بيانات مستشعر الضوء باستخدام Node-RED: في هذه التعليمات ، ستتعلم كيفية إنشاء مستشعر متصل بالإنترنت! سأستخدم مستشعر الإضاءة المحيطة (TI OPT3001) لهذا العرض التوضيحي ، ولكن أي جهاز استشعار من اختيارك (درجة الحرارة ، والرطوبة ، ومقياس الجهد ، وما إلى ذلك) سيعمل. قيم المستشعر
تصور مكاسب وخسارة البيتكوين الخاصة بك مع Arduino & Python: 6 خطوات
تصور مكاسب وخسارة البيتكوين الخاصة بك مع Arduino & Python: فكرة أساسية شخصيًا أنا مستثمر عملة مشفرة. لكن لدي أيضًا عبء ثقيل من العمل يجب أن أحضره. لذلك لا يمكنني الاستمرار في تتبع سعر البيتكوين مثل 10 مرات في الدقيقة. ومع ذلك ، ما زلت أريد معرفة ما إذا كنت أكسب المال أم أخسره. هكذا،
تصور الضغط الجوي ودرجة الحرارة باستخدام Infineon XMC4700 RelaxKit و Infineon DPS422 و AWS: 8 خطوات
تصور الضغط الجوي ودرجة الحرارة باستخدام Infineon XMC4700 RelaxKit و Infineon DPS422 و AWS: إنه مشروع بسيط لالتقاط الضغط الجوي ودرجة الحرارة باستخدام DPS 422. من Infineon يصبح من الصعب تتبع الضغط ودرجة الحرارة خلال فترة من الزمن. هذا هو المكان الذي تأتي فيه التحليلات في الصورة ، والرؤية حول التغيير في
نظام الحصول على البيانات وتصور البيانات لدراجة سباق كهربائية MotoStudent: 23 خطوة
نظام الحصول على البيانات وتصور البيانات لدراجة سباق كهربائية MotoStudent: نظام الحصول على البيانات عبارة عن مجموعة من الأجهزة والبرامج تعمل معًا من أجل جمع البيانات من أجهزة الاستشعار الخارجية وتخزينها ومعالجتها بعد ذلك بحيث يمكن تصورها بيانياً وتحليلها ، السماح للمهندسين بعمل