الجمعة، 11 نوفمبر 2022

Arduino تكشف عن Opta ، أول "Micro PLC" لإنترنت الأشياء الصناعي

 بنيت حول STM32H747XI ، عائلة Opta - المتوفرة في متغيرات Ethernet و RS485 و Wi-Fi / Bluetooth - تستهدف المحترفين.




أعلنت شركة Arduino عن ما تسميه "أول جهاز تحكم منطقي قابل للبرمجة (micro PLC) ،" Opta - أداة قوية مصممة مع إنترنت الأشياء الصناعي (IIoT) في المقدمة.


"لقد صممنا [Opta] على وجه التحديد مع وضع مهندسي PLC في الاعتبار ،" يدعي فريق Arduino أنه تم إطلاق أحدث الأجهزة ، ودعم اللغات القياسية بما في ذلك LD (مخطط سلم المنطق) و FBD (مخطط كتلة الوظيفة) ، فهو يتيح للمستخدمين المحترفين توسيع نطاق مشاريع الأتمتة الصناعية والمباني تستفيد من نهجنا المفتوح المصدر ، سهل الاستخدام ، والمانع لتقييد البائعين ".


داخليًا ، يستخدم Opta القابل للتركيب على قضيب DIN - الذي طورته Arduino بالشراكة مع Finder - متحكمًا دقيقًا ثنائي النواة STMicro STM32H747XI ، والذي يتضمن نواة Arm Cortex-M7 عالية الأداء تعمل بسرعة تصل إلى 480 ميجاهرتز و Cortex منخفض الطاقة- يعمل M4 core بسرعة تصل إلى 240 ميجاهرتز جنبًا إلى جنب مع وحدة النقطة العائمة المشتركة (FPU) ، ومسرع Chrom-ART ، ومسرع JPEG للأجهزة ، وفلاش 2 ميجابايت ، وإجمالي 1،056 كيلو بايت من ذاكرة الوصول العشوائي بالإضافة إلى 1،024 بايت و 4 كيلوبايت من ذاكرة الوصول العشوائي الثابتة (SRAM) .

يعتمد ما تستخدمه بالضبط مع Opta على الطراز ، مع إتاحة ثلاثة متغيرات عند الإطلاق: Opta Lite ، والذي يتضمن اتصال Ethernet و USB Type-C للبرمجة ؛ Opta RS485 ، الذي يضيف دعمًا مزدوج الاتجاه RS485 بشكل غير مفاجئ ؛ و Opta WiFi ، والذي يتضمن أجهزة راديو لاتصالات Wi-Fi و Bluetooth منخفضة الطاقة (BLE). تدعم جميع الطرز التحديثات عبر الهواء ، وقد أكد Arduino ، وتتميز بعنصر آمن مخصص لضمانات التشفير ، بالإضافة إلى مرحلات لتبديل أربعة أحمال تصل إلى 2.3 كيلو واط لكل منها



يدعي فريق Arduino أن Opta تفتح فرصًا جديدة للأتمتة الصناعية في متناول الجميع من خلال الاتصال على متن الطائرة وقدرات التعلم الآلي: تصميم وتكرار وتنفيذ أفكار طموحة بشكل متزايد لتصنيع عالي الجودة وزيادة الكفاءة وإنتاجية أفضل و الربحية. إذا كنت تتفق معنا على أن الابتكار موجود هنا لمساعدتنا في مواجهة كل تحدٍ ممكن ، فإننا نتطلع إلى رؤية الحلول التي تقوم بإنشائها للعمل بشكل أفضل مع Opta! "


في وقت كتابة هذا التقرير ، لم يكن Arduino قد أصدر معلومات التسعير لعائلة Opta ؛ من المتوقع الحصول على مزيد من المعلومات قبل توفر الأجهزة في ديسمبر من هذا العام. ليتم إخطارك عند إطلاق مجموعة Opta ، يمكنك ذلك



















الجمعة، 28 أكتوبر 2022

5.1 قناة معالج الصوت التناظري

 هذا المشروع عبارة عن معالج صوت تمثيلي 5.1 قناة يعتمد على PT2322 و Arduino Nano.



الأشياء المستخدمة في هذا المشروع
مكونات الأجهزة
PT2322
اردوينو نانو R3
onsemi 2N7002
STMicroelectronics L78M08

تطبيقات البرمجيات والخدمات عبر الإنترنت


قصة
في هذا المشروع ، قمنا بتطوير معالج صوت تناظري 5.1 قناة باستخدام PT2322 IC. PT2322 هو معالج صوتي تناظري رخيص الثمن قدمته شركة Princeton Technology Corporation. يحتوي على مخففات القنوات الفردية المكونة من 6 قنوات ، ونظام التحكم في النغمة ثلاثي الاتجاهات لمكبرات الصوت الأمامية ، ونظام محاكاة الصوت ثلاثي الأبعاد.



في هذا التصميم ، نقوم بدمج PT2322 مع Arduino Nano وربطه بلوحات الكمبيوتر / الكمبيوتر المدمجة من خلال منفذ USB. يوفر تطبيق GTK UI الأصلي للتحكم في جميع وظائف PT2322 IC.

يمكن لـ Arduino Nano إضافة مباشرة إلى وحدة PT2322. توجد ثلاثة أزرار ضغط على اللوحة نفسها للتحكم في مستوى الصوت وكتم الصوت.

لتقليل التكلفة وتقليل حجم ثنائي الفينيل متعدد الكلور ، نستخدم مكونات SMD ومكونات من النوع عبر الفتحة في ثنائي الفينيل متعدد الكلور هذا. أبعاد PCB هي 59 مم × 60 مم. يمكن أن تطلب PCB لهذه الوحدة مباشرة من صفحة مشروع PCBWay. باستخدام خدمة PCBWay ، يمكنك طلب مركبات ثنائي الفينيل متعدد الكلور عالية الجودة بأسعار منخفضة. استخدم أداة عرض الأسعار عبر الإنترنت PCBWay للتسعير والمزيد من التفاصيل.


تم تطوير برنامج Arduino الثابت في هذا المشروع باستخدام PlatformIO. تمت كتابة تطبيق التحكم من جانب المضيف باستخدام GCC C. يمكن تجميع تطبيق واجهة المستخدم هذا وتشغيله على أي لوحة متوافقة مع Linux / GTK مثل أجهزة الكمبيوتر الشخصية و Raspberry Pi و Orange Pi و BeagleBone Black وما إلى ذلك. يتم إجراؤها من خلال واجهة USB UART التي توفرها لوحة Arduino Nano.


في مرحلة النمذجة ، نختبر هذه اللوحة باستخدام بطاقة صوت ASUS Xonar SE 5.1 ونظام مكبر صوت تناظري Creative Inspire T6300 - 5.1. يوفر الإعداد أعلاه إخراجًا صوتيًا نظيفًا دون أي تشويه ملحوظ.

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

يحتوي جهاز PT2322 على نظام تحكم في النغمات ثلاثي الاتجاهات يسمح بالتحكم في الصوت الجهير والمتوسط وثلاثة أضعاف في نطاق من -14 ديسيبل إلى + 14 ديسيبل. يوفر نظام التوهين المكون من 6 قنوات توهينًا يصل إلى 15 ديسيبل لكل قناة. كل هذه الضوابط تنقسم إلى 15 خطوة. يمكن استخدام مفتاح التحكم في مستوى الصوت الرئيسي لضبط التوهين من 79 ديسيبل إلى 0 ديسيبل في 80 خطوة.


وحدة معالجة الصوت هذه هي مشروع أجهزة مفتوح المصدر. جميع ملفات التصميم وأكواد المصدر والثنائيات المترجمة موجودة في مستودع المشروع في github.com.














السبت، 3 سبتمبر 2022

تتبع الأصول الداخلي باستخدام Wi-Fi Triangulation

 قم ببناء حل IoT كامل لتتبع الأصول الداخلية باستخدام Blues Wireless Notecard ، ومضيف ESP32 MCU ، و Notecarrier-F ، و Datacake.






الأشياء المستخدمة في هذا المشروع

Blues Wireless Notecard (Cellular)
Blues Wireless Feather Starter Kit for ESP32
SparkFun Atmospheric Sensor Breakout - BME280
Blues Wireless Notehub.io
Datacake

قصة

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

بالطبع ، يتضمن تتبع الأصول أيضًا مراقبة الموقع في مساحة فعلية. يتم تنفيذ ذلك عادةً باستخدام نظام GNSS / GPS ، وهو أكثر الوسائل ثباتًا وموثوقية للتحقق من موقع مادي في الهواء الطلق.

ومع ذلك ، ماذا لو منعك حاوية الجهاز من الحصول على موقع GPS بسبب حاجز مادي؟ ماذا لو كانت محاولة إصلاح القمر الصناعي GPS تستهلك الكثير من الطاقة؟ أو (وهذا هو الشيء الحقيقي) ماذا لو كان هدفك هو تتبع أحد الأصول في الداخل؟

حسنًا ، لدي حل لك اليوم! على الأقل حل إثبات المفهوم 😅.

باستخدام طريقة التثليث الخاصة بأصدقائنا القدامى من علم المثلثات والهندسة ، يمكننا بناء حل لتتبع الأصول الداخلية كامل الوظائف مبني على Blues Wireless Notecard.

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

هل أنت جاهز للغطس؟ لنبدأ بالمتطلبات عالية المستوى لحل التتبع الداخلي هذا.

المتطلبات: بيانات الموقع بدون GPS

يجب أن يكون نظام تحديد المواقع العالمي (GPS) دائمًا هو الخيار الأول عند محاولة التأكد من الموقع الفعلي. ولكن من الجيد أن يكون لديك نسخة احتياطية في حالة فشل إصلاح القمر الصناعي لنظام تحديد المواقع العالمي (والذي يمكن أن يكون هو الحال في كثير من الأحيان داخل المبنى).

قد تعلم بالفعل أن التثليث هو عملية تحديد موقع عن طريق تكوين مخططات متداخلة على نقطة اهتمام مشتركة ، من سلسلة من النقاط المعروفة الأخرى.





في هذا المشروع ، ستسمح لنا Notecard باستخدام كل من GPS والتثليث للتأكد بدقة من موقع الجهاز.

المتطلبات: استخدم الارتفاع لتتبع الأرضية

كان تتبع أحد الأصول على خريطة ثنائية الأبعاد في العام الماضي 😊.

يمكننا استخدام البيانات من جهاز استشعار BME280 لحساب ارتفاع دقيق بشكل معقول. ما قد لا تعرفه هو أن قراءات الارتفاع هذه تستند عادةً إلى مقياس قياسي لضغط مستوى سطح البحر يبلغ 1013.25 hPa.

ألن يكون من الأكثر برودة الاستعلام بنشاط عن ضغط مستوى سطح البحر لموقع معروف قبل مطالبة المستشعر بحساب الارتفاع؟ سيوفر هذا قراءة أكثر دقة ، مما يسمح لنا بحساب أرضية المبنى الذي نحن فيه تقريبًا.

المتطلبات: مضخة بيانات من جهاز إلى سحابة

نحن بحاجة إلى وسيلة لمزامنة بيانات الموقع والارتفاع التي تم جمعها مع السحابة. ونعم ، لقد تخلت بالفعل عن المكون السري الخاص بنا: Blues Wireless Notecard.

تعد Notecard نظامًا خلويًا مدفوعًا مسبقًا على وحدة ، وهي مفيدة بشكل خاص لاتصالات إنترنت الأشياء الخلوية ذات النطاق الترددي المنخفض. يأتي محملاً مسبقًا بـ 500 ميجابايت من البيانات و 10 سنوات من الخدمة الخلوية العالمية ، بدءًا من 49 دولارًا أمريكيًا.



على الرغم من أن Notecard عبارة عن جهاز خلوي ، فلا يلزمك برمجة المودم بأوامر AT قديمة. واجهة برمجة تطبيقات Notecard هي JSON كلها ، طوال الوقت. على سبيل المثال ، لنفترض أنك تريد الاستعلام عن آخر موقع معروف على Notecard ، فأنت تستخدم card.location API:

// Request
{ "req": "card.location" }

// Response
{
"status": "GPS updated (58 sec, 41dB SNR, 9 sats),
"mode": "periodic",
"lat": 42.577600,
"lon": -70.871340,
"time": 1598554399

والأهم من ذلك ، أن الأمان والتكامل السحابي يعد أمرًا جاهزًا. يتصل Notecard "خارج الإنترنت العام" من خلال أنفاق VPN الخاصة ، باستخدام خدمة Blues Wireless السحابية Notehub.

Notehub هو أيضًا الصلصة السرية الخاصة بنا عندما يتعلق الأمر بتوفير بيانات الموقع عبر التثليث. كما سنرى لاحقًا ، عندما نوفر بيانات نقطة وصول Wi-Fi معروفة إلى Notehub ونقوم بتمكين card.triangulate API ، يمكن لـ Notehub بالفعل البحث عن بيانات الموقع الدقيقة بشكل صادم.

الشرط: طاقة منخفضة

يجب أن يكون أي حل IoT يعمل بالبطارية موفرًا للطاقة. لحسن الحظ ، فإن Notecard هي طاقة منخفضة بشكل افتراضي (لتصل إلى ~ 8uA عند الخمول) وتتضمن مقياس تسارع داخلي ، والذي يسمح لنا بحساب موقع الأصل فقط عندما يكتشف الحركة!

مع وضع كل هذه المتطلبات في الاعتبار ، فلنقم بتجميع أجهزتنا.

الأجهزة

تعد بطاقة المفكرة الخلوية جوهر الحل الذي نقدمه ، حيث توفر نظام تحديد المواقع العالمي (GPS) على متن الطائرة ومقياس تسارع لاكتشاف الحركة والاتصال الخلوي لترحيل البيانات المجمعة إلى السحابة.


نظرًا لأنني لست على استعداد للتخلي عن نظام تحديد المواقع العالمي (حتى بالنسبة للنشر الداخلي) ، سأستخدم هوائي GPS صغيرًا نشطًا جنبًا إلى جنب مع هوائي LTE للبيانات الخلوية



لجمع البيانات البيئية وحساب الارتفاع ، أقوم بتضمين جهاز استشعار BME280 الموقر من Bosch.



بالنسبة إلى متحكم مضيف ، ذهبت مع ESP32-S2 Feather. لقد اخترت MCU بشكل أساسي بسبب وحدة Wi-Fi المدمجة الخاصة بها ودعمها لـ CircuitPython. على الرغم من أننا لا نستطيع استخدام Wi-Fi للاتصال (نظرًا لأنه نظام متحرك ولن نتمكن من تسجيل الدخول إلى نقاط وصول Wi-Fi المتغيرة) ، فإننا سنستخدمها لجمع بيانات نقطة وصول Wi-Fi العامة.


إذن كيف نجمع كل القطع معًا؟ هذا هو الغرض من Blues Wireless Notecarrier-F الجديد!

Notecarriers هي لوحات حاملة تتيح لك إنشاء نماذج أولية لحلول إنترنت الأشياء التي تستخدم Notecard بسرعة. يعد Notecarrier-F خيارًا رائعًا لوحدات MCU المتوافقة مع Feather ويوفر منفذين Qwiic لإضافة الأجهزة الطرفية (مثل BME280) وموصلات JST لتوصيل بطاريات LiPo.



وهنا الإعداد النهائي للأجهزة ، كلها متصلة وجاهزة للبرمجة:


البرامج فيرموير

أنا من محبي بايثون بلا حرج ، لذا كان CircuitPython خيارًا سهلاً بالنسبة لي.

لماذا CircuitPython؟ سؤال صحيح! في رأيي المتواضع ، ساعدت CircuitPython في فتح إنترنت الأشياء لسلسلة جديدة من المطورين الذين نشأوا مع Python. مثل MicroPython "الأم" (التي تستند إليها CircuitPython) ، فإن القدرة على استخدام لغة Python المشهورة uber لبرمجة هذه "الأشياء" وربطها بالعالم قد وسع نطاق حلول إنترنت الأشياء ونطاقها.

لذلك دعونا نكتب بعض البرامج الثابتة CircuitPython!

ملاحظة: يتوفر رمز مصدر CircuitPython الكامل لهذا المشروع في مستودع Github هذا.

مكتبات وواردات بايثون

التبعيات الخارجية الوحيدة التي لدينا هي Notecard ومستشعر BME280. يحتوي كلاهما على مكتبات Python المدعومة جيدًا والتي تعمل بشكل رائع مع CircuitPython: note-python و adafruit-circpython-bme280.

تبدو المجموعة النهائية من الواردات كما يلي:

mport board
import busio
import notecard
from adafruit_bme280 import basic as adafruit_bme280
import utils
import keys
import time
from time import sleep

تهيئة الجهاز

نحن بحاجة إلى تهيئة الوصول إلى الأجهزة الطرفية لدينا. تتواصل كل من Notecard و BME280 عبر I2C ، مما يجعل خطوات init بسيطة للغاية:

# initialize the Blues Wireless Notecard (blues.io)
i2c = busio.I2C(board.SCL, board.SDA)
card = notecard.OpenI2C(i2c, 0, 0, debug=True)

# create reference to BME280
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)

من أجل حساب ارتفاع دقيق ، نحتاج إلى معرفة ضغط مستوى سطح البحر الحالي في موقعنا المحدد. المزيد عن هذا لاحقًا ، لكننا سنبدأ بتزويد المستشعر بمقياس قياسي لضغط مستوى سطح البحر يبلغ 1013.25 hPa.

في وقت لاحق ، عند استخدام خدمة عن بُعد لجمع بيانات الضغط ، سنحتاج إلى استخدام إحداثيات خطوط الطول / العرض. يمكننا البرمجة في بعض الإعدادات الافتراضية وتحديثها لاحقًا إذا / عندما يصبح GPS متاحًا:

bme280.sea_level_pressure = 1013.25
lat_def = 43.05769554337394
lon_def = -89.5070545945101

بعد ذلك ، نحتاج إلى ربط Notecard بمشروع قائم على السحابة في خدمة Blues Wireless السحابية Notehub. يمكّن هذا Notecard من نقل البيانات بأمان إلى موقع معروف في السحابة:

# associate Notecard with a project on Notehub.io
req = {"req": "hub.set"}
req["product"] = "your-notehub-product-uid"
req["mode"] = "periodic"
rsp = card.Transaction(req)

ثم نريد تمكين وحدة GPS على Notecard. مرة أخرى ، هذا ليس مطلوبًا تمامًا ، ولكنه بالتأكيد أفضل ممارسة لمحاولة تجميع موقع GPS على الأقل إذا كانت الأقمار الصناعية مرئية:

# enable GPS module on Notecard
req = {"req": "card.location.mode"}
req["mode"] = "periodic"
rsp = card.Transaction(req)

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

# enable motion tracking on Notecard
req = {"req": "card.motion.mode"}
req["start"] = True
rsp = card.Transaction(req)

ملاحظة: هل تشعر بالفضول حيال طلبات Notecard API هذه؟ راجع مرجع Notecard API الكامل.

تحقق من وجود الحركة

سنحتاج إلى طريقة لاكتشاف ما إذا كان الجهاز قد تحرك قبل محاولة التأكد من موقعه. يمكننا القيام بذلك باستخدام card.motion API.

تخبرنا معلمة العد في الاستجابة عن عدد أحداث الحركة التي تم تسجيلها منذ أن تم التحقق منها مؤخرًا:

def check_motion():
""" check for Notecard movement to see if we need to update its location """

req = {"req": "card.motion"}
rsp = card.Transaction(req)

if "count" in rsp and rsp["count"] > 0:
# movement detected since last check!

using_gps = False
using_wifi = False

# attempt to ascertain the current gps location
using_gps = get_gps_location()

if using_gps is False:
# gps location timed out, switch to wi-fi triangulation
using_wifi = set_wifi_triangulation()

# send readings from the sensor to the cloud
send_sensor_data(using_gps, using_wifi)


هناك طريقتان أخريان تعتمدان على الموقع مذكورتان هنا ، get_gps_location و set_wifi_triangulation. دعونا نلقي نظرة سريعة على هذه.

احصل على موقع GPS

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

def get_gps_location():
""" attempt to ascertain the latest gps location """

# get the latest GPS location
req = {"req": "card.location"}
rsp = card.Transaction(req)

if "lat" in rsp and "lon" in rsp:
# got an updated gps location
lat_def = rsp["lat"]
lon_def = rsp["lon"]

مرة أخرى ، نظرًا لأن هذا نشر داخلي ، فنادراً ما نحصل على موقع GPS صالح. لذلك دعونا ننظر إلى استخدام تثليث Wi-Fi بدلاً من ذلك!


قم بإعداد Wi-Fi Triangulation

هل تعلم أن هواتفنا الذكية تجمع باستمرار البيانات حول نقاط وصول Wi-Fi المتاحة ، وتجمع هذه البيانات مع إحداثيات خطوط الطول / العرض ، وشحن البيانات إلى Apple و Google؟ مرحبًا بكم في ممارسة خصوصية أخرى مشكوك فيها بواسطة شركة Big Tech!

على الجانب المشرق ، يتيح لنا أيضًا الاستفادة من قدرة Notehub على جمع بيانات تحديد الموقع من نقاط وصول Wi-Fi القريبة.

من خلال توفير قائمة بنقاط وصول Wi-Fi إلى card.triangulate API ، يمكننا إخبار Notehub بحساب بيانات تحديد الموقع لنا (غالبًا مع نتائج دقيقة بشكل صادم).

ملاحظة: أوصي بشدة بقراءة وثائق تثليث برج الخلية / شبكة Wi-Fi. هناك إعدادات إضافية في Notehub قد تحتاج إلى تحديثها بناءً على عدد المرات التي تريد فيها استخدام التثليث.

مرة أخرى ، نظرًا لأننا نستخدم MCU المستندة إلى ESP32 ، يمكننا استخدام مكتبة wifi المدمجة CircuitPython لإنشاء قائمة بنقاط وصول Wi-Fi المرئية. تتوفر الوظيفة المساعدة ، get_wifi_access_points ، في مستودع Github أيضًا.

def set_wifi_triangulation():
""" use the card.triangulate api to set the local wifi access points """

req = {"req": "card.triangulate"}
req["mode"] = "wifi"
rsp = card.Transaction(req)

all_wifi_aps = utils.get_wifi_access_points()

if len(all_wifi_aps) > 0:
req = {"req": "card.triangulate"}
req["text"] = all_wifi_aps + "\n"
rsp = card.Transaction(req)
return True
else:
return False

احصل على ضغط مستوى سطح البحر المحدث

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

هذا هو المكان الذي تصبح فيه واجهة OpenWeather API المدمجة مع واجهات برمجة تطبيقات الويب من Notecard مفيدة. يوفر OpenWeather طريقة سهلة للمطورين للوصول إلى مجموعة متنوعة من البيانات المتعلقة بالطقس.

تسمح واجهات برمجة ت بيقات الويب الخاصة بـ Notecard لـ Notecard بإرسال / استقبال البيانات إلى / من واجهات برمجة تطبيقات RESTful البعيدة. الطريقة أدناه مختصرة للمساحة:

def get_sea_level_pressure(card, lat, lon):
""" get the sea level pressure from openweather api """

# call openweather api to get latest pressure reading
weatherURL = "/weather?lat=" + \
str(lat) + "&lon=" + str(lon) + "&appid=" + keys.WEATHER_API_KEY

req = {"req": "web.get"}
req["route"] = "GetWeather"
req["name"] = weatherURL
rsp = card.Transaction(req)

pressure = 0

if rsp and "body" in rsp and "main" in rsp["body"] and "pressure" in rsp["body"]["main"]:
pressure = rsp["body"]["main"]["pressure"]

return pressure

لاحظ استدعاء سلسلة GetWeather في هذه الطريقة؟ هذا هو اسم مسار Notehub الذي تم تكوينه للاستعلام عن خدمة بعيدة (OpenWeather) وإرجاع بيانات الطقس الحالية لإحداثيات خطوط الطول / العرض المحددة. يبدو هذا المسار الخاص بهذا الشكل في واجهة مستخدم Notehub:



إرسال البيانات إلى السحابة
بمجرد حصولنا على ضغط مستوى سطح البحر المحدث ، يمكننا تحديث مستشعر BME280 بهذه القيمة وأخيرًا إرسال بيانات الاستشعار البيئي إلى Notehub للمزامنة مع لوحة معلومات Datacake التي سيتم إنشاؤها:
def send_sensor_data(using_gps, using_wifi):
""" send sensor data to the cloud with the Notecard """

# first get the updated sea level pressure
sl_pressure = utils.get_sea_level_pressure(card, lat_def, lon_def)

bme280.sea_level_pressure = sl_pressure
sleep(1)

note_body = {}

# get 50 readings from the sensor and use the median values
temp_list = []
humidity_list = []
pressure_list = []
altitude_list = []

for x in range(50):
temp_list.append(bme280.temperature)
humidity_list.append(bme280.relative_humidity)
pressure_list.append(bme280.pressure)
altitude_list.append(bme280.altitude)
sleep(0.1)

med_temp = utils.get_median(temp_list)
med_humidity = utils.get_median(humidity_list)
med_pressure = utils.get_median(pressure_list)
med_altitude = utils.get_median(altitude_list)

note_body["temperature"] = med_temp
note_body["humidity"] = med_humidity
note_body["pressure"] = med_pressure
note_body["altitude"] = med_altitude
note_body["sealevelpressure"] = sl_pressure

# get the battery voltage
req = {"req": "card.voltage"}
rsp = card.Transaction(req)
note_body["voltage"] = rsp["value"]

# get the wireless bars and rssi values
req = {"req": "card.wireless"}
rsp = card.Transaction(req)
note_body["bars"] = rsp["net"]["bars"]
note_body["rssi"] = rsp["net"]["rssi"]

# deliver note to the notecard and sync immediately
req = {"req": "note.add"}
req["sync"] = True
req["file"] = "indoor_tracker.qo"
req["body"] = note_body
rsp = card.Transaction(req)
خذ ملاحظة (نعم ، التورية المقصودة) للطلب النهائي في هذه الطريقة ، note.add. "الملاحظة" هي ببساطة كائن JSON يتضمن بيانات عشوائية تريد إرسالها إلى السحابة.

في هذه الحالة ، نرسل عناصر البيانات التالية في نص ملاحظتنا:

درجة الحرارة
رطوبة
الضغط
ارتفاع
ضغط مستوى سطح البحر
الجهد (من بطارية LiPo المتصلة)
أشرطة و rssi (بيانات جودة الاتصال من المودم الخلوي)
لوحة القيادة السحابية
من خلال كتابة البرامج الثابتة ونشرها في وحدة التحكم الدقيقة ، يمكننا التحقق من Notehub للتأكد من جمع البيانات الصالحة ومزامنتها:

لكن هذه البيانات مفيدة إلى حد ما فقط كونها مرئية في Notehub. ما نحتاج إليه حقًا هو توجيه هذه البيانات إلى لوحة معلومات سحابية لجعلها سهلة الهضم (وجميلة!).

للقيام بذلك ، أنشأت لوحة تحكم كاملة الوظائف باستخدام Datacake:



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


بعد قضاء حوالي 20 دقيقة سيرًا على الأقدام من نهاية إلى نهاية هذا التسوق الداخلي الضخم (من المسلم به أن بعض الأقسام الكبيرة التي تبدأ في الزوايا تم إغلاقها للأسف) تمكنت من جمع بيانات تثليث Wi-Fi للتأكد من مجموعة نقاط موقع دقيقة بشكل صادم:

لقد قمت الآن بعمل كبير حول استخدام بيانات الارتفاع في وقت سابق. بينما لا يمكننا تقديم تصور حقيقي "ثلاثي الأبعاد" لموقعنا على Datacake (أو بصراحة أي لوحة معلومات سحابية أعرفها حتى الآن) ، يمكننا ربط بيانات الموقع على الخريطة ببيانات الارتفاع المقدمة من مستشعر BME280. عند تحديد "ارتفاع خط الأساس" للطابق الأول (أو صفر بالنسبة إلى الأشخاص خارج الولايات المتحدة) ، يمكننا تقريبًا تتبع الأرضية التي نتواجد عليها أيضًا استنادًا إلى الارتفاع النسبي المقاس:


ملخص
دعني أكون واضحًا تمامًا: يجب أن تحاول دائمًا على الأقل استخدام GPS عند التحقق من موقع الجهاز. سيكون الخيار الأكثر دقة ، وعند استخدام المجموعة الصحيحة من الأجهزة والبرامج الثابتة ، يستخدم الحد الأدنى من الطاقة في جهاز يعمل بالبطارية.

ومع ذلك ، إذا لزم الأمر ، فمن الرائع أن يكون لديك خيار مثل Blues Wireless Notecard مع Notehub وقدرات التثليث الخاصة به.

فضولي لمعرفة المزيد؟ احصل على مجموعة المبتدئين Blues Wireless ESP32 اليوم!
























السبت، 16 يوليو 2022

بناء مسجل بيانات الطقس القائم على إنترنت الأشياء

 سيساعدك هذا الدليل على إنشاء مسجل بيانات الطقس القائم على إنترنت الأشياء باستخدام Blues Wireless Notecard و Notecarrier.



مكونات الأجهزة

بطاقة الملاحظات اللاسلكية Blues (خلوية)

Blues Wireless Notecarrier-A

Arduino Nano 33 BLE Sense

Seeed Studio Grove - مستشعر الضوء

انظر Studio Grove - مستشعر جودة الهواء v1.3

مستشعر درجة الحرارة والرطوبة DHT11 (3 دبابيس)

تطبيقات البرمجيات والخدمات عبر الإنترنت

Blues Wireless Notehub.io

Qubitro

اردوينو IDE


قصة

مع ارتفاع درجات الحرارة في جميع أنحاء العالم ، لم تكن مراقبة الظروف البيئية أكثر أهمية من أي وقت مضى

يمكن تتبع البيانات البيئية بعدة طرق. يمكنك استخدام الأجهزة السلكية ، أو بطاقة SD في وحدة التحكم لالتقاط البيانات يدويًا ، أو يمكنك استخدام وحدات التحكم القائمة على الاتصال عبر Wi-Fi أو BLE للتعامل مع هذه المهمة.

ضع في اعتبارك إذا لم يكن لديك الوقت لاسترداد البيانات يدويًا من بطاقة SD ، أو إذا لم تكن أجهزتك في نطاق اتصال Wi-Fi أو Bluetooth ، فكيف ستقوم بتتبع بيانات الطقس الخاصة بك؟

في هذا البرنامج التعليمي ، سأوضح لك كيفية إنشاء مسجل بيانات الطقس القائم على إنترنت الأشياء باستخدام وحدات أجهزة Blues Wireless ؛ لا يلزم وجود بطاقة SD أو Wi-Fi أو BLE. ما عليك سوى توصيل Blues Notecard و Notecarrier بوحدات التحكم لتتبع بيانات الطقس الخاصة بك


سيتبع هذا البرنامج التعليمي بالكامل هذه الخطوات الثلاث:


الخطوة 1: إعداد الجهاز


تتمثل الخطوة الأولى في جمع البيانات البيئية ، لذلك سنستخدم DHT11 ، ومستشعر المطر ، ومستشعر جودة الهواء ، ومستشعر الضوء للقيام بذلك. يتم توصيل Arduino Nano 33 BLE Sense بجميع المستشعرات ، والتي ستعمل كوحدة تحكم لمعالجة البيانات.


الخطوة 2: إعداد Notehub

سيتم إرسال البيانات التي تم جمعها من أجهزة الاستشعار إلى سحابة Blues Notehub باستخدام Blues Notecard و Blues Notecarrier.

الخطوة 3: إعداد Qubitro

بمجرد وصول بيانات المستشعر إلى السحابة ، سنستخدم Qubitro لتصورها ومعالجتها بعد ذلك

إعداد الأجهزة:

جميع أجهزة الاستشعار باستثناء DHT11 تناظرية. قم بتوصيل DHT11 بـ D13 من Arduino Nano 33 BLE Sense وقم بتوصيل A0 بـ A2 من دبابيس Arduino Nano 33 التناظرية مباشرة.



الآن بعد أن تم توصيل جميع المستشعرات الخاصة بك ، دعنا ننتقل إلى جزء البرمجة. للقيام بذلك ، افتح Arduino IDE وقم بتجميع الكود أدناه. سيقوم بجمع جميع بيانات المستشعر وإخراجها إلى الشاشة التسلسلية.

#include "Air_Quality_Sensor.h"
#include <DHT.h>

String Stage;

AirQualitySensor sensor(A1); //Analog pin A1 for Air Quality sensor
#define DHTPIN 13 //Digital pin 13 for DHT11 sensor
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup(void) {

dht.begin(); // Init DHT11
Serial.println("Waiting sensor to init...");
delay(10000);

}
void loop(void) {

int quality = sensor.slope();

Serial.print("AQ Sensor value : ");
Serial.println(sensor.getValue());
Serial.print("Pollution Level : ");

if (quality == AirQualitySensor::FORCE_SIGNAL) {
String Stage = "ERROR!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::HIGH_POLLUTION) {
String Stage = "High pollution!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::LOW_POLLUTION) {
String Stage = "Low pollution!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::FRESH_AIR) {
String Stage = "Fresh air!";
Serial.println(Stage);
}

float h = dht.readHumidity();
Serial.print("Humidity Level : ");
Serial.print(h);
Serial.println(" %");

// Read temperature as Celsius (the default)
float t = dht.readTemperature();
Serial.print("Temperature Level : ");
Serial.print(t);
Serial.println(" C");

int value = analogRead(A2); //Analog pin A2 for Light sensor
float valuel = map(value, 0, 800, 0, 100);
Serial.print("Light Sensor Level : ");
Serial.print(valuel);
Serial.println(" %");

int rainSensor = analogRead(A3); //Analog pin A3 for Rain sensor
float rainSensor1 = map(rainSensor, 0, 1024, 0, 100);
Serial.print("Rain Sensor Level : ");
Serial.println(rainSensor);
Serial.print("Dry level : ");
Serial.print(rainSensor1);
Serial.println(" %");
Serial.println("------------------------------------------------");
delay(10000);

}

الخطوة التالية هي إعداد Blues Notecarrier. قم بتوصيل Notecard بـ Notecarrier (أنا أستخدم بطاقة sim خارجية ، لذلك سأشرح كيفية القيام بذلك). قم بتوصيل Notecarrier بجهاز الكمبيوتر الخاص بك عن طريق كابل micro USB.

[يمكنك إلقاء نظرة تفصيلية على الإعداد الموجود على عنوان URL التالي - https://dev.blues.io/quickstart/notecard-quickstart/notecarrier-a/ ، إذا واجهت أي مشكلات أثناء التشغيل ، فيمكنك التواصل للمساعدة في منتدى Blues Forum.]

إذا كنت تريد استخدام بطاقة SIM خارجية مثل I am (Airtel) ، فاتبع هذه الخطوات أيضًا لتكوين Notecard الخاص بك.

# disable the cellular modem on the Notecard
{"req":"hub.set","mode":"off"}

# set the Airtel APN
{"req":"card.wireless","mode":",airtelgprs.com"}

# make sure the Notecard cloud host is set to the default (if you changed it)
{"req":"hub.set","host":"a.notefile.net"}

# enable the cellular modem (minimum requires explicit sync requests)
{"req":"hub.set","mode":"minimum"}

# force a sync (if it hasn't started already)
{"req":"hub.sync","allow":true}

الآن سنقوم بتجربة Blues Notecarrier. أنا أستخدم Python لإرسال بعض البيانات الوهمية إلى Notehub.

import json
import notecard
import serial
import time

productUID = "com.gmail.pradeeplogu26:env_data_logger" #Change this with yours

# Select Serial
use_uart = True
card = None
# Configure the serial connection to the Notecard
serial = serial.Serial('COM7', 9600) #Change this with your COM port

card = notecard.OpenSerial(serial, debug=True)
req = {"req": "hub.set"}
req["product"] = productUID
req["mode"] = "continuous"
card.Transaction(req)

while True:
temp = 10
humidity = 20
print('Temperature: {} degrees C'.format(temp))
print('Humidity: {}%'.format(humidity))
req = {"req": "note.add"}
req["file"] = "sensors.qo"
req["start"] = True
req["body"] = {"temp": temp, "humidity": humidity}
card.Transaction(req)
time.sleep(15)

ما عليك سوى إعادة تسمية projectUID ومنفذ Com إلى المنفذ الخاص بك والضغط على run. يمكنك رؤية البيانات الوهمية في الجهاز.



سيعود هذا البرنامج النصي مع الرد أعلاه. بعد ذلك ، افتح لوحة معلومات Notehub وانتقل إلى علامة التبويب "الأحداث" وشاهد البيانات.

يمكنك رؤية البيانات التي يتم إرسالها بواسطة برنامج Python النصي في Notehub ، إذا كنت قد انتهيت من هذه الخطوة ، يمكنك توصيل Blues Notecard و Notecarrier بـ Arduino Nano 33 BLE Sense باستخدام منفذ UART.

[يدعم The Blues Notecarrier اتصال I2C و UART]


بعد اكتمال الاتصالات ، قم فقط بتجميع كود Arduino أدناه في Arduino IDE ، سيؤدي ذلك إلى إرسال بيانات المستشعر إلى Notehub.

#include <Notecard.h>
#include "Air_Quality_Sensor.h"
#include <DHT.h>

AirQualitySensor sensor(A1); //Analog pin A1 for Air Quality sensor
#define DHTPIN 13 //Digital pin 13 for DHT11 sensor

#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define txRxPinsSerial Serial1
#define productUID "xxxxxxxxxxxxxxxxxxxx"
Notecard notecard;

String Stage;

void setup(void) {

notecard.begin(txRxPinsSerial, 9600);

J *req = notecard.newRequest("hub.set");
JAddStringToObject(req, "product", productUID);
JAddStringToObject(req, "mode", "continuous");
notecard.sendRequest(req);

delay(1000);

dht.begin(); // Init DHT11
Serial.println("Waiting sensor to init...");
delay(10000);

}

void loop(void) {

int quality = sensor.slope();
Serial.print("AQ Sensor value : ");
Serial.println(sensor.getValue());

Serial.print("Pollution Level : ");
if (quality == AirQualitySensor::FORCE_SIGNAL) {
String Stage = "ERROR!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::HIGH_POLLUTION) {
String Stage = "High pollution!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::LOW_POLLUTION) {
String Stage = "Low pollution!";
Serial.println(Stage);
}
else if (quality == AirQualitySensor::FRESH_AIR) {
String Stage = "Fresh air!";
Serial.println(Stage);
}

float h = dht.readHumidity();
Serial.print("Humidity Level : ");
Serial.print(h);
Serial.println(" %");

// Read temperature as Celsius (the default)
float t = dht.readTemperature();
Serial.print("Temperature Level : ");
Serial.print(t);
Serial.println(" C");

int value = analogRead(A2);
float valuel = map(value, 0, 800, 0, 100);
Serial.print("Light Sensor Level : ");
Serial.print(valuel);
Serial.println(" %");

int rainSensor = analogRead(A3);
float rainSensor1 = map(rainSensor, 0, 1024, 0, 100);
Serial.print("Rain Sensor Level : ");

Serial.println(rainSensor);
Serial.print("Dry level : ");
Serial.print(rainSensor1);
Serial.println(" %");

J *req = notecard.newRequest("note.add");
if (req != NULL) {
JAddStringToObject(req, "file", "sensors.qo");
JAddBoolToObject(req, "sync", true);

J *body = JCreateObject();
if (body != NULL) {
JAddNumberToObject(body, "temperature", t);
JAddNumberToObject(body, "humidity", h);
JAddNumberToObject(body, "air quality value", sensor.getValue());
JAddNumberToObject(body, "light intencity", valuel);
JAddNumberToObject(body, "rain sensor", rainSensor);
JAddNumberToObject(body, "dry level", rainSensor1);
JAddItemToObject(req, "body", body);
}
notecard.sendRequest(req);
}
Serial.println("------------------------------------------------");
delay(10000);

}

ما عليك سوى فتح الشاشة التسلسلية وإلقاء نظرة على البيانات الناتجة. بعد ذلك ، انتقل إلى علامة التبويب "الأحداث" في لوحة معلومات Notehub.




هناك يمكنك رؤية بيانات المستشعر الخاصة بنا.

في هذه المرحلة ، انتهينا من جزء الجهاز. يمكنك النقر فوق بيانات JSON وتحليل البيانات الكاملة التي تم إرسالها بواسطة جهاز Blues الخاص بنا.

إعداد Notehub:

لقد أرسلنا بياناتنا إلى Notehub ، لذا نحتاج الآن إلى تصور البيانات ببعض الرسوم البيانية والجداول. دعونا نلقي نظرة على كيفية القيام بذلك باستخدام Qubitro cloud.

أولاً ، افتح Notehub وانتقل إلى علامة التبويب "المسارات" ، ثم أنشئ مسارًا جديدًا



ثم حدد نوع التكامل مثل HTTP / HTTPS.






أدخل الاسم كما تريد وأدخل عنوان URL كـ "https://webhook.qubitro.com/integrations/blueswireless" ، ثم انقر فوق العناوين ، واختر رؤوسًا إضافية ، وأدخل العنوانين كما هو موضح في الصورة belo

إعداد Qubitro:

في هذه الخطوة ، سنقوم بإعداد المشروع في Qubitro. للبدء ، افتح https://portal.qubitro.com/ ، وقم بتسجيل الدخول باستخدام بيانات الاعتماد الخاصة بك ، وأنشئ مشروعًا جديدًا. لست بحاجة إلى إضافة أي أجهزة.

بعد ذلك ، انتقل إلى إعدادات المشروع وانسخ "معرف المشروع



ثم انتقل إلى علامة تبويب بيانات الاعتماد في بوابة Qubitro وانسخ "مفتاح تسجيل الدخول للخطّاف على الويب". خذ هذه وأدخلها مرة أخرى في رأس مسار Blues Notehub.



بمجرد إكمال الإعداد بالكامل ، انقر فوق "إنشاء مسار جديد" ، والذي سيضيف المسار الجديد في Notehub الخاص بك.

يمكنك الآن رؤية جهاز Blues الخاص بك في بوابة Qubitro.


فقط افتح الجهاز وشاهد البيانات الواردة. يقوم Qubitro تلقائيًا باستخراج البيانات من Blues. في علامة التبويب "نظرة عامة" ، يمكنك رؤية الموقع الحالي والجهد والاتجاه للجهاز.


بعد ذلك ، افتح علامة تبويب البيانات ، حيث يمكنك هنا رؤية بيانات المستشعر.

سنقوم الآن ببعض التصورات ، والتي يمكنك القيام بها عن طريق فتح علامة التبويب المراقبة وإضافة بعض الأدوات.



وبالمثل ، أضف عناصر واجهة مستخدم إلى جميع البيانات. هنا نموذج لوحة القيادة الخاصة بي



أخيرًا ، وصلنا إلى تصور بيانات المستشعر في الرسوم البيانية والمخططات.


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


لتجربتها ، افتح علامة التبويب بيانات الاعتماد في بوابة Qubitro وانسخ مفتاح API.


ثم افتح عنوان URL هذا https://qubitro-api.readme.io/reference/getdevice ، والذي سيطلب منك إكمال بعض المدخلات.


أدخل مفتاح واجهة برمجة التطبيقات بتنسيق "Bearer-API Key" ، وأدخل معرف الجهاز وقم بعرض المشروع الذي استخدمته في إعداد مشروع Qubitro ، ثم انقر فوق الزر "جربه". يمكنك رؤية بياناتك بالكامل من جهاز Blues الخاص بك.


لنقم بعمل نص برمجي بايثون بسيط للحصول على استجابة API. ما عليك سوى نسخ نص Python أدناه وتغيير المفاتيح ، ثم التنفيذ.

import requests
import time
from colorama import Fore, Back, Style

while (True):
url = "https://api.qubitro.com/v1/projects/e675f223-ff1e-4bab-85e1-37de1e944f6d/devices/dev%3A867730051771776-e675f223-ff1e-4bab-85e1-37de1e944f6d"
headers = {
"Accept": "application/json",
"Authorization": "Bearer-xxxxxxxxxxxxxxxxxxxxxxxx"
}
response = requests.get(url, headers=headers)
print(response.text)
time.sleep(10)

سيعيد البيانات من الجهاز.





في هذا البرنامج التعليمي ، أوضحت لك كيفية إنشاء مسجل بيانات الطقس الخاص بك المستند إلى إنترنت الأشياء مع وحدات أجهزة Blues ، وشرحت كيفية مشاركة هذه البيانات مع العالم الخارجي. يمكنك الآن تتبع بيانات الطقس بدون أسلاك أو Wi-


كود