Translation Update

pull/532/head
Lee Stott 2 weeks ago committed by GitHub
parent 5abdff52cf
commit a2cff7377c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,280 +0,0 @@
# <div dir="rtl"> مقدمة لإنترنت الأشياء </div>
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.jpg)
> <div dir="rtl"> خريطة من <a href="https://github.com/nitya">Nitya Narasimhan</a> </div>
> <div dir="rtl"> اضغط على الصورة لتكبيرها </div>
## <div dir="rtl"> اختبار ما قبل المحاضرة </div>
[<div dir="rtl"> اختبار ما قبل المحاضرة </div>](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## <div dir="rtl"> المقدمة </div>
<div dir="rtl"> يغطي هذا الدرس بعض الموضوعات التمهيدية حول إنترنت الأشياء ، ويساعدك على إعداد أجهزتك. </div>
<div dir="rtl"> سنغطي في هذا الدرس: </div>
<div dir="rtl">
- [ ما هو انترنت الأشياء ](#what-is-the-internet-of-things)
- [الأجهزة المتعلقة بانترنت الأشياء](#iot-devices)
- [قم بإعداد جهازك](#set-up-your-device)
- [تطبيقات انترنت الأشياء](#applications-of-iot)
- [أمثلة على أجهزة إنترنت الأشياء التي قد تكون موجودة حولك](#examples-of-iot-devices-you-may-have-around-you)
</div>
## <div dir="rtl"> ما هو "انترنت الأشياء"؟ </div>
<div dir="rtl"> مصطلح "إنترنت الأشياء" ابتكره
<a href="https://wikipedia.org/wiki/KevinAshton">Kevin Ashton</a>
في عام 1999 ، للإشارة إلى توصيل الإنترنت بالعالم المادي عبر أجهزة الاستشعار. منذ ذلك الحين ، تم استخدام المصطلح لوصف أي جهاز يتفاعل مع العالم المادي من حوله ، إما عن طريق جمع البيانات من أجهزة الاستشعار ، أو توفير تفاعلات في العالم الحقيقي عبر المشغلات (الأجهزة التي تقوم بشيء مثل تشغيل مفتاح أو إضاءة LED ) ، متصلة بشكل عام بأجهزة أخرى أو بالإنترنت. </div>
> <div dir="rtl"> المستشعرات تجمع المعلومات من العالم ، مثل قياس السرعة أو درجة الحرارة أو الموقع. </div>
>
> <div dir="rtl"> المشغلات تحول الإشارات الكهربائية إلى تفاعلات في العالم الحقيقي مثل تشغيل مفتاح أو تشغيل الأضواء أو إصدار أصوات أو إرسال إشارات تحكم إلى أجهزة أخرى ، على سبيل المثال لتشغيل مقبس طاقة. </div>
<div dir="rtl">إن إنترنت الأشياء كمجال تقني هو أكثر من مجرد أجهزة - فهو يشمل الخدمات المستندة إلى السحابة التي يمكنها معالجة بيانات المستشعر ، أو إرسال طلبات إلى المشغلات المتصلة بأجهزة إنترنت الأشياء. ويشمل أيضًا الأجهزة التي لا تحتوي على اتصال بالإنترنت أو لا تحتاج إليه ، وغالبًا ما يشار إليها باسم الأجهزة المتطورة. هذه هي الأجهزة التي يمكنها معالجة بيانات الاستشعار والاستجابة لها بنفسها ، وعادةً ما تستخدم نماذج الذكاء الاصطناعي المدربة في السحابة.</div>
<div dir="rtl">إنترنت الأشياء هو مجال تكنولوجي سريع النمو. تشير التقديرات إلى أنه بحلول نهاية عام 2020 ، تم نشر 30 مليار جهاز إنترنت الأشياء وتوصيلها بالإنترنت. بالنظر إلى المستقبل ، تشير التقديرات إلى أنه بحلول عام 2025 ، ستجمع أجهزة إنترنت الأشياء ما يقرب من 80 زيتابايت من البيانات ، أو 80 تريليون جيجابايت. هذا كثير من البيانات!</div>
![A graph showing active IoT devices over time, with an upward trend from under 5 billion in 2015 to over 30 billion in 2025](../../../../images/connected-iot-devices.svg)
<div dir="rtl">✅ قم بإجراء القليل من البحث: ما مقدار البيانات التي تم إنشاؤها بواسطة أجهزة إنترنت الأشياء المستخدمة بالفعل ، وكم يتم إهدارها؟ لماذا يتم تجاهل الكثير من البيانات؟ </div>
<div dir="rtl">
هذه البيانات هي مفتاح نجاح إنترنت الأشياء. لكي تكون مطورًا ناجحًا لإنترنت الأشياء ، فأنت بحاجة إلى فهم البيانات التي تحتاج إلى جمعها ، وكيفية جمعها ، وكيفية اتخاذ القرارات بناءً عليها ، وكيفية استخدام هذه القرارات للتفاعل مع العالم المادي إذا لزم الأمر.</div>
## <div dir="rtl">الأجهزة المتعلقة بانترنت الأشياء</div>
<div dir="rtl">
يرمز T في إنترنت الأشياء إلى الأشياء - الأجهزة التي تتفاعل مع العالم المادي من حولها إما عن طريق جمع البيانات من أجهزة الاستشعار ، أو توفير تفاعلات واقعية عبر المشغلات.
عادةً ما تكون الأجهزة المخصصة للإنتاج أو الاستخدام التجاري ، مثل أجهزة تتبع اللياقة البدنية للمستهلكين أو أجهزة التحكم في الآلات الصناعية ، مصنوعة خصيصًا. يستخدمون لوحات دوائر مخصصة ، وربما حتى معالجات مخصصة ، مصممة لتلبية احتياجات مهمة معينة ، سواء كانت صغيرة بما يكفي لتناسب معصمك ، أو متينة بما يكفي للعمل في درجات حرارة عالية ، أو ضغط مرتفع ، أو بيئة مصنع عالية الاهتزاز.
بصفتك مطورًا إما يتعلم عن إنترنت الأشياء أو يصنع نموذجًا أوليًا للجهاز ، فستحتاج إلى البدء بمجموعة أدوات التطوير. هذه أجهزة إنترنت الأشياء للأغراض العامة مصممة للمطورين لاستخدامها ، غالبًا مع ميزات لن تراها على جهاز إنتاج ، مثل مجموعة من المسامير الخارجية لتوصيل المستشعرات أو المشغلات بها ، أو الأجهزة لدعم التصحيح ، أو الموارد الإضافية التي سيضيف تكلفة غير ضرورية عند إجراء عملية تصنيع كبيرة.
تنقسم مجموعات المطورين هذه عادةً إلى فئتين - المتحكمات الدقيقة وأجهزة الكمبيوتر أحادية اللوحة. سيتم تقديم هذه هنا ، وسنتناول المزيد من التفاصيل في الدرس التالي.
>💁يمكن أيضًا اعتبار هاتفك جهاز إنترنت الأشياء للأغراض العامة ، مع أجهزة استشعار ومحركات مدمجة ، مع تطبيقات مختلفة تستخدم المستشعرات والمشغلات بطرق مختلفة مع خدمات سحابية مختلفة. يمكنك أيضًا العثور على بعض البرامج التعليمية لإنترنت الأشياء التي تستخدم تطبيق الهاتف كجهاز إنترنت الأشياء.
</div>
</br>
### <div dir="rtl">المتحكم الدقيق</div>
<div dir="rtl">
المتحكم الدقيق (يشار إليه أيضًا باسم MCU ، اختصارًا لوحدة التحكم الدقيقة) هو جهاز كمبيوتر صغير يتكون من:
🧠 واحدة أو أكثر من وحدات المعالجة المركزية (CPUs) - "عقل" المتحكم الدقيق الذي يدير برنامجك
💾 الذاكرة (ذاكرة الوصول العشوائي وذاكرة البرنامج) - حيث يتم تخزين البرنامج والبيانات والمتغيرات الخاصة بك
🔌 اتصالات الإدخال / الإخراج القابلة للبرمجة (I / O) - للتحدث إلى الأجهزة الطرفية الخارجية (الأجهزة المتصلة) مثل المستشعرات والمشغلات
عادةً ما تكون وحدات التحكم الدقيقة أجهزة حوسبة منخفضة التكلفة ، حيث ينخفض ​​متوسط ​​أسعار الأجهزة المستخدمة في الأجهزة المخصصة إلى حوالي 0.50 دولار أمريكي ، وبعض الأجهزة رخيصة مثل 0.03 دولار أمريكي. يمكن أن تبدأ مجموعات المطورين بسعر منخفض يصل إلى 4 دولارات أمريكية ، مع ارتفاع التكاليف كلما أضفت المزيد من الميزات. <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">محطة Wio</a>, مجموعة مطور متحكم من <a href="https://www.seeedstudio.com">Seeed studios</a> تحتوي على أجهزة استشعار ومحركات واي فاي وشاشة تكلف حوالي 30 دولارًا أمريكيًا.
</div>
![A Wio Terminal](../../../../images/wio-terminal.png)
> <div dir="rtl">💁 عند البحث في الإنترنت عن المتحكمات الدقيقة ، احذر من البحث عن المصطلح MCU لأن هذا سيعيد لك الكثير من النتائج ل Marvel السينمائي ، وليس للمتحكمات الدقيقة.</div>
<div dir="rtl">
تم تصميم وحدات التحكم الدقيقة بحيث تتم برمجتها للقيام بعدد محدود من المهام المحددة للغاية ، بدلاً من أن تكون أجهزة كمبيوتر للأغراض العامة مثل أجهزة الكمبيوتر الشخصية أو أجهزة Mac. باستثناء سيناريوهات محددة للغاية ، لا يمكنك توصيل الشاشة ولوحة المفاتيح والماوس واستخدامها في مهام الأغراض العامة.
عادة ما تأتي مجموعات مطوري وحدات التحكم الدقيقة بأجهزة استشعار ومشغلات إضافية على متنها. تحتوي معظم اللوحات على واحد أو أكثر من مصابيح LED التي يمكنك برمجتها ، بالاضافة الى الأجهزة الأخرى مثل المقابس القياسية لإضافة المزيد من أجهزة الاستشعار أو المشغلات باستخدام أنظمة بيئية مختلفة للمصنعين ، أو أجهزة استشعار مدمجة (عادةً ما تكون الأكثر شيوعًا مثل مستشعرات درجة الحرارة). تحتوي بعض وحدات التحكم الدقيقة على اتصال لاسلكي مدمج مثل Bluetooth أو WiFi ، أو تحتوي على وحدات تحكم دقيقة إضافية على اللوحة لإضافة هذا الاتصال.
</div>
> <div dir="rtl">💁 عادة ما يتم برمجة المتحكمات الدقيقة في C / C ++. </div>
### <div dir="rtl"> أجهزة كمبيوتر أحادية اللوحة</div>
<div dir="rtl"> الكمبيوتر أحادي اللوحة هو جهاز حوسبة صغير يحتوي على جميع عناصر الكمبيوتر الكامل الموجودة على لوحة صغيرة واحدة. هذه هي الأجهزة التي لها مواصفات قريبة من سطح المكتب أو الكمبيوتر المحمول أو جهاز Mac ، وتعمل بنظام تشغيل كامل ، ولكنها صغيرة ، وتستخدم طاقة أقل ، وأرخص بكثير.</div>
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
<div dir="rtl">
يعد Raspberry Pi أحد أشهر أجهزة الكمبيوتر أحادية اللوحة.
مثل وحدة التحكم الدقيقة ، تحتوي أجهزة الكمبيوتر أحادية اللوحة على وحدة معالجة مركزية وذاكرة ودبابيس إدخال / إخراج ، ولكنها تحتوي على ميزات إضافية مثل شريحة رسومات للسماح لك بتوصيل الشاشات ومخرجات الصوت ومنافذ USB مثل كاميرات الويب أو وحدات التخزين الخارجية. يتم تخزين البرامج على بطاقات SD أو محركات أقراص ثابتة بالاضافة الى نظام التشغيل ، بدلاً من شريحة ذاكرة مدمجة في اللوحة.
</div>
> <div dir="rtl">🎓 يمكنك التفكير في الكمبيوتر أحادي اللوحة كإصدار أصغر وأرخص من الكمبيوتر الشخصي أو جهاز Mac الذي تقرأ عليه ، مع إضافة دبابيس GPIO (إدخال / إخراج للأغراض العامة) للتفاعل مع المستشعرات والمحركات.</div>
<div dir="rtl">أجهزة الكمبيوتر أحادية اللوحة هي أجهزة كمبيوتر كاملة الميزات ، لذا يمكن برمجتها بأي لغة. عادةً ما تتم برمجة أجهزة إنترنت الأشياء بلغة Python.</div>
</br>
### <div dir="rtl"> اختيارات الأجهزة لبقية الدروس</div>
<div dir="rtl">تتضمن جميع الدروس اللاحقة مهام باستخدام جهاز إنترنت الأشياء للتفاعل مع العالم والتواصل مع السحابة. يدعم كل درس 3 خيارات للأجهزة - Arduino (باستخدام Seeed Studios Wio Terminal) ، أو كمبيوتر لوحة واحدة ، إما جهاز (Raspberry Pi 4) ، أو جهاز كمبيوتر افتراضي أحادي اللوحة يعمل على الكمبيوتر الشخصي أو جهاز Mac.</div>
يمكنك أن تقرأ عن الأجهزة اللازمة لإكمال جميع المهام في ملف [hardware guide](../../../../hardware.md)
> <div dir="rtl">💁 لا تحتاج إلى شراء أي جهاز إنترنت الأشياء لإكمال المهام ، يمكنك القيام بكل شيء باستخدام جهاز كمبيوتر افتراضي أحادي اللوحة. </div>
<div dir="rtl">تحديد الأجهزة التي تختارها متروك لك - يعتمد ذلك على ما لديك إما في المنزل أو في مدرستك ، ولغة البرمجة التي تعرفها أو تخطط لتعلمها. سيستخدم كلا النوعين من الأجهزة نفس نظام المستشعر البيئي ، لذلك إذا بدأت في مسار واحد ، يمكنك التغيير إلى الآخر دون الحاجة إلى استبدال معظم المجموعة. سيكون الكمبيوتر الافتراضي أحادي اللوحة مكافئًا للتعلم على Raspberry Pi ، حيث يمكن نقل معظم الشفرة إلى Pi إذا حصلت في النهاية على جهاز ومستشعرات.</div>
</br>
### <div dir="rtl"> مجموعة مطوري Arduino </div>
<div dir="rtl"> إذا كنت مهتمًا بتعلم تطوير وحدة التحكم الدقيقة ، فيمكنك إكمال المهام باستخدام جهاز Arduino. ستحتاج إلى فهم أساسي لبرمجة C / C ++ ، حيث أن الدروس ستعلم فقط الكود ذي صلة بإطار عمل Arduino ، وأجهزة الاستشعار والمشغلات المستخدمة ، والمكتبات التي تتفاعل مع السحابة. </div>
<div dir="rtl"> ستستخدم الواجبات <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">Visual Studio Code</a> مع <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">امتداد PlatformIO لتطوير وحدة التحكم الدقيقة</a>. يمكنك أيضًا استخدام Arduino IDE إذا كنت من ذوي الخبرة في هذه الأداة ، حيث لن يتم توفير الإرشادات.</div>
</br>
### <div dir="rtl"> مجموعة مطوري الكمبيوتر أحادية اللوحة </div>
<div dir="rtl">
إذا كنت مهتمًا بتعلم تطوير إنترنت الأشياء باستخدام أجهزة كمبيوتر أحادية اللوحة ، فيمكنك إكمال المهام باستخدام Raspberry Pi ، أو جهاز افتراضي يعمل على جهاز الكمبيوتر أو جهاز Mac.
ستحتاج إلى فهم أساسي لبرمجة Python ، حيث ستعلم الدروس فقط التعليمات البرمجية ذات الصلة بالمستشعرات والمشغلات المستخدمة والمكتبات التي تتفاعل مع السحابة.
</div>
> <div dir="rtl">💁 إذا كنت تريد تعلم البرمجة في Python ، فراجع سلسلتي الفيديو التاليين:
>
>* [بايثون للمبتدئين](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [ المزيد من بايثون للمبتدئين ](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
</div>
<div dir="rtl">
الواجبات ستستخدم <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">Visual Studio Code</a>
إذا كنت تستخدم Raspberry Pi ، فيمكنك إما تشغيل Pi الخاص بك باستخدام إصدار سطح المكتب الكامل من Raspberry Pi OS ، والقيام بكل الترميز مباشرة على Pi باستخدام <a href="https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn">the Raspberry Pi OS version of VS Code</a> ، أو قم بتشغيل Pi من جهاز الكمبيوتر أو جهاز Mac باستخدام VS Code مع <a href="https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn">Remote SSH extension</a> التي يتيح لك الاتصال بـ Pi الخاص بك وتحرير التعليمات البرمجية وتصحيحها وتشغيلها كما لو كنت تقوم بالتشفير عليها مباشرةً.
إذا كنت تستخدم خيار الجهاز الظاهري ، فستقوم بالتشفير مباشرة على جهاز الكمبيوتر الخاص بك. بدلاً من الوصول إلى المستشعرات والمشغلات ، ستستخدم أداة لمحاكاة هذا الجهاز لتوفير قيم أجهزة الاستشعار التي يمكنك تحديدها ، وإظهار نتائج المشغلات على الشاشة.
</div>
### <div dir="rtl"> قم بإعداد جهازك </div>
<div dir="rtl"> قبل أن تبدأ في برمجة جهاز إنترنت الأشياء الخاص بك ، ستحتاج إلى إجراء قدر صغير من الإعداد. اتبع التعليمات ذات الصلة أدناه بناءً على الجهاز الذي ستستخدمه. </div>
> <div dir="rtl">💁 إذا لم يكن لديك جهاز بعد ، فارجع إلى </div>
>
>[hardware guide](../../../../hardware.md) للمساعدة في تحديد الجهاز الذي ستستخدمه والأجهزة الإضافية التي تحتاج إلى شرائها. لا تحتاج إلى شراء أجهزة ، حيث يمكن تشغيل جميع المشاريع على أجهزة افتراضية.
<div dir="rtl">
تتضمن هذه التعليمات ارتباطات إلى مواقع ويب تابعة لجهات خارجية من منشئي الأجهزة أو الأدوات التي ستستخدمها. هذا للتأكد من أنك تستخدم دائمًا أحدث الإرشادات للأدوات والأجهزة المختلفة.
اعمل من خلال الدليل ذي الصلة لإعداد جهازك وإكمال مشروع "Hello World". ستكون هذه هي الخطوة الأولى في إنشاء ضوء ليلي لإنترنت الأشياء على الدروس الأربعة .
* [ وحدة Arduino - Wio ](../wio-terminal.md)
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi](../pi.md)
* [كمبيوتر ذو لوحة واحدة - جهاز افتراضي](../virtual-device.md)
</div>
### <div dir="rtl"> تطبيقات إنترنت الأشياء </div>
<div dir="rtl">يغطي إنترنت الأشياء مجموعة كبيرة من حالات الاستخدام عبر مجموعات قليلة:
* انترنت الاشياء المستهلك
* إنترنت الأشياء التجاري
* إنترنت الأشياء الصناعي
* انترنت الاشياء البنية التحتية
</div>
<div dir="rtl">✅ قم ببعض البحث: لكل مجال من المجالات الموضحة أدناه ، ابحث عن مثال ملموس واحد لم يرد في النص.</div>
### <div dir="rtl"> انترنت الاشياء المستهلك </div>
<div dir="rtl">
يشير IoT للمستهلكين إلى أجهزة IoT التي سيشتريها المستهلكون ويستخدمونها في المنزل. بعض هذه الأجهزة مفيدة بشكل لا يصدق ، مثل مكبرات الصوت الذكية وأنظمة التدفئة الذكية والمكانس الكهربائية الآلية. البعض الآخر مشكوك فيه في فائدته ، مثل الصنابير التي يتم التحكم فيها بالصوت والتي تعني بعد ذلك أنه لا يمكنك إيقاف تشغيلها لأن التحكم الصوتي لا يمكنه سماع صوت المياه الجارية.
تعمل أجهزة إنترنت الأشياء للمستهلكين على تمكين الأشخاص من تحقيق المزيد في محيطهم ، وخاصة المليار شخص من ذوي الإعاقة. يمكن للمكانس الكهربائية الروبوتية توفير أرضيات نظيفة للأشخاص الذين يعانون من مشاكل في الحركة والذين لا يستطيعون تنظيف أنفسهم ، وتسمح الأفران التي يتم التحكم فيها بالصوت للأشخاص ذوي الرؤية المحدودة أو التحكم في المحرك بتسخين أفرانهم بصوتهم فقط ، ويمكن أن تسمح أجهزة المراقبة الصحية للمرضى بمراقبة الحالات المزمنة بأنفسهم بمزيد من الانتظام والمزيد من التحديثات التفصيلية عن ظروفهم. أصبحت هذه الأجهزة منتشرة في كل مكان حتى أن الأطفال الصغار يستخدمونها كجزء من حياتهم اليومية ، على سبيل المثال الطلاب الذين يقومون بالتعليم الافتراضي أثناء جائحة COVID يضبطون أجهزة ضبط الوقت على الأجهزة المنزلية الذكية لتتبع أعمالهم المدرسية أو أجهزة الإنذار لتذكيرهم باجتماعات الفصل القادمة.
</div>
<div dir="rtl">✅ ما هي أجهزة IoT الاستهلاكية التي لديك أو في منزلك؟ </div>
</br>
### <div dir="rtl">انترنت الأشياء التجاري </div>
<div dir="rtl">
يغطي إنترنت الأشياء التجاري استخدام إنترنت الأشياء في مكان العمل. في مكتب ما ، قد يكون هناك أجهزة استشعار إشغال وكاشفات حركة لإدارة الإضاءة والتدفئة لإبقاء الأضواء والتدفئة فقط عند عدم الحاجة إليها ، مما يقلل التكلفة وانبعاثات الكربون. في المصنع ، يمكن لأجهزة إنترنت الأشياء مراقبة مخاطر السلامة مثل عدم ارتداء العمال للقبعات الصلبة أو الضوضاء التي وصلت إلى مستويات خطيرة. في البيع بالتجزئة ، يمكن لأجهزة إنترنت الأشياء قياس درجة حرارة التخزين البارد ، وتنبيه صاحب المتجر إذا كانت الثلاجة أو الفريزر خارج نطاق درجة الحرارة المطلوبة ، أو يمكنهم مراقبة العناصر الموجودة على الأرفف لتوجيه الموظفين لإعادة تعبئة المنتجات التي تم بيعها. تعتمد صناعة النقل أكثر فأكثر على إنترنت الأشياء لمراقبة مواقع المركبات ، وتتبع الأميال على الطريق لشحن مستخدمي الطريق ، وتتبع ساعات السائق وانقطاع الامتثال ، أو إخطار الموظفين عند اقتراب مركبة من المستودع للاستعداد للتحميل أو التفريغ.
</div>
<div dir="rtl">✅ ما هي أجهزة إنترنت الأشياء التجارية المتوفرة لديك في مدرستك أو مكان عملك؟ </div>
</br>
### <div dir="rtl">انترنت الأشياء الصناعي </div>
<div dir="rtl">
إنترنت الأشياء الصناعي ، أو IIoT ، هو استخدام أجهزة إنترنت الأشياء للتحكم في الآلات وإدارتها على نطاق واسع. يغطي هذا مجموعة واسعة من حالات الاستخدام ، من المصانع إلى الزراعة الرقمية.
تستخدم المصانع أجهزة إنترنت الأشياء بعدة طرق مختلفة. يمكن مراقبة الماكينات بأجهزة استشعار متعددة لتتبع أشياء مثل درجة الحرارة والاهتزاز وسرعة الدوران. يمكن بعد ذلك مراقبة هذه البيانات للسماح للجهاز بالتوقف إذا خرج عن تفاوتات معينة - يعمل على درجة حرارة عالية جدًا ويتم إيقاف تشغيله على سبيل المثال. يمكن أيضًا جمع هذه البيانات وتحليلها بمرور الوقت لإجراء الصيانة التنبؤية ، حيث ستنظر نماذج الذكاء الاصطناعي في البيانات المؤدية إلى الفشل ، وتستخدم ذلك للتنبؤ بحالات الفشل الأخرى قبل حدوثها.
تعتبر الزراعة الرقمية مهمة إذا كان كوكب الأرض يريد إطعام العدد المتزايد من السكان ، خاصة بالنسبة لملياري شخص في 500 مليون أسرة تعيش على <a href="https://wikipedia.org/wiki/Subsistence_agriculture">زراعة الكفاف</a> يمكن أن تتراوح الزراعة الرقمية من عدد قليل من أجهزة الاستشعار بالدولار الواحد ، إلى الأجهزة التجارية الضخمة. يمكن للمزارع أن يبدأ بمراقبة درجات الحرارة واستخدام <a href="https://wikipedia.org/wiki/Growing_degree-day">أيام الدرجات المتزايدة</a> للتنبؤ بموعد جاهزية المحصول للحصاد. يمكنهم ربط مراقبة رطوبة التربة بأنظمة الري الآلية لمنح نباتاتهم القدر المطلوب من المياه ، ولكن ليس أكثر لضمان عدم جفاف محاصيلهم دون إهدار المياه. بل إن المزارعين يأخذون الأمر إلى أبعد من ذلك ويستخدمون الطائرات بدون طيار وبيانات الأقمار الصناعية والذكاء الاصطناعي لمراقبة نمو المحاصيل والأمراض وجودة التربة في مساحات شاسعة من الأراضي الزراعية
</div>
<div dir="rtl">✅ ما هي أجهزة إنترنت الأشياء الأخرى التي يمكن أن تساعد المزارعين؟ </div>
### <div dir="rtl"> انترنت الاشياء البنية التحتية </div>
<div dir="rtl"> يقوم إنترنت الأشياء للبنية التحتية بمراقبة والتحكم في البنية التحتية المحلية والعالمية التي يستخدمها الناس كل يوم. </div>
<div dir="rtl"> <a href="https://wikipedia.org/wiki/Growing_degree-day">المدن الذكية </a> هي مناطق حضرية تستخدم أجهزة إنترنت الأشياء لجمع البيانات حول المدينة واستخدامها لتحسين كيفية إدارة المدينة. عادة ما يتم تشغيل هذه المدن بالتعاون بين الحكومات المحلية والأوساط الأكاديمية والشركات المحلية ، وتتبع وإدارة الأشياء التي تختلف من النقل إلى وقوف السيارات والتلوث. على سبيل المثال ، في كوبنهاغن ، الدنمارك ، يعد تلوث الهواء مهمًا للسكان المحليين ، لذلك يتم قياسه واستخدام البيانات لتوفير معلومات حول أنظف طرق ركوب الدراجات والركض. </div>
<div dir="rtl"> <a href="https://wikipedia.org/wiki/Smart_grid">شبكات الكهرباء الذكية </a> تسمح بتحليلات أفضل للطلب على الطاقة من خلال جمع بيانات الاستخدام على مستوى المنازل الفردية. يمكن أن توجه هذه البيانات القرارات على مستوى الدولة بما في ذلك مكان بناء محطات طاقة جديدة ، وعلى المستوى الشخصي من خلال إعطاء المستخدمين رؤى حول مقدار الطاقة التي يستخدمونها ، وأوقات استخدامها ، وحتى اقتراحات حول كيفية تقليل التكاليف ، مثل لشحن السيارات الكهربائية في الليل. </div>
<div dir="rtl">✅ إذا كان بإمكانك إضافة أجهزة إنترنت الأشياء لقياس أي شيء تعيش فيه ، فماذا سيكون؟</div>
</br>
### <div dir="rtl">أمثلة على أجهزة إنترنت الأشياء التي قد تكون موجودة حولك </div>
<div dir="rtl">
ستندهش من عدد أجهزة إنترنت الأشياء الموجودة حولك. أكتب هذا من المنزل و لدي الأجهزة التالية متصلة بالإنترنت بميزات ذكية مثل التحكم في التطبيق أو التحكم الصوتي أو القدرة على إرسال البيانات إلي عبر هاتفي:
* مكبرات صوت ذكية متعددة
* ثلاجة وغسالة صحون وفرن وميكروويف
* مرقاب كهرباء الألواح الشمسية
* المقابس الذكية
* جرس باب بالفيديو وكاميرات مراقبة
* ترموستات ذكي مع عدة مستشعرات ذكية للغرفة
* فتحت باب المرآب
* أنظمة الترفيه المنزلي وأجهزة التلفزيون ذات التحكم الصوتي
* أضواء
* أجهزة تتبع اللياقة البدنية والصحة
كل هذه الأنواع من الأجهزة لها مستشعرات و / أو مشغلات وتتحدث إلى الإنترنت. يمكنني معرفة ما إذا كان باب الكاراج الخاص بي مفتوحًا من هاتفي ، وأطلب من السماعة الذكية إغلاقها من أجلي. يمكنني حتى ضبطه على مؤقت ، لذلك إذا كان لا يزال مفتوحًا في الليل ، فسيتم إغلاقه تلقائيًا. عندما يرن جرس الباب ، يمكنني أن أرى من هاتفي من يوجد أينما كنت في العالم ، وأتحدث إليهم عبر مكبر صوت وميكروفون مدمجين في جرس الباب. يمكنني مراقبة الجلوكوز في الدم ومعدل ضربات القلب وأنماط النوم ، والبحث عن أنماط في البيانات لتحسين صحتي. يمكنني التحكم في الأضواء الخاصة بي عبر السحابة ، والجلوس في الظلام عندما ينقطع الاتصال بالإنترنت.
</div>
---
## <div dir="rtl">تحدي </div>
<div dir="rtl">ضع قائمة بأكبر عدد ممكن من أجهزة إنترنت الأشياء الموجودة في منزلك أو مدرستك أو مكان عملك - قد يكون هناك أكثر مما تعتقد! </div>
</br>
## <div dir="rtl">مسابقة ما بعد المحاضرة </div>
<div dir="rtl">
<a href="https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2">مسابقة ما بعد المحاضرة </a> </div>
</br>
## <div dir="rtl">المراجعة والدراسة الذاتية </div>
<div dir="rtl"> اقرأ عن مزايا وإخفاقات مشروعات إنترنت الأشياء للمستهلكين. تحقق من المواقع الإخبارية بحثًا عن مقالات عن الأوقات التي حدث فيها خطأ ، مثل مشكلات الخصوصية أو مشكلات الأجهزة أو المشكلات الناجمة عن نقص الاتصال.
بعض الأمثلة:
* قم بالاطلاع على حساب التويتر لأمثلة جيدة على انترنت الاشياء المستهلك **[Internet of Sh*t](https://twitter.com/internetofshit)** *(profanity warning)*
* [c|net - My Apple Watch saved my life: 5 people share their stories](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/)
* [c|net - ADT technician pleads guilty to spying on customer camera feeds for years](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(trigger warning - non-consensual voyeurism)*
### الواجب
[التحقيق في مشروع إنترنت الأشياء](assignment.ar.md)
</div>

@ -1,223 +0,0 @@
# IoT পরিচিতি
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.jpg)
> Nitya Narasimhan তৈরী করছেন এই স্কেচনোটটি । এটির বড় সংস্করণ দেখতে চাইলে ছবিটির উপর ক্লিক করুন ।
## লেকচার পূর্ববর্তী কুইজ
[লেকচার পূর্ববর্তী কুইজ ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## পরিচিতি
এই পাঠে ইন্টারনেট অফ থিংস সম্পর্কিত বেসিক কিছু বিষয় আমরা জানবো এবং হার্ডওয়্যার সেটাপ করা শিখবো ।
এই পাঠে থাকছে :
* [‘ইন্টারনেট অফ থিংস’ কী ?](#‘ইন্টারনেট-অফ-থিংস’-কী )
* [IoT যন্ত্রসমূহ ](#iot-যন্ত্রসমূহ)
* [ডিভাইস সেটাপ করা ](#ডিভাইস-সেটাপ-করা)
* [আইওটি এর প্রয়োগসমূহ ](#আইওটি-এর-প্রয়োগসমূহ)
* [আমাদের চারপাশে থাকতে পারে এমন কিছু আইওটি ডিভাইসের উদাহরণ ](#আমাদের-চারপাশে-থাকতে-পারে-এমন-কিছু-আইওটি-ডিভাইসের-উদাহরণ)
## ‘ইন্টারনেট অফ থিংস’ কী?
১৯৯৯ সালে [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) সর্বপ্রথম ‘ইন্টারনেট অফ থিংস’ এই শব্দবন্ধ প্রচলন করেন যা দ্বারা মূলত তিনি বোঝান সেন্সর ব্যবহার করে আমাদের চারপাশের সবকিছুর সাথে ইন্টারনেটকে যুক্ত করা । তখন থেকেই এই শব্দগুচ্ছ দিয়ে বোঝানো হয় সেসব যন্ত্রকে যারা সাধারণত অন্য কোন যন্ত্র বা ইন্টারনেটের সাথে সংযুক্ত থেকে আমাদের চারপাশের জগতে বিভিন্ন কাজ করে । এই কাজ হতে পারে সেন্সর এর মাধ্যমে তথ্য সংগ্রহ অথবা একচুয়েটরের মাধ্যমে সরাসরি যান্ত্রিক কাজ করা (যেমনঃ সুইচ অন করা বা কোন এলইডি জ্বালিয়ে দেয়া)
> **সেন্সর** আমাদের চারপাশ থেকে তথ্য সংগ্রহ করে যেমনঃ গতি, তাপমাত্রা, অবস্থান।
>
> **একচুয়েটর** ইলেক্ট্রিক সিগন্যাল কে বাস্তব জগতের বিভিন্ন যান্ত্রিক কাজে রুপান্তর করে উদাহরণ হিসেবে বলা যায় কোন সুইচকে নিয়ন্ত্রণ করা, লাইট জ্বালিয়ে দেয়া, শব্দ তৈরী করা বা অন্য কোন যন্ত্রে নির্দেশনা পাঠানো যেমনঃ পাওয়ার সকেট চালু করা।
প্রযুক্তিক্ষেত্র হিসেবে IoT শুধুমাত্র কোন যন্ত্র নয়, বরং এখানে আরো অনেক বিস্তৃত বিষয়াদি অন্তর্ভুক্ত রয়েছে যেমনঃ ক্লাউড নির্ভর সার্ভিসগুলো যার মাধ্যমে সেন্সরের সংগৃহিত ডেটা কে বিশ্লেষণ করা বা একচুয়েটরে নির্দেশনা পাঠানো । আরো একটি বিষয় IoT এর অন্তর্ভুক যা হয়তো অনেককেই অবাক করবে আর তা হলো Edge শ্রেণির যন্ত্রসমূহ যারা ইন্টারনেটে যুক্ত নয় বা যুক্ত হবার প্রয়োজনও হয়না । এই যন্ত্রগুলো ক্লাউডে ট্রেইনড কৃত্রিম বুদ্ধিমত্তার মডেল ব্যবহার করে নিজেরাই প্রাপ্ত তথ্য বিশ্লেষণ করে এবং কীভাবে কাজ করবে সেই সিদ্ধান্ত গ্রহণ করে ।
IoT খুবই দ্রুত বর্ধণশীল একটি প্রযুক্তিক্ষেত্র । ২০২০ সালের মধ্যে আনুমানিক ৩০ বিলিয়ন IoT যন্ত্র ইন্টারনেটে যুক্ত করে ব্যবহার করা হয়েছে । ভবিষ্যতের দিকে তাকিয়ে আনুমান করা হয় যে ২০২৫ সালের মধ্যে এই IoT যন্ত্রগুলো ৮০জেটাবাইট অর্থাৎ ৮০ ট্রিলিয়ন গিগাবাইট সংগ্রহ করে। অনেক ডেটা, তাই না ?
![A graph showing active IoT devices over time, with an upward trend from under 5 billion in 2015 to over 30 billion in 2025](../../../../images/connected-iot-devices.svg)
✅ ছোট্ট একটা গবেষণা করিঃ IoT যে পরিমাণ ডেটা তৈরী করছে তার কতটুকু সত্যিকার অর্থে ব্যবহৃত হচ্ছে আর কতটুকু নষ্ট হচ্ছে ? এত বিশাল পরিমান তথ্য কেন অবহেলা করা হচ্ছে ?
খেয়াল রাখতে হবে, IoT এর সাফল্যের মূলে কিন্তু রয়েছে ডেটা । সফল IoT ডেভলাপার হতে গেলে আমাদের বুঝতে হবে যে আমরা কোন তথ্যগুলো সংগ্রহ করবো, কীভাবে তা করা যাবে । আমাদের জানতে হবে এই তথ্যের ভিত্তিতে কীভাবে আমরা সিদ্ধান্ত নিতে পারি এবং সিদ্ধান্তের প্রাপ্ত ফলাফল দ্বারা আমাদের চারপাশের পরিবেশে কীভাবে কাজ করবো।
## IoT যন্ত্রসমূহ
IoT শব্দে **T** হলো **Things** - ‘থিংস’ বা জিনিষপত্র বলতে এমন সব যন্ত্রকে বোঝানো হয়েছে যারা আশপাশের জগতের সাথে যোগাযোগ করতে পারে সেন্সর থেকে তথ্য সংগ্রহ করে বা একচুয়েটর দ্বারা কোন যান্ত্রিক কাজ করে।
উৎপাদন বা ব্যবসায়িকভাবে ব্যবহারের যন্ত্র যেমনঃ কোন ব্যক্তির ফিটনেস ট্র্যাকার বা কোন কারখানার যন্ত্রের কন্ট্রোলার - প্রয়োজন এর উপর নির্ভর করে বিশেষভাবে তৈরী করতে হতে পারে। তখন সেক্ষেত্রে বিশেষ সার্কিট বোর্ড, আলাদা ধরণের প্রসেসর ব্যবহার করা হয় সে সুনির্দিষ্ট প্রয়োজন মেটাতে। এই কাজ টা খুবই সামান্য হতে পারে যেমন কব্জির সাইজের সাথে মিলিয়ে আকার দেয়া অথবা অনেক কঠিনও হতে পারে যেমন কারখানার অধিক তাপমাত্রা, অত্যধিক চাপ বা তীব্র কম্পনেও যন্ত্রকে চালু রাখতে পারা । .
একজন IoT ডেভলাপার হিসেবে নিজেকে গড়ে তোলার ক্ষেত্রে , এই বিষয়ে জানা বা প্রোটোটাইপ তৈরী করতে হলে আমাদেরকে তা শুরু করতে হবে developer kit দিয়ে । এগুলো সাধারণ ব্যবহারের জন্য তৈরী করা। এর বেশকিছু বৈশিষ্ট্য রয়েছে যা ব্যবহার্য যন্ত্রে দেখা যায়না যেমনঃ অনেকগুলো এক্সটার্নাল পিন, ডিবাগিং এর হার্ডওয়ার বা এমন কিছু সুবিধা যা আপনার সবসময় প্রয়োজন হবেনা। একারণেই এদেরকে general-purpose বা সাধারণ ব্যবহার্য যন্ত্র বলা হয়।
এই ডেভলাপার কিটস গুলোকে দুটো ভাগে ভাগ করা যেতে পারে - মাইক্রোকন্ট্রোলার এবং সিংগেল বোর্ড কম্পিউটার । এগুলোর সাথে আমরা এখন পরিচিত হবো এবং সামনের অধ্যায় এ অনেক বিষদভাবে জানবো ।
> 💁 আমাদের ফোনও কিন্তু general-purpose IoT যন্ত্র হিসেবে কাজ করতে পারে , স্মার্টফোনে সেন্সর আর একচুয়েটর তো রয়েছেই যার সাথে বিভিন্ন অ্যাপ (App) ব্যবহার করে আমরা এদের নিয়ন্ত্রণ করতে পারি বিভিন্নভাবেই । টিউটোরিয়াল খুঁজতে গেলে অনেকসময়ই দেখা যায় ফোনের অ্যাপ ব্যবহার করেই IoT এর কাজ করা হচ্ছে ।
### মাইক্রোকন্ট্রোলার
মাইক্রোকন্ট্রোলার ( microcontroller unit থেকে সংক্ষেপে MCU ও লেখা হয়) হলো ছোট কম্পিউটার যাতে অন্তর্ভুক্ত রয়েছেঃ
🧠 এক বা একাধিক ‘সেন্ট্রাল প্রসেসিং ইউনিট’ (সিপিইউ) - মাইক্রোকন্ট্রোলারের মস্তিষ্ক, যা এটিকে চালায়।
💾 মেমোরি (র‍্যাম এবং প্রোগ্রাম মেমরি) - যেখানে সকল প্রোগ্রাম, তথ্য, চলক রয়েছে ।
🔌 প্রোগ্রামেবল ইনপুট/আউটপুট কানেকশন - যার মাধমে বাহ্যিক যন্ত্রগুলোর সাথে যোগাযোগ করা যায় (যেমনঃ সেন্সর এবং একচুয়েটর এর সাথে)
মাইক্রোকন্ট্রোলার সাধারণ কম খরচের কম্পিউটিং যন্ত্র যার গড় বাজার মূল্য .০৩ মার্কিন ডলার থেকে .৫০ মার্কিন ডলারের মধ্যেই হবে। ডেভলাপার কিট গুলোর দাম ৪ডলার থেকে শুরু হয়ে আস্তে আস্তে বাড়ে , সেখানে কী কী পণ্য দেয়া হচ্ছে তার উপর ভিত্তি করে। [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), যেটি [Seeed studios](https://www.seeedstudio.com) এর একটি মাইক্রোকন্ট্রোলার ডেভলাপার কিট - আর এতে রয়েছে - সেন্সর, অ্যাকচুয়েটর, ওয়াইফাই এবং একটি স্ক্রিন; এর দাম প্রায় ৩০ মার্কিন ডলার।
![A Wio Terminal](../../../../images/wio-terminal.png)
> 💁 ইন্টারনেটে মাইক্রোকন্ট্রোলারের ব্যপারে সার্চ করার সময়, MCU এর ক্ষেত্রে খেয়াল রাখতে হবে। মজার ব্যাপার হলো , MCU এর সার্চ রেজাল্টে মাইক্রোকন্ট্রোলার নয়, বরং বিখ্যাত Marvel Cinematic Universe আসতে পারে !
মাইক্রোকন্ট্রোলার এমনভাবে তৈরী করা হয়েছে যাতে তারা অল্পসংখ্যক সুনির্দিষ্ট কিছু কাজ করতে পারে যা কিনা পিসি বা ম্যাক এর মতো মোটেও নয় । খুবই সুনির্দিষ্ট কিছু পরিস্থিতিকে বাদ দিলে, সাধারণত মনিটর, কীবোর্ড বা মাউসকে সংযুক্ত করে general purpose কাজগুলো করা যায়না।
মাইক্রোকন্ট্রোলার ডেভলাপার কিট সাধারণত অতিরিক্ত সেন্সর এবং একচুয়েটর সম্বলিত থাকে। বেশিরভাগ বোর্ডেই অতিরিক্ত প্রোগ্রামেবল এলইডি থাকে , এতে আরো দেখা যায় কিছু অতিরিক্ত প্লাগ যাতে আমরা বিভিন্ন ধরণের প্রস্তুতকারকের যন্ত্রকে সংযুক্ত করতে পারি অথনা বিল্ট-ইন সেন্সরকে আরো ভালোভাবে ব্যবহার করতে পারি । কিছু মাইক্রোকন্ট্রোলারে বিল্ট-ইন ব্লুটুথ বা ওয়াইফাই কানেকশন থাকে আবার কিছুতে অতিরিক্ত অংশ যোগ করে এই সুবিধা প্রদান করা হয়।
> 💁 মাইক্রোকন্ট্রোলারগুলো সাধারণত সি/সি++ ভাষায় প্রোগ্রাম করা হয়ে থাকে ।
### সিংগেল-বোর্ড কম্পিউটার
সিংগেল-বোর্ড কম্পিউটার হলো ছোট একটি যন্ত্র যার কাছে পূর্ণাঙ্গ কম্পিউটারের সব উপাদানই রয়েছে, তবে ছোট আকারে । এই যন্ত্রগুলোরও ডেস্কটপ বা ল্যাপটপ যেমনঃ পিসি, ম্যাক এর মতো বৈশিষ্ট্য রয়েছে যারা একটি অপারেটিং সিস্টেম রান করতে পারে । তবে এরা কলেবরে ছোট, কম পাওয়ার ব্যবহার করে এবং দৃশ্যত স্বল্পমূল্যের ।
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
বিখ্যাত সিংগেল-বোর্ড কম্পিউটারগুলোর মধ্যে রাস্পবেরি পাই অন্যতম ।
মাইক্রোকন্ট্রোলারের মতো সিংগেল-বোর্ড কম্পিউটার এরও রয়েছে সিপিইউ, মেমরি, ইনপুট/আউটপুট পিন । তবে তাদের অতিরিক্ত বৈশিষ্ট্য রয়েছে যেমন গ্রাফিক্স চিপ দ্বারা আমরা মনিটর, অডিও আউটপুট এবং ইউএসবি পোর্টগুলিকে সংযুক্ত করতে পারি কী-বোর্ড , মাউস এর সাথে বা অন্যান্য স্ট্যান্ডার্ড ইউএসবি ডিভাইসগুলি যেমনঃ ওয়েবক্যাম বা বাহ্যিক স্টোরেজ এর সাথে সংযোগ করতে দেয় । প্রোগ্রামগুলি বোর্ডে তৈরি মেমরি চিপে নয়, বরং হার্ড ড্রাইভে বা এসডি কার্ড এ সংরক্ষণ করা হয়, যার সাথে থাকে অপারেটিং সিস্টেম ।
> 🎓 সিংগেল-বোর্ড কম্পিউটারকে পিসি বা ম্যাকের ছোট ভার্সন হিসেবে ভাবা যেতে পারে যার সাথে অতিরিক্ত কিছু সাধারণ ব্যবহার্য ইনপুট আউটপুট অর্থাৎ GPIO (general-purpose input/output) পিন রয়েছে ।
এগুলো পূর্নাঙ্গ কম্পিউটারের মতই, তাই এদেরকে যেকোন প্রোগ্রামিং ভাষায় চালানো যেতে পারে । তবে আইওটি যন্ত্রগুলো সাধারণত পাইথন ভাষায় প্রোগ্রাম করা হয়ে থাকে।
### এই পাঠের বাকি অংশের জন্য হার্ডওয়ার নির্বাচন
পরবর্তী সমস্ত পাঠগুলিতে আমাদের চারপাশের জগতের সাথে যোগাযোগ করার জন্য এবং ক্লাউড সার্ভিসের সাথে যংযুক্ত থাকার জন্য আইওটি ডিভাইস ব্যবহার করে এসাইনমেন্ট দেয়া হবে। প্রতিটি পাঠ ৩ ধরণের ডিভাইস সাপোর্ট করে - আরডুইনো (একটি সীড স্টুডিওস উইও টার্মিনাল ব্যবহার করে), বা একটি একক বোর্ড কম্পিউটার বা কোনও ফিজিকাল ডিভাইস (একটি রাস্পবেরি পাই 4), অথবা পিসি বা ম্যাকে ব্যবহার যোগ্য ভার্চুয়াল একক-বোর্ড কম্পিউটার (কোন ফিজিক্যাল আইওটি ডিভাইস ব্যবহার না করেই) ।
এখানে [হার্ডওয়্যার গাইড](../../../../translations/hardware.bn.md) অংশে সমস্ত অ্যাসাইনমেন্ট সম্পন্ন করার জন্য প্রয়োজনীয় হার্ডওয়্যার সম্পর্কে বিস্তারিত রয়েছে ।
> 💁 অ্যাসাইনমেন্টগুলি সম্পন্ন করার জন্য আপনার কোন আইওটি হার্ডওয়্যার কেনার দরকার নেই, আমরা চাইলে ভার্চুয়াল সিঙ্গল-বোর্ড কম্পিউটার ব্যবহার করে সবকিছু করতে পারবো ।
আমরা কোন হার্ডওয়্যারটি ব্যবহার করবো তা নির্ভর করে আমাদের শিক্ষা প্রতিষ্ঠান বা ঘরে আমাদের কাছে কী কী এভেইলেবল রয়েছে এবং কোন প্রোগ্রামিং ভাষা আমরা জানি বা শিখার পরিকল্পনা করছি তার উপর । উভয় হার্ডওয়্যার ভেরিয়েন্ট একই সেন্সর ইকোসিস্টেম ব্যবহার করবে, সুতরাং আমরা যদি একটি পাথ শুরু করি তবে বেশিরভাগ কিট প্রতিস্থাপন না করেই অন্যটিতে পরিবর্তন করতে পারবো। ভার্চুয়াল সিংগেল-বোর্ড কম্পিউটারটি রাস্পবেরি পাই তে শিখার সমতুল । তাই পরবর্তীতে ফিজিক্যাল ডিভাইসে কাজ করতে চাইলে বেশ সহজেই আমরা কোড গুলো ব্যবহার করে কাজ করতে পারবো।
### আরডুইনো ডেভলাপার কিট
আমাদের মাইক্রোকন্ট্রোলার ডেভলাপমেন্ট শেখার ব্যাপারে আগ্রহ থাকলে, সেক্ষেত্রে এসাইনমেন্টগুলো আমরা আরডুইনো তে করতে পারি। তবে সি / সি ++ প্রোগ্রামিংয়ের প্রাথমিক জ্ঞান প্রয়োজন হবে, কারণ এখানে পাঠগুলি থেকে আমরা কেবল সেই কোডগুলো ব্যবহার করা শিখবো যেগুলো আরডুইনো কাঠামো, সেন্সর ও অ্যাকচুয়েটরে ব্যবহৃত হচ্ছে এবং এই কোডগুলো মূলত ক্লাউডের সাথে যুক্ত থাকে এমন লাইব্রেরিগুলির সাথে প্রাসঙ্গিক।
এসাইনমেন্টসমূহ আমরা করবো [PlatformIO extension for microcontroller development](https://platformio.org) এক্সটেনশন সম্বলিত [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) ব্যবহার করে। কেউ চাইলে আরডুইনো আইডিই ব্যবহার করতে পারে, যদি এইক্ষেত্রে যথেষ্ট অভিজ্ঞতা থাকে ; কারণ আমাদের পাঠ্যে আরডুইনো আইডিই সংক্রান্ত নির্দেশনা থাকবে।
### সিংগেল-বোর্ড কম্পিউটার ডেভলাপার কিট
সিংগেল-বোর্ড কম্পিউটার ব্যবহার করে আইওটি শিখতে আগ্রহী হলে, আমাদের সেক্ষেত্রে একটি রাস্পবেরি পাই বা আমাদের পিসি বা ম্যাকের সাথে চলমান ভার্চুয়াল ডিভাইস ব্যবহার করে অ্যাসাইনমেন্টগুলি সম্পন্ন করতে পারবো ।
আমাদের পাইথন প্রোগ্রামিংয়ের প্রাথমিক জ্ঞানের প্রয়োজন হবে, কারণ পাঠগুলি থেকে আমরা কেবল এমন কোড শিখবো যা সেন্সর এবং অ্যাকচুয়েটরে ব্যবহৃত হচ্ছে এবং ক্লাউডের সাথে যোগাযোগ করতে পারে এমন প্রাসঙ্গিক লাইব্রেরিগুলি।
> 💁 পাইথনে কোডিং শিখতে চাইলে, নীচের ভিডিও সিরিজটি দুটি দেখতে পারি আমরা -
>
> * [পাইথন ফর বিগিনার্স](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [মোর পাইথন ফর বিগিনার্স](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
.
এসাইনমেন্টগুলো করা হবে [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) ব্যবহার করে ।
আমরা যদি রাস্পবেরি পাই ব্যবহার করতে চাই, তবে হয় রাস্পবেরি পাই ওএস এর সম্পূর্ণ ডেস্কটপ সংস্করণ ব্যবহার করে এটি চালাতে পারি এবং [ভিএস কোডের রাস্পবেরি পাই ওএস সংস্করণ](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn) ব্যবহার করে সরাসরি পাইতে সমস্ত কোডিং করতে পারবো। অথবা পাইকে পিসি বা ম্যাক থেকে হেডলেস ডিভাইস হিসাবে চালাতে পারি [Remote SSH extension](https://code.visualstudio.com/docs/remote/ssh?WT.c_id=academic-17441-jabenn) সহ ভিএস কোড ব্যবহার করে । এতে করে আমাদের পাইয়ের সাথে সংযোগ স্থাপন , কোড এডিট, ডিবাগ বা রান করতে পারবো যেন সরাসরি এতে কোডিং করছি ।
যদি আমরা ভার্চুয়াল ডিভাইস বিকল্পটি ব্যবহার করি, তখন সরাসরি কম্পিউটারে কোড করবো। সত্যিকার সেন্সর এবং অ্যাকচুয়েটর ব্যবহার না করে, বরং এদের একটি সিমুলেশনে আমরা সবকিছু নিয়ন্ত্রণ করতে পারবো ।
## ডিভাইস সেটাপ করা
আইওটি ডিভাইস প্রোগ্রামিং শুরু করার আগে আমাদেরকে কিছু বিষয় সেটআপ করতে হবে। কোন ডিভাইসটি আমরা ব্যবহার করবোতার উপর নির্ভর করে নীচের প্রাসঙ্গিক নির্দেশাবলী অনুসরণ করতে হবে।
> 💁 যদি কোন ডিভাইস না থাকে, তবে কোন ডিভাইস ব্যবহার করা যেতে পারে এবং কী কী অতিরিক্ত যন্ত্র আমাদের কিনতে হবে সেই সংক্রান্ত তথ্যাবলি [হার্ডওয়্যার গাইড](../../../../translations/hardware.bn.md) এ রয়েছে । এক্ষেত্র আমাদের কোন হার্ডওয়্যার না কিনলেও হবে , কারণ সমস্ত প্রকল্প ভার্চুয়াল ভাবে চালিয়ে আমরা শিখতে পারবো ।
এখানের নির্দেশাবলীর মধ্যে এমন হার্ডওয়্যার বা সরঞ্জামগুলির নির্মাতাদের ( তৃতীয় পক্ষের) ওয়েবসাইটগুলির লিঙ্ক অন্তর্ভুক্ত রয়েছে। আমরা যেন সর্বদা বিভিন্ন সরঞ্জাম এবং হার্ডওয়্যারের জন্য সর্বাধিক যুগোপযোগী নির্দেশাবলী ব্যবহার করতে পারি তা নিশ্চিত করার জন্য এটি করা হয়েছে।
আমাদের ডিভাইস সেট আপ করতে এবং 'হ্যালো ওয়ার্ল্ড' প্রকল্পটি সম্পূর্ণ করতে নিচের সহায়ক লিংকগুলোতে নির্দেশনা রয়েছে। Getting Started এর এই অধ্যায়ের 4টি পাঠে, আমরা একটি “নাইটলাইট” প্রজেক্ট করবো যার শুরু এখান থেকেই হতে চলেছে।
* [আরডুইনো Wio টার্মিনাল](wio-terminal.bn.md)
* [সিংগেল বোর্ড কম্পিউটার - রাস্পবেরি পাই](pi.bn.md)
* [সিংগেল বোর্ড কম্পিউটার -ভার্চুয়াল ডিভাইস](../virtual-device.md)
## আইওটি এর প্রয়োগসমূহ
আইওটি কয়েকটি বিস্তৃত প্রেক্ষাপটে অনেকগুলো ক্ষেত্রেই ব্যবহৃত হয়ঃ
* ভোক্তাপর্যায়ে আইওটি
* বাণিজ্যিকক্ষেত্রে আইওটি
* শিল্পক্ষেত্রে আইওটি
* অবকাঠামোগত আইওটি
✅ একটু গবেষণা করা যাক। নিম্নে বর্ণিত প্রতিটি ক্ষেত্রের জন্য, একটি করে উদাহরণ চিন্তা করি যা পাঠ্যে দেওয়া হয়নি।
### ভোক্তাপর্যায়ে আইওটি
কনজিউমার আইওটি বা ভোক্তাপর্যায়ে আইওটি বলতে সেসকল ডিভাইসগুলি বোঝায় যা গ্রাহকরা কিনে এবং বাড়িতে ব্যবহার করে । এর মধ্যে কয়েকটি ডিভাইস অবিশ্বাস্যরূপে দরকারী যেমন স্মার্ট স্পিকার, স্মার্ট হিটিং সিস্টেম এবং রোবোটিক ভ্যাকুয়াম ক্লিনার। অন্যগুলোর প্রয়োজনীয়তা কিছু ক্ষেত্রে প্রশ্নবিদ্ধ, যেমন ভয়েস নিয়ন্ত্রিত পানির ট্যাপ । যখন পানি প্রবাহমান থাকবে, তখন আমাদের ভয়েস এর শব্দ পানির কারণে শোনা না গেলে, এই যন্ত্র আমাদের চাহিদামাফিক কাজটি সম্পাদন করতে পারবেনা ।
গ্রাহকপর্যায়ে আইওটি ডিভাইসগুলি আমাদের সবাইকে আরও বেশি শক্তিশালী করছে, বিশেষত সেই ১ বিলিয়ন মানুষ যাদের বিভিন্ন ধরণের অক্ষমতা আছে। রোবোটিক ভ্যাকুয়াম ক্লিনারগুলি গতিশীলতার সমস্যাযুক্ত লোকদের পরিষ্কার ফ্লোর সরবরাহ করতে পারে , যারা নিজে তা করতে সমস্যার সম্মুখীন হয়। ভয়েস নিয়ন্ত্রিত ওভেনগুলি সীমিত দৃষ্টি বা সীমিত শারীরিক নিয়ন্ত্রণযুক্ত লোকেদের কেবল তাদের ভয়েস দিয়ে ওভেন গরম করতে দেয়, স্বাস্থ্য মনিটরগুলো রোগীদের আরও নিয়মিতভাবে দীর্ঘস্থায়ী পরিস্থিতি পর্যবেক্ষণ করে এবং তাদের অবস্থার বিষয়ে আরও বিশদ তথ্য সরবরাহ করতে পারে। এই ডিভাইসগুলি এতটা সর্বব্যাপী হয়ে উঠছে যে এমনকি ছোট বাচ্চারাও তাদের দৈনন্দিন জীবনের অংশ হিসাবে ব্যবহার করছে, উদাহরণস্বরূপ, শিক্ষার্থীরা কোভিড মহামারীর মাঝে ভার্চুয়াল স্কুলিংয়ের সময় স্মার্ট হোম ডিভাইসগুলিতে টাইমার সেট করছে তাদের স্কুলের কাজগুলো সময়ের মাঝে করার জন্য বা ক্লাসের সময় এলার্মও সেট করে রাখা হচ্ছে আইওটি ব্যবহার করে ।
✅ আপনার বাড়িতে কী কোন গ্রাহকপর্যায়ের আইওটি ডিভাইস রয়েছে?
### বাণিজ্যিকক্ষেত্রে আইওটি
বাণিজ্যিক আইওটি বলতে মূলত কর্মক্ষেত্রে আইওটির ব্যবহারকে বোঝান হয়। কোন অফিসে ব্যয় এবং কার্বন নিঃসরণ হ্রাস করার জন্য, আলো এবং তাপ প্রয়োজন না হলে তা বন্ধ রাখতে অকুপেন্সি সেন্সর এবং মোশন ডিটেক্টর ব্যবহার করা হতে পারে। কারখানায় আইওটি ডিভাইসগুলি ঝুঁকিপূর্ণ পরিস্থিতি পর্যবেক্ষণ করতে পারে যেমনঃ হেলমেট না পরা শ্রমিক বা বিপদজনক সংকেত বাজতে থাকার মতো ঘটনা নজরদারি করতে পারে। আইওটি ডিভাইসগুলি কোল্ড স্টোরেজের তাপমাত্রা পরিমাপ করতে পারে। যদি কোন ফ্রিজ বা ফ্রিজার প্রয়োজনীয় তাপমাত্রার সীমার বাইরে থাকে তবে তারা দোকানের মালিককে সতর্ক করে দিতে পারে। এছাড়াও ব্যবসায়ীরা পণ্যগুলি বিক্রির পর পুনরায় যেন স্টোরেজ পূরণ করা হয় সেই নির্দেশনা সরাসরি কর্মচারীদের দিতে পারে । যানবাহন এর অবস্থান নিরীক্ষণ, গতিসীমার বেশি গাড়ি চালানো হলে তার শাস্তি নিশ্চিত করা, ড্রাইভার কতক্ষণ গাড়ি চালালো এবং পর্যাপ্ত বিরতি নিয়েছে কিনা তা নির্ণয় করা যায়। এছাড়াও যখন কোনও গাড়ি লোড বা আনলোডের প্রস্তুতির জন্য কোনও ডিপোতে পৌঁছায় তা তখন কর্মীদের অবহিত করতেও আইওটি গুরুত্বপূর্ণ ভূমিকা রাখে।
✅ আপনার শিক্ষাপ্রতিষ্ঠান বা কর্মক্ষেত্রে কোন বাণিজ্যিক আইওটি ডিভাইস রয়েছে কী ?
### শিল্পক্ষেত্রে আইওটি (IIoT)
শিল্পক্ষেত্রে আইওটি (Industrial IoT or IIoT ) বলতে বোঝান হয় কারখানার বৃহত্তর পর্যায়ের যন্ত্রপাতি নিয়ন্ত্রণ ও পরিচালনা করা। এই ক্ষেত্রটি ফ্যাক্টরি থেকে শুরু করে ডিজিটাল কৃষিব্যবস্থা পর্যন্ত - অনেক বিশাল প্রেক্ষাপট জুড়ে বিস্তৃত ।
কারখানাগুলি আইওটি ডিভাইসগুলি বিভিন্ন উপায়ে ব্যবহার করে। তাপমাত্রা, কম্পন এবং ঘূর্ণন গতির মতো জিনিসগুলি ট্র্যাক করতে একাধিক সেন্সর দিয়ে যন্ত্রপাতিগুলি পর্যবেক্ষণ করা হয়। এই ডেটাগুলি তখন নির্দিষ্ট কিছু মাত্রার বাইরে চলে গেলে, মেশিনটিকে বন্ধ করার জন্য এটি সার্বক্ষণিক পর্যবেক্ষণ করা হয় যেমনঃ মেশিন খুব গরম হয়ে গেলো আর তখনই আইওটি দ্বারা তা বন্ধ হয়ে যায়। ভবিষ্যদ্বাণীমূলক রক্ষণাবেক্ষণের জন্য এই ডেটাগুলি সময়ের সাথে সংগৃহীত ও বিশ্লেষণ করা যেতে পারে, যেখানে কৃত্রিম বুদ্ধিমত্তার মডেলগুলি বিশ্লেষণ করবে কোন কোন পরিস্থিতিতে মেশিনগুলো ফেইল করছে এবং নেতিবাচক ঘটনা সংঘটিত হওয়ার আগেই তার পূর্বাভাস দিবে।
পৃথিবীর ক্রমবর্ধমান জনগোষ্ঠীের অন্নসংস্থানের জন্য ডিজিটাল কৃষিকাজটি গুরুত্বপূর্ণ, বিশেষত ৫০০ মিলিয়ন পরিবারের ২ বিলিয়ন মানুষ যারা [কৃষিকাজ করে জীবিকা নির্বাহ করে](https://wikipedia.org/wiki/Subsistence_agriculture) থাকে। ডিজিটাল কৃষিক্ষেত্র কয়েকটি স্বল্পমূল্যের সেন্সর থেকে শুরু করে বিশাল বাণিজ্যিক সেটআপ পর্যন্ত হতে পারে। একজন কৃষক তাপমাত্রা পর্যবেক্ষণ করতে পারে এবং [growing degree days](https://wikipedia.org/wiki/Growing_degree-day) ব্যবহার করে ভবিষ্যদ্বাণী করতে পারে কোন ফসল কখন প্রস্তুত হবে। তারা তাদের উদ্ভিদের প্রয়োজনমতো জল দেওয়ার জন্য স্বয়ংক্রিয় জল সরবরাহ ব্যবস্থার সাথে মাটির আর্দ্রতা পর্যবেক্ষণের তথ্যের সংযোগ স্থাপন করতে পারে যাতে পানি নষ্ট না হয়, আবার তাদের ফসলও যেন শুকিয়ে না যায় । কৃষকরা এই প্রযুক্তি আরো এগিয়ে নিয়ে যেতে পারেন এবং ফসলের বৃদ্ধি, রোগ এবং মাটির গুণাগুণ পর্যবেক্ষণ করতে ড্রোন, স্যাটেলাইট থেকে প্রাপ্ত তথ্য এবং আর্টিফিশিয়াল ইন্টেলিজেন্স ব্যবহার করতে পারেন ।
✅ আর কোন কোন আইওটি ডিভাইস কৃষকদের সহায়তা করতে পারে ?
### অবকাঠামোগত আইওটি
অবকাঠামোগত আইওটি মূলত স্থানীয় এবং বিশ্বব্যাপী অবকাঠামোসমূহ পর্যবেক্ষণ এবং নিয়ন্ত্রণ করছে যা সবাই প্রতিদিন ব্যবহার করে।
[স্মার্ট সিটি](https://wikipedia.org/wiki/Smart_city) হল এমন শহুরে অঞ্চল যা আইওটি ডিভাইসগুলি্ ব্যবহার করে ডেটা সংগ্রহ করে এবং শহরটি কীভাবে চালিত হয় তা উন্নত করতে তথ্য প্রদান করে। এই শহরগুলি সাধারণত স্থানীয় সরকার, শিক্ষাপ্রতিষ্ঠান এবং স্থানীয় ব্যবসা্র পরিমন্ডল- সকলের মধ্যে পারষ্পরিক সহযোগিতায় পরিচালিত হয় ; পরিবহণ থেকে পার্কিং এবং দূষণের ক্ষেত্রে বিভিন্ন জিনিস ট্র্যাকিং এবং পরিচালনা করে। উদাহরণস্বরূপ, ডেনমার্কের কোপেনহেগেনে বায়ু দূষণ স্থানীয় বাসিন্দাদের কাছে গুরুত্বপূর্ণ । তাই সেখানে এটি পরিমাপ করা হয় এবং প্রাপ্ত তথ্যাবলি ব্যবহার করে সবচেয়ে পরিষ্কার সাইক্লিং এবং জগিং রুটের তথ্য সরবরাহ করতে ব্যবহৃত হয়।
[স্মার্ট পাওয়ার](https://wikipedia.org/wiki/Smart_grid) গ্রিডগুলি পৃথক পৃথক বাড়ির বিদ্যুতের চাহিদা ও ব্যবহারের তথ্য সংগ্রহ করে, বৈদ্যুতিক চাহিদার বিশ্লেষণ করে। নতুন ডেটা স্টেশন কোথায় তৈরি করতে হবে এবং ব্যক্তিগত পর্যায়ে ব্যবহারকারীরা কতটা বিদ্যুৎ ব্যবহার করছেন, কখন তারা এটি ব্যবহার করছেন এবং কীভাবে কীভাবে ব্যয় হ্রাস করতে হবে কিংবা ইলেক্ট্রিক গাড়িকে রাতে চার্জ দেয়া - সবকিছু সম্পর্কে সিদ্ধান্ত নেয়ার ক্ষেত্রে এই তথ্যাবলী সহায়তা করে থাকে ।
✅ আপনি যেখানে থাকেন সেখানে কিছু পরিমাপ করতে যদি আপনি আইওটি ডিভাইস ব্যবহার করতে পারেন, তবে কোন ডিভাইস ব্যবহার করবেন?
## আমাদের চারপাশে থাকতে পারে এমন কিছু আইওটি ডিভাইসের উদাহরণ
চারপাশে আসলে কী পরিমাণ আইওটি ডিভাইস রয়েছে তা জানলে, আমরা রীতিমতো অবাক হয়ে যাব । আমি এই লেসনটি আমার বাসা থেকে লিখছি এবং আমার কাছে অ্যাপ্লিকেশন নিয়ন্ত্রণ,ভয়েস নিয়ন্ত্রণ বা আমার ফোনের মাধ্যমে ডেটা প্রেরণ করার মতো স্মার্ট বৈশিষ্ট্যগুলির সাথে আমার সাথে নিম্নলিখিত ডিভাইসগুলি ইন্টারনেটে সংযুক্ত রয়েছে:
* একাধিক স্মার্ট স্পিকার
* ফ্রিজ, ডিশ ওয়াশার, ওভেন এবং মাইক্রোওয়েভ
* সৌর প্যানেলগুলির জন্য বিদ্যুৎ নিরীক্ষক
* স্মার্ট প্লাগ
* ভিডিও সম্বলিত দরজার বেল এবং সুরক্ষা ক্যামেরা
* একাধিক স্মার্ট রুম সেন্সর সহ স্মার্ট থার্মোস্ট্যাট
* গ্যারেজের দরজা নিয়ন্ত্রক
* ঘরোয়া বিনোদন সিস্টেম এবং ভয়েস নিয়ন্ত্রিত টিভি
* আলো
* ফিটনেস ট্র্যাকার
এই ধরণের ডিভাইসে সেন্সর এবং / অথবা অ্যাকিউটিউটর রয়েছে এবং তারা ইন্টারনেটে সংযুক্ত থাকে। আমার গ্যারেজের দরজা খোলা আছে কিনা তা আমি আমার ফোন থেকে বলতে পারি এবং আমার স্মার্ট স্পিকার ব্যবহার করেই আমি তা বন্ধ করতে পারি। এমনকি আমি চাইলে টাইমার সেট করতে পারি, তাই এটি যদি রাতে খোলাও থাকে তবে এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।আমার ডোরবেল বেজে উঠলে আমি বিশ্বের যেখানেই থাকি না কেন, কে বেল বাজিয়েছে তা দেখতে পাই এবং ডোরবেলটিতে নির্মিত স্পিকার এবং মাইক্রোফোনের মাধ্যমে তাদের সাথে কথা বলতে পারি।আমি আমার রক্তের গ্লুকোজ, হার্টরেট এবং ঘুমের ধরণগুলি পর্যবেক্ষণ করতে পারি । আমার স্বাস্থ্যের উন্নতি করতে তথ্যাবলি বিশ্লেষণ করি। আমি ক্লাউডের মাধ্যমে আমার ঘরের লাইটগুলি নিয়ন্ত্রণ করতে পারি । তবে কখনো কখনো আমার ইন্টারনেট সংযোগ বিঘ্নিত হলে অন্ধকারে বসে থাকতে হয়।
---
## 🚀 চ্যালেঞ্জ
আমাদের বাড়ি, স্কুল বা কর্মক্ষেত্রে যতগুলি আইওটি ডিভাইস রয়েছে তার তালিকা করি - হয়তো আমাদের ভাবনার চেয়েও বেশি কিছু থাকতে পারে !
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2)
## পর্যালোচনা এবং স্ব-অধ্যয়ন
গ্রাহকপর্যায়ের আইওটি প্রকল্পগুলির সুবিধাগুলি এবং ব্যর্থতাগুলি পড়তে হবে। গোপনীয়তা সংক্রান্ত সমস্যা, হার্ডওয়্যার সমস্যা বা ইন্টারনেট সংযোগের বিঘ্ন ঘটা - এই সমস্যাগুলির ব্যপারে পত্রিকা ও আর্টিকেল পড়তে পারি আমরা।
উদাহরণস্বরূপঃ
* এই টুইটার হ্যান্ডেল দেখতে পারি যেখানে **[Internet of Sh*t](https://twitter.com/internetofshit)** *(সংবিধিবদ্ধ সতর্কীকরণ)* গ্রাহকপর্যায়ে আইওটির ব্যর্থতার বেশ কিছু উদাহরণ রয়েছে।
* [c|net - আমার অ্যাপল ওয়াচ আমার জীবন বাঁচিয়েছিল: ৫ জন তাদের গল্প শুনিয়েছেন](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/)
* [c|net -এডিটি টেকনিশিয়ান বছরের পর বছর গ্রাহক ক্যামেরা ফিডে গুপ্তচরবৃত্তির জন্য দোষী হন](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(সতর্কতা - অনুমতি ব্যাতীত আপত্তিকর দৃশ্য ধারণ )*
## এসাইনমেন্ট
[একটি আইওটি প্রজেক্ট পর্যালোচনা](assignment.bn.md)

@ -1,221 +0,0 @@
# इंटरनेट ऑफ थिंग्स (IoT )का परिचय
![इस पाठ का एक संक्षिप्त विवरण](../../../../sketchnotes/lesson-1.jpg)
> [Nitya Narasimhan](https://github.com/nitya) द्वारा स्केचनोट. Click the image for a larger version.
![अगर उपलब्ध हो तो यहां वीडियो एम्बेड करें](वीडियो-यूआरएल)
## प्री-रीडिंग क्विज
[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## परिचय
इस पाठ में इंटरनेट ऑफ थिंग्स के कुछ परिचयात्मक विषयों को शामिल किया गया है, और आपको अपना हार्डवेयर सेट करने के लिए प्रेरित करता है।
इस पाठ में हम कवर करेंगे:
* [ 'इंटरनेट ऑफ थिंग्स' क्या है? ](#'इंटरनेट-ऑफ-थिंग्'स-क्या-है)
* [ 'इंटरनेट ऑफ थिंग्स' IoT डिवाइस ](#IoT-डिवाइस)
* [अपना डिवाइस सेट करें ](#अपना-डिवाइस-सेट-करें)
* [ 'इंटरनेट ऑफ थिंग्स' IoT के अनुप्रयोग ](#IoT-.-के-अनुप्रयोग)
* [आपके आस-पास मौजूद IoT उपकरणों के उदाहरण ](#IoT-उपकरणों-के-उदाहरण-जो-आपके-आस-पास-हो-सकते-हैं)
## 'इंटरनेट ऑफ थिंग्स' क्या है?
'इंटरनेट ऑफ थिंग्स' शब्द को [kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) ने 1999 में सेंसर के माध्यम से इंटरनेट को भौतिक दुनिया से जोड़ने के लिए गढ़ा था। तब से इस शब्द का उपयोग किसी भी उपकरण का वर्णन करने के लिए किया गया है जो या तो सेंसर से डेटा एकत्र करके, या एक्ट्यूएटर्स के माध्यम से वास्तविक दुनिया की बातचीत प्रदान करके अपने आस-पास की भौतिक दुनिया के साथ इंटरैक्ट करता है (ऐसे उपकरण जो स्विच चालू करने या एलईडी लाइट करने जैसे कुछ करते हैं), आम तौर पर अन्य उपकरणों या इंटरनेट से जुड़ा होता है।
> **सेंसर** दुनिया से जानकारी इकट्ठा करते हैं, जैसे गति, तापमान या स्थान को मापना।
>
> **एक्ट्यूएटर्स** विद्युत संकेतों को वास्तविक दुनिया के इंटरैक्शन में परिवर्तित करते हैं जैसे कि लीवर, लाइट चालू करना, ध्वनि करना, या अन्य हार्डवेयर को नियंत्रण सिग्नल भेजना जैसे कि पावर सॉकेट चालू करना
एक प्रौद्योगिकी क्षेत्र के रूप में IoT केवल उपकरणों से अधिक है - इसमें क्लाउड आधारित सेवाएं शामिल हैं जो सेंसर डेटा को संसाधित कर सकती हैं, या IoT उपकरणों से जुड़े एक्चुएटर्स को अनुरोध भेज सकती हैं। इसमें ऐसे उपकरण भी शामिल हैं जिनमें कनेक्टिविटी नहीं है, जिन्हें अक्सर एज डिवाइस कहा जाता है, जो सेंसर डेटा को स्वयं संसाधित और प्रतिक्रिया दे सकते हैं, आमतौर पर क्लाउड में प्रशिक्षित एआई मॉडल का उपयोग करते हुए।
IoT एक तेजी से बढ़ता प्रौद्योगिकी क्षेत्र है। ऐसा अनुमान है कि 2020 के अंत तक, 30 बिलियन IoT उपकरणों को तैनात किया गया और इंटरनेट से जोड़ा गया। भविष्य को देखते हुए, यह अनुमान लगाया गया है कि 2025 तक, IoT डिवाइस लगभग 80 ज़ेटाबाइट डेटा, या 80 ट्रिलियन गीगाबाइट्स एकत्र करेंगे। यह बहुत सारा डेटा है!
![समय के साथ सक्रिय IoT उपकरणों को दिखाने वाला एक ग्राफ, 2015 में 5 बिलियन से कम से 2025 में 30 बिलियन से अधिक की प्रवृत्ति के साथ](../../../../images/connected-iot-devices.svg)
✅थोड़ा शोध करें: IoT उपकरणों द्वारा उत्पन्न डेटा का वास्तव में कितना उपयोग किया जाता है, और कितना बर्बाद होता है? इतने डेटा को नज़रअंदाज़ क्यों किया जाता है?
यह डेटा IoT की सफलता की कुंजी है। एक सफल IoT डेवलपर बनने के लिए, आपको उस डेटा को समझने की ज़रूरत है जिसे आपको इकट्ठा करने की ज़रूरत है, इसे कैसे इकट्ठा करना है, इसके आधार पर निर्णय कैसे लेना है, और ज़रूरत पड़ने पर भौतिक दुनिया के साथ बातचीत करने के लिए उन निर्णयों का उपयोग कैसे करना है।
## IoT डिवाइस
IoT में **T** का अर्थ है **चीजें** - ऐसे उपकरण जो सेंसर से डेटा एकत्र करके, या एक्ट्यूएटर्स के माध्यम से वास्तविक दुनिया की बातचीत प्रदान करके अपने आस-पास की भौतिक दुनिया के साथ इंटरैक्ट करते हैं।
उत्पादन या व्यावसायिक उपयोग के लिए उपकरण, जैसे उपभोक्ता फिटनेस ट्रैकर्स, या औद्योगिक मशीन नियंत्रक, आमतौर पर कस्टम मेड होते हैं। वे कस्टम सर्किट बोर्ड का उपयोग करते हैं, शायद कस्टम प्रोसेसर भी, जिन्हें किसी विशेष कार्य की जरूरतों को पूरा करने के लिए डिज़ाइन किया गया है, चाहे वह कलाई पर फिट होने के लिए पर्याप्त छोटा हो, या उच्च तापमान, उच्च तनाव, उच्च कंपन कारखाने के वातावरण में काम करने के लिए पर्याप्त कठोर हो।
एक डेवलपर के रूप में, या तो IoT के बारे में सीखना या एक प्रोटोटाइप डिवाइस बनाना, आपको एक डेवलपर किट के साथ शुरुआत करनी होगी। ये सामान्य प्रयोजन के IoT डिवाइस हैं जिन्हें डेवलपर्स के उपयोग के लिए डिज़ाइन किया गया है, अक्सर ऐसी सुविधाओं के साथ जो आप किसी प्रोडक्शन डिवाइस पर नहीं देखेंगे, जैसे सेंसर या एक्ट्यूएटर्स को जोड़ने के लिए बाहरी पिन का एक सेट, डिबगिंग का समर्थन करने के लिए हार्डवेयर, या अतिरिक्त संसाधन एक बड़ा विनिर्माण रन करते समय अनावश्यक लागत जोड़ें।
ये डेवलपर किट आमतौर पर दो श्रेणियों में आते हैं - माइक्रोकंट्रोलर और सिंगल-बोर्ड कंप्यूटर। इन्हें यहां पेश किया जाएगा, और हम अगले पाठ में इनके बारे में विस्तार से जानेंगे।
> आपके फ़ोन को एक सामान्य-उद्देश्य वाला IoT उपकरण भी माना जा सकता है, जिसमें सेंसर और एक्चुएटर अंतर्निहित होते हैं, जिसमें अलग-अलग ऐप्स अलग-अलग क्लाउड सेवाओं के साथ अलग-अलग तरीकों से सेंसर और एक्चुएटर्स का उपयोग करते हैं। आप कुछ IoT ट्यूटोरियल भी पा सकते हैं जो IoT डिवाइस के रूप में फ़ोन ऐप का उपयोग करते हैं।
### माइक्रोकंट्रोलर
एक माइक्रोकंट्रोलर (जिसे एमसीयू भी कहा जाता है, माइक्रोकंट्रोलर यूनिट के लिए छोटा) एक छोटा कंप्यूटर है जिसमें निम्न शामिल हैं:
🧠एक या अधिक सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) - आपके प्रोग्राम को चलाने वाले माइक्रोकंट्रोलर का 'दिमाग'
💾 मेमोरी (रैम और प्रोग्राम मेमोरी) - जहां आपका प्रोग्राम, डेटा और वेरिएबल्स संग्रहीत हैं
🔌 प्रोग्राम करने योग्य इनपुट/आउटपुट (I/O) कनेक्शन - बाहरी बाह्य उपकरणों (कनेक्टेड डिवाइस) जैसे सेंसर या एक्चुएटर से बात करने के लिए
माइक्रोकंट्रोलर आम तौर पर कम लागत वाले कंप्यूटिंग डिवाइस होते हैं, कस्टम हार्डवेयर में उपयोग किए जाने वाले लोगों के लिए औसत मूल्य लगभग यूएस $ 0.50 तक गिरते हैं, कुछ डिवाइस यूएस $ 0.03 के सस्ते होते हैं। डेवलपर किट कम से कम US$4 से शुरू हो सकती हैं, जैसे-जैसे आप अधिक सुविधाएँ जोड़ते हैं, लागत बढ़ती जाती है। [
वाईओ टर्मिनल](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), [सीड स्टूडियो](https://www.seeedstudio.com) का एक माइक्रोकंट्रोलर डेवलपर किट जिसमें सेंसर लगे हैं , एक्चुएटर्स, वाईफाई और एक स्क्रीन की कीमत लगभग US$30 है।
![एक वाईओ टर्मिनल](../../../../images/wio-terminal.png)
> 💁 माइक्रोकंट्रोलर के लिए इंटरनेट पर खोज करते समय **MCU** शब्द की खोज करने से सावधान रहें क्योंकि इससे मार्वल सिनेमैटिक यूनिवर्स के लिए बहुत सारे परिणाम वापस आएंगे, न कि माइक्रोकंट्रोलर।
माइक्रोकंट्रोलर को पीसी या मैक जैसे सामान्य-उद्देश्य वाले कंप्यूटर होने के बजाय सीमित संख्या में बहुत विशिष्ट कार्यों को करने के लिए प्रोग्राम करने के लिए डिज़ाइन किया गया है। बहुत विशिष्ट परिदृश्यों को छोड़कर, आप मॉनिटर, कीबोर्ड और माउस को कनेक्ट नहीं कर सकते हैं और सामान्य प्रयोजन के कार्यों के लिए उनका उपयोग नहीं कर सकते हैं।
माइक्रोकंट्रोलर डेवलपर किट आमतौर पर बोर्ड पर अतिरिक्त सेंसर और एक्चुएटर्स के साथ आते हैं। अधिकांश बोर्डों में एक या एक से अधिक एल ई डी होंगे जिन्हें आप प्रोग्राम कर सकते हैं, साथ ही अन्य उपकरणों जैसे कि विभिन्न निर्माताओं के पारिस्थितिक तंत्र का उपयोग करके अधिक सेंसर या एक्ट्यूएटर जोड़ने के लिए मानक प्लग या सेंसर में निर्मित (आमतौर पर तापमान जैसे सबसे लोकप्रिय वाले)। कुछ माइक्रोकंट्रोलर्स ने ब्लूटूथ या वाईफाई जैसे वायरलेस कनेक्टिविटी में बनाया है, या इस कनेक्टिविटी को जोड़ने के लिए बोर्ड पर अतिरिक्त माइक्रोकंट्रोलर हैं।
> 💁
माइक्रोकंट्रोलर आमतौर पर C/C++ में प्रोग्राम किए जाते हैं।
### सिंगल-बोर्ड कंप्यूटर
एक सिंगल-बोर्ड कंप्यूटर एक छोटा कंप्यूटिंग डिवाइस है जिसमें एक छोटे से बोर्ड पर निहित संपूर्ण कंप्यूटर के सभी तत्व होते हैं। ये ऐसे उपकरण हैं जिनके विनिर्देश डेस्कटॉप या लैपटॉप पीसी या मैक के करीब हैं, एक पूर्ण ऑपरेटिंग सिस्टम चलाते हैं, लेकिन छोटे होते हैं, कम शक्ति का उपयोग करते हैं, और काफी सस्ते होते हैं।
![एक रास्पबेरी पाई 4](../../../../images/raspberry-pi-4.jpg)
रास्पबेरी पाई सबसे लोकप्रिय सिंगल-बोर्ड कंप्यूटरों में से एक है।
एक माइक्रोकंट्रोलर की तरह, सिंगल-बोर्ड कंप्यूटर में एक सीपीयू, मेमोरी और इनपुट/आउटपुट पिन होते हैं, लेकिन उनमें ग्राफिक्स चिप जैसी अतिरिक्त सुविधाएं होती हैं, जिससे आप मॉनिटर, ऑडियो आउटपुट और यूएसबी पोर्ट को कीबोर्ड, चूहों और अन्य मानक यूएसबी से कनेक्ट कर सकते हैं। वेबकैम या बाहरी भंडारण जैसे उपकरण। बोर्ड में निर्मित मेमोरी चिप के बजाय प्रोग्राम को ऑपरेटिंग सिस्टम के साथ एसडी कार्ड या हार्ड ड्राइव पर संग्रहीत किया जाता है।
> 🎓आप एक सिंगल-बोर्ड कंप्यूटर को उस पीसी या मैक के छोटे, सस्ते संस्करण के रूप में सोच सकते हैं जिस पर आप इसे पढ़ रहे हैं, सेंसर और एक्ट्यूएटर्स के साथ बातचीत करने के लिए जी.पी.आई.ओ पिन के अतिरिक्त।
सिंगल-बोर्ड कंप्यूटर पूरी तरह से फीचर्ड कंप्यूटर हैं, इसलिए इन्हें किसी भी भाषा में प्रोग्राम किया जा सकता है। IoT डिवाइस आमतौर पर Python में प्रोग्राम किए जाते हैं।
### बाकी पाठों के लिए हार्डवेयर विकल्प
बाद के सभी पाठों में भौतिक दुनिया के साथ बातचीत करने और क्लाउड के साथ संचार करने के लिए IoT डिवाइस का उपयोग करने वाले असाइनमेंट शामिल हैं। प्रत्येक पाठ 3 डिवाइस विकल्पों का समर्थन करता है - Arduino (एक Seeed Studios Wio Terminal का उपयोग करके), या एक सिंगल-बोर्ड कंप्यूटर, या तो एक भौतिक उपकरण (एक रास्पबेरी पाई 4), या आपके पीसी या मैक पर चलने वाला एक वर्चुअल सिंगल-बोर्ड कंप्यूटर।
आप [हार्डवेयर गाइड](../../../../hardware.md) में सभी असाइनमेंट को पूरा करने के लिए आवश्यक हार्डवेयर के बारे में पढ़ सकते हैं।
> 💁 असाइनमेंट को पूरा करने के लिए आपको कोई IoT हार्डवेयर खरीदने की आवश्यकता नहीं है, आप वर्चुअल सिंगल-बोर्ड कंप्यूटर का उपयोग करके सब कुछ कर सकते हैं।
आप कौन सा हार्डवेयर चुनते हैं यह आप पर निर्भर करता है - यह इस बात पर निर्भर करता है कि आपके स्कूल में घर पर क्या उपलब्ध है, और आप कौन सी प्रोग्रामिंग भाषा जानते हैं या सीखने की योजना बना रहे हैं। दोनों हार्डवेयर वेरिएंट एक ही सेंसर इकोसिस्टम का उपयोग करेंगे, इसलिए यदि आप एक पथ को शुरू करते हैं, तो आप अधिकांश किट को बदले बिना दूसरे में बदल सकते हैं। वर्चुअल सिंगल-बोर्ड कंप्यूटर रास्पबेरी पाई पर सीखने के बराबर होगा, यदि आप अंततः एक डिवाइस और सेंसर प्राप्त करते हैं तो अधिकांश कोड पीआई में स्थानांतरित हो जाते हैं।
### Arduino डेवलपर किट
यदि आप माइक्रोकंट्रोलर विकास सीखने में रुचि रखते हैं, तो आप Arduino डिवाइस का उपयोग करके असाइनमेंट पूरा कर सकते हैं। आपको C/C++ प्रोग्रामिंग की एक बुनियादी समझ की आवश्यकता होगी, क्योंकि पाठ केवल Arduino फ्रेमवर्क, सेंसर और एक्चुएटर्स और क्लाउड के साथ इंटरैक्ट करने वाले पुस्तकालयों के लिए प्रासंगिक कोड सिखाएंगे।
असाइनमेंट [विज़ुअल स्टूडियो कोड](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) का उपयोग [माइक्रोकंट्रोलर डेवलपमेंट के लिए प्लेटफ़ॉर्मियो एक्सटेंशन](https://platformio.org) के साथ करेंगे। यदि आप इस उपकरण के साथ अनुभवी हैं, तो आप Arduino IDE का भी उपयोग कर सकते हैं, क्योंकि निर्देश प्रदान नहीं किए जाएंगे।
### सिंगल-बोर्ड कंप्यूटर डेवलपर किट
यदि आप सिंगल-बोर्ड कंप्यूटर का उपयोग करके IoT विकास सीखने में रुचि रखते हैं, तो आप रास्पबेरी पाई, या अपने पीसी या मैक पर चलने वाले वर्चुअल डिवाइस का उपयोग करके असाइनमेंट पूरा कर सकते हैं।
आपको पायथन प्रोग्रामिंग की एक बुनियादी समझ की आवश्यकता होगी, क्योंकि पाठ केवल वही कोड सिखाएगा जो उपयोग किए जा रहे सेंसर और एक्चुएटर्स और क्लाउड के साथ इंटरैक्ट करने वाले पुस्तकालयों के लिए प्रासंगिक है।
> 💁 यदि आप पायथन में कोड करना सीखना चाहते हैं, तो निम्नलिखित दो वीडियो श्रृंखला देखें:
>
> * [शुरुआती के लिए पायथन](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [शुरुआती के लिए अधिक पायथन](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
असाइनमेंट [विजुअल स्टूडियो कोड](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) का उपयोग करेंगे।
यदि आप रास्पबेरी पाई का उपयोग कर रहे हैं, तो आप या तो रास्पबेरी पाई ओएस के पूर्ण डेस्कटॉप संस्करण का उपयोग करके अपना पाई चला सकते हैं, और [वीएस कोड के रास्पबेरी पाई ओएस संस्करण](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn), या [ रिमोट एसएसएच एक्सटेंशन ](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) के साथ वीएस कोड का उपयोग करके अपने पीसी या मैक से एक हेडलेस डिवाइस और कोड के रूप में अपना पाई चलाएं। जो आपको अपने पाई से कनेक्ट करने और कोड को संपादित करने, डीबग करने और चलाने की अनुमति देता है जैसे कि आप उस पर सीधे कोडिंग कर रहे थे।
यदि आप वर्चुअल डिवाइस विकल्प का उपयोग करते हैं, तो आप सीधे अपने कंप्यूटर पर कोड करेंगे। सेंसर और एक्ट्यूएटर्स तक पहुंचने के बजाय, आप इस हार्डवेयर को सेंसर मान प्रदान करने के लिए एक उपकरण का उपयोग करेंगे जिसे आप परिभाषित कर सकते हैं, और स्क्रीन पर एक्ट्यूएटर्स के परिणाम दिखा सकते हैं।
## अपना डिवाइस सेट करें
इससे पहले कि आप अपने IoT डिवाइस की प्रोग्रामिंग शुरू करें, आपको थोड़ी मात्रा में सेटअप करने की आवश्यकता होगी। आप किस डिवाइस का उपयोग कर रहे हैं, इसके आधार पर नीचे दिए गए प्रासंगिक निर्देशों का पालन करें.
> 💁यदि आपके पास अभी तक कोई उपकरण नहीं है, तो यह तय करने में सहायता के लिए [हार्डवेयर गाइड](../../../../hardware.md) देखें कि आप किस उपकरण का उपयोग करने जा रहे हैं, और आपको कौन सा अतिरिक्त हार्डवेयर खरीदने की आवश्यकता है . आपको हार्डवेयर खरीदने की आवश्यकता नहीं है, क्योंकि सभी प्रोजेक्ट वर्चुअल हार्डवेयर पर चलाए जा सकते हैं।
इन निर्देशों में आपके द्वारा उपयोग किए जा रहे हार्डवेयर या टूल के निर्माताओं से तृतीय-पक्ष वेबसाइटों के लिंक शामिल हैं। यह सुनिश्चित करने के लिए है कि आप हमेशा विभिन्न उपकरणों और हार्डवेयर के लिए नवीनतम निर्देशों का उपयोग कर रहे हैं।
अपने डिवाइस को सेट अप करने और 'हैलो वर्ल्ड' प्रोजेक्ट को पूरा करने के लिए प्रासंगिक गाइड के माध्यम से काम करें। इस आरंभिक भाग में 4 पाठों पर IoT नाइटलाइट बनाने में यह पहला कदम होगा।
* [Arduino - Wio Terminal](../wio-terminal.md)
* [सिंगल-बोर्ड कंप्यूटर - रास्पबेरी पाई](../pi.md)
* [सिंगल-बोर्ड कंप्यूटर - वर्चुअल डिवाइस](../virtual-device.md)
## IoT . के अनुप्रयोग
IoT कुछ व्यापक समूहों में उपयोग के मामलों की एक विशाल श्रृंखला को कवर करता है:
* उपभोक्ता IoT I
* वाणिज्यिक IoT
* औद्योगिक IoT
* इंफ्रास्ट्रक्चर IoT
✅ थोड़ा शोध करें: नीचे वर्णित प्रत्येक क्षेत्र के लिए, एक ठोस उदाहरण खोजें जो पाठ में नहीं दिया गया है।
### उपभोक्ता IoT
उपभोक्ता IoT IoT उपकरणों को संदर्भित करता है जिसे उपभोक्ता घर के आसपास खरीदेंगे और उपयोग करेंगे। इनमें से कुछ डिवाइस अविश्वसनीय रूप से उपयोगी हैं, जैसे स्मार्ट स्पीकर, स्मार्ट हीटिंग सिस्टम और रोबोटिक वैक्यूम क्लीनर। अन्य उनकी उपयोगिता में संदिग्ध हैं, जैसे आवाज नियंत्रित नल, जिसका मतलब है कि आप उन्हें बंद नहीं कर सकते क्योंकि आवाज नियंत्रण आपको बहते पानी की आवाज पर नहीं सुन सकता है।
उपभोक्ता IoT डिवाइस लोगों को अपने परिवेश में और अधिक हासिल करने के लिए सशक्त बना रहे हैं, विशेष रूप से 1 बिलियन जो विकलांग हैं। रोबोटिक वैक्यूम क्लीनर गतिशीलता के मुद्दों वाले लोगों को साफ फर्श प्रदान कर सकते हैं जो खुद को वैक्यूम नहीं कर सकते हैं, आवाज नियंत्रित ओवन सीमित दृष्टि या मोटर नियंत्रण वाले लोगों को अपने ओवन को केवल अपनी आवाज से गर्म करने की अनुमति देते हैं, स्वास्थ्य मॉनीटर रोगियों को पुरानी स्थितियों की निगरानी करने की अनुमति दे सकते हैं। और उनकी शर्तों पर अधिक विस्तृत अपडेट। ये उपकरण इतने सर्वव्यापी होते जा रहे हैं कि छोटे बच्चे भी इनका उपयोग अपने दैनिक जीवन के हिस्से के रूप में कर रहे हैं, उदाहरण के लिए COVID महामारी के दौरान वर्चुअल स्कूलिंग करने वाले छात्र स्मार्ट होम डिवाइस पर टाइमर सेट कर अपने स्कूलवर्क या अलार्म को ट्रैक करने के लिए उन्हें आगामी कक्षा की बैठकों की याद दिलाते हैं।
✅ आपके पास अपने व्यक्ति या आपके घर में कौन से उपभोक्ता IoT उपकरण हैं?
### वाणिज्यिक IoT
व्यावसायिक IoT कार्यस्थल में IoT के उपयोग को कवर करता है। एक कार्यालय की स्थापना में प्रकाश और हीटिंग का प्रबंधन करने के लिए अधिभोग सेंसर और गति डिटेक्टर हो सकते हैं, केवल रोशनी और गर्मी को बंद रखने के लिए, लागत और कार्बन उत्सर्जन को कम करने के लिए। एक कारखाने में, IoT उपकरण सुरक्षा खतरों की निगरानी कर सकते हैं जैसे कि श्रमिक कठोर टोपी नहीं पहने हुए हैं या शोर जो खतरनाक स्तर तक पहुंच गया है। खुदरा क्षेत्र में, IoT उपकरण कोल्ड स्टोरेज के तापमान को माप सकते हैं, दुकान के मालिक को सचेत कर सकते हैं कि क्या फ्रिज या फ्रीजर आवश्यक तापमान सीमा से बाहर है, या वे अलमारियों पर वस्तुओं की निगरानी कर सकते हैं ताकि कर्मचारियों को बेची गई उपज को फिर से भरने के लिए निर्देशित किया जा सके। परिवहन उद्योग वाहन के स्थानों की निगरानी करने, सड़क उपयोगकर्ता चार्जिंग के लिए ऑन-रोड माइलेज ट्रैक करने, ड्राइवर घंटे ट्रैक करने और ब्रेक अनुपालन, या कर्मचारियों को सूचित करने के लिए IoT पर अधिक से अधिक भरोसा कर रहा है, जब कोई वाहन लोडिंग या अनलोडिंग की तैयारी के लिए डिपो के पास आ रहा हो।
✅ आपके स्कूल या कार्यस्थल में आपके पास कौन से व्यावसायिक IoT उपकरण हैं?
### औद्योगिक IoT (IIoT)
औद्योगिक IoT, या IIoT, बड़े पैमाने पर मशीनरी को नियंत्रित और प्रबंधित करने के लिए IoT उपकरणों का उपयोग है। इसमें कारखानों से लेकर डिजिटल कृषि तक कई तरह के उपयोग के मामले शामिल हैं।
फैक्ट्रियां कई अलग-अलग तरीकों से IoT उपकरणों का उपयोग करती हैं। तापमान, कंपन और रोटेशन की गति जैसी चीजों को ट्रैक करने के लिए कई सेंसर के साथ मशीनरी की निगरानी की जा सकती है। इस डेटा की निगरानी की जा सकती है ताकि मशीन को कुछ सहनशीलता से बाहर जाने पर रोका जा सके - यह गर्म हो जाता है और उदाहरण के लिए बंद हो जाता है। भविष्य कहनेवाला रखरखाव करने के लिए इस डेटा को समय के साथ इकट्ठा और विश्लेषण भी किया जा सकता है, जहां एआई मॉडल विफलता के लिए अग्रणी डेटा को देखेगा, और ऐसा होने से पहले अन्य विफलताओं की भविष्यवाणी करने के लिए इसका उपयोग करेगा।
डिजिटल कृषि महत्वपूर्ण है अगर ग्रह को बढ़ती आबादी को खिलाना है, खासकर 500 मिलियन घरों में 2 अरब लोगों के लिए जो [निर्वाह खेती](https://wikipedia.org/wiki/Subsistence_agriculture) पर जीवित हैं। डिजिटल कृषि कुछ एकल अंकों के डॉलर सेंसर से लेकर बड़े पैमाने पर वाणिज्यिक सेटअप तक हो सकती है। एक किसान तापमान की निगरानी और [ग्रोइंग डिग्री डेज](https://wikipedia.org/wiki/Growing_degree-day) का उपयोग करके भविष्यवाणी कर सकता है कि फसल कब कटाई के लिए तैयार होगी। वे अपने पौधों को उतना ही पानी देने के लिए मिट्टी की नमी की निगरानी को स्वचालित जल प्रणाली से जोड़ सकते हैं, लेकिन यह सुनिश्चित करने के लिए और नहीं कि उनकी फसलें पानी बर्बाद किए बिना सूख न जाएं। किसान इसे और आगे ले जा रहे हैं और कृषि भूमि के विशाल क्षेत्रों में फसल वृद्धि, बीमारी और मिट्टी की गुणवत्ता की निगरानी के लिए ड्रोन, उपग्रह डेटा और एआई का उपयोग कर रहे हैं।<br>
✅ अन्य कौन से IoT उपकरण किसानों की मदद कर सकते हैं?
### इंफ्रास्ट्रक्चर IoT
इन्फ्रास्ट्रक्चर IoT स्थानीय और वैश्विक बुनियादी ढांचे की निगरानी और नियंत्रण कर रहा है जिसका लोग हर दिन उपयोग करते हैं।
[स्मार्ट सिटीज](https://wikipedia.org/wiki/Smart_city) शहरी क्षेत्र हैं जो शहर के बारे में डेटा एकत्र करने के लिए IoT उपकरणों का उपयोग करते हैं और इसका उपयोग शहर के चलने के तरीके को बेहतर बनाने के लिए करते हैं। ये शहर आमतौर पर स्थानीय सरकारों, शिक्षाविदों और स्थानीय व्यवसायों के बीच सहयोग से चलाए जाते हैं, परिवहन से लेकर पार्किंग और प्रदूषण तक की चीजों को ट्रैक और प्रबंधित करते हैं। उदाहरण के लिए, डेनमार्क के कोपेनहेगन में, वायु प्रदूषण स्थानीय निवासियों के लिए महत्वपूर्ण है, इसलिए इसे मापा जाता है और डेटा का उपयोग सबसे स्वच्छ साइकिलिंग और जॉगिंग मार्गों पर जानकारी प्रदान करने के लिए किया जाता है।
[स्मार्ट पावर ग्रिड](https://wikipedia.org/wiki/Smart_grid) अलग-अलग घरों के स्तर पर उपयोग डेटा एकत्र करके बिजली की मांग के बेहतर विश्लेषण की अनुमति देता है। यह डेटा देश के स्तर पर निर्णयों का मार्गदर्शन कर सकता है, जिसमें नए पावर स्टेशन बनाने के लिए, और व्यक्तिगत स्तर पर उपयोगकर्ताओं को यह जानकारी दी जाती है कि वे कितनी शक्ति का उपयोग कर रहे हैं, जब वे इसका उपयोग कर रहे हैं, और यहां तक ​​​​कि लागत कम करने के बारे में सुझाव भी दे सकते हैं, जैसे रात में इलेक्ट्रिक कारों को चार्ज करने के रूप में।
✅ यदि आप अपने निवास स्थान को मापने के लिए IoT उपकरणों को जोड़ सकते हैं, तो वह क्या होगा?
## IoT उपकरणों के उदाहरण जो आपके आस-पास हो सकते हैं
आपके आस-पास कितने IoT डिवाइस हैं, यह देखकर आप चकित रह जाएंगे। मैं इसे घर से लिख रहा हूं और मेरे पास इंटरनेट से जुड़े निम्नलिखित डिवाइस हैं जिनमें स्मार्ट फीचर्स जैसे ऐप कंट्रोल, वॉयस कंट्रोल, या मेरे फोन के माध्यम से मुझे डेटा भेजने की क्षमता है:
* एकाधिक स्मार्ट स्पीकर
*फ्रिज, डिशवॉशर, ओवन और माइक्रोवेव
*सौर पैनलों के लिए बिजली की निगरानी
*स्मार्ट प्लग
* वीडियो डोरबेल और सुरक्षा कैमरे
* कई स्मार्ट रूम सेंसर के साथ स्मार्ट थर्मोस्टेट
* गैरेज का दरवाजा खोलने वाला
* होम एंटरटेनमेंट सिस्टम और वॉयस नियंत्रित टीवी
*लाइट्स
* फिटनेस और स्वास्थ्य ट्रैकर
इन सभी प्रकार के उपकरणों में सेंसर और/या एक्चुएटर होते हैं और इंटरनेट से बात करते हैं। मैं अपने फोन से बता सकता हूं कि क्या मेरा गैरेज का दरवाजा खुला है, और अपने स्मार्ट स्पीकर से इसे मेरे लिए बंद करने के लिए कह सकता हूं। मैं इसे टाइमर पर भी सेट कर सकता हूं ताकि अगर यह अभी भी रात में खुला है, तो यह अपने आप बंद हो जाएगा। जब मेरे दरवाजे की घंटी बजती है, तो मैं अपने फोन से देख सकता हूं कि मैं दुनिया में कहीं भी हूं, और दरवाजे की घंटी में बने स्पीकर और माइक्रोफ़ोन के माध्यम से उनसे बात कर सकता हूं। मैं अपने स्वास्थ्य में सुधार के लिए डेटा में पैटर्न की तलाश में, अपने रक्त ग्लूकोज, हृदय गति और नींद के पैटर्न की निगरानी कर सकता हूं। और मैं बादल के माध्यम से अपनी रोशनी को नियंत्रित कर सकता हूं, और जब मेरा इंटरनेट कनेक्शन बंद हो जाता है तो मैं अंधेरे में बैठ सकता हूं।
---
## 🚀 चुनौती
अपने घर, स्कूल या कार्यस्थल में जितने हो सके उतने IoT उपकरणों की सूची बनाएं - आपके विचार से कहीं अधिक हो सकते हैं!
## व्याख्यान के बाद प्रश्नोत्तरी
[व्याख्यान के बाद प्रश्नोत्तरी](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2)
## समीक्षा और आत्म अध्ययन
उपभोक्ता IoT परियोजनाओं के लाभों और विफलताओं के बारे में पढ़ें। लेखों के लिए समाचार साइटों की जाँच करें कि यह कब गलत हो गया, जैसे गोपनीयता समस्याएँ, हार्डवेयर समस्याएँ या कनेक्टिविटी की कमी के कारण होने वाली समस्याएँ।
कुछ उदाहरण:
* उपभोक्ता IoT के साथ विफलताओं के कुछ अच्छे उदाहरणों के लिए ट्विटर अकाउंट **[इंटरनेट ऑफ Sh*t](https://twitter.com/internetofshit)** *(अपमानजनक चेतावनी)* देखें।
* [c|net - My Apple Watch ने मेरी जान बचाई: 5 लोगों ने अपनी कहानियां साझा की](https://www.cnet.com/news/apple-watch-lifeving-health-features-read-5-peoples-stories/ )
* [सी|नेट - एडीटी तकनीशियन वर्षों से ग्राहक कैमरा फीड पर जासूसी करने के लिए दोषी मानते हैं](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/)*
## असाइनमेंट
[एक IoT प्रोजेक्ट की जाँच करें](assignment.hi.md)

@ -1,97 +0,0 @@
# Pengenalan IoT
![Ikhtisar catatan sketsa dari pelajaran ini](../../../../sketchnotes/lesson-1.jpg)
> Sketsa dibuat oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar.
## Kuis prakuliah
[Kuis prakuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## Pengantar
Pelajaran ini mencakup beberapa topik pengantar mengenai Internet of Things, dan membuat Anda dapat mempersiapkan dan mengatur perangkat keras Anda.
Dalam pelajaran ini kita akan membahas:
* [Apa itu 'Internet of Things'?](#apa-itu-internet-of-things)
* [Perangkat IoT](#perangkat-iot)
* [Mengatur Perangkat Anda](#set-up-your-device)
* [Penerapan dari IoT](#applications-of-iot)
* [Contoh Perangkat IoT yang Mungkin Anda Punya di Sekitar](#examples-of-iot-devices-you-may-have-around-you)
## Apa itu 'Internet of Things'?
Istilah 'Internet of Things' diciptakan oleh [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) pada tahun 1999, yang merujuk pada menghubungkan Internet ke dunia fisik melalui sensor. Sejak saat itu, istilah IoT digunakan untuk menggambarkan perangkat apa pun yang berinteraksi dengan dunia fisik di sekitarnya, baik dengan mengumpulkan data dari sensor, atau menyediakan interaksi dunia nyata melalui aktuator (perangkat yang melakukan sesuatu seperti menyalakan sakelar atau menyalakan LED), dan terhubung ke perangkat lain atau Internet.
> **Sensor** mengumpulkan informasi dari lingkungan, seperti mengukur kecepatan, suhu, atau lokasi.
>
> **Aktuator** mengubah sinyal listrik menjadi interaksi pada lingkungan seperti memicu sakelar, menyalakan lampu, membuat suara, atau mengirim *control signal* ke perangkat keras lain, misalnya untuk menyalakan soket listrik.
IoT sebagai suatu bidang teknologi lebih dari sekadar perangkat. Hal ini mencakup layanan berbasis cloud yang dapat memproses data sensor, atau mengirim permintaan ke aktuator yang terhubung ke perangkat IoT. IoT juga mencakup perangkat yang tidak memiliki atau tidak memerlukan konektivitas Internet, sering disebut sebagai *edge devices* atau perangkat tepi. Perangkat tepi adalah perangkat yang dapat memproses dan merespons data sensor itu sendiri, biasanya menggunakan model AI yang dilatih di cloud.
IoT merupakan bidang teknologi yang berkembang pesat. Diperkirakan pada akhir tahun 2020, 30 miliar perangkat IoT dikerahkan dan terhubung ke Internet. Jika melihat ke masa depan, diperkirakan pada tahun 2025, perangkat IoT akan mengumpulkan hampir 80 zettabytes data atau 80 triliun gigabyte. Banyak sekali bukan?
![Grafik yang menunjukkan perangkat IoT aktif dari waktu ke waktu, dengan tren meningkat dari di bawah 5 miliar pada tahun 2015 menjadi lebih dari 30 miliar pada tahun 2025](../../../../images/connected-iot-devices.svg)
✅ Lakukan sedikit riset: Berapa banyak data yang dihasilkan oleh perangkat IoT yang benar-benar digunakan, dan berapa banyak yang terbuang? Mengapa begitu banyak data yang diabaikan?
Data ini adalah kunci kesuksesan IoT. Untuk menjadi pengembang IoT yang sukses, Anda perlu memahami data yang perlu Anda kumpulkan, cara mengumpulkannya, cara membuat keputusan berdasarkan data tersebut, dan cara menggunakan keputusan tersebut untuk berinteraksi dengan lingkungan fisik jika diperlukan.
## Perangkat IoT
Huruf **T** di IoT adalah singkatan dari **Things** - perangkat yang berinteraksi dengan lingkungan fisik di sekitarnya baik dengan mengumpulkan data dari sensor atau menyediakan interaksi dunia nyata melalui aktuator.
Perangkat untuk produksi atau penggunaan komersial, seperti pelacak kebugaran konsumen, atau pengontrol mesin industri, biasanya dibuat khusus. Mereka menggunakan papan sirkuit khusus, bahkan mungkin prosesor khusus, yang dirancang untuk memenuhi kebutuhan tugas tertentu, apakah itu cukup kecil untuk muat di pergelangan tangan, atau cukup kuat untuk bekerja di lingkungan pabrik dengan suhu tinggi, stres tinggi, atau getaran tinggi.
Sebagai pengembang yang belajar tentang IoT atau membuat prototipe perangkat, Anda harus mulai dengan *developer kit* atau perangkat pengembang. Perangkat tersebut adalah perangkat IoT untuk tujuan umum yang dirancang untuk digunakan pengembang, seringkali dengan fitur yang tidak akan Anda miliki di perangkat produksi, seperti satu set pin eksternal untuk menghubungkan sensor atau aktuator, perangkat keras untuk mendukung debugging, atau sumber daya tambahan yang akan menambah biaya yang tidak perlu saat melakukan produksi manufaktur.
Perangkat pengembang ini biasanya terbagi dalam dua kategori - mikrokontroler dan komputer papan tunggal. Perangkat tersebut akan diperkenalkan di sini, dan kita akan membahas lebih detail di pelajaran berikutnya.
> 💁 Ponsel Anda juga dapat dianggap sebagai perangkat IoT tujuan umum, dengan sensor dan aktuator bawaan, dengan berbagai aplikasi yang menggunakan sensor dan aktuator dengan cara yang berbeda dengan layanan cloud yang berbeda. Anda bahkan dapat menemukan beberapa tutorial IoT yang menggunakan aplikasi ponsel sebagai perangkat IoT.
### Mikrokontroler
Mikrokontroler atau Pengendali mikro (juga disebut sebagai MCU, kependekan dari microcontroller unit) adalah komputer kecil yang terdiri dari:
🧠 Satu atau lebih unit pemrosesan pusat (CPU) - 'otak' mikrokontroler yang menjalankan program Anda
💾 Memori (RAM dan memori program) - tempat program, data, dan variabel Anda disimpan
🔌 Koneksi input/output (I/O) yang dapat diprogram - untuk berbicara dengan periferal eksternal (perangkat yang terhubung) seperti sensor dan aktuator
Mikrokontroler biasanya merupakan perangkat komputasi berbiaya rendah, dengan harga rata-rata untuk yang digunakan dalam perangkat keras khusus turun menjadi sekitar US$0,50, dan beberapa perangkat bahkan semurah US$0,03. Perangkat pengembang dapat ditemukan mulai dari harga US$4, dengan biaya meningkat karena Anda menambahkan lebih banyak fitur. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), perangkat pengembang mikrokontroler dari [Seeed studios](https://www.seeedstudio.com) yang memiliki sensor , aktuator, WiFi, dan layar berharga sekitar US$30.
![sebuah terminal wio](../../../../images/wio-terminal.png)
> 💁 Saat mencari mikrokontroler di Internet, berhati-hatilah saat mencari istilah **MCU** karena ini akan mengembalikan banyak hasil untuk Marvel Cinematic Universe, bukan mikrokontroler.
Mikrokontroler dirancang untuk diprogram untuk melakukan sejumlah tugas yang sangat spesifik, daripada menjadi komputer dengan tujuan umum seperti PC atau Mac. Kecuali untuk skenario yang sangat spesifik, Anda tidak dapat menghubungkan monitor, keyboard, dan mouse dan menggunakannya untuk tugas umum.
Perangkat pengembang mikrokontroler biasanya dilengkapi dengan sensor dan aktuator tambahan. Sebagian besar papan (board) akan memiliki satu atau lebih LED yang dapat Anda program, bersama dengan perangkat lain seperti steker standar untuk menambahkan lebih banyak sensor atau aktuator menggunakan berbagai ekosistem pabrikan atau sensor bawaan (biasanya yang paling populer seperti sensor suhu). Beberapa mikrokontroler memiliki konektivitas nirkabel bawaan seperti Bluetooth atau WiFi atau memiliki mikrokontroler tambahan di papan untuk menambahkan konektivitas ini.
> 💁 Mikrokontroler biasanya diprogram dalam bahasa C/C++.
### Komputer papan tunggal
Komputer papan tunggal adalah perangkat komputasi kecil yang memiliki semua elemen komputer lengkap yang terdapat pada satu papan kecil. Ini adalah perangkat yang memiliki spesifikasi yang mirip dengan desktop atau laptop PC atau Mac, menjalankan sistem operasi lengkap, tetapi berukuran kecil, menggunakan lebih sedikit daya, dan jauh lebih murah.
![Raspberry Pi 4](../../../images/raspberry-pi-4.jpg)
Raspberry Pi adalah salah satu komputer papan tunggal yang paling populer.
Seperti mikrokontroler, komputer papan tunggal memiliki CPU, memori dan pin input/output, tetapi mereka memiliki fitur tambahan seperti chip grafis untuk memungkinkan Anda menghubungkan monitor, output audio, dan port USB untuk menghubungkan mouse keyboard dan USB standar lainnya. perangkat seperti webcam atau penyimpanan eksternal. Program disimpan di kartu SD atau hard drive bersama dengan sistem operasi, bukan chip memori yang terpasang di papan.
> 🎓 Anda dapat menganggap komputer papan tunggal sebagai versi PC atau Mac yang lebih kecil dan lebih murah, dengan tambahan pin GPIO (general-purpose input/output) untuk berinteraksi dengan sensor dan aktuator.
Komputer papan tunggal adalah komputer berfitur lengkap, sehingga dapat diprogram dalam bahasa apa pun. Perangkat IoT biasanya diprogram dengan Python.
### Pilihan perangkat keras untuk sisa pelajaran
Semua pelajaran selanjutnya mencakup tugas menggunakan perangkat IoT untuk berinteraksi dengan dunia fisik dan berkomunikasi dengan cloud. Setiap pelajaran mendukung 3 pilihan perangkat - Arduino (menggunakan Terminal Seeed Studios Wio), atau komputer papan tunggal, baik perangkat fisik (Raspberry Pi 4) atau komputer papan tunggal virtual yang berjalan di PC atau Mac Anda.
Anda dapat membaca tentang perangkat keras yang diperlukan untuk menyelesaikan semua tugas di [panduan perangkat keras](../../../hardware.md).
> 💁 Anda tidak perlu membeli perangkat keras IoT apa pun untuk menyelesaikan tugas, Anda dapat melakukan semuanya menggunakan komputer papan tunggal virtual.
Perangkat keras mana yang Anda pilih terserah Anda - itu tergantung pada apa yang Anda miliki di rumah di sekolah Anda, dan bahasa pemrograman apa yang Anda ketahui atau rencanakan untuk dipelajari. Kedua varian perangkat keras akan menggunakan ekosistem sensor yang sama, jadi jika Anda memulai pada salah satu perangkat, Anda dapat dengan mudah melakukannya pada perangkat lain tanpa harus mengganti sebagian besar perangkat pengembang. Komputer papan tunggal virtual akan setara dengan pembelajaran di Raspberry Pi, dengan sebagian besar kode dapat ditransfer ke Pi jika Anda akhirnya mendapatkan perangkat dan sensor.

@ -1,230 +0,0 @@
# IoT에 대한 소개
![이 강의의 개요](../../../../sketchnotes/lesson-1.jpg)
> [Nitya Narasimhan](https://github.com/nitya) 의 스케치노트. 더 큰 이미지를 보고싶으면 클릭하세요.
이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)의 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 일부로 진행되었습니다. 수업은 2개의 비디오로 진행되었는데, 1시간짜리 수업과 강의에 대한 집중탐구 및 질의 응답 1시간으로 구성되어있습니다.
[![Lesson 1: Introduction to IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw)
[![Lesson 1: Introduction to IoT - Office hours](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI)
> 🎥 비디오를 시청하고 싶으면 이미지를 클릭하세요
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## 개요
이 강의에서는 사물 인터넷과 관련된 몇 가지 소개용 항목에 대해 설명하고 하드웨어를 설정하는 방법에 대해 설명합니다.
이 단원에서는 다음을 다룹니다:
* ['사물 인터넷'이란?](#what-is-the-internet-of-things)
* [IoT 장치](#iot-devices)
* [디바이스 설정](#set-up-your-device)
* [IoT의 응용 프로그램](#applications-of-iot)
* [내 주변에서 IoT의 예시](#examples-of-iot-devices-you-may-have-around-you)
## '사물 인터넷'이란 무엇인가?
'사물 인터넷'이라는 용어는 1999년, [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton)이 센서를 통해 인터넷을 물리적 세계에 연결하는 것을 지칭하기 위해 만들었다. 그 이후로 이 용어는 센서로부터 데이터를 수집하거나 액츄에이터(스위치를 켜거나 LED를 켜거나 켜는 것과 같은 일을 하는 장치)를 통해 실제 상호작용을 제공함으로써 주변 물리 세계와 상호 작용하는 모든 장치를 기술하기 위해 사용되어 왔으며 일반적으로 다른 장치나 인터넷에 연결되어 있다.
> **센서** 는 속도, 온도 또는 위치 와 같은 정보를 세상에서 수집합니다.
>
> **액츄에이터** 는 전기 신호를 스위치 트리거, 조명 켜기, 소리 내기 또는 전원 소켓 켜기와 같은 실제 상호 작용으로 변환합니다.
IoT는 단순한 기기가 아니라 센서 데이터를 처리하거나 IoT 기기에 연결된 액츄에이터에 요청을 보낼 수 있는 클라우드 기반 서비스를 포함합니다. 또한 edge장치라고 종종 언급되는, 인터넷 연결이 없거나 필요하지 않은 장치도 포함됩니다. 이들은 센서 데이터를 자체적으로 처리하고 대응할 수 있는 장치들로, 대개 클라우드에서 훈련된 AI 모델을 사용합니다.
IoT는 빠르게 성장하는 기술 분야입니다. 2020년 말까지, IoT 기기가 300억대 보급돼 인터넷에 연결된 것으로 추산됩니다. 미래를 내다보면 2025년에는, IoT 기기가 거의 80제타바이트 또는 80조 기가바이트의 데이터를 수집할 것으로 예상됩니다. 정말 많은 데이터양이죠!
![2015년에 50억 미만에서 2025년에 300억 이상으로 증가하는 추세로 시간에 따른 활성 IoT 기기를 보여주는 그래프](../../../../images/connected-iot-devices.svg)
✅ 약간의 조사를 해보세요: IoT 기기에서 생성된 데이터의 얼마가 실제로 사용되고 있고, 얼마나 많은 데이터가 낭비되고 있나요? 왜 이렇게 많은 데이터가 무시되는 것일까요?
IoT 성공의 비결은 바로 이 데이터입니다. 성공적인 IoT 개발자가 되려면 수집해야 할 데이터, 수집 방법, 이를 어떻게 결정을 할지 및 필요한 경우 이러한 결정들을 물리 세계와 연동하기 위해 어떻게 이용해야하는지 이해해야 합니다.
## IoT 장치
IoT에서 **T****Things** 을 의미합니다. - 센서로부터 데이터를 수집하거나 액추에이터를 통해 실세계의 상호작용을 제공하며 주변 물리적 세계와 상호 작용하는 장치입니다.
소비자 피트니스 추적기 또는 산업용 기계 제어기와 같은 생산 또는 상업적 사용을 위한 장치는 일반적으로 맞춤 제작됩니다. 이들은 맞춤형 회로 기판, 심지어 맞춤형 프로세서를 사용하기도 하는데, 이 기판은 손목에 찰 정도로 작거나 고온, 고강도 또는 고진동 공장 환경에서 작동하기에 충분히 견고하거나, 손목에 잘 맞도록 설계되어 있습니다.
개발자는 IoT에 대해 배우거나 기기 프로토타입을 만들 때 개발자 키트로 시작해야 합니다. 그것은 개발자가 사용할 수 있도록 설계된 범용 IoT 장치이며, 센서나 액추에이터를 연결할 수 있는 외부 핀 세트, 디버깅을 지원하는 하드웨어 또는 대규모 제조 실행 시 불필요한 비용을 추가하는 추가 리소스와 같은 운영 장치에는 없는 기능을 갖추고 있습니다.
이러한 개발자 키트는 일반적으로 마이크로컨트롤러와 싱글보드 컴퓨터의 두 가지 범주로 나뉩니다. 이것들은 여기서 소개될 것이고, 다음 수업에서 더 자세히 다루도록 하겠습니다.
> 💁 당신의 핸드폰 또한 센서와 액추에이터가 내장된 범용 IoT 기기로도 볼 수 있으며, 앱마다 센서와 액추에이터를 사용하는 방식이 다르고 클라우드 서비스도 다릅니다. 당신은 또한 휴대폰 앱을 IoT 기기로 사용하는 IoT 튜토리얼도 찾아볼 수 있습니다.
### 마이크로컨트롤러
마이크로컨트롤러(줄여서 MCU라고도 함)는 다음과 같이 구성된 소형 컴퓨터입니다.:
🧠 하나 이상의 CPU(중앙 처리 장치) - 당시의 프로그램을 실행하는 마이크로컨트롤러의 '두뇌'
💾 메모리(RAM 및 프로그램 메모리) - 당신의 프로그램, 데이터 및 변수가 저장되는 위치
🔌 프로그래밍 가능한 입출력(I/O) 연결 - 센서 및 액추에이터와 같은 외부 주변 장치(연결 장치)와 통신
마이크로컨트롤러는 일반적으로 저렴한 컴퓨팅 장치이며, 사용자 지정 하드웨어에 사용되는 장치의 평균 가격은 약 0.50달러까지 떨어지며, 어떤 장치는 0.03달러만큼 저렴합니다. 개발자 키트는 미화 4달러부터 시작할 수 있으며, 기능을 추가할수록 비용도 증가합니다. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 센서, 액츄에이터, WiFi, 스크린을 갖춘 [Seeed studios](https://www.seeedstudio.com) 의 마이크로컨트롤러 개발자 키트로 미화 약 30달러의 가격으로 형성되어 있습니다.
![A Wio Terminal](../../../../images/wio-terminal.png)
> 💁 인터넷에서 마이크로컨트롤러를 검색할 때 **MCU**라는 용어를 검색하면 마이크로컨트롤러가 아닌 Marvel Cinematic Universe에 대한 많은 결과를 얻을 수 있으므로 주의해야 합니다.
마이크로컨트롤러는 PC나 맥과 같은 범용 컴퓨터가 아니라 제한된 수의 매우 특정한 작업을 수행하도록 프로그래밍되어 있습니다. 매우 구체적인 시나리오를 제외하고는 모니터, 키보드 및 마우스를 연결하여 범용 작업에 사용할 수 없습니다.
마이크로컨트롤러 개발자 키트는 보통 추가적인 센서와 작동기가 탑재되어 있습니다. 대부분의 보드에는 프로그래밍할 수 있는 하나 이상의 LED와 다양한 제조업체의 에코시스템을 사용하여 더 많은 센서 또는 액추에이터를 추가하는 표준 플러그와 같은 다른 장치 또는 내장 센서(일반적으로 온도 센서 등 가장 인기 있는 센서)가 있습니다. 일부 마이크로컨트롤러는 Bluetooth 또는 WiFi와 같은 무선 연결이 내장되어 있거나 이 연결을 추가하기 위해 보드에 추가 마이크로컨트롤러가 있습니다.
> 💁 마이크로컨트롤러는 보통 C/C++로 프로그래밍 됩니다.
### 싱글보드 컴퓨터
단일 보드 컴퓨터(single-board computer)는 하나의 작은 보드에 포함된 완전한 컴퓨터의 모든 요소를 포함하는 소형 컴퓨팅 장치입니다. 데스크탑 또는 노트북 PC 또는 Mac에 가까운 사양을 갖추고 있으며 전체 운영 체제를 실행하지만 크기가 작고 전력 사용량이 적으며 가격이 상당히 저렴한 장치입니다.
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
라즈베리 파이는 가장 인기 있는 싱글보드 컴퓨터 중 하나입니다.
마이크로컨트롤러와 마찬가지로 싱글보드 컴퓨터에는 CPU, 메모리, 입출력 핀이 있지만 모니터, 오디오 출력, USB 포트를 연결하여 키보드 마우스와 웹캠이나 외장 스토리지와 같은 표준 USB 장치를 연결할 수 있는 그래픽 칩과 같은 추가 기능이 있습니다. 프로그램은 메모리 칩 대신 운영 체제와 함께 SD 카드나 하드 드라이브에 저장됩니다.
> 🎓 싱글보드 컴퓨터는 센서 및 액추에이터와 상호 작용할 GPIO(일반용 입력/출력) 핀을 추가하여 읽고 있는 PC 또는 Mac의 더 작고 저렴한 버전이라고 생각할 수 있습니다.
싱글보드 컴퓨터는 모든 기능을 갖춘 컴퓨터이므로 모든 언어로 프로그래밍할 수 있습니다. IoT 장치는 일반적으로 파이썬으로 프로그래밍됩니다.
### 남은 수업 동안의 하드웨어 선택
이후의 모든 과정에는 IoT 디바이스를 사용하여 물리적 세계와 상호 작용하고 클라우드와 통신하는 과제가 포함됩니다. 각 레슨은 Arduino(Seeed Studios Wio Terminal 사용) 또는 단일 보드 컴퓨터, 물리적 장치(Lasberry Pi 4), PC 또는 Mac에서 실행되는 가상 단일 보드 컴퓨터 등 3가지 장치를 지원합니다.
모든 과제를 완료하는 데 필요한 하드웨어에 대한 자세한 내용은 [하드웨어 가이드](../../../hardware.md)에서 확인할 수 있습니다.
> 💁 과제를 완료하기 위해 IoT 하드웨어를 구입할 필요가 없으며 가상 싱글보드 컴퓨터로 모든 작업을 수행할 수 있습니다.
어떤 하드웨어를 선택할지는 여러분의 학교와 가정에서 사용할 수 있는 것과 여러분이 알고 있거나 배울 계획인 프로그래밍 언어에 달려 있습니다. 두 하드웨어 변형 모두 동일한 센서 생태계를 사용하기 때문에 한 경로에서 시작하면 대부분의 키트를 교체할 필요 없이 다른 경로로 변경할 수 있습니다. 가상 싱글보드 컴퓨터는 라즈베리 파이에서 학습하는 것과 같으며, 결국 장치와 센서를 얻게 되면 대부분의 코드를 파이로 전송할 수 있습니다.
### 아두이노 개발자 키트
마이크로컨트롤러 개발에 관심이 있다면 아두이노 기기를 이용해 과제를 완료할 수 있습니다. 이 수업은 아두이노 프레임워크, 사용 중인 센서와 액추에이터, 클라우드와 상호 작용하는 라이브러리와 관련된 코드만 가르치기 때문에 C/C++ 프로그래밍에 대한 기본적인 이해가 필요합니다.
과제는 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) 와 [PlatformIO extension for microcontroller development](https://platformio.org)를 이용할 것입니다. 또한 이 도구에 익숙한 경우, 지침이 제공되지 않는 Arduino IDE를 사용할 수도 있습니다.
### Single-board 컴퓨터 개발자 키트
싱글보드 컴퓨터를 사용하여 IoT 개발을 배우는 데 관심이 있다면 PC 또는 Mac에서 실행 중인 가상 장치인 라즈베리 파이를 사용하여 과제를 완료할 수 있습니다.
사용 중인 센서와 액추에이터, 클라우드와 상호 작용하는 라이브러리와 관련된 코드만 학습하므로 파이썬 프로그래밍에 대한 기본적인 이해가 필요합니다.
> 💁 만약 당신이 Python으로 코드를 알기 원한다면 : 다음의 두개의 비디오 시리즈를 확인해보세요 :
>
> * [입문자를 위한 파이썬](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [입문자를 위한 더 많은 파이썬](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
과제에서는 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn)을 이용할 것입니다..
Rasberry Pi를 사용하는 경우 Rasberry Pi OS의 전체 데스크톱 버전을 사용하여 Pi를 실행하고 [Rasberry Pi OS 버전의 VS Code](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn)를 사용하여 Pi에서 직접 모든 코딩을 수행하거나 [원격 SSH 확장](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn)을 사용하여 PC 또는 Mac의 헤드리스 장치 및 코드로 Pi를 실행할 수 있습니다. 직접 코드를 코딩하는 것처럼 코드를 편집, 디버그 및 실행합니다.
가상 디바이스 옵션을 사용하는 경우 컴퓨터에서 직접 코딩합니다. 센서와 액추에이터에 액세스하는 대신 도구를 사용하여 정의할 수 있는 센서 값을 제공하고 액추에이터의 결과를 화면에 표시합니다.
## 장치 설정
IoT 장치 프로그래밍을 시작하려면 먼저 소량의 설정을 수행해야 합니다. 사용할 기기에 따라 아래의 관련 지침을 따라보세요.
> 💁 아직 장치가 없는 경우 [하드웨어 가이드](../../../../hardware.md)를 참조하여 사용할 장치와 구입해야 할 추가 하드웨어를 결정해보세요. 모든 프로젝트를 가상 하드웨어에서 실행할 수 있으므로 하드웨어를 구입할 필요는 없습니다.
이러한 지침에는 사용할 하드웨어 또는 도구를 만든 사람이 제공하는 타사 웹 사이트에 대한 링크가 포함됩니다. 이렇게 하면 다양한 도구 및 하드웨어에 대한 최신 지침을 항상 사용할 수 있습니다.
관련 안내에 따라 장치를 설정하고 'Hello World' 프로젝트를 완료해보세요. 이것은 이 시작 부분의 4가지 레슨에 대한 IoT 야간조명을 만드는 첫 번째 단계가 될 것입니다.
* [Arduino - Wio Terminal](wio-terminal.md)
* [Single-board computer - Raspberry Pi](pi.md)
* [Single-board computer - Virtual device](virtual-device.md)
✅ 당신은 아두이노와 싱글보드 컴퓨터 모두에 VS code를 사용하게 될 것입니다. 사용해본적이 없다면 [VS Code site](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)를 자세히 읽어보세요.
## IoT의 응용
IoT는 몇 가지 광범위한 그룹에 걸쳐 광범위한 사용 사례를 다루고 있습니다 :
* 소비자 IoT
* 상용 IoT
* 산업 IoT
* 사회 기반 시설 IoT
✅ 약간의 조사를 해보세요: 아래에 설명된 각 영역에 대해, 본문에 나와 있지 않은 구체적인 예를 하나 찾아보세요.
### 소비자 IoT
컨슈머 IoT는 소비자가 가정 주변에서 구매해 사용할 IoT 기기를 말합니다. 스마트 스피커, 스마트 난방 시스템, 로봇 청소기와 같은 이 장치들 중 일부는 엄청나게 유용합니다. 음성 제어 수도꼭지와 같이 유용성이 의심되는 경우도 있는데, 이는 음성 제어가 흐르는 물 소리 때문에 당신의 목소리를 들을 수 없기 때문에 끌 수 없음을 의미합니다.
소비자 IoT 기기들은 특히 장애를 가진 10억 명의 사람들에게 그들의 환경에서 더 많은 것을 성취할 수 있는 힘을 주고 있습니다. 로봇청소기는 스스로 진공청소기를 사용할 수 없는 거동이 불편한 사람들에게 깨끗한 바닥을 제공할 수 있고, 음성제어 오븐은 시력이 제한적이거나 운동기능이 있는 사람들이 목소리만으로 오븐을 데울 수 있게 하며, 건강 모니터는 환자들이 만성 상태를 그들의 상태에 대한 업데이트로 보다 규칙적이고 더 자세하게 스스로 모니터링할 수 있게 합니다. 예를 들어 COVID 대유행 기간 동안 가상 교육을 하는 학생들이 스마트 홈 장치에 타이머를 설정하여 학교 공부를 추적하거나 다가오는 학급 회의를 상기시키는 등 이러한 장치는 매우 보편화되고 있습니다.
✅ 개인 또는 가정에 어떤 소비자 IoT 기기를 가지고 있나요?
### 상용 IoT
상용 IoT는 직장에서 IoT를 사용하는 것을 포함합니다. 사무실 환경에서는 조명과 난방을 관리하기 위한 거주 감지기와 동작 감지기가 있어 필요하지 않을 때만 조명을 유지하고 열을 차단하여 비용과 탄소 배출량을 줄일 수 있습니다. 공장에서 사물인터넷(IoT) 기기는 작업자가 안전모를 쓰지 않거나 위험 수위에 도달한 소음 등 안전상의 위험을 감시할 수 있습니다. 소매업체에서는 사물인터넷(IoT) 기기가 냉장·냉동고가 필요 온도 범위를 벗어나면 점주에게 알려 냉장·냉동고 보관 온도를 측정하거나, 선반에 있는 품목을 모니터링해 직원들에게 판매된 농산물을 리필하도록 지시할 수 있습니다. 운송업계는 차량 위치 모니터링, 도로 사용자 충전을 위한 온로드 마일리지 추적, 운전자 시간 및 고장 준수 여부 추적, 적재 또는 하역 준비를 위해 차량 입고지 접근 시 직원에게 알리는 등의 IoT 의존도가 높아지고 있습니다.
✅ 당신의 학교나 직장에 어떤 상용 IoT 기기를 가지고 있나요?
### 산업 IoT (IIoT)
산업용 IoT 또는 IIoT는 대규모로 기계를 제어하고 관리하기 위해 IoT 장치를 사용하는 것입니다. 여기에는 공장에서 디지털 농업에 이르기까지 광범위한 사용 사례가 포함됩니다.
공장들은 IoT 기기를 다양한 방식으로 사용합니다. 기계는 온도, 진동, 회전 속도와 같은 것들을 추적하기 위해 여러 센서로 모니터링될 수 있습니다. 그런 다음 이 데이터를 모니터링하여 특정 공차를 벗어날 경우 기계가 중지되도록 할 수 있습니다. 예를 들어, 너무 뜨거울 경우 기계가 종료됩니다. 이 데이터는 시간이 지남에 따라 수집 및 분석하여 예측 정비를 수행할 수 있으며, 여기서 AI 모델은 장애로 이어지는 데이터를 살펴보고 다른 장애가 발생하기 전에 예측에 사용할 수 있습니다.
지구의 증가하는 인구, 특히 [지속 농업](https://wikipedia.org/wiki/Subsistence_agriculture)으로 생존하는 5억 가구 20억 인구의 경우 디지털 농업이 중요합니다. 디지털 농업은 몇 개의 한 자릿수 달러 센서에서 대규모 상업 설정에 이르기까지 다양합니다. 농부는 온도를 모니터링하고 [일별 성장 비율](https://wikipedia.org/wiki/Growing_degree-day) 을 사용하여 농작물이 언제 수확할 수 있는지 예측할 수 있습니다. 그들은 토양 수분 모니터링과 자동 식수 시스템을 연결하여 식물들에게 필요한 만큼의 물을 줄 수 있지만, 물을 낭비하지 않고 농작물이 마르지 않도록 더 이상 보장할 수는 없습니다. 농부들은 심지어 그것을 더 나아가서 드론, 위성 데이터, AI를 이용하여 거대한 농경지의 농작물 성장, 질병, 토양의 질 등을 감시하고 있습니다.
✅ 농부들에게 도움이 될 수 있는 다른 사물인터넷 기기들은 무엇일까요?
### 사회 기반 시설(인프라) IoT
인프라 IoT는 사람들이 일상적으로 사용하는 지역적 인프라와 세계적 인프라를 감시하고 제어하는 것입니다.
[Smart Cities](https://wikipedia.org/wiki/Smart_city) 는 IoT 기기를 사용하여 도시에 대한 데이터를 수집하고 도시 운영 방식을 개선하는 도시 지역입니다. 이 도시들은 보통 지방 정부, 학계, 지역 기업들 간의 협업으로 운영되며, 교통에서부터 주차, 오염에 이르기까지 다양한 것들을 추적하고 관리합니다. 예를 들어 덴마크 코펜하겐은 대기오염이 지역 주민들에게 중요하기 때문에 이를 측정해 데이터를 활용해 가장 깨끗한 자전거와 조깅 경로에 대한 정보를 제공합니다.
[스마트 전력망](https://wikipedia.org/wiki/Smart_grid) 은 개별 가정 수준에서 사용 데이터를 수집하여 전력 수요를 더 잘 분석할 수 있도록 합니다. 이 데이터는 발전소를 새로 지을 장소를 포함한 국가 차원에서의 의사 결정을 안내할 수 있으며, 사용자가 얼마나 많은 전력을 사용하고 있는지, 언제 사용하는지에 대한 통찰력과 심지어 야간 전기차 충전과 같은 비용 절감 방법에 대한 제안까지 사용자에게 제공하여 개인 차원에서의 의사 결정을 안내할 수 있습니다.
✅ 만약 당신이 살고 있는 곳의 사물인터넷 장치를 추가하여 무엇이든 측정할 수 있다면, 무엇을 하고 싶나요?
## 주변에 있을 수 있는 IoT 장치의 예
주변에 IoT 기기가 얼마나 많은지 알면 놀라실거에요. 집에서 작성 중이며 앱 컨트롤, 음성 컨트롤 또는 전화기를 통해 데이터를 전송하는 기능과 같은 스마트 기능을 갖춘 다음과 같은 장치들이 인터넷에 연결되어 있습니다.
* 다중 스마트 스피커
* 냉장고, 식기세척기, 오븐 및 전자레인지
* 태양 전지판용 전기 모니터
* 스마트 플러그
* 비디오 초인종 및 보안 카메라
* 여러 개의 스마트 룸 센서가 장착된 스마트 온도 조절기
* 차고 문 개폐기
* 가정용 엔터테인먼트 시스템 및 음성 제어 TV
* 조명
* 피트니스 및 건강 추적기
이러한 모든 유형의 장치에는 센서 및/또는 작동기가 있으며 인터넷과 통신합니다. 우리는 휴대폰으로 차고 문이 열려 있는지 알 수 있고, 스마트 스피커에게 문을 닫아달라고 부탁할 수 있습니다. 타이머도 설정할 수 있어서 밤에 열려 있으면 자동으로 닫힙니다. 초인종이 울리면 세계 어디에 있든 휴대폰으로 누가 있는지, 초인종 안에 내장된 스피커와 마이크를 통해 대화할 수 있습니다. 나는 내 혈당, 심박수, 수면 패턴을 모니터링 할 수 있고 내 건강을 증진시키기 위해 데이터에서 패턴을 찾을 수 있습니다. 우리는 클라우드를 통해 조명을 제어할 수 있고, 인터넷 연결이 끊어졌을 때 어둠 속에 앉아 있을 수 있습니다.
---
## 🚀 도전
집, 학교 또는 직장에 있는 IoT 기기를 가능한 한 많이 나열해보세요 - 생각보다 많을 에요!
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2)
## 복습 & 자기주도 학습
소비자 IoT 프로젝트의 이점과 실패에 대해 읽어보세요. 뉴스 사이트에서 개인 정보 보호 문제, 하드웨어 문제 또는 연결 부족으로 인한 문제와 같은 잘못된 기사를 확인해보세요.
예시 :
* 트위터 계정 **[Internet of Sh*t](https://twitter.com/internetofshit)** *(profanity warning)* 에서 소비자 IoT의 실폐사례로 좋은 몇가지 예시들을 확인해보세요.
* [c|net - My Apple Watch saved my life: 5 people share their stories](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/)
* [c|net - ADT technician pleads guilty to spying on customer camera feeds for years](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(trigger warning - non-consensual voyeurism)*
## 과제
[IoT 프로젝트 조사](assignment.md)

@ -1,222 +0,0 @@
# Introdução à IoT
![Um sketchnote de visão geral desta lição](../../../../sketchnotes/lesson-1.jpg)
> Sketchnote por [Nitya Narasimhan](https://github.com/nitya). Clique na imagem para uma versão maior.
## Questionário pré-aula
[Questionário pré-aula](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## Introdução
Esta lição cobre alguns dos tópicos introdutórios sobre a Internet das Coisas e mostra como configurar seu hardware.
Nesta lição, vamos cobrir:
* [O que é a 'Internet das Coisas'?](#o-que-é-a-internet-das-coisas)
* [Dispositivos IoT](#dispositivos-iot)
* [Configure seu dispositivo](#configure-seu-dispositivo)
* [Aplicações de IoT](#aplicações-de-iot)
* [Exemplos de dispositivos IoT que você pode ter ao seu redor](#exemplos-de-dispositivos-iot-que-você-pode-ter-ao-seu-redor)
## O que é a 'Internet das Coisas'?
O termo 'Internet das Coisas' foi cunhado por [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) em 1999, para se referir à conexão da Internet ao mundo físico por meio de sensores. Desde então, o termo tem sido usado para descrever qualquer dispositivo que interage com o mundo físico ao seu redor, seja reunindo dados de sensores ou fornecendo interações com o mundo real por meio de atuadores (dispositivos que fazem algo como ligar um interruptor ou acender um LED ), geralmente conectado a outros dispositivos ou à Internet.
> **Sensores** coletam informações do mundo, como medição de velocidade, temperatura ou localização.
>
> **Atuadores** convertem sinais elétricos em interações com o mundo real, como acionar um interruptor, acender luzes, fazer sons ou enviar sinais de controle para outro hardware, por exemplo, para ligar uma tomada.
A IoT como uma área de tecnologia é mais do que apenas dispositivos - inclui serviços baseados em nuvem que podem processar os dados do sensor ou enviar solicitações para atuadores conectados a dispositivos IoT. Também inclui dispositivos que não têm ou não precisam de conectividade com a Internet, geralmente chamados de dispositivos de borda. São dispositivos que podem processar e responder a dados de sensores eles próprios, geralmente usando modelos de IA treinados na nuvem.
A IoT é um campo de tecnologia em rápido crescimento. Estima-se que até o final de 2020, 30 bilhões de dispositivos IoT foram implantados e conectados à Internet. Olhando para o futuro, estima-se que até 2025, os dispositivos IoT estarão reunindo quase 80 zetabytes de dados ou 80 trilhões de gigabytes. São muitos dados!
![Um gráfico mostrando dispositivos IoT ativos ao longo do tempo, com uma tendência de aumento de menos de 5 bilhões em 2015 para mais de 30 bilhões em 2025](../../../../images/connected-iot-devices.svg)
✅ Faça uma pequena pesquisa: quanto dos dados gerados pelos dispositivos IoT é realmente usado e quanto é desperdiçado? Por que tantos dados são ignorados?
Esses dados são a chave para o sucesso da IoT. Para ser um desenvolvedor de IoT bem-sucedido, você precisa entender os dados que precisa coletar, como coletá-los, como tomar decisões com base neles e como usar essas decisões para interagir com o mundo físico, se necessário.
## Dispositivos IoT
O **T** em IoT significa **Coisas** - dispositivos que interagem com o mundo físico ao seu redor, seja coletando dados de sensores ou fornecendo interações com o mundo real por meio de atuadores.
Dispositivos para produção ou uso comercial, como rastreadores de condicionamento físico para consumidores ou controladores de máquinas industriais, geralmente são feitos sob medida. Eles usam placas de circuito personalizadas, talvez até processadores personalizados, projetados para atender às necessidades de uma tarefa específica, seja ela pequena o suficiente para caber em um pulso ou robusta o suficiente para funcionar em um ambiente de fábrica de alta temperatura, alto estresse ou alta vibração.
Como um desenvolvedor que está aprendendo sobre IoT ou criando um protótipo de dispositivo, você precisará começar com um kit de desenvolvedor. Esses são dispositivos IoT de uso geral projetados para serem usados por desenvolvedores, geralmente com recursos que você não teria em um dispositivo de produção, como um conjunto de pinos externos para conectar sensores ou atuadores, hardware para suportar depuração ou recursos adicionais que adicionaria custos desnecessários ao fazer uma grande rodada de fabricação.
Esses kits de desenvolvedor geralmente se enquadram em duas categorias - microcontroladores e computadores de placa única. Eles serão apresentados aqui e entraremos em mais detalhes na próxima lição.
> 💁 Seu telefone também pode ser considerado um dispositivo IoT de uso geral, com sensores e atuadores integrados, com diferentes aplicativos que usam os sensores e atuadores de maneiras diferentes com diferentes serviços em nuvem. Você pode até encontrar alguns tutoriais de IoT que usam um aplicativo de telefone como um dispositivo de IoT.
### Microcontroladores
Um microcontrolador (também conhecido como MCU, abreviação de microcontroller unit) é um pequeno computador que consiste em:
🧠 Uma ou mais unidades de processamento central (CPUs) - o 'cérebro' do microcontrolador que executa seu programa
💾 Memória (RAM e memória de programa) - onde seu programa, dados e variáveis são armazenados
🔌 Conexões de entrada/saída (I/O) programáveis - para falar com periféricos externos (dispositivos conectados), como sensores e atuadores
Microcontroladores são tipicamente dispositivos de computação de baixo custo, com preços médios para aqueles usados em hardware customizado caindo para cerca de US$0,50, e alguns dispositivos tão baratos quanto US$0,03. Os kits de desenvolvedor podem começar em US$4, com custos aumentando à medida que você adiciona mais recursos. O [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), um kit de desenvolvedor de microcontrolador da [Seeed studios](https://www.seeedstudio.com) que tem sensores, atuadores, Wi-Fi e uma tela custam cerca de US$30.
![Um Wio Terminal](../../../../images/wio-terminal.png)
> 💁 Ao pesquisar por microcontroladores na Internet, tenha cuidado ao pesquisar pelo termo **MCU**, pois isso trará muitos resultados para o Universo Cinematográfico Marvel (Marvel Cinematic Universe), não microcontroladores.
Os microcontroladores são projetados para serem programados para realizar um número limitado de tarefas muito específicas, em vez de serem computadores de uso geral, como PCs ou Macs. Exceto em cenários muito específicos, você não pode conectar um monitor, teclado e mouse e usá-los para tarefas de propósito geral.
Os kits de desenvolvedor de microcontroladores geralmente vêm com sensores e atuadores adicionais a bordo. A maioria das placas terá um ou mais LEDs que você pode programar, junto com outros dispositivos, como plugues padrão para adicionar mais sensores ou atuadores usando ecossistemas de vários fabricantes ou sensores embutidos (geralmente os mais populares, como sensores de temperatura). Alguns microcontroladores possuem conectividade sem fio integrada, como Bluetooth ou WiFi, ou possuem microcontroladores adicionais na placa para adicionar essa conectividade.
> 💁 Microcontroladores geralmente são programados em C/C++.
### Computadores de placa única
Um computador de placa única é um pequeno dispositivo de computação que possui todos os elementos de um computador completo contidos em uma única placa pequena. Esses são dispositivos que têm especificações próximas a um desktop ou laptop PC ou Mac, executam um sistema operacional completo, mas são pequenos, usam menos energia e são substancialmente mais baratos.
![Um Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
O Raspberry Pi é um dos computadores de placa única mais populares.
Como um microcontrolador, os computadores de placa única têm CPU, memória e pinos de entrada/saída, mas têm recursos adicionais, como um chip gráfico para permitir a conexão de monitores, saídas de áudio e portas USB para conectar teclados a mouses e outros dispositivos USB padrão como webcams ou armazenamento externo. Os programas são armazenados em cartões SD ou discos rígidos junto com um sistema operacional, em vez de um chip de memória embutido na placa.
> 🎓 Você pode pensar em um computador de placa única como uma versão menor e mais barata do PC ou Mac em que você está lendo isso, com a adição de pinos GPIO (entrada/saída de uso geral) para interagir com sensores e atuadores.
Os computadores de placa única são computadores completos, portanto, podem ser programados em qualquer linguagem. Os dispositivos IoT são normalmente programados em Python.
### Opções de hardware para o resto das lições
Todas as lições subsequentes incluem tarefas usando um dispositivo IoT para interagir com o mundo físico e se comunicar com a nuvem. Cada lição oferece suporte a 3 opções de dispositivo - Arduino (usando um Wio Terminal da Seeed Studios) ou um computador de placa única, seja ele um dispositivo físico (um Raspberry Pi 4) ou um computador de placa única virtual rodando em seu PC ou Mac.
Você pode ler sobre o hardware necessário para completar todas as tarefas no [guia do hardware](../../../../hardware.md).
> 💁 Você não precisa comprar nenhum hardware IoT para completar as atribuições, você pode fazer tudo usando um computador de placa única virtual.
A escolha do hardware depende de você - depende do que você tem disponível em casa ou na escola e de que linguagem de programação você conhece ou planeja aprender. Ambas as variantes de hardware usarão o mesmo ecossistema de sensores, portanto, se você começar por um caminho, poderá mudar para o outro sem ter que substituir a maior parte do kit. O computador de placa única virtual será o equivalente a aprender em um Raspberry Pi, com a maior parte do código transferível para o Pi se você eventualmente conseguir um dispositivo e sensores.
### Kit de desenvolvedor do Arduino
Se você estiver interessado em aprender o desenvolvimento de microcontroladores, poderá concluir as tarefas usando um dispositivo Arduino. Você precisará de um conhecimento básico de programação C/C++, pois as lições ensinarão apenas códigos relevantes para a estrutura do Arduino, os sensores e atuadores em uso e as bibliotecas que interagem com a nuvem.
As tarefas usarão o [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) com a [extensão PlatformIO para desenvolvimento de microcontrolador](https://platformio.org). Você também pode usar o IDE do Arduino se tiver experiência com essa ferramenta, pois as instruções não serão fornecidas.
### Kit de desenvolvedor de computador de placa única
Se estiver interessado em aprender o desenvolvimento de IoT usando computadores de placa única, você pode concluir as tarefas usando um Raspberry Pi ou um dispositivo virtual em execução no seu PC ou Mac.
Você precisará de um conhecimento básico de programação Python, já que as lições ensinarão apenas códigos relevantes para os sensores e atuadores em uso e as bibliotecas que interagem com a nuvem.
> 💁 Se você quiser aprender a codificar em Python, confira as duas séries de vídeo a seguir:
>
> * [Python para iniciantes](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [Mais Python para iniciantes](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
As tarefas usarão o [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn).
Se estiver usando um Raspberry Pi, você pode executar seu Pi usando a versão desktop completa do Raspberry Pi OS e fazer toda a codificação diretamente no Pi usando [a versão do VS Code para o Raspberry Pi OS](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn) ou executar seu Pi como um dispositivo sem cabeça e codificar a partir de seu PC ou Mac usando o VS Code com a [extensão SSH remota](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) que permite que você se conecte ao seu Pi e edite, depure e execute o código como se você estivesse codificando nele diretamente.
Se você usar a opção de dispositivo virtual, codificará diretamente no seu computador. Em vez de acessar sensores e atuadores, você usará uma ferramenta para simular esse hardware, fornecendo valores de sensor que você pode definir e mostrando os resultados dos atuadores na tela.
## Configure seu dispositivo
Antes de começar a programar seu dispositivo IoT, você precisará fazer algumas configurações. Siga as instruções relevantes abaixo, dependendo de qual dispositivo você irá usar.
> 💁 Se você ainda não tem um dispositivo, consulte o [guia de hardware](../../../../hardware.md) para ajudar a decidir qual dispositivo você vai usar e qual hardware adicional você precisa comprar. Você não precisa comprar hardware, pois todos os projetos podem ser executados em hardware virtual.
Essas instruções incluem links para sites de terceiros dos criadores do hardware ou das ferramentas que você usará. Isso é para garantir que você esteja sempre usando as instruções mais atualizadas para as várias ferramentas e hardware.
Trabalhe com o guia relevante para configurar seu dispositivo e concluir um projeto 'Hello World'. Esta será a primeira etapa na criação de uma luz noturna IoT nas 4 lições desta parte de introdução.
* [Arduino - Wio Terminal](wio-terminal.pt.md)
* [Computador de placa única - Raspberry Pi](pi.pt.md)
* [Computador de placa única - Dispositivo virtual](virtual-device.pt.md)
✅ Você usará o VS Code para o Arduino e para computadores de placa única. Se você nunca usou isso antes, leia mais sobre isso no [site do VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)
## Aplicações de IoT
A IoT cobre uma grande variedade de casos de uso, em alguns grupos amplos:
* IoT do Consumidor
* IoT Comercial
* IoT Industrial
* IoT para Infraestrutura
✅ Faça uma pequena pesquisa: para cada uma das áreas descritas abaixo, encontre um exemplo concreto que não seja fornecido no texto.
### IoT do Consumidor
A IoT do consumidor se refere a dispositivos IoT que os consumidores comprarão e usarão em casa. Alguns desses dispositivos são incrivelmente úteis, como alto-falantes inteligentes, sistemas de aquecimento inteligentes e aspiradores de pó robóticos. Outros são questionáveis em sua utilidade, como torneiras controladas por voz, o que significa que você não pode desligá-los, pois o controle de voz não pode ouvi-lo por causa do som de água corrente.
Os dispositivos IoT do consumidor estão capacitando as pessoas a realizar mais em seus arredores, especialmente 1 bilhão de pessoas com algum tipo de deficiência. Aspiradores de pó robóticos podem fornecer pisos limpos para pessoas com problemas de mobilidade que não podem aspirar a si mesmas, fornos controlados por voz permitem que pessoas com visão ou controle motor limitados aqueçam seus fornos apenas com a voz, monitores de saúde podem permitir que os pacientes monitorem suas condições crônicas com atualizações mais regulares e mais detalhadas. Esses dispositivos estão se tornando tão onipresentes que até crianças pequenas estão usando-os como parte de suas vidas diárias, por exemplo, alunos fazendo aulas virtuais durante a pandemia do COVID configurando cronômetros em dispositivos domésticos inteligentes para rastrear seus trabalhos escolares ou alarmes para lembrá-los das próximas reuniões da turma.
✅ Quais dispositivos IoT do consumidor você tem consigo ou em casa?
### IoT comercial
A IoT comercial cobre o uso da IoT no local de trabalho. Em um ambiente de escritório, pode haver sensores de ocupação e detectores de movimento para gerenciar a iluminação e o aquecimento para apenas manter as luzes e o aquecimento desligados quando não forem necessários, reduzindo o custo e as emissões de carbono. Em uma fábrica, os dispositivos IoT podem monitorar os riscos à segurança, como trabalhadores sem capacete ou ruído que atingiu níveis perigosos. No varejo, os dispositivos IoT podem medir a temperatura do armazenamento refrigerado, alertando o proprietário da loja se uma geladeira ou freezer está fora da faixa de temperatura exigida, ou podem monitorar os itens nas prateleiras para direcionar os funcionários para reabastecer os produtos que foram vendidos. A indústria de transporte está confiando cada vez mais na IoT para monitorar a localização dos veículos, rastrear a quilometragem na estrada para cobrança do usuário da estrada, monitorar as horas do motorista e interromper a conformidade ou notificar a equipe quando um veículo se aproxima de um depósito para se preparar para carga ou descarga
✅ Quais dispositivos IoT comerciais você tem em sua escola ou local de trabalho?
### IoT Industrial (IIoT)
IoT industrial, ou IIoT, é o uso de dispositivos IoT para controlar e gerenciar máquinas em grande escala. Isso cobre uma ampla gama de casos de uso, desde fábricas até agricultura digital.
As fábricas usam dispositivos IoT de muitas maneiras diferentes. A maquinaria pode ser monitorada com vários sensores para rastrear coisas como temperatura, vibração e velocidade de rotação. Esses dados podem então ser monitorados para permitir que a máquina seja parada se ficar fora de certas tolerâncias - ela fica muito quente e é desligada, por exemplo. Esses dados também podem ser coletados e analisados ao longo do tempo para fazer a manutenção preditiva, onde os modelos de IA examinam os dados que levam a uma falha e os usam para prever outras falhas antes que elas aconteçam.
A agricultura digital é importante se o planeta deseja alimentar a população crescente, especialmente para os 2 bilhões de pessoas em 500 milhões de famílias que sobrevivem da [agricultura de subsistência](https://pt.wikipedia.org/wiki/Agricultura_de_subsist%C3%AAncia). A agricultura digital pode variar de alguns sensores de um dígito de dólar a enormes configurações comerciais. Um agricultor pode começar monitorando as temperaturas e usar o [grau-dia de crescimento](https://wikipedia.org/wiki/Growing_degree-day) para prever quando uma safra estará pronta para a colheita. Eles podem conectar o monitoramento da umidade do solo a sistemas de rega automatizados para fornecer a suas plantas a quantidade necessária de água, mas não mais para garantir que suas safras não sequem sem desperdício de água. Os agricultores estão indo mais longe e usando drones, dados de satélite e IA para monitorar o crescimento da safra, doenças e qualidade do solo em grandes áreas de terras agrícolas.
✅ Que outros dispositivos IoT podem ajudar os agricultores?
### IoT para Infraestrutura
A IoT para infraestrutura monitora e controla a infraestrutura local e global que as pessoas usam todos os dias.
[Cidades inteligentes](https://pt.wikipedia.org/wiki/Cidade_inteligente) são áreas urbanas que usam dispositivos IoT para coletar dados sobre a cidade e usá-los para melhorar o funcionamento da mesma. Essas cidades geralmente são administradas com a colaboração entre governos locais, universidades e empresas locais, rastreando e gerenciando coisas que variam de transporte a estacionamento e poluição. Por exemplo, em Copenhague, Dinamarca, a poluição do ar é importante para os residentes locais, por isso é medida e os dados são usados para fornecer informações sobre as rotas de ciclismo e corrida mais limpas.
[Redes de energia inteligentes](https://pt.wikipedia.org/wiki/Rede_el%C3%A9trica_inteligente) permitem uma melhor análise da demanda de energia, reunindo dados de uso no nível de residências individuais. Esses dados podem orientar decisões em nível de país, incluindo onde construir novas usinas de energia, e em nível pessoal, dando aos usuários insights sobre quanta energia eles estão usando, quando estão usando, e até mesmo sugestões sobre como reduzir custos, como por exemplo carregar carros elétricos à noite.
✅ Se você pudesse adicionar dispositivos IoT para medir qualquer coisa onde você mora, o que seria?
## Exemplos de dispositivos IoT que você pode ter ao seu redor
Você ficaria surpreso com a quantidade de dispositivos IoT que tem ao seu redor. Estou escrevendo isso de casa e tenho os seguintes dispositivos conectados à Internet com recursos inteligentes, como controle de aplicativos, controle de voz ou a capacidade de enviar dados para mim através do meu telefone:
* Vários alto-falantes inteligentes
* Geladeira, lava-louças, forno e micro-ondas
* Monitor de eletricidade para painéis solares
* Plugues inteligentes
* Campainha de vídeo e câmeras de segurança
* Termostato inteligente com vários sensores inteligentes de ambiente
* Abridor de porta de garagem
* Sistemas de entretenimento doméstico e TVs controladas por voz
* Luzes
* Rastreadores de condicionamento físico e de saúde
Todos esses tipos de dispositivos possuem sensores e/ou atuadores e se comunicam com a Internet. Posso dizer pelo meu telefone se a porta da garagem está aberta e pedir ao meu alto-falante inteligente para fechá-la para mim. Posso até definir um temporizador para que, se ainda estiver aberta à noite, feche automaticamente. Quando minha campainha toca, posso ver no meu telefone quem está lá em qualquer lugar do mundo e falar com eles por meio de um alto-falante e microfone embutidos na campainha. Posso monitorar minha glicemia, frequência cardíaca e padrões de sono, procurando padrões nos dados para melhorar minha saúde. Posso controlar minhas luzes por meio da nuvem e ficar sentado no escuro quando minha conexão com a Internet cair.
---
## 🚀 Desafio
Liste o máximo de dispositivos IoT que puder em sua casa, escola ou local de trabalho - pode haver mais do que você pensa!
## Questionário pós-aula
[Questionário pós-aula](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2)
## Revisão e autoestudo
Leia sobre os benefícios e as falhas dos projetos de IoT do consumidor. Verifique os sites de notícias para obter artigos sobre quando deu errado, como questões de privacidade, problemas de hardware ou problemas causados por falta de conectividade.
Alguns exemplos:
* Verifique a conta do Twitter **[Internet of Sh*t](https://twitter.com/internetofshit) ** *(aviso de palavrões)* para obter alguns bons exemplos de falhas com a IoT do consumidor.
* [c|net - Meu Apple Watch salvou minha vida: 5 pessoas compartilham suas histórias](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/)
* [c|net - Técnico ADT se declara culpado de espionar imagens de câmeras de clientes por anos](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on- customer-camera-feeds-for-years/) *(aviso de gatilho - voyeurismo não consensual)*
## Tarefa
[Investigar um projeto IoT](assignment.pt.md)

@ -1,222 +0,0 @@
# 物联网IoT简介
![这个课程概述的涂鸦笔记sketchnote](../../../../sketchnotes/lesson-1.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 如果你想看比较大的图片,请点击它。
## 课前测验
[课前测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1)
## 简介
本课程涵盖一些介绍物联网IoT的主题以及教你怎么开始设置你的硬件。
本课程将涵盖:
* [什么是 “物联网IoT](#什么是-物联网iot)
* [物联网设备](#物联网设备)
* [设置你的设备](#设置你的设备)
* [物联网的应用场景](#物联网的应用场景)
* [在你的周围的物联网设备例子](#在你的周围的物联网设备例子)
## 什么是 “物联网IoT
为了形容运用传感器sensors又译作感应器来连接网络与物理世界1999 年 [凯文·阿什顿Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) 生造了“物联网IoT”这个词。自从那时起这个术语被用来形容任何能够与周围物理世界交互的设备。这些设备可以使用传感器收集数据或者使用执行器actuators指的是执行诸如打开开关点亮发光二极管等操作的设备在物理世界完成任务。通常执行器会连接到其它设备或者互联网。
> **传感器** 从世界中收集数据,例如:测量速度、温度或地点。
>
> **执行器** 将电信号转换成现实世界的交互,例如:触发开关,打开灯,发出声音或将控制信号传送到其它硬件,例如,打开电源插座。
物联网作为一个技术领域不仅是设备它也包含云服务这些服务能处理传感器数据或者将请求传送给跟物联网设备有连接的执行器。它也包括没有或不需要互联网连接的设备它们通常被称为“边缘设备edge devices而且它们有能力用基于云的 AI 模型自己处理与回应传感器的数据。
物联网是一个快速发展的技术领域。专家预计到 2020 底,世界上有三百亿物联网设备部署并连接到互联网。专家也预计到 2025 年,物联网设备将收集大概 80 ZB80 万亿 GB的数据。这是巨量的数据
![这个图表展示随着时间的推移的有源 IoT 设备;它展示出一个上升趋势,从 2015 年不超过 50 亿到 2025 年超过 300 亿](../../../../images/connected-iot-devices.svg)
✅ 做一点儿研究: 物联网设备收集的数据,多少是有用的、多少是被浪费的?为什么那么多数据被忽略了?
对于物联网的成功,这些数据是不可或缺的。想成为一名成功的物联网开发者,就必须了解你需要收集的数据、怎么收集它,怎么利用它来作出决策,以及如果有必要的话,怎么利用这些决策来和物理世界交互。
## 物联网设备
IoT 的 **T** 代表 **Things**(物)—— 可以和物理世界交互的设备;它们使用感应器收集数据或者使用执行器在物理世界完成任务。
为生产或商业的设备(例:健身追踪器、工业机器控制器等)通常是定制的。它们使用定制电路板——甚至有可能是定制处理器——旨在满足特定任务的需求。例:要戴在手上的需要够小,或者要承受高温度、高压力、高振动的工厂环境的需要够耐用。
无论你正在学物联网或是在创建原型设备,作为一名 物联网开发者你必须由一个开发者套件developer kits开始。这些是为物联网开发者设计的通用设备通常具有生产设备上没有的功能例如用来连接传感器或执行器的外部引脚、帮助排除错误的硬件或者进行大规模生产时会增加不必要的成本的额外资源。
这些开发者套件通常有两种微控制器microcontrollers和单板机single-board computers。我们会在这儿介绍它们而将在下一课更详细地解释它们。
> 💁 你的手机也算是一个通用物联网设备;它拥有感应器与执行器,以及不同应用程序用不同的方式来和不同云服务利用它们。你甚至可以找到几个用手机的应用程序当作物联网设备的物联网教程。
### 微控制器
一个微控制器MCU是一个小型计算机。它包含
🧠 至少一个中央处理器CPU它就是微控制器的“大脑”——它用来运行你的程序
💾 内存随机存取存储器RAM和程序存储器——储存你的程序、数据和变量的地方
🔌 可编程输入/输出I/O连接——为了和外围设备如传感器或执行器通信
微控制器通常是较便宜的计算设备;定制硬件的平均成本下降到 0.50 美元,而有些设备低至 0.03 美元。开发者套件的起价低至 4 美元,但加上越多功能,价钱就越高。[Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 是个来自 [Seeed studios](https://www.seeedstudio.com) 的微控制器它包含传感器、执行器、Wi-Fi 和一个屏幕,总共算起来大约 30 美元。
![一个 Wio Terminal](../../../../images/wio-terminal.png)
> 💁 当你在网上寻找微控制器时,要小心用 **MCU** 这个词因为会带来许多关于漫威电影宇宙Marvel Cinematic Universe的搜索结果而不是关于微控制器的。
微控制器被设计成通过编程完成有限数量的非常特定的任务,不像 PC 或 Mac 那样的通用计算机。除了一些很特殊的场景,你无法连接显示器、键盘和鼠标并利用它完成通用任务。
微控制器开发者套件通常包括额外的传感器和执行器。大多数电路板会有至少一个可编程的发光二极管LEDs还有其它设备例如用来添加不同制造商的传感器或执行器或是用来添加内置传感器的标准插头平时最常见的如温度。有些微控制器有内置的无线连接如蓝牙或 Wi-Fi或者在电路板上有额外的微控制器来添加这种连接。
> 💁 我们通常用 C 或 C++ 来为微控制器写程序。
### 单板机
单板机是一种小型计算设备;它把完整计算机的所有要素装在一个小板上。这些设备的规格与台式电脑或笔记本电脑比较相似,完整的操作系统,但体积小、耗电少,而且便宜得多。
![一个 Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
Raspberry Pi 是其中最流行的单板机。
与微控制器一样,单板机具有 CPU、内存和输入/输出引脚,但它们也有额外的功能,如一个让你连接显示器的图形芯片、音频输出,以及 USB 端口它让你连接键盘、鼠标和其它标准USB设备如网络摄像头和外置储存。程序与操作系统一起存储在 SD 卡或硬盘驱动器上,而不是内置于板中的内存芯片。
> 🎓 你可以把单板机当成一个更小、更便宜的个人电脑,就像你现在正在用来读这篇文章的 PC 或 Mac。可是单板机还增加了通用输入/输出引脚GPIOgeneral-purpose input/output让你和传感器、执行器交互。
单板机是功能齐全的计算机,所以你可以用任何编程语言来为它写程序。我们通常用 Python 为物联网设备写程序。
### 日后课程的硬件选择
所有后续课程都包括使用物联网设备与物理世界交互并与云通信的作业。每节课会支持3种设备选择Arduino使用 Seeed Studios Wio Terminal或者单板机物理设备Raspberry Pi 4或在你的电脑上运行的虚拟单板机。
你能在[硬件手册](../../../../hardware.md)查到完成作业所需的硬件。
> 💁 你不需要为了完成作业而买任何物联网硬件;虚拟单板机即可完成所有任务。
要使用哪种硬件是你的选择,取决于你家里或学校里有什么,以及你知道或想学的编程语言。两种硬件都使用同样的传感器生态系统,所以万一你想途中改变你的选择,你也不需要替换大部分的套件。用虚拟单板机相当于在 Raspberry Pi 上学习,如果你最后购买了设备和传感器,大部分代码都可以转移到 Pi 上。
### Arduino 开发者套件
如果你对微控制器的开发感兴趣,那你可以用一个 Arduino 设备完成作业。你需要对 C 或 C++ 的编程语言有基本的理解,因为将来的课程只会教关于 Arduino 框架的程序、需要用到的感应器和执行器以及跟云交互的库。
作业将用 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) 跟 [为微控制器开发的 PlatformIO 扩展](https://platformio.org). 如果你对 Arduino IDE 熟悉的话,你也能用它,但我们不会提供指示。
### 单板机开发者套件
如果你对使用单板机学物联网开发有兴趣,你可以用 Raspberry Pi树莓派或者在你的电脑运行的虚拟设备来完成作业。
你需要对 Python 有基本的理解,因为将来的课程只会教授与所使用的传感器和执行器相关的代码,以及与云交互的库。
> 💁 如果你想学怎么用 Python 写程序,请查看下面的两个视频系列:
>
> * [Python for beginners为初学者的 Python](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn)
> * [More Python for beginners更多为初学者的 Python](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn)
作业将用 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn)。
如果你使用的是 Raspberry Pi则可以使用完整桌面版 Raspberry Pi OS 运行你的树莓派,并使用 [VS Code 的 Raspberry Pi OS 版](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn)直接在你的树莓派上写程序。或者把它当成一个无头设备,从你的电脑用 VS Code 的 [Remote SSH 插件](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn)写程序;这个插件让你连接到树莓派,编辑,调试和运行代码,就像你直接在树莓派上写程序一样。
如果你选择用虚拟设备,将直接在你的电脑上写程序。你不会直接访问传感器和执行器,而是用工具来模拟此硬件,提供自己定义的传感器值,并在屏幕上显示执行器的结果。
## 设置你的设备
在你为你的物联网设备写程序前,你需要做点设置。请根据你将用到的设备,按照以下的指示进行操作。
> 💁 如果你还没有设备,参阅[硬件手册](../../../../hardware.md) 帮你决定你要用的设备,以及你需要购买的额外硬件。当然硬件不是必需购买的,因为你可以用虚拟硬件运行所有的项目。
这些说明包括您将使用的硬件或工具的创建者提供的第三方网站链接。这是为了确保你始终遵照工具和硬件的最新说明。
按照相关的指南来设置你的设备并完成一个“Hello World”项目。我们将用 4 个课程创造一个物联网夜灯,而这是第一步。
* [ArduinoWio Terminal](wio-terminal.zh-cn.md)
* [单板机Raspberry Pi](pi.zh-cn.md)
* [单板机:虚拟设备](virtual-device.zh-cn.md)
您将使用 VS Code 在 Arduino 和单板机上编程。如果您以前从未使用过它,请在 [VS Code 站点](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn)上阅读更多相关信息。
## 物联网的应用场景
物联网涵盖了范围广泛的用例,涵盖了几个广泛的领域:
* 消费者物联网
* 商业物联网
* 工业物联网
* 基础设施物联网
✅ 做一点儿研究:对于以下描述的每个领域,找到一个文本中没有给出的具体例子。
### 消费物联网
消费物联网指的是消费者购买的家用物联网设备。这些设备中有的非常有用,例如:智能音箱、智能供暖系统和机器人吸尘器。其它的设备可用性则存疑,例如声控水龙头,这意味着您无法关闭它们,因为声控无法在流水声中听到您的声音。
消费物联网设备使人们能够在周围环境中获取更多能力,尤其是世界上的 10 亿个残障人士。机器人吸尘器能为行动不便、无法亲自清扫的人提供干净的地板、声控烤箱让视力或行动较差的人用自己的语音打开烤箱、健康监测器使患者能够监测自己的慢性病情况并定期得到更加详细的信息。这些设备将变得普及到连小孩子也在天天使用它们,如学生们在冠状病毒疫情时进行居家学习,利用智能家居设备的计时器记录他们的功课或者设置闹钟来提醒他们参与他们未来的课程。
✅ 你身上或家里有什么消费物联网设备呢?
### 商业物联网
商业物联网包含工作场所里的物联网用例。在办公室里,有可能会有空间占用传感器和移动探测器,这些物联网设备被用来管理灯光和供暖,在不需要的时候把它们关掉,以降低成本和碳排放。在工厂中,物联网设备可以监测安全隐患,例如:没有戴安全帽的人员或达到危险水平的噪音。在零售店,物联网设备可以测量冷库的温度,如果冰箱或冰柜超出所需的温度范围,将通知店主;或者它们可以监测货架上的商品,通知工作人员为卖完的产品补货。交通运输业也越来越依靠物联网设备来监测车辆位置、为道路使用者收费记录行驶里程、记录司机的工作时间和安全措施,或在车辆接近仓库准备装卸时通知工作人员。
✅ 你的学校或公司里有什么商业物联网设备呢?
### 工业物联网(IIoT)
工业物联网(也称为 “IIoT”指的是使用物联网设备来大规模控制和管理机械。这包含很多用例从工厂到数字农业。
工厂以多种不同方式使用物联网设备。它们能使用各种传感器(如:温度、振动、旋转速度等)来监测机械。我们可以监测这些数据,以便在机器超出特定指标时停止机器 如它的温度太高。我们也可以收集并分析这些数据让人工智能AI模型学习故障前的数据再利用它预报其它未来的故障这就叫做“预测性维护”。
为了养活不断增长的人口,数字农业非常重要,尤其是对于依靠[自给农业](https://wikipedia.org/wiki/Subsistence_agriculture) 的 5 亿家户中的 20 亿人而言。数字农业的领域包括才几块钱的传感器,也包含大规模的商业装置。农民可以首先监测温度以及用[生长度日GDD](https://wikipedia.org/wiki/Growing_degree-day),预测农作物什么时候收割。你们还可以将土壤湿度监测与自动浇水系统连接起来,为他们的植物提供刚好所需的水量,而不浪费水资源。最后,农民可以进一步、用无人驾驶飞机、卫星数据、人工智能来监测大面积农田的作物生长、疾病和土壤质量。
✅ 还有什么物联网设备可以用来帮助农民呢?
### 基础设施物联网
基础设施物联网正在监控和控制人们每天使用的本地和全球基础设施。
[智慧城市](https://wikipedia.org/wiki/Smart_city)是用物联网设备来收集关于城市的数据再利用这些数据来改善城市运行方式的城市地区。这些城市通常靠本地政府、学术界和本地企业之间的合作,监测和管理各种东西——从交通到停车和污染。一个例子是在哥本哈根(丹麦王国首都),空气污染对人民来说非常重要,所以对其进行测量,再用它给人民提供最干净的骑行与慢跑路线的信息。
[智能电网](https://wikipedia.org/wiki/Smart_grid)以收集各家各户使用电力的数据的方式来更好的分析电力需求。这些数据可以指导国家层面的决策,包括在哪里建新发电厂。以及让用户明确地了解自己使用了多少电力,何时使用,在个人层面上做出决策。还可以为我们提供减少浪费的建议,例如晚上为电动汽车充电。
✅ 假如你可以在你住的地方添加物联网设备,你会选择什么?
## 在你的周围的物联网设备例子
你会惊讶于你身边有多少物联网设备。我正在家里写这个课程的内容,有以下具有智能功能的设备连接到互联网,像是应用程式控制、语音控制、或者有能力通过手机把数据发给我的设备:
* 好几个智能音箱
* 冰箱、洗碗机、烤箱和微波炉
* 太阳能电池板的电量监测器
* 智能插座
* 可视门铃和安全摄像头
* 带有多个智能房间传感器的智能恒温器
* 车库开门器
* 家庭娱乐系统和声控电视
* 灯光
* 健身和健康追踪器
这些设备都有传感器和/或执行器与跟互联网沟通。我可以通过手机判断我的车库门是否打开,并让我的智能扬声器为我关闭它。我甚至可以为它设置一个计时器,如果车库门在晚上仍然打开,它会自动关闭。每当我的门铃响起,无论我在世界的哪儿个地方,我都能从手机看到门前是谁,并通过门铃的音箱和麦克风跟他们沟通。我能监测我的血糖、心率和睡眠周期,再用数据中的趋势来改善自己的健康状况。我能通过云控制我的灯,而当我的网络连接出状况,我能在黑暗中坐着。
---
## 🚀 挑战
尽可能多地列出家中、学校或工作场所中的物联网设备——有可能比你的想象中还要多!
## 课后测验
[课后测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2)
## 复习和自学
阅读关于消费物联网项目的成功和失败。在新闻网站上找一找关于失败的文章,例如:隐私问题、硬件问题或者因缺少连接而发生的问题。
几个例子:
* 这个推特账户 **[Internet of Sh*t](https://twitter.com/internetofshit)** *(亵渎警告)* 有几个关于消费物联网失败的好例子。
* [c|net - 我的 Apple Watch 救了我一命5 个人分享他们的故事](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/)
* [c|net - ADT 技术人员承认多年来一直监视客户的摄像头信息](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(触发警告:未经同意的偷窥)*
## 作业
[调查一个物联网IoT项目](../assignment.md)

@ -1,20 +0,0 @@
<div dir="rtl">
# التحقيق في مشروع إنترنت الأشياء
## تعليمات
هناك العديد من مشاريع إنترنت الأشياء الكبيرة والصغيرة التي يتم طرحها على مستوى العالم ، من المزارع الذكية إلى المدن الذكية ، ومراقبة الرعاية الصحية ، والنقل ، أو استخدام الأماكن العامة.
ابحث في الويب عن تفاصيل المشروع الذي يثير اهتمامك ، ومن الأفضل أن يكون مشروعًا قريبًا من المكان الذي تعيش فيه. اشرح الجوانب الإيجابية والسلبية للمشروع ، مثل الفائدة التي تأتي منه ، وأي مشاكل يسببها وكيف يتم أخذ الخصوصية في الاعتبار.
## الموضوع
| المعايير | نموذجي | كافية | يحتاج إلى تحسين |
| -------- | --------- | -------- | ----------------- |
| اشرح الإيجابيات والسلبيات | قدّم شرحاً واضحاً لأوجه الإيجابيات والسلبيات للمشروع | قدم شرحا مختصرا للجوانب الإيجابية والسلبية | لم يشرح الإيجابيات أو السلبيات |
</div>

@ -1,13 +0,0 @@
# একটি IoT প্রজেক্ট পর্যালোচনা
## নির্দেশাবলী
স্মার্ট ফার্ম থেকে শুরু করে স্মার্ট শহরগুলিতে, স্বাস্থ্যসেবা পর্যবেক্ষণ, পরিবহন এবং জনসাধারণের ব্যবহারের জন্য বিশ্বব্যাপী বড় এবং ছোট আকারের অনেক আইওটি প্রকল্প আসছে।
আপনার বসবাসের জায়গার আশেপাশের এমন কোন প্রকল্প থাকলে, সেটি সম্পর্কে ইন্টারনেটে সার্চ করুন। প্রজেক্টটির ইতিবাচক এবং নেতিবাচক দিকগুলো (যেমন: এটির কারণে কী কী সুবিধা হচ্ছে, কোন সমস্যা তৈরী করছে কিনা বা তথ্যের গোপনীয়তা সংক্রান্ত বিষয়গুলি কীভাবে দেখা হচ্ছে) ব্যখ্যা করুন।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা | পর্যাপ্ত ব্যখ্যা | আরো উন্নতির প্রয়োজন |
| -------- | --------- | -------- | -----------------|
| ইতিবাচক এবং নেতিবাচক দিকগুলোর ব্যখ্যা করুন | বিশদভাব ব্যখ্যা করা হয়েছে | সংক্ষিপ্ত ব্যখ্যা করা হয়েছে | ভালোভাবে ব্যখ্যা করা হয়নি |

@ -1,13 +0,0 @@
# एक IoT प्रोजेक्ट की जाँच करें
## अनुदेश
स्मार्ट फ़ार्म से लेकर स्मार्ट शहरों, स्वास्थ्य निगरानी, परिवहन, या सार्वजनिक स्थानों के उपयोग तक, वैश्विक स्तर पर कई बड़े और छोटे पैमाने के IoT प्रोजेक्ट शुरू किए जा रहे हैं।
किसी ऐसे प्रोजेक्ट के विवरण के लिए वेब पर खोजें जिसमें आपकी रुचि हो, आदर्श रूप से वह स्थान जहां आप रहते हैं। परियोजना के उतार-चढ़ाव के बारे में बताएं, जैसे कि इससे क्या लाभ होता है, इससे होने वाली कोई भी समस्या और गोपनीयता को कैसे ध्यान में रखा जाता है।
## शीर्ष
| मानदंड | उदाहरणात्मक| पर्याप्त | सुधार की जरूरत |
| ----- | --------- | ----- | ----------------- |
| उतार-चढ़ाव के बारे में बताएं | परियोजना के उतार-चढ़ाव की स्पष्ट व्याख्या दी | उतार-चढ़ाव का संक्षिप्त विवरण दिया | उतार-चढ़ाव की व्याख्या नहीं की |

@ -1,13 +0,0 @@
# Investigue um projeto de IoT
## Instruções
Existem muitos projetos de IoT de grande e pequena escala sendo implementados globalmente, de fazendas inteligentes a cidades inteligentes, em monitoramento de saúde, transporte e para o uso de espaços públicos.
Pesquise na web por detalhes de um projeto do seu interesse, de preferência um perto de onde você mora. Explique as vantagens e desvantagens do projeto, por exemplo, quais os benefícios dele, quaisquer problemas que ele causa e como a privacidade é levada em consideração.
## Rubrica
| Critérios | Exemplar | Adequado | Precisa Melhorar |
| --------- | -------- | -------- | ---------------- |
| Explique as vantagens e desvantagens | Deu uma explicação clara das vantagens e desvantagens do projeto | Deu uma breve explicação sobre as vantagens e desvantagens | Não explicou as vantagens ou desvantagens |

@ -1,13 +0,0 @@
# 调查一个物联网IoT项目
## 指示
从智慧农场到智慧城市、医疗保健监测系统、交通或利用公共空间等,世界上有非常多 IoT 项目。
在互联网寻找一个让你感兴趣的 IoT 项目的细节,最好是离你不太远的。解释一下项目的好处与坏处,例如:它带来的益处、它带来的任何麻烦以及他怎么顾及隐私。
## 评分表
| 标准 | 优秀 | 一般 | 需改进 |
| -------- | --------- | -------- | ----------------- |
| 解释项目的好处与坏处 | 把项目的好处与坏处解释得很清楚 | 简要地解释项目的好处与坏处 | 没有解释项目的好处与坏处 |

@ -1,242 +0,0 @@
# রাস্পবেরি পাই
[রাস্পবেরি পাই](https://raspberrypi.org) হলো একটি সিংগেল বোর্ড কম্পিউটার । আমরা বিভিন্ন ইকোসিস্টেমের সেন্সর এবং অ্যাকচুয়েটর ব্যবহার করতে পারি, আর এই লেসনে আমরা [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html) নামের বেশ সমৃদ্ধ একটি হার্ডওয়্যার ইকোসিস্টেম ব্যবহার করবো। আমাদের রাস্পবেরি পাই (সংক্ষেপে "পাই") এর কোডিং এবং Grove সেন্সরগুলো আমরা নিয়ন্ত্রণ করবো পাইথন ল্যাংগুয়েজে।
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
## সেটাপ
যদি আমরা আমাদের আইওটি হার্ডওয়্যার হিসাবে রাস্পবেরি পাই ব্যবহার করি, তবে দুটি অপশন আছে - সবগুলো লেসন পড়ে সরাসরি রাসপবেরি পাই তে কোডের মাধ্যমে কাজ করা অথবা কম্পিউটার থেকে 'হেডলেস' পাই এবং কোডের সাথে দূরবর্তীভাবে সংযোগ করতে পারেন।
কাজ শুরু করার আগে আমাদের গ্রোভ বেস হ্যাটটি আপনার পাইয়ের সাথে সংযুক্ত করতে হবে।
### কাজ - সেটাপ
Grove বেস হ্যাটটি রাস্পবেরি পাই এ ইন্সটল করা এবং পাই কে সেই অনুসারে কনফিগার করা।
১. গ্রোভ বেস টুপিটি রাস্পবেরি পাই এর সাথে সংযুক্ত করতে হবে। নিচের ছবির মতো, জিপিআইও পিনগুলো বরাবর আমরা গ্রোভ হ্যাট বসাতে পারবো।
![Fitting the grove hat](../../../../images/pi-grove-hat-fitting.gif)
২. কীভাবে রাস্পবেরি পাই তে কাজ করতে চাচ্ছি, সে সম্পর্কিত সিদ্ধান্ত নিয়ে - নিচের যেকোন একটি প্রাসঙ্গিক সেকশন এ যেতে হবে
* [সরাসরি রাস্পবেরি পাই তে কাজ করা](#সরাসরি-রাস্পবেরি-পাই-তে-কাজ-করা)
* [রাস্পবেরি পাই তে রিমোট একসেস নেয়া](#পাই-তে-রিমোট-একসেস)
### সরাসরি রাস্পবেরি পাই তে কাজ করা
আমরা যদি সরাসরি রাস্পবেরি পাই তে কাজ করতে চাই, সেক্ষত্রে আমাদেরকে Raspberry Pi OS এর ডেস্কটপ ভার্সন ব্যবহার করতে হবে এবং প্রয়োজনীয় সব উপাদান ইন্সটল করতে হবে।
#### কাজ - সরাসরি রাস্পবেরি পাই
আমাদেরকে রাস্পবেরি পাই সেটাপ করে নিতে হবে।
1. [ রাস্পবেরি পাই সেটাপ গাইড](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) থেকে সব নির্দেশ অনুসরণ করে আমাদের পাই সেটাপ করে নিতে হবে। এটিকে এবার কীবোর্ড/মাউস/মনিটরের সাথে যুক্ত করি। তারপর ওয়াইফাই বা ইথারনেটে সংযুক্ত করে, সফটওয়্যর আপডেট করে নিতে হবে। এক্ষেত্রে যে অপারেটিং সিস্টেম আমরা ডাউনলোড করবো তা হলো **Raspberry Pi OS (32 bit)** , এটিই রেকমেন্ডেড হিসেবে মার্ক করা থাকে ।
গ্রোভ সেন্সর ও একচুয়েটর ব্যবহার করে কাজ করার জন্য, আগেই একটি এডিটর ইন্সটল করতে হবে যাতে আমরা কোড লিখতে পারি এবং বিভিন্ন লাইব্রেরি ও ট্যুল ব্যবহার করতে পারি - এতে করে সহজেই আমরা গ্রোভে কাজ করতে পারবো।
1. পাই রিব্যুট করার পরে, উপরের মেন্যু বার থেকে **Terminal** আইকনে ক্লিক করে তা চালু করতে হবে অথবা *Menu -> Accessories -> Terminal* এভাবে চালু করতে হবে।
2. ওএস এবং সব সফটওয়্যর আপডেট করা আছে কিনা তার জন্য নীচের কমান্ড টা রান করতে হবে।
```sh
sudo apt update && sudo apt full-upgrade --yes
```
3. গ্রোভে সকল লাইব্রেরি ইন্সটল করার জন্য নিচের কমান্ড রান দিই।
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
পাইথনের অন্যতম শক্তিশালী একটি সুবিধা হলো [pip packages](https://pypi.org) ইন্সটল করতে পারা - পিপ প্যাকেজ হলো অন্যদের তৈরী ও পাবলিশ করা কোডের প্যাকেজ। মাত্র ১টা কমান্ড দিয়েই পিপ ইন্সটল করে ব্যবহার করা যায়। এই গ্রুভ ইন্সটল স্ক্রিপ্ট টি রান করলে, তা আমাদের প্রয়োজনীয় সকল ট্যুল ইন্সটল করে নিবে।
4. আমাদের রাস্পবেরি পাই টি মেন্যু থেকে অথবা নিচের স্ক্রিপ্ট রান করে রিব্যুট করে নিই।
```sh
sudo reboot
```
5. পাই রিব্যুট হওয়ার পর, টার্মিনাল আবারো চালু করতে হবে আর [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) ইন্সটল করতে হবে। এই এডিটরের সাহায্যেই মূলত আমরা সব কোড লিখবো।
```sh
sudo apt install code
```
ইন্সটলেশনের পর টপ মেন্যু থেকেই ভিএস কোড পাওয়া যাবে।
> 💁 পছন্দানুসারে যেকোন পাইথন আইডিই বা এডিটর ব্যবহার করলেই হয়, কিন্তু আমরা এখানে সম্পূর্ণ টিউটোরিয়াল সাজিয়েছি ভিএস কোডের উপর ভিত্তি করে।
6. Pylance ইন্সটল করতে হবে। পাইথনে কোড করার জন্য, এটি ভিএস কোডের একটি এক্সটেনশন। [Pylance extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) থেকে এটি ইন্সটল করার সকল নির্দেশনা পাওয়া যাবে।
### পাই তে রিমোট একসেস
কম্পিউটারের কীবোর্ড/মাউস/মনিটরের সাথে যুক্ত না রেখে, সরাসরি এটিতে কোডিং না করে, আমরা 'হেডলেস' হিসেবে এটাকে রান করতে পারি। এক্ষেত্রেও ভিস্যুয়াল স্টুডিও কোড ব্যবহার করে আমরা কনফিগারেশন এবং কোডিং করবো।
#### পাই অপারেটিং সিস্টেম সেটাপ করা
পাই ওএস কে একটি এসডি কার্ডে ইন্সটল করে রাখতে হবে।
##### কাজ- পাই ওএস সেটাপ
হেডলেস পাই ওএস সেটাপ করা :
1. [Raspberry Pi OS software page](https://www.raspberrypi.org/software/) থেকে **Raspberry Pi Imager** ডাউনলোড এবং ইন্সটল করতে হবে।
1. কম্পিউটারে একটি এসডি কার্ড প্রবেশ করাতে হবে (এডাপটার প্রয়োজন হতে পারে) ।
1. রাস্পবেরি পাই ইমেজার চালু করতে হবে ।
1. রাস্পবেরি পাই ইমেজার থেকে **CHOOSE OS** সিলেক্ট করি। তারপর *Raspberry Pi OS (Other)* সিলেক্ট করতে হবে *Raspberry Pi OS Lite (32-bit)* এর পরে ।
![The Raspberry Pi Imager with Raspberry Pi OS Lite selected](../../../../images/raspberry-pi-imager.png)
> 💁 Raspberry Pi OS Lite হলো মূলত Raspberry Pi OS এরই একটি ভার্সন যার ডেস্কটপ ইন্টারফেস বা এই সংক্রান্ত ট্যুল নেই। হেডলেস পাই তে এসব দরকার নেই বলেই লাইট ভার্সন নেয়া হচ্ছে যাতে প্রক্রিয়াটি সংক্ষিপ্ত হয় এবং দ্রুত ব্যুট করা যায়।
1. **CHOOSE STORAGE** এ ক্লিক করে, এসডি কার্ড সিলেক্ট করি ।
1. **Advanced Options** চালু করতে হবে, `Ctrl+Shift+X` প্রেস করে। এখান থেকে আমরা পাই এর কিছু প্রি-কনফিগারেশন করতে পারবো।
1. এখন **Enable SSH** বক্সে টিক দিতে হবে এবং পাই ইউজারের জন্য পাসওয়ার্ড সেট করতে হবে। এই পাসওয়ার্ডটি আমরা পরে পাইতে লগ ইন করতে ব্যবহার করবো।
1. যদি আমাদেরকে পাই কে ওয়াইফাইয়ের সাথে সংযোগ স্থাপনের মাধ্যমে কাজ করার ইচ্ছে থাকে, তাহলে **Configure WiFi** চেক বাক্সটি চেক করুন এবং আমাদের ওয়াইফাই, এসএসআইডি এবং পাসওয়ার্ড লিখে, দেশ নির্বাচন করতে হবে। যদি ইথারনেট ক্যাবল ব্যবহার করি, তবে এটি করার দরকার নেই। এখানে অবশ্যই নিশ্চিত থাকতে হবে যে, পাই কে যে নেটওয়ার্কে সংযোগ করা হচ্ছে, সেই একই নেটওয়ার্কে কম্পিউটারটি যুক্ত রয়েছে।
1. **Set locale settings** বক্সে টিক দিতে হবে এব দেশ এবং টাইমজোন দিতে হবে।
1. **SAVE** সিলেক্ট করি।
1. এবার **WRITE** ক্লিক করলে ওএস আর এসডি কার্ডের কাজ শুরু। যদি ম্যাক-ওএস ব্যবহার করলে এক্ষেত্রে পাসওয়ার্ডটি প্রবেশ করতে বলা হবে যা ডিস্ক ইমেজ এ কাজ করার একসেস দেয়।
অপারেটিং সিস্টেমটি এসডি কার্ডে 'write' করা হবে এবং কার্ডটি সম্পূর্ণ হয়ে গেলে ওএস দ্বারা 'ইজেক্ট' করে দেওয়া হবে এবং ইউজারকে অবহিত করা হবে। এটি হয়ে গেলে, কম্পিউটার থেকে এসডি কার্ড সরিয়ে তা পাই তে প্রবেশ করিয়ে তা চালু করতে হবে।
#### পাই এর সাথে সংযোগ
পরবর্তী ধাপ হলো পাই তে রিমোট একসেস পাওয়া। এটি `ssh` ব্যবহার করে করা যায়, যা ম্যাক-ওএস, লিনাক্স এবং উইন্ডোজের সাম্প্রতিক ভার্সনগুলোতে রয়েছে।
##### কাজ - পাই এর সাথে সংযোগ
পাই এ রিমোট একসেস
1. টার্মিনাল বা কমান্ড প্রম্পট চালু করতে হবে এবং পাই কে যুক্ত করার জন্য নীচের কমান্ডটি চালু করতে হবে।
```sh
ssh pi@raspberrypi.local
```
উইন্ডোজের পুরাতন ভার্সন, যেসবে `ssh` নেই সেখানে কী করা যায় ? খুব সহজ - OpenSSH ব্যবহার করা যাবে। ইন্সটল করার সব নির্দেশনা [OpenSSH installation documentation](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn) এ পাওয়া যাবে।
1. এটি পাইয়ের সাথে সংযুক্ত হয়ে এবং পাসওয়ার্ড চাইবে।
আমাদের কম্পিউটার নেটওয়ার্ক `<hostname>.local` এই কমান্ডের মাধ্যমে জানতে পারাটা বেশ নতুন একটি ফীচার লিনাক্স এবং উইন্ডোজে। যদি লিনাক্স বা উইন্ডোজে এইক্ষেত্রে হোস্টনেম পাওয়া না গিয়ে বরং এরর আসে তাহলে, অতিরিক্ত সফটওয়্যার ইন্সটল করতে হবে যাতে করে 'ZeroConf networking' চালু করা যায় (এপল ডিভাইসের জন্য 'Bonjour'):
1. লিনাক্স ব্যবহারকারী হলে, Avahi ইন্সটল করতে হবে নীচের কমান্ড ব্যবহার করে:
```sh
sudo apt-get install avahi-daemon
```
1. উইন্ডোজে সবচেয়ে সহজে 'ZeroConf networking' চালু করার জন্য [Bonjour Print Services for Windows](http://support.apple.com/kb/DL999) ইন্সটল করলেই হবে। এছাড়াও [iTunes for Windows](https://www.apple.com/itunes/download/) ইন্সটল করলেও হবে, আর এতে কিছু নতুন সুবিধা রয়েছে যা স্ট্যান্ড-এলোন হিসেবে সাধারণত পাওয়া যায়না।
> 💁 যদি `raspberrypi.local` ব্যবহার করে কানেক্ট করা না যায় , তখন পাই এর আইপি এড্রেস ব্যবহার করতে হবে। এই সংক্রান্ত নির্দেশনা [Raspberry Pi IP address documentation](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) এ বিস্তারিত দেয়া রয়েছে।
1. রাস্পবেরি পাই ইমেজার এডভান্সড অপশনে যে পাসওয়ার্ডটি সেট করা হয়েছিল, তা প্রবেশ করাতে হবে।
#### পাই এ সফ্টওয়্যার কনফিগার
একবার পাইয়ের সাথে সংযুক্ত হয়ে গেলে, আমাদেরকে খেয়াল রাখতে হবে ওএস আপ টু ডেট রয়েছে কিনা এবং গ্রোভ হার্ডওয়ারের সাথে যুক্ত বিভিন্ন লাইব্রেরি এবং সরঞ্জাম ইনস্টল করতে হবে।
##### কাজ - পাই সফ্টওয়্যার কনফিগার
পাই সফ্টওয়্যার কনফিগার এবং গ্রোভ লাইব্রেরি ইন্সটল করা।
1. `ssh` সেশন থেকে, নিচের কমান্ডগুলো রান করতে হবে এবং আপডেট করার পর , পাই রিব্যুট করতে হবে।
```sh
sudo apt update && sudo apt full-upgrade --yes && sudo reboot
```
আপডেট এবং রিব্যুট হয়ে যাবে আর তা শেষ হলে `ssh`সেশন শেষ হয়ে যাবে। তাই ৩০ সেকেন্ড পর পুনরায় কানেক্ট করতে হবে।
1. রিকানেক্ট করা `ssh` সেশনে , নিচের কমান্ডগুলো রান করতে হবে গ্রোভ লাইব্রেরি ইন্সটল করার জন্য:
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
পাইথনের অন্যতম শক্তিশালী একটি সুবিধা হলো [pip packages](https://pypi.org) ইন্সটল করতে পারা - পিপ প্যাকেজ হলো অন্যদের তৈরী ও পাবলিশ করা কোডের প্যাকেজ। মাত্র ১টা কমান্ড দিয়েই পিপ ইন্সটল করে ব্যবহার করা যায়। এই গ্রুভ ইন্সটল স্ক্রিপ্ট টি রান করলে, তা আমাদের প্রয়োজনীয় সকল ট্যুল ইন্সটল করে নিবে।
1. নিচের কমান্ডটি রান করে রিব্যুট করতে হবে:
```sh
sudo reboot
```
পাই রিব্যুট হওয়ার পর `ssh`সেশন শেষ হয়ে যাবে। রিকানেক্ট করার আর প্রয়োজন নেই।
#### রিমোট একসেসের জন্য ভিএস কোড কনফিগার
পাই কনফিগার করার পরে, এটাতে Visual Studio Code (অর্থাৎ VS Code) এর মাধ্যমে কানেক্ট করা যাবে।
##### কাজ - রিমোট একসেসের জন্য ভিএস কোড কনফিগার
প্রয়োজনীয় সফ্টওয়্যার ইনস্টল করে এবং পাই এর সাথে রিমোট বা দূরবর্তী সংযোগ স্থাপন করতে হবে।
1. [VS Code documentation](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) অনুসারে ভিসুয়াল স্টুডিও কোড ইন্সটল করতে হবে।
1. তারপর [VS Code Remote Development using SSH documentation](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) অনুসরণ করে প্রয়োজনীয় সব কম্পোনেন্ট ইন্সটল করতে হবে।
1. একই গাইড ফলো করে রাস্পবেরি পাই কে ভিএস কোডের সাথে সংযুক্ত করতে হবে।
1. কানেক্ট হয়ে যাওয়ার পরে [managing extensions](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn) অনুসারে [Pylance extension](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) রিমোট মাধ্যমে পাই তে ইন্সটল করতে হবে।
## Hello world (হ্যালো ওয়ার্লড)
কোন নতুন প্রোগ্রামিং ভাষা বা প্রযুক্তি শেখা শুরু করার সময় এটি প্রচলিত রয়েছে যে - একটি 'হ্যালো ওয়ার্ল্ড' অ্যাপ্লিকেশন তৈরির মাধ্যমে যাত্রা শুরু করা । 'হ্যালো ওয়ার্ল্ড'- একটি ছোট অ্যাপ্লিকেশন যা `"Hello World"` আউটপুট হিসেবে প্রদান করবে আর এতে আমরা বুঝতে পারি যে আমাদের সব কনফিগারেশন ঠিক আছে কিনা।
এক্ষেত্রে 'হ্যালো ওয়ার্ল্ড' অ্যাপটি নিশ্চিত করবে যে আমাদের পাইথন এবং ভিজ্যুয়াল স্টুডিও কোডটি সঠিকভাবে ইনস্টল করা হয়েছে।
এই অ্যাপ্লিকেশনটি `nightlight` নামে একটি ফোল্ডারে থাকবে এবং নাইটলাইট অ্যাপ্লিকেশনটি তৈরি করতে এই অ্যাসাইনমেন্টের পরবর্তী অংশগুলিতে এটি বিভিন্ন কোডের সাথে পুনরায় ব্যবহার করা হবে।
### কাজ - হ্যালো ওয়ার্লড
'হ্যালো ওয়ার্ল্ড' অ্যাপ তৈরী করা
1. ভিএস কোড চালু করতে হবে। সরসারি রাস্পবেরি পাই অথবা কম্পিউটার থেকে এটি করা যাবে যা Remote SSH extension দিয়ে পাই এর সাথে যুক্ত ।
1. ভিএস কোডের টার্মিনাল চালু করতে হবে, এজন্য আমাদেরকে এই ধারা অনুসরণ করতে হবে *Terminal -> New Terminal অথবা `` CTRL+` `` টাইপ করে। এটি `pi` ইউজারের হোম ডিরেক্টরি চালু করবে।
1. নিচের কমান্ড রান করার মাধ্যমে কোড এর জন্য একটি ডিরেক্টরি ক্রিয়েট করা হবে এবং আমরা `app.py` নামের একটি পাইথন ফাইল সেই ডিরেক্টরি তে তৈরী করছি:
```sh
mkdir nightlight
cd nightlight
touch app.py
```
1. এই ফোল্ডারটি ভিএস কোডের মাধ্যমে ওপেন করতে হবেঃ *File -> Open...* তারপর *nightlight* folder সিলেক্ট করে **OK** তে ক্লিক করতে হবে।
![The VS Code open dialog showing the nightlight folder](../../../../images/vscode-open-nightlight-remote.png)
1. `app.py` ফাইলটি ভিএস কোড এক্সপ্লোরারের মাধ্যমে ওপেন করে, নিম্নের কোডটি লিখি
```python
print('Hello World!')
```
এখানে `print` ফাংশনটি এর ভেতরে যা রাখা হবে, তাকে আউটপুট হিসেবে প্রদর্শন করবে।
1. ভিএস কোড টার্মিনাল থেকে নিচের কমান্ডটি রান করানো হলে, পাইথন ফাইলটি রান করবে :
```sh
python3 app.py
```
> 💁 এই কোডটি চালানোর জন্য স্পষ্টভাবে `Python 3` কল করতে হবে কেননা ডিভাইসে যদি পাইথন 3 (সর্বশেষ সংস্করণ) ছাড়াও পাইথন 2 ইনস্টল করা থাকে সেক্ষেত্রে সমস্যা এড়ানোর জন্য। যদি আমাদের পাইথন 2 ইনস্টল থাকে তবে `Python` কল করলে, পাইথন 3 এর পরিবর্তে পাইথন 2 ব্যবহার হবে যা আমাদের অবশ্যই এড়িয়ে চলতে হবে।
টার্মিনালে নিম্নোক্ত আউটপুট দেখাবে :
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Hello World!
```
> 💁 এই সম্পূর্ণ কোডটি পাওয়া যাবে [code/pi](../code/pi) ফোল্ডারে ।
😀 আমাদের 'Hello World'প্রোগ্রাম সফল হলো !

@ -1,247 +0,0 @@
# रास्पबेरी पाई
[रास्पबेरी पाई](https://raspberrypi.org) एक सिंगल-बोर्ड कंप्यूटर है। आप कई तरह के उपकरणों और पारिस्थितिक तंत्रों का उपयोग करके सेंसर और एक्ट्यूएटर जोड़ सकते हैं, और इन पाठों के लिए [ग्रोव](https://www.seeedstudio.com/category/Grove-c-1003.html) नामक हार्डवेयर पारिस्थितिकी तंत्र का उपयोग कर सकते हैं। आप अपने पाई को कोड करेंगे और पायथन का उपयोग करके ग्रोव सेंसर तक पहुंचेंगे।
![एक रास्पबेरी पाई 4](../../../../images/raspberry-pi-4.jpg)
***रास्पबेरी पाई 4. माइकल हेन्ज़लर / [विकिमीडिया कॉमन्स](https://commons.wikimedia.org/wiki/Main_Page) / [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)***
## सेट अप
यदि आप अपने आईओटी हार्डवेयर के रूप में रास्पबेरी पाई का उपयोग कर रहे हैं, तो आपके पास दो विकल्प हैं - आप इन सभी पाठों और कोड के माध्यम से सीधे पाई पर काम कर सकते हैं, या आप दूरस्थ रूप से 'हेडलेस' पाई से कनेक्ट करके अपने कंप्यूटर से कोड कर सकते हैं।
शुरू करने से पहले, आपको ग्रोव बेस हैट को अपने पाई से कनेक्ट करना होगा।
### टास्क - सेटअप
अपने पाई पर ग्रोव बेस हैट स्थापित करें और पाई को कॉन्फ़िगर करें
1. ग्रोव बेस हैट को अपने पाई से कनेक्ट करें। हैट का सॉकेट पाई पर सभी जी.पी.आई.ओ पिनों पर फिट बैठता है, पाई पर मजबूती से बैठाने के लिए सभी तरह से पिन को नीचे की ओर खिसकायें। यह पाई के ऊपर बैठता है उसे ढकते हुए।
![ग्रोव हैट फिट करना](../../../../images/pi-grove-hat-fitting.gif)
1. तय करें कि आप अपने पाई को कैसे प्रोग्राम करना चाहते हैं, और नीचे दिए गए संबंधित अनुभाग पर जाएं:
* [सीधे अपने पाई पर काम करें](#सीधे-अपने-पाई-पर-काम-करें)
* [पाई को कोड करने के लिए रिमोट एक्सेस](#पाई-को-कोड-करने-के-लिए-रिमोट-एक्सेस)
### सीधे अपने पाई पर काम करें
यदि आप सीधे अपने पाई पर काम करना चाहते हैं, तो आप रास्पबेरी पाई ओएस के डेस्कटॉप संस्करण का उपयोग कर सकते हैं और अपने सभी आवश्यक टूल्स इंस्टॉल कर सकते हैं।
#### टास्क - सीधे अपने पाई पर काम करें
विकास के लिए अपना पाई सेट करें।
1. अपना पाई सेट करने के लिए [रास्पबेरी पाई सेटअप गाइड](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) में दिए गए निर्देशों का पालन करें, इसे कीबोर्ड/माउस/मॉनिटर से कनेक्ट करें, अपने वाईफाई या ईथरनेट नेटवर्क से कनेक्ट करें और सॉफ्टवेयर को अपडेट करें। जिस ओएस को आप इंस्टॉल करना चाहते हैं वह **Raspberry Pi OS (32 bit)** है, एस.डी. कार्ड इमेज के लिए रास्पबेरी पाई इमेजर इसे अनुशंसित ओएस (Recommended OS) के रूप में चिह्नित करता है।
ग्रोव सेंसर और एक्चुएटर्स का उपयोग करके पाई को प्रोग्राम करने के लिए, आपको डिवाइस कोड, और ग्रोव हार्डवेयर के साथ इंटरैक्ट करने वाले विभिन्न लाइब्रेरीज़ और उपकरणों को लिखने की अनुमति देने के लिए एक एडीटर स्थापित करने की आवश्यकता होगी।
1. एक बार आपका पाई रीबूट हो जाने के बाद, शीर्ष मेनू बार पर **Terminal** आइकन पर क्लिक करके टर्मिनल लॉन्च करें, या *Menu -> Accessories -> Terminal* चुनें
1. ओएस और स्थापित सॉफ़्टवेयर अद्यतित है यह सुनिश्चित करने के लिए निम्न आदेश चलाएं:
```sh
sudo apt update && sudo apt full-upgrad --yes
```
1. ग्रोव हार्डवेयर के लिए सभी आवश्यक लाइब्रेरीज़ को स्थापित करने के लिए निम्न आदेश चलाएँ:
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
पायथन की शक्तिशाली विशेषताओं में से एक [पिप पैकेज](https://pypi.org) स्थापित करने की क्षमता है - ये अन्य लोगों द्वारा लिखे गए और इंटरनेट पर प्रकाशित कोड के पैकेज हैं। आप अपने कंप्यूटर पर एक कमांड के साथ एक पिप पैकेज स्थापित कर सकते हैं, फिर उस पैकेज को अपने कोड में उपयोग कर सकते हैं। यह ग्रोव इंस्टाल स्क्रिप्ट उन पिप पैकेजों को स्थापित करेगा जिनका उपयोग आप पायथन से ग्रोव हार्डवेयर के साथ काम करने के लिए करेंगे।
1. या तो मेनू का उपयोग करके या टर्मिनल में निम्न कमांड चलाकर पाई को रिबूट करें:
```sh
sudo reboot
```
1. एक बार पाई रीबूट हो जाने के बाद, टर्मिनल को फिर से लॉन्च करें और [विजुअल स्टूडियो कोड (वीएस कोड)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) स्थापित करने के लिए निम्न आदेश चलाएं - यह वह संपादक है जिसका उपयोग आप अपने डिवाइस कोड को पायथन में लिखने के लिए करेंगे।
```sh
sudo apt install code
```
एक बार यह इंस्टॉल हो जाने के बाद, वीएस कोड शीर्ष मेनू से उपलब्ध होगा।
>💁 यदि आपके पास कोई पसंदीदा टूल है, तो आप इन पाठों के लिए किसी भी पायथन आईडीई या संपादक का उपयोग करने के लिए स्वतंत्र हैं, लेकिन पाठ वीएस कोड के उपयोग के आधार पर निर्देश देंगे।
1. पाइलेंस स्थापित करें। यह वीएस कोड के लिए एक एक्सटेंशन है जो पायथन भाषा समर्थन प्रदान करता है। वीएस कोड में इस एक्सटेंशन को स्थापित करने के निर्देशों के लिए [पायलेंस एक्सटेंशन डॉक्यूमेंटेशन](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) देखें।
### पाई को कोड करने के लिए रिमोट एक्सेस
पीआई पर सीधे कोडिंग करने के बजाय, इसे आप 'हेडलेस' चला सकते है यानी कि बिना कीबोर्ड/माउस/मॉनिटर जोड़े, और विजुअल स्टूडियो कोड का उपयोग करके अपने कंप्यूटर से कॉन्फ़िगर और कोड कर सकते है।
#### पाई ओएस सेट करें
दूरस्थ रूप से कोड करने के लिए, पीआई ओएस को एसडी कार्ड पर इंस्टॉल करना होगा।
##### टास्क - पाई ओएस सेट करें
हेडलेस पाई ओएस सेट करें।
1. [रास्पबेरी पाई ओएस सॉफ्टवेयर पेज](https://www.raspberrypi.org/software/) से **Raspberry Pi Imager** डाउनलोड करें और इसे इंस्टॉल करें
1. यदि आवश्यक हो तो एडेप्टर का उपयोग करके अपने कंप्यूटर में एक एसडी कार्ड डालें
1. रास्पबेरी पाई इमेजर लॉन्च करें
1. रास्पबेरी पाई इमेजर से, **Chosse OS** बटन चुनें, फिर *Raspberry Pi OS (Other)* चुनें, उसके बाद *Raspberry Pi OS Lite (32-bit)*
![रास्पबेरी पाई ओएस लाइट के साथ रास्पबेरी पाई इमेजर चयनित](../../../../images/raspberry-pi-imager.png)
> रास्पबेरी पाई ओएस लाइट रास्पबेरी पाई ओएस का एक संस्करण है जिसमें डेस्कटॉप यूआई या यूआई आधारित उपकरण नहीं हैं। हेडलेस पाई के लिए इनकी आवश्यकता नहीं होती है और यह इंस्टाल को छोटा और बूट अप समय को तेज बनाता है।
1. **CHOOSE OS** बटन चुनें, फिर अपना एसडी कार्ड चुनें
1. `Ctrl+Shift+X` दबाकर **Advanced Options** लॉन्च करें। एसडी कार्ड में इमेज किए जाने से पहले ये विकल्प रास्पबेरी पाई ओएस के कुछ पूर्व-कॉन्फ़िगरेशन की अनुमति देते हैं।
1. **Enable SSH** चेक बॉक्स चेक करें, और `pi` उपयोगकर्ता के लिए पासवर्ड सेट करें। यह वह पासवर्ड है जिसका उपयोग आप बाद में पाई में लॉग इन करने के लिए करेंगे।
1. यदि आप वाईफाई पर पाई से कनेक्ट करने की योजना बना रहे हैं, तो **Configure WiFi** चेक बॉक्स को चेक करें, और अपना वाईफाई SSID और पासवर्ड दर्ज करें, साथ ही अपने वाईफाई देश का चयन करें। यदि आप ईथरनेट केबल का उपयोग करेंगे तो आपको ऐसा करने की आवश्यकता नहीं है। सुनिश्चित करें कि जिस नेटवर्क से आप कनेक्ट हैं वह वही है जिससे आपका कंप्यूटर भी कनेक्ट है।
1. **Set locale settings** चेक बॉक्स चेक करें, और अपना देश और समय क्षेत्र सेट करें
1. ** SAVE** बटन चुनें
1. एसडी कार्ड में ओएस लिखने के लिए ** WRITE** बटन चुनें। यदि आप macOS का उपयोग कर रहे हैं, तो आपको अपना पासवर्ड दर्ज करने के लिए कहा जाएगा क्योंकि डिस्क इमेज लिखने वाले अंतर्निहित टूल को इस कार्ये के लिए विशेषाधिकार प्राप्त करने की आवश्यकता होती है।
ओएस एसडी कार्ड पर लिखा जाएगा, और एक बार पूरा हो जाने पर ओएस द्वारा इजेक्ट किया जाएगा, और आपको सूचित किया जाएगा। अपने कंप्यूटर से एसडी कार्ड निकालें, इसे पाई में डालें और पाई को पावर दें।
#### पाई से जुड़ें
अगला कदम पाई को दूरस्थ रूप से एक्सेस करना है। आप इसे `ssh` का उपयोग करके कर सकते हैं, जो macOS, Linux और Windows के नवीनतम संस्करणों पर उपलब्ध है।
##### टास्क - पाई से कनेक्ट करें
पाई को दूरस्थ रूप से एक्सेस करें।
1. टर्मिनल या कमांड प्रॉम्प्ट लॉन्च करें, और पाई से कनेक्ट करने के लिए निम्न आदेश दर्ज करें:
```sh
ssh pi@raspberrypi.local
```
यदि आप Windows पर पुराने संस्करण का उपयोग कर रहे हैं जिसमें `ssh` स्थापित नहीं है, तो आप OpenSSH का उपयोग कर सकते हैं। आप [ओपन एसएसएच इंस्टॉलेशन डॉक्यूमेंटेशन](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn) में इंस्टॉलेशन निर्देश पा सकते हैं।
1. यह आपके पाई से जुड़ना चाहिए और पासवर्ड मांगना चाहिए।
`<hostname>.local` का उपयोग करके अपने नेटवर्क पर कंप्यूटर खोजने में सक्षम होना Linux और Windows के लिए एक नया फ़ीचर है। यदि आप Linux या Windows का उपयोग कर रहे हैं और आपको होस्टनाम नहीं मिलने के बारे में कोई त्रुटि मिलती है, तो आपको ZeroConf नेटवर्किंग को सक्षम करने के लिए अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता होगी (जिसे Apple द्वारा Bonjour भी कहा जाता है):
1. यदि आप Linux का उपयोग कर रहे हैं, तो अवही को निम्न कमांड का उपयोग करके स्थापित करें:
```sh
sudo apt-get install avahi-daemon
```
1. यदि आप Windows का उपयोग कर रहे हैं, तो ZeroConf को सक्षम करने का सबसे आसान तरीका [विंडोज़ के लिए बोनजोर प्रिंट सर्विसेज](http://support.apple.com/kb/DL999) स्थापित करना है। आप उपयोगिता का नया संस्करण प्राप्त करने के लिए [Windows के लिए आईट्यून्स](https://www.apple.com/itunes/download/) भी इंस्टॉल कर सकते हैं (जो स्टैंडअलोन उपलब्ध नहीं है)।
> 💁 यदि आप `raspberrypi.local` का उपयोग करके कनेक्ट नहीं कर सकते हैं, तो आप अपने पाई के आईपी ​​​​एड्रेस का उपयोग कर सकते हैं। आईपी ​​​​एड्रेस प्राप्त करने के कई तरीकों के निर्देशों के लिए [रास्पबेरी पाई आईपी एड्रेस डॉक्यूमेंटेशन](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) देखें।
1. रास्पबेरी पाई इमेजर एडवांस्ड ऑप्शंस में आपके द्वारा सेट किया गया पासवर्ड दर्ज करें
#### Pi पर सॉफ़्टवेयर कॉन्फ़िगर करें
एक बार जब आप पीआई से जुड़ जाते हैं, तो यह सुनिश्चित करने की ज़रूरत है कि आपका ओएस अप्डेटेड है, और ग्रोव हार्डवेयर के साथ बातचीत करने वाले विभिन्न लाइब्रेरीज़ और उपकरणों को स्थापित/इंस्टॉल करें।
##### कार्य - Pi पर सॉफ़्टवेयर कॉन्फ़िगर करें
पूर्व-स्थापित पाई सॉफ्टवेयर को कॉन्फ़िगर करें और ग्रोव लाइब्रेरीज़ स्थापित करें।
1. अपने `ssh` सत्र से, अद्यतन करने के लिए निम्नलिखित कमांड चलाएँ और फिर पाई को रिबूट करें:
```sh
sudo apt update && sudo apt full-upgrade --yes && sudo reboot
```
पाई को अपडेट और रीबूट किया जाएगा। Pi के रीबूट होने पर `ssh` सत्र समाप्त हो जाएगा, इसलिए इसे लगभग 30 सेकंड के लिए छोड़ दें और फिर से कनेक्ट करें।
1. फिर से जुड़े `ssh` सत्र से, ग्रोव हार्डवेयर के लिए सभी आवश्यक लाइब्रेरीज़ स्थापित करने के लिए निम्न आदेश चलाएँ:
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
पायथन की शक्तिशाली विशेषताओं में से एक [पिप पैकेज](https://pypi.org) स्थापित करने की क्षमता है - ये अन्य लोगों द्वारा लिखे गए कोड के पैकेज हैं और इंटरनेट पर प्रकाशित होते हैं। आप अपने कंप्यूटर पर एक कमांड के साथ एक पिप पैकेज स्थापित कर सकते हैं, फिर उस पैकेज को अपने कोड में उपयोग कर सकते हैं। यह ग्रोव इंस्टाल स्क्रिप्ट उन पिप पैकेजों को स्थापित करेगा जिनका उपयोग आप पायथन से ग्रोव हार्डवेयर के साथ काम करने के लिए करेंगे।
1. निम्न आदेश चलाकर पाई को रीबूट करें:
```sh
sudo reboot
```
पाइ के रीबूट होने पर `ssh` सत्र समाप्त हो जाएगा। पुन: कनेक्ट करने की कोई आवश्यकता नहीं है।
#### रिमोट एक्सेस के लिए वीएस कोड कॉन्फ़िगर करें
एक बार पाई कॉन्फ़िगर हो जाने के बाद, आप अपने कंप्यूटर से विजुअल स्टूडियो कोड (वीएस कोड) का उपयोग करके इससे जुड़ सकते हैं - यह एक मुफ्त डेवलपर टेक्स्ट एडिटर है जिसका उपयोग आप अपने डिवाइस कोड को पायथन में लिखने के लिए करेंगे।
##### कार्य - रिमोट एक्सेस के लिए वीएस कोड कॉन्फ़िगर करें
आवश्यक सॉफ़्टवेयर स्थापित करें और दूरस्थ रूप से अपने पाई से कनेक्ट करें।
1. [वीएस कोड प्रलेखन](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) का पालन करके अपने कंप्यूटर पर वीएस कोड स्थापित करें।
1. आवश्यक घटकों को स्थापित करने के लिए [एसएसएच दस्तावेज़ीकरण का उपयोग कर वीएस कोड रिमोट डेवलपमेंट](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) में दिए गए निर्देशों का पालन करें।
1. समान निर्देशों का पालन करते हुए, VS कोड को पाइ से कनेक्ट करें
1. कनेक्ट होने के बाद, [पाइलेंस एक्सटेंशन](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) इंस्टॉल करने के लिए [मैनेजिंग एक्सटेंशन](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn#_managing-extensions) निर्देशों का पालन करें।
## हैलो वर्ल्ड
एक नई प्रोग्रामिंग भाषा या तकनीक के साथ शुरू करते समय यह पारंपरिक है कि हम एक छोटे से एप्लिकेशन का निर्माण करें जो हैलो वर्ल्ड प्रिंट करता हो - यह दिखाने के लिए कि सभी टूल्स सही तरीके से कॉन्फ़िगर किए गए हैं
पाई के लिए हैलो वर्ल्ड ऐप यह सुनिश्चित करेगा कि आपके पास पायथन और विजुअल स्टूडियो कोड सही तरीके से स्थापित है।
यह ऐप `नाइटलाइट` नामक फ़ोल्डर में होगा, और नाइटलाइट एप्लिकेशन बनाने के लिए इस असाइनमेंट के बाद के हिस्सों में हैलो वर्ल्ड को अलग-अलग कोड के साथ फिर से उपयोग किया जाएगा।
### कार्य - हैलो वर्ल्ड लिखना
हेलो वर्ल्ड ऐप बनाएं।
1. वीएस कोड लॉन्च करें, या तो सीधे पीआई पर, या अपने कंप्यूटर पर और रिमोट एसएसएच एक्सटेंशन का उपयोग करके पाई से कनेक्ट करें
1. *Terminal -> New Terminal* या `` CTRL+` `` दबाकर VS कोड टर्मिनल लॉन्च करें। यह `pi` उपयोगकर्ताओं की होम निर्देशिका के लिए खुलेगा।
1. अपने कोड के लिए एक निर्देशिका बनाने के लिए निम्नलिखित कमांड चलाएँ, और उस निर्देशिका के अंदर `app.py` नामक एक पायथन फ़ाइल बनाएँ:
```sh
mkdir nightlight
cd nightlight
touch app.py
```
1. इस फोल्डर को VS कोड में खोलें *File -> Open...* का चयन करें और *नाइटलाइट* फोल्डर का चयन करें, फिर **ओके** दबाएं
![वी.एस. कोड ओपन डायलॉग जो नाइटलाइट फोल्डर दिखा रहा है](../../../../images/vscode-open-nightlight-remote.png)
1. वीएस कोड एक्सप्लोरर से `app.py` फ़ाइल खोलें और निम्नलिखित कोड जोड़ें:
```python
print('Hello World!')
```
`print` फ़ंक्शन कंसोल पर जो कुछ भी पास किया जाता है उसे प्रिंट करता है।
1. वीएस कोड टर्मिनल से, अपना पायथन ऐप चलाने के लिए निम्नलिखित चलाएँ:
```sh
python3 app.py
```
> 💁 इस कोड को चलाने के लिए आपको स्पष्ट रूप से `python3` को कॉल करने की आवश्यकता है, यदि आपके पास Python 3 (नवीनतम संस्करण) के अलावा Python 2 भी स्थापित है। यदि ऐसा है, तो `python` को कॉल करने से Python 3 के बजाय Python 2 का उपयोग किया जाएगा
आपको निम्न आउटपुट देखना चाहिए:
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Hello World!
```
> 💁 आप इस कोड को [code/pi](code/pi) फोल्डर में पा सकते हैं।
😀 आपका 'हैलो वर्ल्ड' प्रोग्राम सफल रहा!

@ -1,245 +0,0 @@
# Raspberry Pi
O [Raspberry Pi](https://raspberrypi.org) é um computador de placa única. Você pode adicionar sensores e atuadores usando uma ampla variedade de dispositivos e ecossistemas, e para essas lições, usando um ecossistema de hardware chamado [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). Você codificará seu Pi e acessará os sensores Grove usando Python.
![Um Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
## Configuração
Se você estiver usando um Raspberry Pi como seu hardware IoT, você tem duas opções - você pode trabalhar em todas essas lições e codificar diretamente no Pi ou pode se conectar remotamente a um Pi 'headless' e codificar de seu computador.
Antes de começar, você também precisa conectar o Grove Base Hat ao seu Pi.
### Tarefa - configuração
Instale o Grove Base Hat no seu Pi e configure o Pi
1. Conecte o Grove Base Hat ao seu Pi. O soquete no Grove Base Hat se encaixa em todos os pinos de GPIO no Pi, deslizando para baixo sobre os pinos para que se assente firmemente na base. Ele fica sobre o Pi, cobrindo-o.
![Ajustando o Grove Hat](../../../../images/pi-grove-hat-fitting.gif)
1. Decida como você deseja programar seu Pi e vá para a seção relevante abaixo:
* [Trabalhe diretamente no seu Pi](#trabalhe-diretamente-no-seu-pi)
* [Acesso remoto para codificar o Pi](#acesso-remoto-para-codificar-o-pi)
### Trabalhe diretamente no seu Pi
Se você quiser trabalhar diretamente no seu Pi, pode usar a versão desktop do Raspberry Pi OS e instalar todas as ferramentas de que precisa.
#### Tarefa - trabalhe diretamente no seu Pi
Configure seu Pi para desenvolvimento.
1. Siga as instruções no [guia de configuração do Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) para configurar seu Pi, conecte-o a um teclado/mouse/monitor, conecte-o à sua rede WiFi ou ethernet e atualize o software. O sistema operacional que você deseja instalar é o **Raspberry Pi OS (32 bits)**, ele é marcado como o sistema operacional recomendado ao usar o Raspberry Pi Imager para criar a imagem do seu cartão SD.
Para programar o Pi usando os sensores e atuadores Grove, você precisará instalar um editor para permitir que você escreva o código do dispositivo e várias bibliotecas e ferramentas que interagem com o hardware Grove.
1. Assim que seu Pi for reiniciado, inicie o Terminal clicando no ícone **Terminal** na barra de menu superior ou escolha *Menu -> Acessórios -> Terminal*
1. Execute o seguinte comando para garantir que o sistema operacional e o software instalado estejam atualizados:
```sh
sudo apt update && sudo apt full-upgrade --yes
```
1. Execute o seguinte comando para instalar todas as bibliotecas necessárias para o hardware Grove:
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
Um dos recursos poderosos do Python é a capacidade de instalar [pacotes pip](https://pypi.org) - são pacotes de código escritos por outras pessoas e publicados na Internet. Você pode instalar um pacote pip em seu computador com um comando e, em seguida, usar esse pacote em seu código. Este script de instalação do Grove instalará os pacotes pip que você usará para trabalhar com o hardware Grove a partir do Python.
1. Reinicialize o Pi usando o menu ou executando o seguinte comando no Terminal:
```sh
sudo reboot
```
1. Após a reinicialização do Pi, reinicie o Terminal e execute o seguinte comando para instalar o [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) - este é o editor que você usará para escrever o código do seu dispositivo em Python.
```sh
sudo apt install code
```
Depois de instalado, o VS Code estará disponível no menu superior.
> 💁 Você está livre para usar qualquer IDE de Python ou editor para essas lições se tiver uma ferramenta preferida, mas as lições darão instruções baseadas no uso do VS Code.
1. Instale o Pylance. Esta é uma extensão para VS Code que fornece suporte à linguagem Python. Consulte a [documentação da extensão Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) para obter instruções sobre como instalar esta extensão no VS Code.
### Acesso remoto para codificar o Pi
Em vez de codificar diretamente no Pi, ele pode rodar 'headless', quando não está conectado a um teclado/mouse/monitor, e assim configurar e codificar nele a partir do seu computador, usando o Visual Studio Code.
#### Configure o Pi OS
Para codificar remotamente, o Pi OS precisa ser instalado em um cartão SD.
##### Tarefa - configurar o Pi OS
Configure o Pi OS headless.
1. Baixe o **Raspberry Pi Imager** da [página do software Raspberry Pi OS](https://www.raspberrypi.org/software/) e instale-o
1. Insira um cartão SD em seu computador, usando um adaptador, se necessário
1. Inicie o Raspberry Pi Imager
1. No Raspberry Pi Imager, selecione o botão **CHOOSE OS** e, em seguida, selecione *Raspberry Pi OS (Other)*, seguido por *Raspberry Pi OS Lite (32 bits)*
![O Raspberry Pi Imager com o Raspberry Pi OS Lite selecionado](../../../../images/raspberry-pi-imager.png)
> 💁 Raspberry Pi OS Lite é uma versão do Raspberry Pi OS que não possui a UI para desktop ou ferramentas baseadas em UI. Eles não são necessários para um Pi headless e tornam a instalação menor e o tempo de inicialização mais rápido.
1. Selecione o botão **CHOOSE STORAGE** e, em seguida, selecione seu cartão SD
1. Inicie as **Advanced Options** pressionando `Ctrl+Shift+X`. Essas opções permitem alguma pré-configuração do sistema operacional do Raspberry Pi antes que sua imagem seja criada no cartão SD.
1. Marque a caixa de seleção **Enable SSH** e defina uma senha para o usuário `pi`. Esta é a senha que você usará para fazer login no Pi mais tarde.
1. Se você está planejando se conectar ao Pi por WiFi, marque a caixa de seleção **Configure WiFi** e insira o SSID e a senha do seu WiFi, bem como selecione o país do seu WiFi. Você não precisa fazer isso se for usar um cabo Ethernet. Certifique-se de que a rede à qual você se conecta é a mesma em que seu computador está.
1. Marque a caixa de seleção **Set locale settings** e defina seu país e fuso horário
1. Selecione o botão **SAVE**
1. Selecione o botão **WRITE** para gravar o sistema operacional no cartão SD. Se estiver usando o macOS, será solicitado que você insira sua senha, pois a ferramenta subjacente que grava imagens de disco precisa de acesso privilegiado.
O sistema operacional será gravado no cartão SD e, uma vez concluído, o cartão será ejetado pelo sistema operacional e você será notificado. Remova o cartão SD do seu computador, insira-o no Pi e ligue o Pi.
#### Conecte-se ao Pi
A próxima etapa é acessar remotamente o Pi. Você pode fazer isso usando `ssh`, que está disponível no macOS, Linux e versões recentes do Windows.
##### Tarefa - conectar ao Pi
Acesse remotamente o Pi.
1. Inicie um Terminal ou Prompt de Comando e digite o seguinte comando para se conectar ao Pi:
```sh
ssh pi@raspberrypi.local
```
Se você estiver no Windows usando uma versão mais antiga que não possui o `ssh` instalado, você pode usar o OpenSSH. Você pode encontrar as instruções de instalação na [documentação de instalação do OpenSSH](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn).
1. Isso deve se conectar ao seu Pi e pedir a senha.
Ser capaz de encontrar computadores em sua rede usando `<hostname>.local` é uma adição bastante recente ao Linux e Windows. Se você estiver usando Linux ou Windows e receber algum erro sobre o nome do host não ser encontrado, será necessário instalar software adicional para habilitar o ZeroConf networking (também conhecido pela Apple como Bonjour):
1. Se você estiver usando Linux, instale o Avahi usando o seguinte comando:
```sh
sudo apt-get install avahi-daemon
```
1. Se você estiver usando o Windows, a maneira mais fácil de ativar o ZeroConf é instalar [Bonjour Print Services para Windows](http://support.apple.com/kb/DL999). Você também pode instalar o [iTunes para Windows](https://www.apple.com/itunes/download/) para obter uma versão mais recente do utilitário (que não está disponível standalone).
> 💁 Se você não conseguir se conectar usando `raspberrypi.local`, poderá usar o endereço IP do seu Pi. Consulte a [documentação do endereço IP do Raspberry Pi](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) para obter instruções sobre várias maneiras de obter o endereço IP.
1. Digite a senha que você definiu nas opções avançadas do Raspberry Pi Imager
#### Configure o software no Pi
Assim que estiver conectado ao Pi, você precisa garantir que o sistema operacional esteja atualizado e instalar várias bibliotecas e ferramentas que interagem com o hardware Grove.
##### Tarefa - configurar software no Pi
Configure o software Pi instalado e instale as bibliotecas Grove.
1. Na sessão `ssh`, execute o seguinte comando para atualizar e reinicie o Pi:
```sh
sudo apt update && sudo apt full-upgrade --yes && sudo reboot
```
O Pi será atualizado e reiniciado. A sessão `ssh` terminará quando o Pi for reiniciado, então deixe-o por cerca de 30 segundos e reconecte.
1. A partir da sessão `ssh` reconectada, execute o seguinte comando para instalar todas as bibliotecas necessárias para o hardware Grove:
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
Um dos recursos poderosos do Python é a capacidade de instalar [pacotes pip](https://pypi.org) - são pacotes de código escritos por outras pessoas e publicados na Internet. Você pode instalar um pacote pip em seu computador com um comando e, em seguida, usar esse pacote em seu código. Este script de instalação do Grove instalará os pacotes pip que você usará para trabalhar com o hardware Grove a partir do Python.
1. Reinicialize o Pi executando o seguinte comando:
```sh
sudo reboot
```
A sessão `ssh` terminará quando o Pi for reiniciado. Não há necessidade de reconectar.
#### Configure o VS Code para acesso remoto
Depois que o Pi estiver configurado, você pode se conectar a ele usando o Visual Studio Code (VS Code) a partir do seu computador - este é um editor de texto para desenvolvedores gratuito que você usará para escrever o código do seu dispositivo em Python.
##### Tarefa - configurar o VS Code para acesso remoto
Instale o software necessário e conecte-se remotamente ao seu Pi.
1. Instale o VS Code em seu computador seguindo a [documentação do VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)
1. Siga as instruções em [VS Code Remote Development using SSH documentation](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) para instalar os componentes necessários
1. Seguindo as mesmas instruções, conecte o VS Code ao Pi
1. Depois de conectado, siga as instruções em [gerenciando extensões](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn) para instalar a [extensão Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) remotamente no Pi
## Hello World
É tradicional, ao começar com uma nova linguagem de programação ou tecnologia, criar um aplicativo 'Hello World' - um pequeno aplicativo que produz algo como o texto `"Hello World"` para mostrar que todas as ferramentas estão configuradas corretamente.
O aplicativo Hello World para o Pi garantirá que você tenha o Python e o Visual Studio Code instalados corretamente.
Este aplicativo estará em uma pasta chamada `nightlight` e será reutilizado com código diferente em partes posteriores desta tarefa para construir o aplicativo nightlight.
### Tarefa - hello world
Crie o aplicativo Hello World.
1. Inicie o VS Code, diretamente no Pi ou em seu computador e conectado ao Pi usando a extensão Remote SSH
1. Inicie o Terminal do VS Code selecionando *Terminal -> Novo Terminal* ou pressionando `` CTRL+` ``. Ele será aberto no diretório inicial dos usuários `pi`.
1. Execute os seguintes comandos para criar um diretório para o seu código e crie um arquivo Python chamado `app.py` dentro desse diretório:
```sh
mkdir nightlight
cd nightlight
touch app.py
```
1. Abra esta pasta no VS Code selecionando *File -> Open...* e selecionando a pasta *nightlight* e, em seguida, selecione **OK**
![A caixa de diálogo de abertura do VS Code mostrando a pasta nightlight](../../../../images/vscode-open-nightlight-remote.png)
1. Abra o arquivo `app.py` no VS Code explorer e adicione o seguinte código:
```python
print('Hello World!')
```
A função `print` imprime tudo o que é passado para ela no console.
1. No Terminal do VS Code, execute o seguinte para executar seu aplicativo Python:
```sh
python3 app.py
```
> 💁 Você precisa chamar explicitamente `python3` para executar este código apenas no caso de ter o Python 2 instalado além do Python 3 (a versão mais recente). Se você tiver Python2 instalado, chamar `python` usará Python 2 em vez de Python 3
A seguinte saída aparecerá no terminal:
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Hello World!
```
> 💁 Você pode encontrar este código na pasta [code/pi](code/pi).
😀 Seu programa 'Hello World' foi um sucesso!

@ -1,244 +0,0 @@
# 树莓派(Raspberry Pi)
[树莓派](https://raspberrypi.org)是一个单板机,你可以用大量的设备和生态系统来给树莓派加上传感器和执行器,在这些课程中我们使用一个叫做[Grove](https://www.seeedstudio.com/category/Grove-c-1003.html)的硬件生态系统你将会用Python来给你的Pi编程和读取传感器。
![一个树莓派 4](../../../../images/raspberry-pi-4.jpg)
## 设置
如果你要使用树莓派来作为你的物联网硬件,那么你有两个选择来完成这些课程 - 直接在树莓派上编码,或者从你的计算机远程连接到无界面的树莓派上来编码。
在你开始之前你还需要把Grove基础扩展板连接到你的Pi上。
### 任务 - 设置
安装Grove基础扩展板并配置好你的树莓派
1. 安装Grove基础扩展板到你的树莓派扩展板上的插孔与Pi上的GPIO引脚一一对应沿着引脚一路滑下去来压住底部扩展板会在上面盖住树莓派。
![安装grove扩展板](../../../../images/pi-grove-hat-fitting.gif)
2. 决定你要如何来编码你的树莓派,并直接跳到下面相关的部分:
* [在树莓派上直接编码](#在树莓派上直接编码)
* [远程连接来编码树莓派](#远程连接来编码树莓派)
### 在树莓派上直接编码
如果你想要直接在树莓派上编码你可以使用Raspberry Pi OS的桌面版本并安装你需要的所有工具。
#### 任务 - 在树莓派上直接编码
配置树莓派的开发环境。
1. 跟着[树莓派配置指南](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)的步骤来配置你的树莓派,给它连上一个键盘/鼠标/显示器把它接入你的Wi-Fi或者以太网络然后更新软件。你要安装的是**Raspberry Pi OS (32 bit)**用Raspberry Pi Imager来烧写SD卡的时候一般都会推荐这个操作系统。
想要使用Grove传感器和执行器来给树莓派编程的话你需要安装一个编辑器来编写设备代码和各种用来与Grove硬件交互的函数库、工具。
1. 当你的树莓派重启后,点击上方菜单栏的**Terminal** 图标或者选择*Menu -> Accessories -> Terminal*来启动终端。
1. 运行下面的命令来确保操作系统和已安装的软件都是最新的:
```sh
sudo apt update && sudo apt full-upgrade --yes
```
1. 运行下面的命令来安装所有Grove硬件需要的函数库
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
Python一个强大的特性是可以安装[pip包](https://pypi.org) - 这些都是其他人编写了发布到网上的软件包用一个命令你就可以把一个pip包安装到你的计算机上然后在代码里面使用这个软件包了这个Grove安装脚本会安装你用Python来操控Grove硬件时将会用到的pip软件包。
1. 用菜单点击或者运行下面的命令来重启树莓派:
```sh
sudo reboot
```
1. 树莓派重启后,重新打开终端并运行下面的命令来安装[Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) - 你会使用这个编辑器来编写你的设备Python代码。
```sh
sudo apt install code
```
安装完成后上面的菜单栏就会出现VS Code了。
> 💁 如果你有更喜欢的工具你也可以自由使用任意的Python IDE或者编辑器来学习课程但是课程中会基于VS Code来给出指示。
1. 安装Pylance这是给VS Code提供Python语言支持的扩展插件可以参考这个[Pylance扩展文档](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance)中的指示在VS Code中安装这个插件。
### 远程连接来编码树莓派
除了直接在树莓派上编码,它也可以无界面运行,不连接键盘/鼠标/显示器使用Visual Studio Code从你的计算机来配置和编码树莓派。
#### 配置树莓派操作系统
树莓派操作系统需要被安装在一张SD卡上才能远程编码。
##### 任务 - 配置树莓派操作系统
配置无界面树莓派系统
1. 从[树莓派操作系统软件页面](https://www.raspberrypi.org/software/)下载**Raspberry Pi Imager**并安装
1. 在你的计算机上插入一张SD卡必要时需要使用一个转换器
1. 启动Raspberry Pi Imager
1. 在Raspberry Pi Imager点击**CHOOSE OS**,选择*Raspberry Pi OS (Other)*,然后选择*Raspberry Pi OS Lite (32-bit)*
![Raspberry Pi Imager选择Raspberry Pi OS Lite](../../../../images/raspberry-pi-imager.png)
> 💁 Raspberry Pi OS Lite是一个没有桌面UI或者基于UI的工具的操作系统版本这些对于无界面树莓派来说都是不需要的而且这样可以安装更小的空间、启动速度也更快。
1. 点击**CHOOSE STORAGE** 按钮然后选择你的SD卡
1. 按下`Ctrl+Shift+X`来启动**Advanced Options**这些选项允许你在烧写到SD卡之前对Raspberry Pi OS进行一些预配置。
1. 勾选**Enable SSH**,然后给用户`pi`设置一个密码,这是你等会用来登录的密码。
2. 如果你打算通过WiFi连接到树莓派那么需要勾选**Configure WiFi**然后输入你WiFi的SSID和密码并选择你的国家码。如果打算使用以太网线缆来连接那就不需要做这一步了只需要确保树莓派和你的计算机连接的是同一个网络就行。
3. 勾选**Set locale settings**,设置你的国家和时区。
4. 点击 **SAVE** 按钮
2. 点击**WRITE**按钮把OS烧写到SD卡上如果你使用的是MacOS你会被要求输入你的密码因为底层的写磁盘镜像的工具需要访问权限。
操作系统会被烧写到SD卡上完成之后SD卡会被弹出并且你会收到通知。从你的计算机拔出SD卡再把它插到树莓派上并上电启动。
#### 连接到树莓派
接下来的一个步骤是远程连接树莓派,你可以使用`ssh`这个工具在macOS、Linux和最近几个版本的Windows上都可以直接使用。
##### 任务 - 连接到树莓派
远程连接树莓派。
1. 启动一个终端或者命令提示符,输入下面的命令来连接树莓派:
```sh
ssh pi@raspberrypi.local
```
如果你是在一个老版本没有安装`ssh`的Windows上可以使用OpenSSH你可以在[OpenSSH安装文档](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn)里找到安装指南。
2. 这应该会连上你的树莓派,并且会请求密码。
通过`<hostname>.local`来寻找你的网络中的计算机是Linux和Windows最近才加入的功能如果你是在使用Linux或者Windows过程中遇到一些Hostname无法找到的问题你会需要安装一些额外的软件来启用ZeroConf网络也被Apple称为Bonjour
1. 如果你在使用Linux用下面的命令来安装Avahi
```sh
sudo apt-get install avahi-daemon
```
2. 如果你在使用Windows启用ZeroConf最简单的方法是安装[Bonjour Print Services for Windows](http://support.apple.com/kb/DL999),你也可以安装[iTunes for Windows](https://www.apple.com/itunes/download/)来获取更新版本的组件(无法独立下载安装)。
> 💁 如果你无法通过`raspberrypi.local`连接那么你也可以使用你的树莓派的IP地址参考[树莓派IP地址文档](https://www.raspberrypi.org/documentation/remote-access/ip-address.md)上大量的获取IP地址的方法。
3. 输入你在Raspberry Pi Imager高级选项中输入的密码
#### 在树莓派上配置软件
当你连接上树莓派之后你需要确保这个操作系统是最新的并且安装各类用于和Grove硬件交互的函数库和工具。
##### 任务 - 在树莓派上配置软件
配置已安装的树莓派软件并安装Grove的函数库。
1. 从你的`ssh`会话中,运行下面的命令来更新并重启树莓派:
```sh
sudo apt update && sudo apt full-upgrade --yes && sudo reboot
```
树莓派会被更新并重启,这个`ssh`会话在树莓派重启的时候会中断等待30秒后重连就行。
2. 从重连的`ssh`会话中运行下面的命令来安装Grove硬件需要的函数库
```sh
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
```
Python一个强大的特性是可以安装[pip包](https://pypi.org) - 这些都是其他人编写了发布到网上的软件包用一个命令你就可以把一个pip包安装到你的计算机上然后在代码里面使用这个软件包了这个Grove安装脚本会安装你用Python来操控Grove硬件时将会用到的pip软件包。
3. 用下面的命令来重启树莓派:
```sh
sudo reboot
```
树莓派重启的时候`ssh`会话会中断,不要再重新连接。
#### 配置VS Code的远程连接
树莓派配置完以后你可以从你的计算机通过Visual Studio Code (VS Code)来连接到它 - 这是一个你将要用Python来写设备代码的免费开发者编辑器。
##### 任务 - 配置VS Code的远程连接
安装需要的软件并远程连接到你的树莓派。
1. 跟着[VS Code 文档](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)在你的计算机上安装 VS Code
2. 根据[VS Code远程SSH开发文档](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn)的步骤来安装需要的组件
3. 根据相同的指示连接VS Code到树莓派
4. 连接上之后,根据[管理扩展程序](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn)的指示来远程安装[Pylance扩展程序](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance)到树莓派上
## Hello world
开始一门新的编程语言或者技术时创建一个'Hello World'的程序是一个传统 - 一个输出类似于`"Hello World"`文本的小程序,用来证明所有的工具都已经配置正确了。
树莓派的这个Hello World程序可以确保你已经把Python和Visual Studio Code正确安装了。
这个程序会在一个叫`nightlight`的文件夹里面,他会在这个任务后面部分的不同代码里面再次使用,用来构建夜灯程序。
### 任务 - hello world
创建Hello World应用。
1. 直接在树莓派上启动VS Code或者在你的计算机上用远程SSH扩展来连接到树莓派。
2. 选择 *Terminal -> New Terminal* 或者按下`` CTRL+` `` 来启动VS Code这会打开在`pi`的home目录。
3. 运行下面的命令来为你的代码创建一个目录,并在目录里创建一个叫`app.py`的Python文件
```sh
mkdir nightlight
cd nightlight
touch app.py
```
4. 在VS Code中点击*File -> Open...*并选择*nightlight*文件夹和 **OK** 来打开这个文件夹
![VS Code打开nightlight文件夹的对话框](../../../../images/vscode-open-nightlight-remote.png)
5. 从VS Code窗口打开 `app.py` 文件并增加下面的代码:
```python
print('Hello World!')
```
`print`函数会在终端打印任何传递给它的东西。
6. 从VS Code的终端运行下面的命令来运行你的Python应用
```sh
python3 app.py
```
> 💁 你需要显式的调用`python3`来运行这个代码以防你除了Python 3最新版本还安装了Python 2如果你安装了Python 2那么调用`python`命令时会使用Python 2 而不是Python 3
终端里会出现下面的输出:
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Hello World!
```
> 💁 你可以在[code/pi](../code/pi) 文件夹里找到这个代码
😀 你的'Hello World'程序成功了!

@ -1,210 +0,0 @@
# Computador de placa única virtual
Em vez de comprar um dispositivo IoT, junto com sensores e atuadores, você pode usar seu computador para simular o hardware IoT. O [projeto CounterFit](https://github.com/CounterFit-IoT/CounterFit) permite que você execute um aplicativo localmente que simula hardware IoT, como sensores e atuadores, e acesse os sensores e atuadores a partir do código Python local que está escrito da mesma forma que o código que você escreveria em um Raspberry Pi usando um hardware físico.
## Configuração
Para usar o CounterFit, você precisará instalar alguns softwares gratuitos em seu computador.
### Tarefa
Instale o software necessário.
1. Instale o Python. Consulte a [página de downloads do Python](https://www.python.org/downloads/) para obter instruções sobre como instalar a versão mais recente do Python.
1. Instale o Visual Studio Code (VS Code). Este é o editor que você usará para escrever o código do seu dispositivo virtual em Python. Consulte a [documentação do VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) para obter instruções sobre como instalar o VS Code.
> 💁 Você está livre para usar qualquer IDE ou editor de código Python para essas lições se tiver uma ferramenta preferida, mas as lições darão instruções baseadas no uso do VS Code.
1. Instale a extensão Pylance do VS Code. Esta é uma extensão para VS Code que fornece suporte à linguagem Python. Consulte a [documentação da extensão Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) para obter instruções sobre como instalar esta extensão no VS Code.
As instruções para instalar e configurar o aplicativo CounterFit serão fornecidas no momento relevante nas instruções de atribuição, uma vez que é instalado por projeto.
## Hello world
É tradicional, ao começar com uma nova linguagem de programação ou tecnologia, criar um aplicativo 'Hello World' - um pequeno aplicativo que produz algo como o texto `"Hello World"` para mostrar que todas as ferramentas estão configuradas corretamente.
O aplicativo Hello World para o hardware IoT virtual garantirá que você tenha o Python e o Visual Studio Code instalados corretamente. Ele também se conectará ao CounterFit para os sensores e atuadores IoT virtuais. Ele não usará nenhum hardware, apenas se conectará para provar que tudo está funcionando.
Este aplicativo estará em uma pasta chamada `nightlight` e será reutilizado com código diferente em partes posteriores desta atribuição para construir o aplicativo nightlight.
### Configure um ambiente virtual Python
Um dos recursos poderosos do Python é a capacidade de instalar [pacotes pip](https://pypi.org) - são pacotes de código escritos por outras pessoas e publicados na Internet. Você pode instalar um pacote pip em seu computador com um comando e, em seguida, usar esse pacote em seu código. Você usará o pip para instalar um pacote para falar com o CounterFit.
Por padrão, quando você instala um pacote, ele está disponível em qualquer lugar do seu computador, e isso pode causar problemas com as versões do pacote - como um aplicativo dependendo de uma versão de um pacote que quebra quando você instala uma nova versão para um aplicativo diferente. Para contornar esse problema, você pode usar um [ambiente virtual Python](https://docs.python.org/3/library/venv.html), essencialmente uma cópia do Python em uma pasta dedicada, e ao instalar o pip pacotes são instalados apenas nessa pasta.
#### Tarefa - configurar um ambiente virtual Python
Configure um ambiente virtual Python e instale os pacotes pip para CounterFit.
1. Em seu terminal ou linha de comando, execute o seguinte em um local de sua escolha para criar e navegar para um novo diretório:
```sh
mkdir nightlight
cd nightlight
```
1. Agora execute o seguinte para criar um ambiente virtual na pasta `.venv`
```sh
python3 -m venv .venv
```
> 💁 Você precisa chamar explicitamente `python3` para criar o ambiente virtual apenas no caso de ter o Python 2 instalado além do Python 3 (a versão mais recente). Se você tiver Python2 instalado, chamar `python` usará Python 2 em vez de Python 3
1. Ative o ambiente virtual:
* No Windows, execute:
```cmd
.venv \ Scripts \ activate.bat
```
* No macOS ou Linux, execute:
```cmd
source ./.venv/bin/activate
```
1. Uma vez que o ambiente virtual foi ativado, o comando padrão `python` irá executar a versão do Python que foi usada para criar o ambiente virtual. Execute o seguinte para obter a versão:
```sh
python --version
```
A saída deve conter o seguinte:
```output
(.venv) ➜ nightlight python --version
Python 3.9.1
```
> 💁 Sua versão do Python pode ser diferente - contanto que seja a versão 3.6 ou superior, você está bem. Caso contrário, exclua esta pasta, instale uma versão mais recente do Python e tente novamente.
1. Execute os seguintes comandos para instalar os pacotes pip para CounterFit. Esses pacotes incluem o aplicativo CounterFit principal, bem como shims para hardware Grove. Esses shims permitem que você escreva código como se estivesse programando usando sensores e atuadores físicos do ecossistema Grove, mas conectado a dispositivos IoT virtuais.
```sh
pip install CounterFit
pip install counterfit-connection
pip install counterfit-shims-grove
```
Esses pacotes pip só serão instalados no ambiente virtual e não estarão disponíveis fora dele.
### Escreva o código
Assim que o ambiente virtual Python estiver pronto, você pode escrever o código para o aplicativo 'Hello World'
#### Tarefa - escreva o código
Crie um aplicativo Python para imprimir `" Hello World "` no console.
1. Em seu terminal ou linha de comando, execute o seguinte dentro do ambiente virtual para criar um arquivo Python chamado `app.py`:
* No Windows, execute:
```cmd
type nul > app.py
```
* No macOS ou Linux, execute:
```cmd
touch app.py
```
1. Abra a pasta atual no VS Code:
```sh
code .
```
> 💁 Se o seu terminal retornar `command not found` no macOS, significa que o VS Code não foi adicionado ao seu PATH. Você pode adicionar o VS Code ao seu PATH seguindo as instruções na seção [Iniciando a partir da linha de comando da documentação do código do VS](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) e execute o comando depois. O VS Code é instalado em seu PATH por padrão no Windows e Linux.
1. Quando o VS Code for iniciado, ele ativará o ambiente virtual Python. O ambiente virtual selecionado aparecerá na barra de status inferior:
![VS Code mostrando o ambiente virtual selecionado](../../../../images/vscode-virtual-env.png)
1. Se o Terminal do VS Code já estiver em execução quando o VS Code for inicializado, ele não terá o ambiente virtual ativado nele. A coisa mais fácil a fazer é matar o terminal usando o botão **Kill the active terminal instance**:
![Botão Kill the active terminal instance do VS Code](../../../../images/vscode-kill-terminal.png)
Você pode dizer se o terminal tem o ambiente virtual ativado, pois o nome do ambiente virtual será um prefixo no prompt do terminal. Por exemplo, pode ser:
```sh
(.venv) ➜ nightlight
```
Se você não tiver `.venv` como prefixo no prompt, o ambiente virtual não está ativo no terminal.
1. Inicie um novo Terminal do VS Code selecionando *Terminal -> Novo Terminal* ou pressionando `` CTRL+` ``. O novo terminal irá carregar o ambiente virtual, e a chamada para ativá-lo aparecerá no terminal. O prompt também terá o nome do ambiente virtual (`.venv`):
```output
➜ nightlight source .venv/bin/activate
(.venv) ➜ nightlight
```
1. Abra o arquivo `app.py` no VS Code explorer e adicione o seguinte código:
```python
print('Hello World!')
```
A função `print` imprime no console tudo o que é passado para ela.
1. No terminal do VS Code, execute o seguinte para executar seu aplicativo Python:
```sh
python app.py
```
O seguinte estará na saída:
```output
(.venv) ➜ nightlight python app.py
Hello World!
```
😀 Seu programa 'Hello World' foi um sucesso!
### Conecte o 'hardware'
Como uma segunda etapa 'Hello World', você executará o aplicativo CounterFit e conectará seu código a ele. Isso é o equivalente virtual de conectar algum hardware IoT a um kit de desenvolvimento.
#### Tarefa - conecte o 'hardware'
1. A partir do terminal do VS Code, inicie o aplicativo CounterFit com o seguinte comando:
```sh
counterfit
```
O aplicativo começará a funcionar e abrir no seu navegador da web:
![O aplicativo Counter Fit em execução em um navegador](../../../../images/counterfit-first-run.png)
Ele será marcado como *Desconectado*, com o LED no canto superior direito apagado.
1. Adicione o seguinte código ao topo de `app.py`:
```python
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
```
Este código importa a classe `CounterFitConnection` do módulo `counterfit_connection`, que vem do pacote pip `counterfit-connection` que você instalou anteriormente. Em seguida, ele inicializa uma conexão com o aplicativo CounterFit em execução em `127.0.0.1`, que é um endereço IP que você sempre pode usar para acessar seu computador local (muitas vezes referido como *localhost*), na porta 5000.
> 💁 Se você tiver outros aplicativos em execução na porta 5000, pode alterar isso atualizando a porta no código e executando o CounterFit usando `CounterFit --port <port_number>`, substituindo `<port_number>` pela porta que deseja usar.
1. Você precisará iniciar um novo terminal do VS Code selecionando o botão **Create a new integrated terminal**. Isso ocorre porque o aplicativo CounterFit está sendo executado no terminal atual.
![Botão Create a new integrated terminal do VS Code](../../../../images/vscode-new-terminal.png)
1. Neste novo terminal, execute o arquivo `app.py` como antes. O status do CounterFit mudará para **Conectado** e o LED acenderá.
![CounterFit mostrando como conectado](../../../../images/counterfit-connected.png)
> 💁 Você pode encontrar este código na pasta [code/virtual-device](../code/virtual-device).
😀 Sua conexão com o hardware foi um sucesso!

@ -1,210 +0,0 @@
# 虚拟单板机
除了买一个 IoT 设备、传感器和执行器,你也可以用你的电脑来模拟 IoT 硬件。[CounterFit 项目](https://github.com/CounterFit-IoT/CounterFit) 让你在自己的电脑上运行模拟 IoT 硬件(如传感器和执行器)的应用,并从本地 Python 代码访问传感器和执行器,代码的编写方式,与使用 Raspberry Pi 物理硬件相同。
## 设置
使用 CounterFit 前,你必须在你的电脑上安装一些免费的软件。
### 任务
安装需要的软件。
1. 安装 Python。 在 [Python 的下载页](https://www.python.org/downloads/) 找到最新版本 Python 的安装指示。
1. 安装 Visual Studio Code (VS Code)。 这是你将用来写虚拟设备的 Python 代码的代码编辑器。在 [VS Code 文档](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) 找到 VS Code 的安装指示。
> 💁 如果你对其它平台比较熟悉,你当然可以用你较喜欢的 Python IDE 或 代码编辑器,但注意这个课程将根据 VS Code 提供说明。
1. 安装 VS Code 的 Pylance 扩展。 这个 VS Code 扩展提供 Python 语言支持。在 [Pylance 扩展文档](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) 找安装扩展的指示。
我们将在日后的作业中提供安装及设置 CounterFit 的说明,因为我们需要在每个项目中安装它。
## Hello world你好世界
第一次用新的编程语言或技术通常以创建一个“Hello World”应用开始——一个输出类似`"Hello World"`文本的小小应用,以确保所有的工具被设置好。
这个虚拟 IoT 硬件的“Hello World”应用将确保你安装好 Python 与 Visual Studio Code。它也会连接到 CounterFit 以获取虚拟 IoT 传感器和执行器。它不会用到任何硬件,它只会以正确连接来证明每个部分运作良好。
这个应用放在名为 `nightlight` 的文件夹中,稍后将和其他代码结合,以构建夜灯应用。
### 配置 Python 虚拟环境
Python 的强大功能之一是能够安装 [pip 软件包](https://pypi.org);这些是由其他人编写并发布到互联网上的代码包。只需一条命令就可以在你的电脑上安装 pip 软件包,并在你的代码中使用它。你将用 pip 安装一个软件包,来与 CounterFit 沟通。
默认情况下,当你安装软件包时,在计算机的任何位置都是可用的,而这可能会造成软件包版本问题,例如:当你为新应用安装软件包的新版本,依靠旧版本的另一应用就有可能出现状况。为了避免这种问题,你可以使用 [Python 虚拟环境](https://docs.python.org/3/library/venv.html),本质上是一个专用文件夹中的 Python 副本,当你安装 pip 软件包时,它们只会安装到那个文件夹中。
#### 任务:配置一个 Python 虚拟环境
配置一个 Python 虚拟环境便安装为 CounterFit 的 pip 软件包。
1. 从你的终端或命令行,在你选的地方运行以下的程序,来创建和导航到一个新目录:
```sh
mkdir nightlight
cd nightlight
```
2. 现在,运行以下的程序来在 `.venv` 文件夹中创建一个虚拟环境
```sh
python3 -m venv .venv
```
> 💁 为了创建虚拟环境,你必须明确地调用 `python3`,万一 Python 3 (最新版本)以外你也曾经安装过 Python 2。如果你安装过 Python 2那调用 `python` 将用到 Python 2 而不是 Python 3。
3. 激活虚拟环境:
* 在 Windows 运行:
```cmd
.venv\Scripts\activate.bat
```
* 在 macOS 或 Linux运行
```cmd
source ./.venv/bin/activate
```
4. 虚拟环境一被激活,默认的 `python` 命令将运行用来创建虚拟环境的 Python 版本。为了拿到版本,运行以下的程序:
```sh
python --version
```
输出应该包括一下:
```output
(.venv) ➜ nightlight python --version
Python 3.9.1
```
> 💁 你的 Python 版本有可能不一样,但只要版本是 3.6 或以上就没事。不然,请删除这个文件夹,并安装较新的 Python 版本,再试一试。
5. 运行以下的命令来安装 CounterFit 软件包。这些软件包包括主要的 CounterFit 应用以及 Grove 硬件的[垫片](https://zh.wikipedia.org/wiki/%E5%9E%AB%E7%89%87_(%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1))。这些垫片让你就像用来自 Grove 生态系统的物理传感器和执行器一样写代码,但把它连接到虚拟 IoT 设备。
```sh
pip install CounterFit
pip install counterfit-connection
pip install counterfit-shims-grove
```
这些 pip 软件包只会在虚拟环境中安装,而你无法在虚拟环境外访问它。
### 编写代码
一旦 Python 虚拟环境被准备好,你就能为 “Hello World” 应用写代码。
#### 任务:编写代码
创建一个 Python 应用在控制台上打印 `"Hello World"` 输出。
1. 从你的终端或命令行,在虚拟环境中运行以下的程序来创建一个叫做 `app.py` 的 Python 文件:
* 在 Windows 运行:
```cmd
type nul > app.py
```
* 在 macOS 或 Linux运行
```cmd
touch app.py
```
2. 在 VS Code 打开当前的文件夹:
```sh
code .
```
> 💁 如果你的终端在 macOS 返回 `command not found`,那就代表 VS Code 还未被加进你的 PATH。为了把 VS Code 加进你的 PATH你可以按照 [Launching from the command line section of the VS Code 文档](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) 的指示,然后运行命令。在 Windows 和 LinuxVS Code 默认被加进你的 PATH。
3. 当 VS Code 被启动,它会激活 Python 虚拟环境。被选择的虚拟环境将在底部状态栏出现:
![ 被选择的虚拟环境将在 VS Code的底部状态栏出现](../../../../images/vscode-virtual-env.png)
4. 如果 VS Code 被启动时 VS Code 终端已经正在运行,虚拟环境不会被激活。这时,最容易做的是用 **Kill the active terminal instance** 的按钮:
![VS Code Kill the active terminal instance 按钮](../../../../images/vscode-kill-terminal.png)
虚拟环境的名字将是终端提示的字首,所以你可以把它用来确认虚拟环境已经被激活。例如,它可能是:
```sh
(.venv) ➜ nightlight
```
如果你没有 `.venv` 的字首在提示上,虚拟环境不在终端中活动。
5. 为了启动一个新的 VS Code 终端,选择 *Terminal -> New Terminal 或按`` CTRL+` ``。这个新终端将加载虚拟环境,以及激活它的调用将在终端中出现。提示也会有虚拟环境的名字(`.venv`
```output
➜ nightlight source .venv/bin/activate
(.venv) ➜ nightlight
```
6. 从 VS Code explorer 打开 `app.py` 文件,并添加以下的代码:
```python
print('Hello World!')
```
`print` 函数将在控制台打印出函数中的任何东西。
7. 从 VS Code 终端,运行以下的程序来运行你的 Python 应用:
```sh
python app.py
```
以下将在输出中:
```output
(.venv) ➜ nightlight python app.py
Hello World!
```
😀 你的 “Hello World” 编码成功了!
### 连接“硬件”
你的第二个 “Hello World” 步骤,是运行 CounterFit 应用并连接你的代码。这相当于把一些 IoT 硬件插入开发者套件。
#### 任务:连接“硬件”
1. 从 VS Code 终端,用以下的命令启动 CounterFit 应用:
```sh
counterfit
```
应用将开始运行以及在你的网页浏览器打开:
![CounterFit 应用在网页浏览器运行](../../../../images/counterfit-first-run.png)
他会有个 *Disconnected*(断开连接)的标记,右上角的 LED 也会关着。
2. 在 `app.py` 上加以下的代码:
```python
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
```
这个代码从 `counterfit_connection` 模块进口 `CounterFitConnection` 类;这个模块来自你刚才安装的 `counterfit-connection` pip 软件包。然后,它初始化跟 CounterFit 应用的连接。应用在 `127.0.0.1` 运行着;它是一个 IP 地址,而你一直可以用它在端口 5000 访问你的本地电脑(通常被叫为 *localhost*)。
> 💁 如果你有其它应用正在端口 5000 运行着,你可以在代码更新端口,再用 `CounterFit --port <port_number>` 运行 CounterFit在`<port_number>` 填着你想用的端口。
3. 你必须选择 **Create a new integrated terminal** 按钮来启动一个新 VS Code 终端。这是因为 CounterFit 应用正在当前终端运行着。
![VS Code Create a new integrated terminal 按钮](../../../../images/vscode-new-terminal.png)
4. 在这个新终端,像以前一样运行 `app.py` 文件。CounterFit 的状态将改成 **Connected** 连接LED 也会开着。
![CounterFit 被连接了](../../../../images/counterfit-connected.png)
> 💁 你可以在 [code/virtual-device](../code/virtual-device) 文件夹找到这个代码。
😀 你的硬件连接成功了!

@ -1,200 +0,0 @@
# Wio Terminal
[সীড স্টুডিও](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) এর Wio Terminal একটি আরডুইনো সাপোর্টেড মাইক্রোকন্ট্রোলার, যাতে ওয়াইফাই সংযোগ এবং কিছু সেন্সর ও অ্যাকচুয়েটর বিল্ট-ইন রয়েছে। এছাড়াও এর সাথে রয়েছে কিছু পোর্ট, অতিরিক্ত সেন্সর ও অ্যাকচুয়েটর সংযোগ এবং এটি নির্মাণ করা হয়েছে একটি হার্ডওয়্যার ইকোসিস্টেম ব্যবহার করে যার নাম
[Grove](https://www.seeedstudio.com/category/Grove-c-1003.html).
![A Seeed studios Wio Terminal](../../../../images/wio-terminal.png)
## সেটআপ
Wio Terminal ব্যবহার করার জন্য, আমাদের কিছু ফ্রি সটওয়্যার নিজেদের কম্পিউটার এ ইনস্টল করতে হবে। আমাদের অবশ্যই ওয়াইফাই সংযোগদানের পূর্বে Wio Terminal ফার্মওয়্যারটি আপডেট করে নিতে হবে।
### কাজের সেটআপ
প্রথমেই আমরা আমাদের প্রয়োজনীয় সটওয়্যারগুলো এবং ফার্মওয়ারটি আপডেট করে নেব।
১. ভিজুয়াল স্টুডিও কোড (ভি এস কোড) ইনস্টল করতে হবে । এটি একটি এডিটর যার সাহায্যে আমরা আমাদের ডিভাইস কোড লিখতে পারি সি/সি++ ভাষায়। বিস্তারিত জানতে [VS Code documentation](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) টি পড়ে নেয়া যেতে পারে।
> 💁 আরডুইনো ডেভলপমেন্ট এর জন্য আর একটি ভালো আই.ডি.ই হলো [Arduino IDE](https://www.arduino.cc/en/software). এই IDE টির সাথে কাজ করার পূর্ব অভিজ্ঞতা থাকলে ভি এস কোড ও platformIO এর পরিবর্তে একেও ব্যাবহার করা যেতে পারে। তবে, এখানে আমরা ভি এস কোডের উপর ভিত্তি করেই কাজ করবো।
২. এরপর ভি এস কোড platformIO এক্সটেনশনটি ইনস্টল করতে হবে। এই এক্সটেনশনটি ভি এস কোডে ইনস্টল করতে [PlatformIO extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) এ দেওয়া দিকির্দেশনাগুলো পড়ে দেখতে পারেন। এটি একটি ভি এস কোড এক্সটেনশন যা সি/সি++ ভাষায় মাইক্রোকন্ট্রোলার প্রোগ্রামিংকে সাপোর্ট করে। এই এক্সটেনশনটি মাইক্রোসফট সি/সি++ এর উপর নির্ভর করে , সি অথবা সি++ ভাষা নিয়ে কাজ করার জন্য। উল্লেখ্য, এই সি/সি++ এক্সটেনশন সয়ংক্রিয়ভাবে ইনস্টল হয়ে যায় যখন কেউ platformIO ইনস্টল করে।
৩. এখন, আমরা আমাদের Wio Terminal কে কম্পিউটার এর সাথে সংযুক্ত করব। এটির নিচের দিকে একটি ইউএসবি-সি পোর্ট আছে, সেটিকে আমরা আমাদের কম্পিউটার এর ইউএসবি পোর্ট এর সাথে সংযোগ দিব। উইও টার্মিনালে ইউএসবি-সি ও ইউএসবি-এ ক্যাবল থাকে। যদি আমাদের কম্পিউটারে শুধু ইউএসবি-সি পোর্ট থেকে, তাহলে আমাদের হয় ইউএসবি-সি ক্যাবল অথবা ইউএসবি-এ ক্যাবলের প্রয়োজন হবে ইউএসবি-সি অ্যাডাপ্টার এ সংযোগ দেওয়ার জন্য।
. [Wio Terminal Wiki WiFi Overview documentation](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) এ উল্লেখিত দিকনির্দেশনা গুলোকে মেনে আমরা আমাদের উইও টার্মিনাল সেটআপ ও ফার্মওয়্যার আপডেট করে ফেলি।
### হ্যালো ওয়ার্ল্ড
প্রথাগতভাবে, কোনো নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ অথবা টেকনোলজি নিয়ে কাজ শুরু করার সময় আমরা একটি "Hello World" application লিখি, একটি ছোট application যা আউটপুট হিসেবে `"Hello World"` লেখাটি দেখায়। এতে করে আমরা বুঝি যে আমাদের প্রোগ্রামটিতে সকল টুল সঠিকভাবে কাজ করছে।
আমাদের Wio Terminal এর হেলো ওয়ার্ল্ড অ্যাপটি এটি নিশ্চিত করবে যে আমাদের ভিজুয়াল স্টুডিও কোড platformIO এর সাথে সঠিকভাবে ইনস্টল করা হয়েছে এবং এখন এটি microcontroller development এর জন্য প্রস্তুত।
### platformIO প্রজেক্ট তৈরী
আমাদের প্রথম কাজ হলো platformIO ব্যাবহার করে একটি নতুন প্রজেক্ট তৈরী করা যা Wio terminal এর জন্য কনফিগার করা।
#### কাজ- platformIO প্রজেক্ট তৈরী
একটি platformIO প্রজেক্ট তৈরী করি।
১. Wio terminal কে কম্পিউটারের সাথে সংযোগ দেই।
২. ভি এস কোড launch করি
৩. আমরা platformIO আইকনটি সাইড মেন্যু বারে দেখতে পাবো:
![The Platform IO menu option](../../../../images/vscode-platformio-menu.png)
এই মেন্যু আইটেমটি সিলেক্ট করে, সিলেক্ট করি *PIO Home -> Open*
![The Platform IO open option](../../../../images/vscode-platformio-home-open.png)
. Welcome স্ক্রীন থেকে **+ New Project** বাটনটিতে ক্লিক করি।
![The new project button](../../../../images/vscode-platformio-welcome-new-button.png)
৫. প্রজেক্টটিকে *Project Wizard* এ configure করি:
i. প্রজেক্টটিকে `nightlight` নাম দেই।
ii. *Board* dropdown থেকে, `WIO` লিখে বোর্ডগুলোকে ফিল্টার করি, *Seeeduino Wio Terminal* সিলেক্ট করি।
ii. *Framework* টিকে *Arduino* হিসেবে রাখি|
iii. হয় *Use default location* কে টিক অবস্থায় ছেড়ে দেই অথবা সেটিকে টিক না দিয়ে আমাদের প্রজেক্টটির জন্য যেকোনো location সিলেক্ট করি।
iv. **Finish** বাটনটিতে ক্লিক করি।
![The completed project wizard](../../../../images/vscode-platformio-nightlight-project-wizard.png)
platformIO এখন wio terminal এর কোডগুলোকে compile করার জন্য প্রয়োজনীয় কম্পনেন্টস ডাউনলোড করে নেবে এবং আমাদের প্রজেক্টটি create করে নেবে। পুরো প্রক্রয়াটি সম্পন্ন হতে কয়েক মিনিট সময় লাগতে পারে।
### platformIO প্রজেক্টটি investigate করে দেখা
ভি এস কোড এক্সপ্লোরার আমাদের কিছু ফাইল এবং ফোল্ডার দেখাবে যা platformIO wizerd দ্বারা তৈরি হয়েছে।
#### ফোল্ডারস
* `.pio` - এই ফোল্ডারটি কিছু temporary ডাটা বহন করে যা platformIO এর প্রয়জন হতে পারে, যেমন: libraries অথবা compiled code, এটা delete করার সাথে সাথে আবার পুনঃনির্মিতো হয়। U আমরা প্রজেক্টটি কোনো সাইট 
* `.vscode` - এই ফোল্ডারটি ভি এস কোড ও platformIO দ্বারা ব্যবহৃত configuration গুলোকে বহন করে। এটা delete করার সাথে সাথে আবার পুনঃনির্মিতো হয়। প্রজেক্টটি কোনো সাইট যেমন GitHub এ share করতে এর কোনো সোর্স কোড কন্ট্রোল অ্যাড করতে হবে না।
* `include` - এই ফোল্ডারটি এক্সটার্নাল হেডার ফাইল বহনের জন্য রয়েছে যা আমাদের কোডে অতিরিক্ত library যোগের সময় দরকার হয়। আমাদের কাজগুলোতে আমরা এই ফোল্ডারটি ব্যাবহার করব না।
* `lib` - এই ফোল্ডারটি কিছু এক্সটার্নাল libraries বহন করবে যা আমরা আমাদের কোড থেকে কল করব। আমাদের কাজগুলোতে আমরা এই ফোল্ডারটি ব্যাবহার করব না।
* `src` - এই ফোল্ডারটি আমাদের main সোর্স কোডটিকে বহন করবে, যা কিনা একটি সিংগেল ফাইল - main.cpp
* `test` - এই ফোল্ডারটি সেই স্থান যেখানে আমরা আমাদের কোডের ইউনিট টেস্ট গুলোকে রাখবো।
#### ফাইলস
* `main.cpp` - src ফোল্ডারে অবস্থিত এই ফাইলটি আমাদের অ্যাপ্লিকেশন এর entry point হিসেবে কাজ করবে। আমরা ফাইলটি খুলে দেখব, এটি বহন করে:
```cpp
#include <Arduino.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
```
যখন ডিভাইসটি কাজ শুরু করে, Arduino framework টি সেটআপ ফাংশনটি একবার রান করে, এরপর নিরন্তর এটিকে রান করতে থেকে যতক্ষণ পর্যন্ত ডিভাইসটি বন্ধ না হয় 
* `.gitignore` - এটি সেই ফাইল ও ডিরেক্টরিগুলোকে লিস্ট করে রাখে, যেগুলোকে আমরা আমাদের কোড git source code control এ যুক্ত করার সময় ইগনোর করবো, যেমন: কোনো GitHub repository তে আপলোড করার সময়।
* `platformio.ini` - এই ফাইলে আমাদের ডিভাইসের এবং অ্যাপের configuration গুলো রয়েছে । এটি খুললে দেখা যাবে: 
```ini
[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
```
`[env:seeed_wio_terminal]` সেকশনটিতে wio terminal এর configuration আছে। আমরা একের অধিক `env` সেকশন রাখতে পারি যেন আমাদের কোডকে একের অধিক board এর জন্য compile করা যায়।
Project wizerd থেকে আরো কিছু value যা configuration ম্যাচ করে:
* `platform = atmelsam` Wio terminal যে হার্ডওয়্যারটি ব্যাবহার করে তাকে ডিফাইন করে (an ATSAMD51-based microcontroller)
* `board = seeed_wio_terminal` মাইক্রোকন্ট্রোলার এর টাইপ কে ডিফাইন করে (the Wio Terminal)
* `framework = arduino` আমাদের প্রজেক্টটি Arduino framework ব্যাবহার করে সেটি ডিফাইন করে।
### হ্যালো ওয়ার্ল্ড অ্যাপটি লিখি
এখন আমরা হ্যালো ওয়ার্ল্ড অ্যাপটি লিখার জন্য প্রস্তুত হয়েছি।
#### কাজ - হ্যালো ওয়ার্ল্ড অ্যাপটি লিখা
হ্যালো ওয়ার্ল্ড অ্যাপটি লিখি।
১.`main.cpp` ফাইলটি ভি এস কোড থেকে ওপেন করি।
২.কোডটি এমনভাবে লিখি যেনো এটি নিম্নোক্ত কোডটির সাথে মিলে যায়:
```cpp
#include <Arduino.h>
void setup()
{
Serial.begin(9600);
while (!Serial)
; // Wait for Serial to be ready
delay(1000);
}
void loop()
{
Serial.println("Hello World");
delay(5000);
}
```
`setup` ফাংশনটি একটি connection কে initialize করে সিরিয়াল পোর্ট এর সাথে, সেই usb পোর্টটি যেটি আমাদের কম্পিউটারকে wio terminal এর সাথে সংযুক্ত করেছে। `9600` প্যারামিটারটি হলো [baud rate](https://wikipedia.org/wiki/Symbol_rate) (যা সিম্বল রেট হিসেবেও পরিচিত) সিরিয়াল পোর্ট এর মধ্য দিয়ে যাওয়া ডাটার speed (bits per second). এই সেটিং দ্বারা আমরা বোঝাই ৯৬০০ bits ( এবং ১) ডাটা পাঠানো হচ্ছে প্রতি সেকেন্ডে। এরপর এটি সিরিয়াল পোর্টটি ready state এ যাওয়ার জন্য wait করে। 
`loop` ফাংশনটি `Hello World!` লাইনটির character গুলো এবং একটি new line character সিরিয়াল পোর্টে পাঠায়। এরপর, এটি ৫০০০ মিলি সেকেন্ড সময়ের জন্য sleep state এ যায়। Loop শেষ হওয়ার পর, এটি আবার রান করে এবং চলতে থাকে যতক্ষণ পর্যন্ত মাইক্রোকন্ট্রোলারটি ON থাকে।
৩. কোডটি বিল্ড করে wio terminal এ আপলোড করি:
i. ভি এস কোড command palette ওপেন করি।
ii. টাইপ করি `PlatformIO Upload` আপলোড অপশনটি খুঁজে পাওয়ার জন্য, এরপর *PlatformIO: Upload* সিলেক্ট করি।
![The PlatformIO upload option in the command palette](../../../../images/vscode-platformio-upload-command-palette.png)
যদি দরকার হয়, platformIO এখন অটোমেটিক ভাবে কোডটিকে বিল্ড করবে, আপলোড করার পূর্বে।
iii. কোডটি কম্পাইল হয়ে wio terminal এ আপলোড হয়ে যাবে 
> 💁 আমরা যদি MacOS ব্যাবহার করে থাকি, একটি *DISK NOT EJECTED PROPERLY* notification দেখতে পাবো। এটা এজন্যে দেখায় যে, wio terminal টি মাউন্টেড হয় ড্রাইভ হিসেবে যা কিনা ফ্লাশিং প্রসেসের একটি পার্ট, এবং এটি বিচ্ছিন্ন হয়ে যায় যখন compiled code টি আমদর ডিভাইস এ লেখা। আমরা এই নোটিফিকেশনটি ইগনোর করতে পারি।
⚠️ আমরা যদি error দেখতে পাই যে আপলোড পোর্ট unavailable, প্রথমত, আমাদের দেখতে হবে wio টার্মিনালটি আমাদের কম্পিউটারের সাথে সংযুক্ত আছে কিনা এবং স্ক্রীন এর বামদিকের সুইচটি অন করা আছে কিনা। নিচের দিকের সবুজ লাইটটি অন থাকতে হবে। এরপরও যদি error আসে, আমরা on/off সুইটটিকে দুবার নিচের দিকে টানবো এমনভাবে যেনো আমাদের wio terminal টি bootloader mode এ যায়। এরপর, আবার আপলোড করবো।
wio terminal এর একটি serial monitor থাকে যা wio terminal থেকে usb পোর্ট এর মাধ্যমে কতটুকু ডাটা পাঠানো হয়েছে তা দেখে। আমরা `Serial.println("Hello World");` কমান্ডটির মাধ্যমে কতটুকু ডাটা পাঠানো হয়েছে তা মনিটর করতে পারবো।
১. ভি এস কোড command palette ওপেন করি
২. `PlatformIO Serial` টাইপ করি serial monitor অপশনটি খুঁজে পাওয়া জন্য, সিলেক্ট *PlatformIO: Serial Monitor*
![The PlatformIO Serial Monitor option in the command palette](../../../../images/vscode-platformio-serial-monitor-command-palette.png)
এখন একটি নতুন টার্মিনাল ওপেন হবে যেখানে সিরিয়াল পোর্টের মাধ্যমে যত ডাটা পাঠানো হয়েছে তা দেখা যাবে:
```output
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hello World
Hello World
```
serial monitor এ প্রতি ৫ সেকেন্ডে `Hello World` প্রিন্ট হবে।
> 💁 আমরা উক্ত কোডটি [code/wio-terminal](../code/wio-terminal) ফোল্ডারে খুঁজে পাবো। 
😀 আমাদের 'হ্যালো ওয়ার্ল্ড' লেখাটি সফল হলো!!

@ -1,198 +0,0 @@
# Wio Terminal
O [Wio Terminal da Seeed Studios] (https://www.seeedstudio.com/Wio-Terminal-p-4509.html) é um microcontrolador compatível com Arduino, com WiFi e alguns sensores e atuadores integrados, bem como portas para adicionar mais sensores e atuadores, usando um ecossistema de hardware chamado [Grove] (https://www.seeedstudio.com/category/Grove-c-1003.html).
![Um Wio Terminal da Seeed studios](../../../../images/wio-terminal.png)
## Configuração
Para usar o Wio Terminal, você precisará instalar algum software gratuito no computador. Você também precisará atualizar o firmware do Wio Terminal antes de conectá-lo ao WiFi.
### Tarefa - configuração
Instale o software necessário e atualize o firmware.
1. Instale o Visual Studio Code (VS Code). Este é o editor que você usará para escrever o código do seu dispositivo em C/C++. Consulte a [documentação do VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) para obter instruções sobre como instalar o VS Code.
> 💁 Outro IDE popular para o desenvolvimento do Arduino é o [Arduino IDE](https://www.arduino.cc/en/software). Se você já está familiarizado com esta ferramenta, você pode usá-la em vez do VS Code e PlatformIO, mas as lições darão instruções baseadas no uso do VS Code.
1. Instale a extensão PlatformIO do VS Code. Esta é uma extensão do VS Code que oferece suporte à programação de microcontroladores em C/C++. Consulte a [documentação da extensão PlatformIO](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) para obter instruções sobre como instalar esta extensão no VS Code. Esta extensão depende da extensão Microsoft C/C++ para funcionar com código C e C ++, e a extensão C/C++ é instalada automaticamente quando você instala a extensão PlatformIO.
1. Conecte o Wio Terminal ao computador. O Wio Terminal possui uma porta USB-C na parte inferior e ela precisa ser conectada a uma porta USB no seu computador. O Wio Terminal vem com um cabo USB-C para USB-A, mas se o seu computador tiver apenas portas USB-C, você precisará de um cabo USB-C ou de um adaptador USB-A para USB-C.
1. Siga as instruções na [documentação de visão geral de WiFi da Wiki do Wio Terminal](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) para configurar seu Wio Terminal e atualizar o firmware.
## Hello World
É tradicional, ao começar com uma nova linguagem de programação ou tecnologia, criar um aplicativo 'Hello World' - um pequeno aplicativo que produz algo como o texto `"Hello World"` para mostrar que todas as ferramentas estão configuradas corretamente.
O aplicativo Hello World para o Wio Terminal garantirá que você tenha o Visual Studio Code instalado corretamente com PlatformIO e configurado para desenvolvimento de microcontrolador.
### Crie um projeto PlatformIO
A primeira etapa é criar um novo projeto usando PlatformIO configurado para o Wio Terminal.
#### Tarefa - criar um projeto PlatformIO
Crie o projeto PlatformIO.
1. Conecte o Wio Terminal ao seu computador
1. Inicie o VS Code
1. O ícone PlatformIO estará na barra de menu lateral:
![A opção de menu Platform IO](../../../../images/vscode-platformio-menu.png)
Selecione este item de menu e, em seguida, selecione *PIO Home -> Open*
![A opção de Abrir do Platform IO](../../../../images/vscode-platformio-home-open.png)
1. Na tela de boas-vindas, selecione o botão **+ New Project**
![O botão de Novo Projeto](../../../../images/vscode-platformio-welcome-new-button.png)
1. Configure o projeto no *Project Wizard*:
1. Nomeie seu projeto como `nightlight`
1. No dropdown de *Board*, digite `WIO` para filtrar as placas e selecione *Seeeduino Wio Terminal*
1. Deixe o *Framework* como *Arduino*
1. Deixe a caixa de seleção *Use default location* marcada, ou desmarque-a e selecione um local para o seu projeto
1. Selecione o botão **Finish**
![O assistente de projeto concluído](../../../../images/vscode-platformio-nightlight-project-wizard.png)
PlatformIO baixará os componentes necessários para compilar o código para o Wio Terminal e criar seu projeto. Isso pode levar alguns minutos.
### Investigue o projeto PlatformIO
O explorador do VS Code mostrará vários arquivos e pastas criados pelo assistente PlatformIO.
#### Pastas
* `.pio` - esta pasta contém dados temporários necessários para PlatformIO, como bibliotecas ou código compilado. Ela é recriada automaticamente se excluída e você não precisa adicioná-la ao controle do código-fonte se estiver compartilhando seu projeto em sites como o GitHub.
* `.vscode` - esta pasta contém a configuração usada por PlatformIO e VS Code. Ela é recriada automaticamente se excluída e você não precisa adicioná-la ao controle do código-fonte se estiver compartilhando seu projeto em sites como o GitHub.
* `include` - esta pasta é para arquivos de cabeçalho externos necessários ao adicionar bibliotecas adicionais ao seu código. Você não usará esta pasta em nenhuma dessas lições.
* `lib` - esta pasta é para bibliotecas externas que você deseja chamar de seu código. Você não usará esta pasta em nenhuma dessas lições.
* `src` - esta pasta contém o código-fonte principal do seu aplicativo. Inicialmente, ele conterá um único arquivo - `main.cpp`.
* `test` - esta pasta é onde você colocaria quaisquer testes de unidade para o seu código
#### Arquivos
* `main.cpp` - este arquivo na pasta `src` contém o ponto de entrada para sua aplicação. Abra este arquivo e ele conterá o seguinte código:
```cpp
#include <Arduino.h>
void setup() {
// coloque seu código de configuração aqui, para ser executado uma vez:
}
void loop() {
// coloque seu código principal aqui, para executar repetidamente:
}
```
Quando o dispositivo é inicializado, a estrutura do Arduino executará a função `setup` uma vez e, em seguida, executará a função `loop` repetidamente até que o dispositivo seja desligado.
* `.gitignore` - este arquivo lista os arquivos e diretórios a serem ignorados ao adicionar seu código ao controle de código-fonte do git, como enviar para um repositório no GitHub.
* `platformio.ini` - este arquivo contém a configuração para seu dispositivo e aplicativo. Abra este arquivo e ele conterá o seguinte código:
```ini
[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
```
A seção `[env:seeed_wio_terminal]` tem configuração para o Wio Terminal. Você pode ter várias seções `env` para que seu código possa ser compilado para várias placas.
Os outros valores correspondem à configuração do assistente de projeto:
* `platform = atmelsam` define o hardware que o Wio Terminal usa (um microcontrolador baseado em ATSAMD51)
* `board = seeed_wio_terminal` define o tipo de placa do microcontrolador (o Wio Terminal)
* `framework = arduino` define que este projeto está usando o framework Arduino.
### Escreva o aplicativo Hello World
Agora você está pronto para escrever o aplicativo Hello World.
#### Tarefa - escrever o aplicativo Hello World
Escreva o aplicativo Hello World.
1. Abra o arquivo `main.cpp` no VS Code
1. Altere o código para corresponder ao seguinte:
```cpp
#include <Arduino.h>
void setup()
{
Serial.begin(9600);
while (!Serial)
; // Aguarde até que o Serial esteja pronto
delay(1000);
}
void loop()
{
Serial.println("Hello World");
delay(5000);
}
```
A função `setup` inicializa uma conexão com a porta serial - neste caso, a porta USB que é usada para conectar o Wio Terminal ao seu computador. O parâmetro `9600` é a [taxa de transmissão](https://wikipedia.org/wiki/Symbol_rate) (também conhecida como taxa de símbolo), ou velocidade com que os dados serão enviados pela porta serial em bits por segundo. Essa configuração significa que 9.600 bits (0s e 1s) de dados são enviados a cada segundo. Em seguida, ele espera que a porta serial esteja pronta.
A função `loop` envia a linha `Hello World!` para a porta serial, então os caracteres de `Hello World!` junto com um caractere de nova linha. Em seguida, ele dorme por 5.000 milissegundos ou 5 segundos. Depois que o `loop` termina, ele é executado novamente, e novamente, e assim por diante, o tempo todo em que o microcontrolador permanece ligado.
1. Construa e carregue o código para o Wio Terminal
1. Abra a paleta de comando do VS Code
1. Digite `PlatformIO Upload` para pesquisar a opção de upload e selecione *PlatformIO: Upload*
![A opção de upload do PlatformIO na paleta de comando](../../../../images/vscode-platformio-upload-command-palette.png)
PlatformIO construirá automaticamente o código, se necessário, antes de fazer o upload.
1. O código será compilado e enviado para o Wio Terminal
> 💁 Se você estiver usando o macOS, será exibida uma notificação sobre um *DISCO NÃO EJETADO CORRETAMENTE*. Isso ocorre porque o Wio Terminal é montado como uma unidade como parte do processo de flashing e é desconectado quando o código compilado é gravado no dispositivo. Você pode ignorar esta notificação.
⚠️ Se você receber erros sobre a porta de upload não estar disponível, primeiro certifique-se de ter o Wio Terminal conectado ao seu computador e ligado usando o botão no lado esquerdo da tela. A luz verde na parte inferior deve estar acesa. Se você ainda receber o erro, puxe o botão liga/desliga para baixo duas vezes em rápida sucessão para forçar o Wio Terminal no modo bootloader e tente fazer o upload novamente.
PlatformIO tem um monitor serial que pode monitorar os dados enviados pelo cabo USB do Wio Terminal. Isso permite que você monitore os dados enviados pelo comando `Serial.println("Hello World");`.
1. Abra a paleta de comando do VS Code
1. Digite `PlatformIO Serial` para pesquisar a opção Serial Monitor e selecione *PlatformIO: Serial Monitor*
![A opção PlatformIO Serial Monitor na paleta de comandos](../../../../images/vscode-platformio-serial-monitor-command-palette.png)
Um novo terminal será aberto e os dados enviados pela porta serial serão transmitidos para este terminal:
```output
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hello World
Hello World
```
`Hello World` será impresso no monitor serial a cada 5 segundos.
> 💁 Você pode encontrar este código na pasta [code/wio-terminal](../code/wio-terminal).
😀 Seu programa 'Hello World' foi um sucesso!

@ -1,197 +0,0 @@
# Wio 终端
[Seeed Studios 的 Wio 终端](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 是个Arduino兼容的微控制器无线上网以及一些传感器和执行器已经被装上还有端口让你用叫做 [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html) 的硬件生态系统加更多传感器和执行器。
![一个 Seeed Studios Wio 终端](../../../../images/wio-terminal.png)
## 设置
想用你个 Wio 终端,你必须在你的电脑上安装几个免费软件。你也需要在连接无线上网前更新 Wio 终端的固件。
### 任务:设置
安装需要的软件以及更新固件。
1. 安装 Visual Studio Code (VS Code)。这是你将用来写 C 或 C++ 的设备代码的编辑器。在 [VS Code 文档](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) 找一下安装 VS Code 的指示。
> 💁 另外一个为 Arduino 开发的 IDE 是 [Arduino IDE](https://www.arduino.cc/en/software)。如果你已经对这个工具熟悉,那你可以把它用来代替 VS Code 和 PlatformIO但这个课程的指示将基于 VS Code。
1. 安装 VS Code 的 PlatformIO 扩展。这是支持用 C 或 C++ 来为微控制器写编码的 VS Code 扩展。在 [PlatformIO 扩展文档](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) 找一下在 VS Code 安装扩展的指示。这个扩展依赖着Microsoft C/C++ 扩展来与 C 和 C++ 代码工作而这个C/C++ 扩展在默认情况下会被安装当你安装 PlatformIO。
1. 将你的 Wio 终端连接到你的电脑。Wio 终端底下有个 USB-C 端口,而它需要连接到你的电脑的一个 USB 端口。Wio 终端包括一个 USB-C 至 USB-A 电缆,但万一你的电脑只有 USB-C 端口,那你就需要一个 USB-C 电缆或者一个 USB-A 至USB-C 适配器。
1. 按照 [Wio 终端 Wiki WiFi Overview 文档](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) 的指示来设置你的 Wio 终端和更新固件。
## Hello world你好世界
第一次用新的编程语言或科技通常以创建一个“Hello World”应用开始——一个输出像 `"Hello World"` 的字的小小应用,为了确保所有的工具被设置好。
Wio 终端的 Hello World 应用将确保你安装好了 Visual Studio Code 与 PlatformIO并为微控制器开发做好设置。
### 创建一个 PlatformIO 项目
第一步是使用为 Wio 终端配置的 PlatformIO 创建一个新项目。
#### 任务:创建一个 PlatformIO 项目
创建 PlatformIO 项目。
1. 将 Wio 终端连接到你的电脑。
1. 启动 VS Code。
1. PlatformIO 的图表应该在旁边的菜单栏上:
![PlatformIO 菜单选项](../../../../images/vscode-platformio-menu.png)
选择这个菜单项,再选择 *PIO Home -> Open*
![PlatformIO 的打开选项](../../../../images/vscode-platformio-home-open.png)
1. 从欢迎屏幕,选择 **+ New Project** 的按钮。
![新项目的按钮](../../../../images/vscode-platformio-welcome-new-button.png)
1. 在 *Project Wizard* 配置项目:
1. 给你的项目取名为 `nightlight`
1. 从 *Board* 的下拉式选单,输入 `WIO` 来过滤板,再选择 *Seeeduino Wio Terminal*
1. 将 *Framework* 保留为 *Arduino*
1. 选中 *Use default location* 复选框,或取消选中它并为你的项目选择一个位置
1. 选择 **Finish** 的按钮
![被完成的项目向导](../../../../images/vscode-platformio-nightlight-project-wizard.png)
PlatformIO 将下载它需要使用为 Wio 终端编译代码和创建项目的组件。它可能花几分钟。
### 调查 PlatformIO 项目
VS Code explorer 将显示PlatformIO向导创建的几个文件与文件夹。
#### 文件夹
* `.pio` - 这个文件夹包含 PlatformIO 需要的临时数据例如库或编译代码。万一它被删除它就会自动重新创造而如果你在GitHub或其它网络分享项目你也不必把它加进源代码管理。
* `.vscode` - 这个文件夹包含 PlatformIO 和 VS Code 用到的配置。万一它被删除它就会自动重新创造而如果你在GitHub或其它网络分享项目你也不必把它加进源代码管理。
* `include` - 这个文件夹是给添加其它库时所需的外部头文件。课程中你不会用到这个文件夹。
* `lib` - 这个文件夹是给要从代码中调用的外部库。课程中你不会用到这个文件夹。* `src` - 这个文件夹包含你应用程序的主要源代码。一开始,它会包含一个文件—— `main.cpp`
* `test` - 这个文件夹是给你放代码的任何单元测试。
#### 文件
* `main.cpp` - 这个文件在 `src` 文件夹中;它包含应用程序的入口点,还有会包含以下的代码:
```cpp
#include <Arduino.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
```
当设备启动Arduino 框架将运行一次`setup` 函数,然后重复运行 `loop` 函数,直到设备关闭。
* `.gitignore` - 这个文件列出了将代码添加到 git 源代码控制时(例如:上传到 GitHub 上的存储库)要忽略的文件和目录。
* `platformio.ini` - 这个文件包含你的设备和应用的配置。打开这个文件,它就包含以下的代码:
```ini
[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
```
`[env:seeed_wio_terminal]` 部分有 Wio 终端的配置。你可以有多数的 `env` 部分,让你的代码能为更多板编译。
其它值与项目向导中的配置相匹配:
* `platform = atmelsam` 定义了 Wio 终端使用的硬件(基于 ATSAMD51 的微控制器)
* `board = seeed_wio_terminal` 定义了微控制器板的类型Wio 终端)
* framework = arduino` 定义这个项目使用 Arduino 框架。
### 写 Hello World 应用
你现在已准备好写 Hello World 应用。
#### 任务:写 Hello World 应用
写Hello World 应用。
1. 在 VS Code 打开 `main.cpp` 文件
1. 更改代码以匹配以下内容:
```cpp
#include <Arduino.h>
void setup()
{
Serial.begin(9600);
while (!Serial)
; // Wait for Serial to be ready
delay(1000);
}
void loop()
{
Serial.println("Hello World");
delay(5000);
}
```
`setup`函数初始化与串行端口的连接;在这个情况下,用来将 Wio 终端连接到你的电脑的USB 端口。`9600` 参数是[波特率](https://wikipedia.org/wiki/Symbol_rate) (also known as Symbol rate),以每秒位数为单位的数据通过串行端口发送的速度。这个设置代表每秒发送 9,600 位0 和 1数据。 然后,它等待串行端口准备就绪。
`loop` 函数把 `Hello World!` 发送到串行端口,也就是 `Hello World!` 的字符与换行符。然后,它将花 5,000毫秒或 5 秒睡眠。当 `loop` 结束,它会重新运行,而只要微控制器上电,它会一直重新运行着。
1. 构建代码和把它上传到 Wio 终端
1. 打开 VS Code 的命令面板
1. 输入 `PlatformIO Upload` 来搜索上传选项,再选择 *PlatformIO: Upload*
![ 命令面板中 PlatformIO 的上传选项](../../../../images/vscode-platformio-upload-command-palette.png)
如果有必要的话PlatformIO上传代码前将自动构建代码。
1. 代码将被编译并上传到 Wio 终端
> 💁 如果你正在用macOS, *DISK NOT EJECTED PROPERLY* 的通知将出现。这是因为 Wio 终端作为闪存过程的一部分安装为驱动器,并且在将编译的代码写入设备时断开连接。 你可以忽略这个通知。
⚠️ 如果你收到关于上传端口不可用的错误消息,请首先确保你已经将 Wio 终端连接到你的电脑,并使用屏幕左侧的开关打开。 底部的绿灯应该亮着。 如果仍然出现错误,请快速连续两次拉下开关以强制 Wio 终端进入引导加载程序模式,然后再次尝试上传。
PlatformIO 有一个串行监视器,可以监视从 Wio 终端通过 USB 电缆发送的数据。 这允许你监视由`Serial.println("Hello World");` 命令发送的数据。
1. 打开 VS Code 的命令面板
1. 输入 `PlatformIO Serial` 来搜索串行监视器选项,再选择 *PlatformIO: Serial Monitor*
![ 命令面板中 PlatformIO 的串行监视器选项](../../../../images/vscode-platformio-serial-monitor-command-palette.png)
这将打开一个新终端,而通过串行端口发送的数据将流入这个终端:
```output
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hello World
Hello World
```
每 5 秒,`Hello World` 将打印在串行监视器上
> 💁 你可以在 [code/wio-terminal](code/wio-terminal) 文件夹找到这个代码。
😀 你的 “Hello World” 编码成功了!

@ -1,283 +0,0 @@
# <div dir="rtl">التعمق أكثر بإنترنت الأشياء</div>
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-2.jpg)
> <div dir="rtl"> خريطة من <a href="https://github.com/nitya">Nitya Narasimhan</a> </div>
> <div dir="rtl"> اضغط على الصورة لتكبيرها </div>
</br>
## <div dir="rtl"> اختبار ما قبل المحاضرة </div>
[<div dir="rtl"> اختبار ما قبل المحاضرة </div>](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## <div dir="rtl"> المقدمة </div>
<div dir="rtl">
يتعمق هذا الدرس في بعض المفاهيم التي تم تناولها في الدرس الأخير.
سنغطي في هذا الدرس:
* [مكونات تطبيق إنترنت الأشياء](#components-of-an-iot-application)
* [التعمق اكثر في المتحكم الدقيق](#deeper-dive-into-microcontrollers)
* [التعمق اكثر في أجهزة الكمبيوتر ذات اللوحة الواحدة](#deeper-dive-into-single-board-computers)
## مكونات تطبيقات إنترنت الأشياء
المكونان لتطبيق إنترنت الأشياء هما الإنترنت و الشيء. لنلقِ نظرة على هذين المكونين بمزيد من التفصيل.
### الشيء
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
يشير الشيء من إنترنت الأشياء إلى جهاز يمكنه التفاعل مع العالم المادي. عادةً ما تكون هذه الأجهزة أجهزة كمبيوتر صغيرة ومنخفضة السعر ، وتعمل بسرعات منخفضة وتستخدم طاقة منخفضة - على سبيل المثال ، وحدات تحكم دقيقة بسيطة بها كيلوبايت من ذاكرة الوصول العشوائي (على عكس الجيجابايت في جهاز الكمبيوتر) تعمل ببضع مئات من الميجاهرتز فقط (على عكس الجيجاهيرتز) في جهاز كمبيوتر) ، ولكن في بعض الأحيان يستهلك القليل من الطاقة بحيث يمكن تشغيلها لأسابيع أو شهور أو حتى سنوات على البطاريات.
تتفاعل هذه الأجهزة مع العالم المادي ، إما باستخدام أجهزة استشعار لجمع البيانات من محيطها أو عن طريق التحكم في المخرجات أو المحركات لإجراء تغييرات فيزيائية. المثال النموذجي لذلك هو منظم الحرارة الذكي - جهاز يحتوي على مستشعر درجة الحرارة ، ووسيلة لتعيين درجة الحرارة المرغوبة مثل قرص أو شاشة تعمل باللمس ، ووصلة بنظام تدفئة أو تبريد يمكن تشغيله عند اكتشاف درجة الحرارة خارج النطاق المطلوب. يكتشف مستشعر درجة الحرارة أن الغرفة شديدة البرودة ويقوم المشغل بتشغيل التدفئة.
![A diagram showing temperature and a dial as inputs to an IoT device, and control of a heater as an output](../../../../images/basic-thermostat.png)
هناك مجموعة كبيرة من الأشياء المختلفة التي يمكن أن تعمل كأجهزة إنترنت الأشياء ، من الأجهزة المخصصة التي تستشعر شيئًا واحدًا ، إلى الأجهزة ذات الأغراض العامة ، حتى هاتفك الذكي! يمكن للهاتف الذكي استخدام المستشعرات لاكتشاف العالم من حوله والمحركات للتفاعل مع العالم - على سبيل المثال ، باستخدام مستشعر GPS لاكتشاف موقعك ومكبر صوت لإعطائك إرشادات التنقل إلى وجهة.
✅ فكر في الأنظمة الأخرى الموجودة حولك والتي تقرأ البيانات من جهاز استشعار وتستخدمها لاتخاذ القرارات. أحد الأمثلة على ذلك هو منظم الحرارة الموجود في الفرن. هل يمكنك إيجاد المزيد؟
</br>
### الانترنت
يتكون جانب الإنترنت من التطبيقات التي يمكن لجهاز إنترنت الأشياء توصيلها لإرسال البيانات واستقبالها ، بالإضافة إلى التطبيقات الأخرى التي يمكنها معالجة البيانات من جهاز إنترنت الأشياء والمساعدة في اتخاذ قرارات بشأن الطلبات التي سيتم إرسالها إلى مشغلات أجهزة إنترنت الأشياء.
يتمثل أحد الإعدادات النموذجية في وجود نوع من الخدمة السحابية التي يتصل بها جهاز إنترنت الأشياء ، وتتولى هذه الخدمة السحابية أشياء مثل الأمان ، بالإضافة إلى تلقي الرسائل من جهاز إنترنت الأشياء ، وإرسال الرسائل مرة أخرى إلى الجهاز. ستتصل هذه الخدمة السحابية بعد ذلك بالتطبيقات الأخرى التي يمكنها معالجة بيانات المستشعر أو تخزينها ، أو استخدام بيانات المستشعر مع البيانات من الأنظمة الأخرى لاتخاذ القرارات.
لا تتصل الأجهزة دائمًا مباشرة بالإنترنت عبر شبكة WiFi أو اتصالات سلكية. تستخدم بعض الأجهزة الشبكات المتداخلة للتحدث مع بعضها البعض عبر تقنيات مثل Bluetooth ، والاتصال عبر جهاز لوحة وصل متصل بالإنترنت.
باستخدام مثال منظم الحرارة الذكي ، سيتصل منظم الحرارة باستخدام شبكة WiFi المنزلية بخدمة سحابية تعمل في السحابة. سيرسل بيانات درجة الحرارة إلى هذه الخدمة السحابية ، ومن هناك ستتم كتابتها في قاعدة بيانات بشكل يسمح لمالك المنزل بالتحقق من درجات الحرارة الحالية والسابقة باستخدام تطبيق الهاتف. ستعرف خدمة أخرى في السحابة درجة الحرارة التي يريدها صاحب المنزل ، وترسل الرسائل مرة أخرى إلى جهاز إنترنت الأشياء عبر الخدمة السحابية لإخبار نظام التدفئة بالتشغيل أو الإيقاف.
![A diagram showing temperature and a dial as inputs to an IoT device, the IoT device with 2 way communication to the cloud, which in turn has 2 way communication to a phone, and control of a heater as an output from the IoT device](../../../../images/mobile-controlled-thermostat.png)
يمكن لنسخة أكثر ذكاءً استخدام الذكاء الاصطناعي في السحابة مع بيانات من مستشعرات أخرى متصلة بأجهزة إنترنت الأشياء الأخرى مثل مستشعرات الإشغال التي تكتشف الغرف المستخدمة ، بالاضافة الى البيانات مثل الطقس وحتى التقويم الخاص بك ، لاتخاذ قرارات بشأن كيفية ضبط درجة الحرارة بطريقة ذكية. على سبيل المثال ، يمكن أن يوقف التدفئة إذا كان يقرأ من التقويم الخاص بك أنك في إجازة ، أو أيقاف التدفئة على أساس كل غرفة على حدة اعتمادًا على الغرف التي تستخدمها ، والتعلم من البيانات لتكون أكثر دقة بمرور الوقت .
![A diagram showing multiple temperature sensors and a dial as inputs to an IoT device, the IoT device with 2 way communication to the cloud, which in turn has 2 way communication to a phone, a calendar and a weather service, and control of a heater as an output from the IoT device](../../../../images/smarter-thermostat.png)
✅ ما هي البيانات الأخرى التي يمكن أن تساعد في جعل منظم الحرارة المتصل بالإنترنت أكثر ذكاءً؟
</br>
### إنترنت الأشياء على edge
على الرغم من أن انترنت الاشياء تعني الإنترنت ، إلا أن هذه الأجهزة لا تحتاج إلى الاتصال بالإنترنت. في بعض الحالات ، يمكن للأجهزة الاتصال بأجهزة "edge" - أجهزة البوابة التي تعمل على شبكتك المحلية مما يعني أنه يمكنك معالجة البيانات دون إجراء مكالمة عبر الإنترنت. يمكن أن يكون هذا أسرع عندما يكون لديك الكثير من البيانات أو يكون اتصال الإنترنت بطيئًا ، فهو يسمح لك بالعمل دون اتصال بالإنترنت حيث يكون الاتصال بالإنترنت غير ممكن كما هو الحال على متن سفينة أو في منطقة كوارث عند الاستجابة لأزمة إنسانية ، ويسمح لك الحفاظ على خصوصية البيانات. ستحتوي بعض الأجهزة على كود معالجة تم إنشاؤه باستخدام أدوات السحابة وتشغيله محليًا لجمع البيانات والاستجابة لها دون استخدام اتصال بالإنترنت لاتخاذ قرار.
أحد الأمثلة على ذلك هو جهاز منزلي ذكي مثل Apple HomePod أو Amazon Alexa أو Google Home ، والتي ستستمع إلى صوتك باستخدام نماذج AI المدربة في السحابة ، ولكنها تعمل محليًا على الجهاز. سوف "تستيقظ" هذه الأجهزة عند نطق كلمة أو عبارة معينة ، وعندها فقط ترسل كلامك عبر الإنترنت لمعالجته. سيتوقف الجهاز عن إرسال الكلام في نقطة مناسبة مثل عندما يكتشف توقفًا مؤقتًا في كلامك. كل ما تقوله قبل إيقاظ الجهاز بكلمة التنبيه ، وكل ما تقوله بعد توقف الجهاز عن الاستماع لن يتم إرساله عبر الإنترنت إلى مزود الجهاز ، وبالتالي سيكون خاصًا.
✅ فكر في سيناريوهات أخرى حيث تكون الخصوصية مهمة ، لذا من الأفضل إجراء معالجة البيانات على edge بدلاً من السحابة. كتلميح - فكر في أجهزة إنترنت الأشياء المزودة بكاميرات أو أجهزة تصوير أخرى عليها.
</br>
### أمن إنترنت الأشياء
مع أي اتصال بالإنترنت ، يعد الأمان أحد الاعتبارات المهمة. هناك مزحة قديمة مفادها أن "S in IoT تعني الأمان" - لا يوجد حرف "S" في إنترنت الأشياء ، مما يعني أنه ليس آمنًا.
تتصل أجهزة إنترنت الأشياء بالخدمة السحابية ، وبالتالي فهي آمنة فقط مثل تلك الخدمة السحابية - إذا كانت الخدمة السحابية الخاصة بك تسمح لأي جهاز بالاتصال ، فيمكن إرسال البيانات الضارة ، أو يمكن أن تحدث هجمات الفيروسات. يمكن أن يكون لهذا عواقب حقيقية للغاية حيث تتفاعل أجهزة إنترنت الأشياء وتتحكم في الأجهزة الأخرى. على سبيل المثال ، ملف <a href="https://wikipedia.org/wiki/Stuxnet">Stuxnet worm</a> التلاعب بالصمامات في أجهزة الطرد المركزي لإتلافها. استفاد القراصنة أيضًا من <a href="https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable">ضعف الأمن للوصول إلى أجهزة مراقبة الأطفال</a> وأجهزة المراقبة المنزلية الأخرى.
> 💁 في بعض الأحيان ، تعمل أجهزة إنترنت الأشياء والأجهزة الطرفية على شبكة معزولة تمامًا عن الإنترنت للحفاظ على خصوصية البيانات وأمانها. هذا هو المعروف باسم <a href="https://wikipedia.org/wiki/Air_gap_(networking)">air-gapping</a>.
</br>
### التعمق اكثر في المتحكم الدقيق
في الدرس الأخير ، قدمنا المتحكمات الدقيقة. دعونا الآن نلقي نظرة أعمق عليهم.
</br>
### وحدة المعالجة المركزية
وحدة المعالجة المركزية هي "عقل" المتحكم الدقيق. إنه المعالج الذي يقوم بتشغيل الكود الخاص بك ويمكنه إرسال البيانات واستقبال البيانات من أي أجهزة متصلة. يمكن أن تحتوي وحدات المعالجة المركزية (CPU) على مركز واحد أو أكثر - وحدة معالجة مركزية واحدة أو أكثر يمكنها العمل معًا لتشغيل التعليمات البرمجية الخاصة بك.
تعتمد وحدات المعالجة المركزية (CPU) على ساعة لتحديد عدة ملايين أو مليارات المرات في الثانية. تقوم كل علامة أو دورة بمزامنة الإجراءات التي يمكن أن تتخذها وحدة المعالجة المركزية. مع كل علامة ، يمكن لوحدة المعالجة المركزية تنفيذ تعليمات من أحد البرامج ، مثل استرداد البيانات من جهاز خارجي أو إجراء عملية حسابية. تسمح هذه الدورة المنتظمة بإكمال جميع الإجراءات قبل معالجة التعليمات التالية.
كلما كانت دورة الساعة أسرع ، زادت التعليمات التي يمكن معالجتها كل ثانية ، وبالتالي زادت سرعة وحدة المعالجة المركزية. يتم قياس سرعات وحدة المعالجة المركزية بـ<a href="https://wikipedia.org/wiki/Hertz">Hertz (Hz)</a> ،وحدة قياسية حيث 1 هرتز يعني دورة واحدة أو علامة ساعة في الثانية.
> 🎓 سرعات وحدة المعالجة المركزية تُعطى غالبًا بالميغاهرتز أو الجيجاهرتز. 1 ميجا هرتز هو 1 مليون هرتز ، 1 جيجا هرتز 1 مليار هرتز.
> 💁 تنفذ وحدات المعالجة المركزية البرامج باستخدام امتداد <a href="https://wikipedia.org/wiki/Instruction_cycle">fetch-decode-execute cycle)</a> . لكل علامة ساعة ، ستقوم وحدة المعالجة المركزية بجلب التعليمات التالية من الذاكرة ، وفك تشفيرها ، ثم تنفيذها مثل استخدام وحدة المنطق الحسابي (ALU) لإضافة رقمين. ستستغرق بعض عمليات التنفيذ عدة علامات للتشغيل ، لذا ستعمل الدورة التالية عند العلامة التالية بعد اكتمال التعليمات.
![The fetch decode execute cycles showing the fetch taking an instruction from the program stored in RAM, then decoding and executing it on a CPU](../../../../images/fetch-decode-execute.png)
تتميز المتحكمات الدقيقة بسرعات ساعة أقل بكثير من أجهزة الكمبيوتر المكتبية أو المحمولة ، أو حتى معظم الهواتف الذكية. تحتوي Wio Terminal على سبيل المثال على وحدة معالجة مركزية تعمل بسرعة 120 ميجاهرتز أو 120.000.000 دورة في الثانية.
✅ يحتوي الكمبيوتر الشخصي العادي أو جهاز Mac على وحدة معالجة مركزية متعددة النوى تعمل بسرعة جيجاهرتز متعددة ، مما يعني أن الساعة تدق مليارات المرات في الثانية. ابحث في سرعة الساعة لجهاز الكمبيوتر الخاص بك وقارن عدد المرات التي تكون فيها أسرع من محطة Wio.
تقوم كل دورة على مدار الساعة بسحب الطاقة وتوليد الحرارة. كلما زادت سرعة ضربات الساعة ، زادت الطاقة المستهلكة والمزيد من الحرارة المتولدة. تحتوي أجهزة الكمبيوتر على أحواض حرارية ومراوح لإزالة الحرارة ، والتي بدونها سوف ترتفع درجة حرارتها وتغلق في غضون ثوانٍ. غالبًا ما لا تحتوي المتحكمات الدقيقة على أي منهما لأنها تعمل بشكل أكثر برودة وبالتالي فهي أبطأ بكثير. نفد التيار الكهربائي للكمبيوتر الشخصي أو البطاريات الكبيرة لبضع ساعات ، يمكن أن تعمل وحدات التحكم الدقيقة لأيام أو شهور أو حتى سنوات من البطاريات الصغيرة. يمكن أن تحتوي وحدات التحكم الدقيقة أيضًا على نوى تعمل بسرعات مختلفة ، وتتحول إلى نوى منخفضة الطاقة أبطأ عندما يكون الطلب على وحدة المعالجة المركزية منخفضًا لتقليل استهلاك الطاقة.
> 💁 تتبنى بعض أجهزة الكمبيوتر الشخصية وأجهزة Mac نفس المزيج من النوى السريعة عالية الطاقة ونواتج الطاقة المنخفضة الأبطأ ، مع التبديل لتوفير البطارية. على سبيل المثال ، يمكن لشريحة M1 في أحدث أجهزة كمبيوتر Apple المحمولة التبديل بين 4 نوى أداء و 4 نوى كفاءة لتحسين عمر البطارية أو سرعتها اعتمادًا على المهمة التي يتم تشغيلها.
✅ قم ببعض البحث: اقرأ عن وحدات المعالجة المركزية في <a href="https://wikipedia.org/wiki/Central_processing_unit">Wikipedia CPU article </a>
### مهمة
تحقق من محطة Wio.
إذا كنت تستخدم Wio Terminal لهذه الدروس ، فحاول العثور على وحدة المعالجة المركزية. ابحث عن قسم نظرة عامة على الأجهزة في <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">Wio Terminal product page </a> للحصول على صورة للأجزاء الداخلية ، وحاول العثور على وحدة المعالجة المركزية من خلال النافذة البلاستيكية الشفافة الموجودة في الخلف.
### ذاكرة
عادة ما تحتوي المتحكمات الدقيقة على نوعين من الذاكرة - ذاكرة البرنامج وذاكرة الوصول العشوائي (RAM).
ذاكرة البرنامج غير متطايرة ، مما يعني أن كل ما هو مكتوب عليها يبقى عند عدم وجود طاقة للجهاز. هذه هي الذاكرة التي تخزن كود البرنامج الخاص بك.
ذاكرة الوصول العشوائي هي الذاكرة التي يستخدمها البرنامج للتشغيل ، وتحتوي على متغيرات يخصصها برنامجك وبيانات تم جمعها من الأجهزة الطرفية. ذاكرة الوصول العشوائي متقلبة ، عندما تنقطع الطاقة تضيع المحتويات ، مما يؤدي إلى إعادة ضبط البرنامج بشكل فعال.
> 🎓 ذاكرة البرنامج تخزن الكود الخاص بك وتبقى عند انقطاع التيار الكهربائي.
> 🎓 تُستخدم ذاكرة الوصول العشوائي (RAM) لتشغيل برنامجك وتتم إعادة تعيينها عند انقطاع التيار الكهربائي
كما هو الحال مع وحدة المعالجة المركزية ، فإن الذاكرة الموجودة على وحدة التحكم الدقيقة هي أصغر من أجهزة الكمبيوتر الشخصي أو جهاز Mac. قد يحتوي جهاز الكمبيوتر العادي على 8 جيجا بايت من ذاكرة الوصول العشوائي ، أو 8000 مليون بايت ، مع مساحة كافية لكل بايت لتخزين حرف واحد أو رقم من 0-255. سيكون للمتحكم الدقيق فقط كيلو بايت (KB) من ذاكرة الوصول العشوائي ، مع كيلو بايت يبلغ 1000 بايت. تحتوي محطة Wio المذكورة أعلاه على 192 كيلو بايت من ذاكرة الوصول العشوائي ، أو 192000 بايت - أي أكثر من 40000 مرة أقل من متوسط ​​الكمبيوتر الشخصي!
يوضح الرسم البياني أدناه اختلاف الحجم النسبي بين 192 كيلو بايت و 8 جيجابايت - تمثل النقطة الصغيرة في المنتصف 192 كيلو بايت.
![A comparison between 192KB and 8GB - more than 40,000 times larger](../../../../images/ram-comparison.png)
تخزين البرنامج أصغر أيضًا من جهاز الكمبيوتر. قد يحتوي جهاز الكمبيوتر العادي على محرك أقراص ثابت سعة 500 جيجابايت لتخزين البرنامج ، في حين أن وحدة التحكم الدقيقة قد تحتوي على كيلوبايت فقط أو ربما بضعة ميغا بايت (MB) من التخزين (1 ميجابايت تساوي 1،000 كيلو بايت ، أو 1000000 بايت). محطة Wio لديها 4 ميغا بايت من تخزين البرنامج.
✅ قم بإجراء بحث بسيط: ما مقدار ذاكرة الوصول العشوائي ومساحة التخزين التي يمتلكها الكمبيوتر الذي تستخدمه لقراءة هذا؟ كيف يقارن هذا بالمتحكم الدقيق؟
### الإدخال / الإخراج
تحتاج المتحكمات الدقيقة إلى توصيلات الإدخال والإخراج (I / O) لقراءة البيانات من أجهزة الاستشعار وإرسال إشارات التحكم إلى المشغلات. عادة ما تحتوي على عدد من دبابيس الإدخال / الإخراج للأغراض العامة (GPIO). يمكن تكوين هذه المسامير في البرنامج بحيث يتم إدخالها (أي أنها تتلقى إشارة) ، أو إخراج (ترسل إشارة).
🧠⬅️ تُستخدم دبابيس الإدخال لقراءة القيم من أجهزة الاستشعار
🧠➡️ ترسل دبابيس الإخراج التعليمات إلى المشغلات
✅ سوف تتعلم المزيد عن هذا في درس لاحق.
#### مهمة
تحقق من محطة Wio.
إذا كنت تستخدم Wio Terminal لهذه الدروس ، فابحث عن دبابيس GPIO. ابحث عن قسم Pinout diagram في ملف <a href="https://www.seeedstudio.com/Wio-Terminal-p-4509.html">Wio Terminal product page </a> لمعرفة الدبابيس التي. تأتي Wio Terminal مع ملصق يمكنك تثبيته على ظهره بأرقام الدبوس ، لذا أضف هذا الآن إذا لم تكن قد قمت بذلك بالفعل.
### حجم فيزيائي
عادة ما تكون المتحكمات الدقيقة صغيرة الحجم ، وأصغرها <a href="https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/">Freescale Kinetis KL03 MCU صغير بما يكفي ليلائم غمازة كرة الجولف </a> . يمكن لوحدة المعالجة المركزية في جهاز الكمبيوتر فقط قياس 40 مم × 40 مم ، وهذا لا يشمل المشتتات الحرارية والمراوح اللازمة لضمان تشغيل وحدة المعالجة المركزية لأكثر من بضع ثوانٍ دون ارتفاع درجة الحرارة ، وهي أكبر بكثير من وحدة تحكم دقيقة كاملة. إن مجموعة مطور Wio الطرفية المزودة بوحدة تحكم دقيقة وحالة وشاشة ومجموعة من التوصيلات والمكونات ليست أكبر بكثير من وحدة المعالجة المركزية Intel i9 ، وهي أصغر بكثير من وحدة المعالجة المركزية مع المشتت الحراري والمروحة!
| الجهاز | الحجم |
| ------------------------------- | --------------------- |
| Freescale Kinetis KL03 | 1.6 مم × 2 مم × 1 مم |
| محطة Wio | 72 مم × 57 مم × 12 مم |
| وحدة المعالجة المركزية Intel i9 ، المشتت الحراري والمروحة | 136 مم × 145 مم × 103 مم |
### أنظمة التشغيل
نظرًا لانخفاض سرعتها وحجم الذاكرة ، لا تقوم وحدات التحكم الدقيقة بتشغيل نظام تشغيل (OS) بمعنى سطح المكتب . يحتاج نظام التشغيل الذي يعمل على تشغيل الكمبيوتر (Windows أو Linux أو macOS) إلى قدر كبير من الذاكرة وقوة المعالجة لتشغيل المهام غير الضرورية تمامًا لوحدة التحكم الدقيقة. تذكر أن المتحكمات الدقيقة عادة ما تكون مبرمجة لأداء مهمة واحدة أو أكثر من المهام المحددة للغاية ، على عكس أجهزة الكمبيوتر ذات الأغراض العامة مثل الكمبيوتر الشخصي أو جهاز Mac الذي يحتاج إلى دعم واجهة المستخدم أو تشغيل الموسيقى أو الأفلام أو توفير أدوات لكتابة المستندات أو التعليمات البرمجية أو ممارسة الألعاب أو تصفح الانترنت.
لبرمجة متحكم دقيق بدون نظام تشغيل ، فأنت بحاجة إلى بعض الأدوات للسماح لك ببناء الكود الخاص بك بطريقة يمكن للميكروكونترولر تشغيلها ، باستخدام واجهات برمجة التطبيقات التي يمكنها التحدث إلى أي أجهزة طرفية. يختلف كل متحكم عن الآخر ، لذا فإن الشركات المصنعة تدعم عادةً الأطر القياسية التي تسمح لك باتباع "وصفة" قياسية لبناء الكود الخاص بك وتشغيله على أي متحكم يدعم هذا الإطار.
يمكنك برمجة وحدات التحكم الدقيقة باستخدام نظام تشغيل - يشار إليه غالبًا باسم نظام التشغيل في الوقت الفعلي (RTOS) ، حيث تم تصميمه للتعامل مع إرسال البيانات من وإلى الأجهزة الطرفية في الوقت الفعلي. تتميز أنظمة التشغيل هذه بأنها خفيفة الوزن للغاية وتوفر ميزات مثل:
* خيوط متعددة ، مما يسمح للكود الخاص بك بتشغيل أكثر من كتلة واحدة من التعليمات البرمجية في نفس الوقت ، إما على مراكز متعددة أو بالتناوب على نواة واحدة
* الشبكات للسماح بالاتصال عبر الإنترنت بشكل آمن
* مكونات واجهة المستخدم الرسومية (GUI) لبناء واجهات المستخدم (UI) على الأجهزة التي تحتوي على شاشات.
✅ اقرأ عن بعض أنظمة RTOS المختلفة:
<a href="https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn">Azure RTOS </a>, <a href="https://www.freertos.org">FreeRTOS </a> , <a href="https://www.zephyrproject.org">Zephyr </a>
</br>
#### Arduino
![The Arduino logo](../../../../images/arduino-logo.svg)
<a href="https://www.arduino.cc">Arduino </a>
من المحتمل أن يكون إطار عمل وحدة التحكم الدقيقة الأكثر شيوعًا ، خاصة بين الطلاب والهواة والصناع. Arduino عبارة عن منصة إلكترونية مفتوحة المصدر تجمع بين البرامج والأجهزة. يمكنك شراء لوحات Arduino المتوافقة من Arduino نفسها أو من الشركات المصنعة الأخرى ، ثم كتابة التعليمات البرمجية باستخدام إطار عمل Arduino.
يتم ترميز لوحات Arduino في C أو C ++. يتيح استخدام C / C ++ تجميع التعليمات البرمجية الخاصة بك بشكل صغير جدًا وتشغيلها بسرعة ، وهو شيء مطلوب على جهاز مقيد مثل متحكم دقيق. يُشار إلى جوهر تطبيق Arduino بالرسم وهو رمز C / C ++ مع وظيفتين - "الإعداد" و "الحلقة". عند بدء تشغيل اللوحة ، سيعمل كود إطار عمل Arduino على تشغيل وظيفة "الإعداد" مرة واحدة ، ثم يقوم بتشغيل وظيفة "الحلقة" مرارًا وتكرارًا ، وتشغيلها باستمرار حتى يتم إيقاف تشغيل الطاقة.
ستكتب رمز الإعداد الخاص بك في وظيفة "الإعداد" ، مثل الاتصال بشبكة WiFi والخدمات السحابية أو تهيئة المسامير للإدخال والإخراج. سيحتوي رمز الحلقة الخاص بك بعد ذلك على رمز معالجة ، مثل القراءة من جهاز استشعار وإرسال القيمة إلى السحابة. يمكنك عادةً تضمين تأخير في كل حلقة ، على سبيل المثال ، إذا كنت تريد فقط إرسال بيانات المستشعر كل 10 ثوانٍ ، فستضيف تأخيرًا لمدة 10 ثوانٍ في نهاية الحلقة حتى يتمكن المتحكم الدقيق من السكون ، وتوفير الطاقة ، ثم التشغيل الحلقة مرة أخرى عند الحاجة بعد 10 ثوانٍ.
![An arduino sketch running setup first, then running loop repeatedly](../../../../images/arduino-sketch.png)
✅ تُعرف بنية البرنامج هذه باسم حلقة الحدث أو حلقة الرسالة . تستخدم العديد من التطبيقات هذا تحت الغطاء وهو المعيار لمعظم تطبيقات سطح المكتب التي تعمل على أنظمة تشغيل مثل Windows أو macOS أو Linux. "الحلقة" تستمع إلى الرسائل الواردة من مكونات واجهة المستخدم مثل الأزرار أو الأجهزة مثل لوحة المفاتيح وتستجيب لها. يمكنك قراءة المزيد في هذا <a href="https://wikipedia.org/wiki/Event_loop">article on the event loop </a>
يوفر Arduino مكتبات قياسية للتفاعل مع وحدات التحكم الدقيقة ودبابيس الإدخال / الإخراج ، مع تطبيقات مختلفة أسفل الغطاء للتشغيل على وحدات تحكم دقيقة مختلفة. على سبيل المثال ، ملف <a href="https://www.arduino.cc/reference/en/language/functions/time/delay/">`delay` function </a> سيوقف البرنامج مؤقتًا لفترة معينة من الوقت ، فإن <a href="https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/">`digitalRead` function </a> سيقرأ قيمة "HIGH" أو "LOW" من رقم التعريف الشخصي المحدد ، بغض النظر عن اللوحة التي يتم تشغيل الكود عليها. تعني هذه المكتبات القياسية أن كود Arduino المكتوب للوحة واحدة يمكن إعادة تجميعه لأي لوحة Arduino أخرى وسيتم تشغيله ، على افتراض أن الدبابيس هي نفسها وأن اللوحات تدعم نفس الميزات.
يوجد نظام بيئي كبير من مكتبات Arduino الخارجية يسمح لك بإضافة ميزات إضافية إلى مشاريع Arduino الخاصة بك ، مثل استخدام المستشعرات والمشغلات أو الاتصال بخدمات إنترنت الأشياء السحابية.
##### مهمة
تحقق من محطة Wio.
إذا كنت تستخدم Wio Terminal لهذه الدروس ، فأعد قراءة الكود الذي كتبته في الدرس الأخير. ابحث عن وظيفتي "الإعداد" و "الحلقة". راقب الإخراج التسلسلي لوظيفة الحلقة التي يتم استدعاؤها بشكل متكرر. حاول إضافة رمز إلى وظيفة "الإعداد" للكتابة إلى المنفذ التسلسلي ولاحظ أن هذا الرمز يتم استدعاؤه مرة واحدة فقط في كل مرة تقوم فيها بإعادة التشغيل. حاول إعادة تشغيل جهازك باستخدام مفتاح الطاقة الموجود على الجانب لإظهار أن هذا يسمى في كل مرة يتم فيها إعادة تشغيل الجهاز.
## التعمق اكثر في أجهزة الكمبيوتر ذات اللوحة الواحد
في الدرس الأخير ، قدمنا أجهزة كمبيوتر أحادية اللوحة. دعونا الآن نلقي نظرة أعمق عليهم.
### Raspberry Pi
![The Raspberry Pi logo](../../../../images/raspberry-pi-logo.png)
<a href="https://www.raspberrypi.org">Raspberry Pi Foundation </a> هي مؤسسة خيرية من المملكة المتحدة تأسست عام 2009 للترويج لدراسة علوم الكمبيوتر ، وخاصة على مستوى المدرسة. كجزء من هذه المهمة ، قاموا بتطوير جهاز كمبيوتر ذو لوحة واحدة ، يسمى Raspberry Pi. يتوفر Raspberry Pi حاليًا في 3 متغيرات - إصدار بالحجم الكامل ، و Pi Zero الأصغر ، ووحدة حسابية يمكن دمجها في جهاز IoT النهائي الخاص بك.
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
أحدث نسخة من Raspberry Pi بالحجم الكامل هي Raspberry Pi 4B. يحتوي هذا على وحدة معالجة مركزية رباعية النواة (4 نواة) تعمل بسرعة 1.5 جيجاهرتز أو 2 أو 4 أو 8 جيجابايت من ذاكرة الوصول العشوائي و Gigabit ethernet و WiFi ومنفذين HDMI يدعمان شاشات 4K ومنفذ إخراج الصوت والفيديو المركب ومنافذ USB (2 USB 2.0 ، 2 USB 3.0) ، 40 GPIO ، موصل كاميرا لوحدة كاميرا Raspberry Pi ، وفتحة بطاقة SD. كل هذا على لوحة مقاس 88 مم × 58 مم × 19.5 مم ويتم تشغيلها بواسطة مصدر طاقة 3 أمبير USB-C. يبدأ سعرها من 35 دولارًا أمريكيًا ، وهو أرخص بكثير من جهاز الكمبيوتر الشخصي أو جهاز Mac.
> 💁 يوجد أيضًا جهاز كمبيوتر Pi400 الكل في واحد مع Pi4 المدمج في لوحة المفاتيح.
![A Raspberry Pi Zero](../../../../images/raspberry-pi-zero.jpg)
Pi Zero أصغر بكثير ، مع طاقة أقل. يحتوي على وحدة معالجة مركزية أحادية النواة بسرعة 1 جيجاهرتز ، وذاكرة وصول عشوائي (RAM) سعة 512 ميجابايت ، و WiFi (في طراز Zero W) ، ومنفذ HDMI واحد ، ومنفذ micro-USB ، و 40 دبوس GPIO ، وموصل كاميرا لوحدة كاميرا Raspberry Pi ، وبطاقة SD فتحة. يقيس 65 مم × 30 مم × 5 مم ، ولا يستهلك سوى القليل من الطاقة. سعر Zero 5 دولارات أمريكية ، مع إصدار W مع شبكة WiFi بقيمة 10 دولارات أمريكية.
> 🎓 وحدات المعالجة المركزية في كلاهما هي معالجات ARM ، على عكس معالجات Intel / AMD x86 أو x64 التي تجدها في معظم أجهزة الكمبيوتر الشخصية وأجهزة Mac. هذه تشبه وحدات المعالجة المركزية التي تجدها في بعض المتحكمات الدقيقة ، وكذلك جميع الهواتف المحمولة تقريبًا ، ومايكروسوفت سيرفس إكس ، وأجهزة آبل ماك الجديدة القائمة على السيليكون.
تعمل جميع متغيرات Raspberry Pi على إصدار من Debian Linux يسمى Raspberry Pi OS. يتوفر هذا كإصدار خفيف بدون سطح مكتب ، وهو مثالي لمشروعات "بلا رأس" حيث لا تحتاج إلى شاشة ، أو نسخة كاملة مع بيئة سطح مكتب كاملة ، مع متصفح الويب ، والتطبيقات المكتبية ، وأدوات الترميز والألعاب. نظرًا لأن نظام التشغيل هو إصدار من Debian Linux ، يمكنك تثبيت أي تطبيق أو أداة تعمل على Debian ومصممة لمعالج ARM داخل Pi.
#### مهمة
تحقق من Raspberry Pi.
إذا كنت تستخدم Raspberry Pi لهذه الدروس ، فاقرأ عن مكونات الأجهزة المختلفة الموجودة على اللوحة.
* يمكنك العثور على تفاصيل حول المعالجات المستخدمة في <a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/">Raspberry Pi hardware documentation page </a> اقرأ عن المعالج المستخدم في Pi الذي تستخدمه.
* حدد موقع دبابيس GPIO. اقرأ المزيد عنها في <a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md">Raspberry Pi GPIO documentation </a> . استخدم <a href="https://www.raspberrypi.org/documentation/usage/gpio/README.md">GPIO Pin Usage guide </a> لتحديد الدبابيس المختلفة على Pi الخاص بك.
### برمجة أجهزة الكمبيوتر ذات اللوحة الواحدة
أجهزة الكمبيوتر أحادية اللوحة هي أجهزة كمبيوتر كاملة تعمل بنظام تشغيل كامل. هذا يعني أن هناك مجموعة واسعة من لغات البرمجة والأطر والأدوات التي يمكنك استخدامها لترميزها ، على عكس المتحكمات الدقيقة التي تعتمد على دعم اللوحة في أطر مثل Arduino. تحتوي معظم لغات البرمجة على مكتبات يمكنها الوصول إلى دبابيس GPIO لإرسال واستقبال البيانات من أجهزة الاستشعار والمشغلات.
✅ ما هي لغات البرمجة التي تعرفها؟ هل هم مدعومون على لينكس؟
لغة البرمجة الأكثر شيوعًا لبناء تطبيقات إنترنت الأشياء على Raspberry Pi هي Python. يوجد نظام بيئي ضخم للأجهزة المصممة لـ Pi ، وكلها تقريبًا تشتمل على الكود ذي الصلة اللازم لاستخدامها كمكتبات Python. تعتمد بعض هذه الأنظمة البيئية على "القبعات" - وهذا ما يسمى لأنها تجلس على قمة Pi مثل القبعة وتتصل بمقبس كبير إلى 40 دبوس GPIO. توفر هذه القبعات إمكانات إضافية ، مثل الشاشات أو المستشعرات أو السيارات التي يتم التحكم فيها عن بُعد أو المحولات للسماح لك بتوصيل المستشعرات بكابلات قياسية
### استخدام أجهزة الكمبيوتر أحادية اللوحة في عمليات نشر إنترنت الأشياء الاحترافية
تُستخدم أجهزة الكمبيوتر أحادية اللوحة في عمليات نشر إنترنت الأشياء الاحترافية ، وليس فقط كمجموعات للمطورين. يمكن أن توفر طريقة قوية للتحكم في الأجهزة وتشغيل المهام المعقدة مثل تشغيل نماذج التعلم الآلي. على سبيل المثال ، <a href="https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/">Raspberry Pi 4 compute module </a> توفر كل قوة Raspberry Pi 4 ولكن في عامل شكل مدمج وأرخص بدون معظم المنافذ ، مصمم ليتم تثبيته في الأجهزة المخصصة.
---
## 🚀 تحدي
كان التحدي في الدرس الأخير هو سرد أكبر عدد ممكن من أجهزة إنترنت الأشياء الموجودة في منزلك أو مدرستك أو مكان عملك. لكل جهاز في هذه القائمة ، هل تعتقد أنه مبني على وحدات تحكم دقيقة أو أجهزة كمبيوتر أحادية اللوحة ، أو حتى مزيج من الاثنين؟
## مسابقة ما بعد المحاضرة
[<div dir="rtl"> اختبار ما بعد المحاضرة </div>](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## مراجعة ودراسة ذاتية
* اقرأ <a href="https://www.arduino.cc/en/Guide/Introduction">Arduino getting started guide </a> لفهم المزيد حول نظام Arduino الأساسي.
* اقرأ <a href="https://www.raspberrypi.org/products/raspberry-pi-4-model-b/">introduction to the Raspberry Pi 4</a> لمعرفة المزيد عن Raspberry Pi.
✅ استخدم هذه الأدلة ، جنبًا إلى جنب مع التكاليف الموضحة باتباع الروابط الموجودة في ملف [hardware guide](../../../hardware.md) لتحديد النظام الأساسي للأجهزة الذي تريد استخدامه ، أو إذا كنت تفضل استخدام جهاز افتراضي.
## واجب
[قارن بين المتحكمات الدقيقة وأجهزة الكمبيوتر أحادية اللوحة](assignment.ar.md)
</div>

@ -1,254 +0,0 @@
# IoT এর আরো গভীরে
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-2.jpg)
>স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার পূর্ববর্তী কুইজ
[লেকচার পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## সূচনা
এই অংশে আমাদের আগের পাঠ্যের আলোচিত কিছু বেসিক ধারণাগুলির আরও গভী্রে যাব আমরা।
এই পাঠে আমরা কভার করব:
* [আইওটি উপাদানসমূহ](#আইওটি-উপাদানসমূহ)
* [মাইক্রোকন্ট্রোলারের আরো গভীরে](#মাইক্রোকন্ট্রোলারের-আরো-গভীরে)
* [সিংগেল বোর্ড কম্পিউটারের আরো গভীরে](#সিংগেল-বোর্ড-কম্পিউটারের-আরো-গভীরে)
## আইওটি উপাদানসমূহ
আইওটি অ্যাপ্লিকেশনের দুটি উপাদান হলো *ইন্টারনেট* এবং *থিংস* । এই দুটি উপাদানকে আরও কিছুটা বিস্তারিতভাবে দেখা যাক।
### থিংস
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
**থিংস** বলতে আইওটির এই অংশটি এমন একটি ডিভাইসকে বোঝায় যা চারপাশের জগতের সাথে যোগাযোগ করতে পারে। এই ডিভাইসগুলি সাধারণত ছোট, কম দামের কম্পিউটার, কম গতিতে চলমান এবং কম শক্তি ব্যবহার করে। উদাহরণস্বরূপ সাধারণ মাইক্রোকন্ট্রোলারগুলি কিলোবাইট র‍্যামের (অথচ একটি পিসিতে তা গিগাবাইটের) চালিত হয় মাত্র কয়েক শতাধিক মেগাহার্টজ (অথচ একটি পিসিতে তা গিগাহার্টজের)। তবে কখনও কখনও এত অল্প শক্তি ব্যবহার করে তারা ব্যাটারিতে সপ্তাহ, মাস বা কয়েক বছর ধরে চলতে পারে।
এই যন্ত্রগুলো আমাদের চারপাশের পৃথিবীর সাথে সংযুক্ত থাকে; হয় সেন্সর ব্যবহার করে তথ্য সংগ্রহ করে অথবা একচুয়েটরের আউটপুট নিয়ন্ত্রণ করে কোন কাজ করার মাধ্যমে। এর সাধারণ একটি উদাহরণ হল স্মার্ট থার্মোস্ট্যাট -এমন একটি ডিভাইস যার মধ্যে তাপমাত্রা সেন্সর থাকে। এছাড়াও এতে থাকে একটি পছন্দসই তাপমাত্রা সেট করার উপায় যেমন ডায়াল বা টাচস্ক্রিন ব্যবহার করে এবং একটি তাপীকরণ বা শীতলকরণ ব্যবস্থার সাথে সংযুক্ত থাকে। ব্যবহারকারীর নির্ধারিত সীমার বাইরে গেলেই এই যন্ত্রগুলো চালু হয় । এখানে উদাহরণস্বরূপ, তাপমাত্রা সেন্সর সনাক্ত করে যে ঘরটি খুব শীতল এবং একটি একচুয়েটর তখন হিটিং চালু করে।
![A diagram showing temperature and a dial as inputs to an IoT device, and control of a heater as an output](../../../../images/basic-thermostat.png)
বিভিন্ন জিনিস রয়েছে যা আইওটি ডিভাইস হিসাবে কাজ করতে পারে, সংবেদনশীল ডেডিকেটেড হার্ডওয়্যার থেকে শুরু করে , জেনারেল পারপাস ডিভাইস এমনকি আমাদের স্মার্টফোন পর্যন্ত! একটি স্মার্টফোন চারপাশের বিভিন্ন তথ্য সংগ্রহের জন্য সেন্সর ব্যবহার করে এবং বাস্তব জগতের সাথে যোগাযোগ করে একচুয়েটর - উদাহরণস্বরূপ আমাদের অবস্থান সনাক্ত করতে জিপিএস সেন্সর এবং কোন গন্তব্যে আমাদেরকে নির্দেশনা দেওয়ার জন্য স্পিকার রয়েছে।
✅ আমাদের চারপাশের অন্যান্য সিস্টেমগুলির কথা চিন্তা করি যা সেন্সর থেকে ডেটা সংগ্রহ করে এবং সিদ্ধান্ত নিতে তা ব্যবহার করে। একটি উদাহরণ হতে পারে, ওভেনের উপর রাখা থার্মোস্ট্যাট। চারপাশে আরও কিছু কী খুঁজে পাওয়া যাবে ?
### ইন্টারনেট
আইওটি অ্যাপ্লিকেশনটির **ইন্টারনেট** অংশে বোঝান হয় এমন সব অ্যাপ্লিকেশন যার সাথে আইওটি ডিভাইসে সংযুক্ত থেকে ডেটা প্রেরণ এবং গ্রহণ করতে পারে। পাশাপাশি অন্যান্য অ্যাপ্লিকেশনগুলিও এর অংশ যা আইওটি ডিভাইস থেকে প্রাপ্ত ডেটা বিশ্লেষণ করতে পারে এবং আইওটি ডিভাইস একচুয়েটরকে কী কী নির্দেশ পাঠাতে হবে সেই সিদ্ধান্ত নেয়।
একটি সাধারণ সেটআপে আইওটি ডিভাইসটি সংযুক্ত হওয়ার সাথে কিছু ধরণের ক্লাউড সেবা থাকবে এবং এই ক্লাউড পরিষেবাগুলো সুরক্ষা, আইওটি ডিভাইস থেকে বার্তা গ্রহণ এবং ডিভাইসে বার্তা প্রেরণের মতো বিষয়গুলি পরিচালনা করে। এই ক্লাউড সার্ভিসটি তখন এমন অন্যান্য অ্যাপ্লিকেশনগুলির সাথে সংযুক্ত হবে যা সেন্সর ডেটা প্রক্রিয়া করতে বা স্টোর করতে পারে। এছাড়াও সিদ্ধান্ত নিতে অন্যান্য যেকোন সিস্টেমের ডেটার সেন্সর থেকে প্রাপ্ত ডেটা ক্লাউড সার্ভিস ব্যবহার করে থাকে।
ডিভাইসগুলো সবসময় যে ক্যাবল বা ওয়াইফাই দ্বারা সরাসরি ইন্টারনেটে সংযুক্ত থাকবে তাও কিন্তু নয়। কিছু যন্ত্র মেশ নেটওয়ার্ক ব্যবহার করে ব্লুটুথ বা এইধরণের কোন টেকনলজির সাহায্যে অন্য ডিভাইসের সাথে যুক্ত থাকে, আর এই সংযুক্তি ঘটায় হাব যা নিজে ইন্টারনেটের সাথে যুক্ত ।
ইন্টারনেট সংযোগে কাজের উদাহরণস্বরূপ, একটি থার্মোস্ট্যাট নিই, যা কিনা ক্লাউডে হোম ওয়াইফাই ব্যবহার করে সংযুক্ত হয়েছে। এটি এই ক্লাউড পরিষেবায় তাপমাত্রার ডেটা প্রেরণ করে এবং সেখান থেক তা কোন ডাটাবেইস বা তথ্যভান্ডারে সংরক্ষিত থাকে এবং বাড়ির মালিককে কোন একটি মোবাইল অ্যাপ্লিকেশন ব্যবহার করে বর্তমান এবং অতীত তাপমাত্রা যাচাই করার সুযোগ দেয়। ক্লাউডের অন্য একটি আগে থেকেই জেনে নেয় যে বাড়ির মালিক কত তাপমাত্রা পছন্দ করেন এবং সেই পছন্দের ভিত্তিতে ক্লাউড সার্ভিসের মাধ্যমে আইওটি ডিভাইসে বার্তা প্রেরণ করে হিটিং সিস্টেমটি চালু বা বন্ধ করতে বলে।
![A diagram showing temperature and a dial as inputs to an IoT device, the IoT device with 2 way communication to the cloud, which in turn has 2 way communication to a phone, and control of a heater as an output from the IoT device](../../../../images/mobile-controlled-thermostat.png)
আরও উন্নত কোন ভার্সন, যা আইওটি ডিভাইসে সংযুক্ত অন্যান্য ডিভাইসের সেন্সরগুলির সাথে যেমন অকুপেন্সি সেন্সর থেকে বিভিন্ন তথ্য ( যেমন সেই সময়ের আবহাওয়া বা আপনার ব্যক্তিগত ক্যালেন্ডারে কী কী তথ্য রয়েছে) এর ভিত্তিতে সিদ্ধান্ত নিতে পারে যে তাপমাত্রা কত হওয়া উচিত। উদাহরণস্বরূপ আপনার ক্যালেন্ডারে বলা রয়েছে আজ আপনি ভ্রমণে গিয়েছেন। সেক্ষেত্রে শীতকালে আপনার রুমে হিটার চালানোর কোন দরকার নেই আর, আইওটি এই স্মার্ট ডিসিশনটি নিতে পারবে। এছাড়াও আপনি কোন রুম কখন কীভাবে ব্যবহার করেন, তার ভিত্তিতেও আর্টিফিশিয়াল ইন্টেলিজেন্স মডেলগুলি সিদ্ধান্ত নিতে পারে আর সময়ের সাথে সাথে প্রাপ্ত ডেটার কারণে এই সিদ্ধান্তগুলি আরো বেশি সঠিক হতে থাকে।
![A diagram showing multiple temperature sensors and a dial as inputs to an IoT device, the IoT device with 2 way communication to the cloud, which in turn has 2 way communication to a phone, a calendar and a weather service, and control of a heater as an output from the IoT device](../../../../images/smarter-thermostat.png)
✅ ইন্টারনেট সংযুক্ত থার্মোস্ট্যাটকে আরও স্মার্ট করে তুলতে অন্য কোন কোন ধরণের ডেটা সাহায্য করতে পারে?
### Edge চালিত IoT
যদিও আইওটিতে **I** বলতে ইন্টারনেট বোঝায়, এই ডিভাইসগুলি যে অবশ্যই ইন্টারনেটে সংযুক্ত থাকতে হবে - তা পুরোপুরি সত্য নয়। কিছু ক্ষেত্রে আইওটি যন্ত্রগুলো 'এজ' ডিভাইসগুলির সাথে সংযোগ স্থাপন করতে পারে - যেগুলো হলো লোকাল নেটওয়ার্কে চালিত গেটওয়ে ডিভাইস যেখানে ইন্টারনেটে কোন সংযোগ না করেই ডেটা প্রক্রিয়া করতে পারবো। আমাদের যখন প্রচুর ডেটা ট্রান্সফার বা ধীর ইন্টারনেট সংযোগ থাকে তখন এটির মাধমে সম্পূর্ণ কাজ আরও দ্রুততর হতে পারে যা অফলাইনে চালানো যাবে এমনকি যখন কোন মানবিক সংকটের সময় কোন জাহাজে বা দুর্যোগ অঞ্চলে ইন্টারনেট সংযোগ সম্ভব হয়না, তখন সেখানে কার্যক্রম পরিচালনা করা যায়; সাথে সাথে আমাদের ব্যক্তিগত তথ্যের গোপনীয়তা রক্ষা করাও সম্ভব । কিছু ডিভাইসে ক্লাউড সুবিধা ব্যবহার করে তৈরি প্রসেসিং কোড থাকে এবং কোনও সিদ্ধান্ত নেওয়ার জন্য কোনও ইন্টারনেট সংযোগ ব্যবহার না করেই ডেটা সংগ্রহ ও প্রতিক্রিয়া জানাতে লোকাল নেটওয়ার্কে এটি চালানো যাবে।
উদাহরণস্বরূপ, আমাদের স্মার্ট হোম ডিভাইস যেমন অ্যাপল হোমপড, অ্যামাজন অ্যালেক্সা বা গুগল হোম যা প্রশিক্ষিত এআই মডেলগুলি ব্যবহার করে আমাদের ভয়েস শুনতে পাবে এবং নির্দিষ্ট শব্দ বা বাক্যাংশ বললে চালু হয় বা 'wake up' করে এবং তারপরই আমরা আমাদের কথাগুলো ইন্টারনেটে প্রসেসিং এর জন্য পাঠাই অথচ বাকি সময়ের নির্দেশগুলো প্রাইভেট থাকে। বিস্তারিত বলতে গেলে, ডিভাইসটি উপযুক্ত সময়ে আমাদের ভয়েস প্রেরণ বন্ধ করবে যেমন এটি যখন আমাদের কথায় কোন বিরতি সনাক্ত করে, তখন বন্ধ হয়ে যায়। এটিকে'wake up' করার আগে এবং ডিভাইসটি বন্ধ করার পরে আমরা যা কিছু বলছি, তা ইন্টারনেটের মাধ্যমে ডিভাইস সরবরাহকারীর বা প্রস্তুতকারকের কাছে প্রেরণ করা হবে না এবং তাই এটি ব্যক্তিগত গোপনীয়তা বজায় রাখবে।
✅ এমন কিছু পরিস্থিতির কথা চিন্তা করি যেখানে গোপনীয়তা গুরুত্বপূর্ণ, তাই ডেটা প্রক্রিয়াকরণটি ক্লাউডের চেয়ে 'Edge' এ করা তুলনামূলকভাবে ভালো । ছোট্ট একটি ইঙ্গিত দিই - ক্যামেরা বা অন্যান্য ইমেজিং ডিভাইস সম্বলিত আইওটি সার্ভিসকে এক্ষেত্রে ভাবা যেতে পারে ।
### IoT নিরাপত্তা
যেকোন ইন্টারনেট সংযোগের সাথে, সুরক্ষা একটি গুরুত্বপূর্ণ বিষয়। বেশ পরিচিত একটি কৌতুক রয়েছে যেখানে বলা হয়, IoT তে S মানে হলো Security - কিন্তু আইওটির পূর্ণরূপে কোথাও S নেই, যার মানে Security বা নিরাপত্তা নেই। উদাহরণস্বরূপ, [Stuxnet worm](https://wikipedia.org/wiki/Stuxnet) নামক ক্ষতিকারক 'কীট' বা worm অনেকগুলো সেন্ট্রিফিউজের ভাল্ভকে ভুলভাবে নিয়ন্ত্রণ করে কাজে ব্যাঘাত ঘটায়। হ্যাকাররাও তখন [baby monitor গুলোর নিম্নমানের নিরাপত্তার](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable) সুযোগ নেয়।
> 💁 কখনও কখনও আইওটি ডিভাইস এবং Edge ডিভাইসগুলি ব্যক্তিগত তথ্য ও নিরাপত্তাকে সুরক্ষিত রাখতে ইন্টারনেট থেকে সম্পূর্ণ বিচ্ছিন্ন কোন নেটওয়ার্কে চালিত হয়। এটিকে বলা হয় [এয়ার গ্যাপিং](https://wikipedia.org/wiki/Air_gap_(networking))।
## মাইক্রোকন্ট্রোলারের আরো গভীরে
গত লেসনে আমরা মাইক্রোকন্ট্রোলারদের পরিচিত হয়েছিলাম। এখন তাদেরকে আরও গভীরভাবে জানবো।
### সিপিইউ
সিপিইউ হল মাইক্রোকন্ট্রোলারের 'মস্তিষ্ক'। এটি মূলত প্রসেসর যা আপনার কোড রান করে এবং কোন সংযুক্ত ডিভাইসে ডেটা প্রেরণ এবং তা থেকে ডেটা গ্রহণ করতে পারে। সিপিইউতে এক বা একাধিক কোর থাকতে পারে - যা মূলত এক বা একাধিক সিপিইউ যা কোড রান করার জন্য একসাথে কাজ করতে পারে।
সিপিইউগুলি একধরণের ঘড়ির উপর নির্ভর করে যা প্রতি সেকেন্ডে বহু মিলিয়ন বা বিলিয়ন বার টিক দেয়। প্রতিটি টিক বা সাইকেলে, সিপিইউর তার ক্ষমতানুসারে কাজগুলো করে। প্রতিটি টিকের সাথেই সিপিইউ কোন প্রোগ্রামের একটি নির্দেশনা কার্যকর করতে পারে, যেমন কোন বাহ্যিক ডিভাইস থেকে ডেটা পুনরুদ্ধার করা বা গাণিতিক গণনা সম্পাদন করা। এই নিয়মিত চক্রটি পরবর্তী নির্দেশাবলী প্রক্রিয়া করার আগেই আগের সব কাজ করে ফেলে।
ক্লক সাইকেল যত দ্রুত হবে, প্রতি সেকেন্ডে সিপিইউ তত বেশি কাজও করতে পারবে অর্থাৎ দ্রুততর সিপিইউ হবে। এদের গতি পরিমাপ করা হয়ে থাকে [হার্টজ (Hz)](https://wikipedia.org/wiki/Hertz) এককে, যেখানে ১ হার্টজ বলতে বোঝান হয়, প্রতি সেকেন্ডে একটি চক্র বা টিক সম্পাদন করা।
> 🎓 বেশিরভাগ সময় সিপিইউ স্পীড লেখা হয় MHz অথবা GHz দিয়ে। ১ মেগাহার্টজ হলো ১ মিলিয়ন হার্টজ এবং ১ গিগাহার্টজ হলো ১ বিলিয়ন হার্টজ ।
> 💁 সিপিইউগুলো [fetch-decode-execute cycle](https://wikipedia.org/wiki/Instruction_cycle) ব্যবহার করে প্রোগ্রাম এক্সেকিউট করে। প্রতি টিক এর সাথে সিপিইউ পরবর্তী নির্দেশনা গ্রহণ করবে, তা ডিকোড করবে এবং পরিশেষে এক্সেকিউট করবে যেমনঃ Arithmetic Logic Unit (ALU) ব্যবহার করে ২ যোগ করা। কিছু কিছু এক্সেকিউশন এর জন্য একাধিক টিক বা সাইকেল দরকার হয়। কাজ হয়ে যাওয়ার পর, পরবর্তী টিক আসলে তবেই পরের সাইকেলটি রান করবে।
![The fetch decode execute cycles showing the fetch taking an instruction from the program stored in RAM, then decoding and executing it on a CPU](../../../../images/fetch-decode-execute.png)
মাইক্রোকন্ট্রোলারগুলির ক্লক স্পীড ডেস্কটপ বা ল্যাপটপ কম্পিউটার, এমনকি বেশিরভাগ স্মার্টফোনের চেয়ে অনেক কম। উদাহরণস্বরূপ, Wio টার্মিনালের একটি সিপিইউ রয়েছে যা 120MHz বা সেকেন্ডে 120,000,000 সাইকেল চালায়।
✅ একটি গড়পড়তা পিসি বা ম্যাক এর গিগাহার্টজে চলমান একাধিক কোর থাকে অর্থাৎ সেকেন্ডে কয়েক বিলিয়ন বার টিক দেয় বা সাইকেল সম্পাদন করে। আমাদের কম্পিউটারের ক্লক স্পীড কত তা জেনে নিয়ে Wio টার্মিনালের চেয়ে তা কতগুণ দ্রুত সেই হিসেব করি।
প্রতিটি সাইকেল রান করতে প্রয়োজন হয় শক্তি যা কিনা তাপ বা হিট তৈরী করে। যত দ্রুত ক্লকস্পীড, তত বেশি পাওয়ার প্রয়োজন হবে এবং তাপ উৎপন্ন হবে। পিসির তাপ অপসারণ করত 'হিট সিংক' এবং ফ্যান ব্যবহৃত হয় যা ছাড়া প্রচণ্ড উত্তাপের সাথে কয়েক সেকেন্ডের মধ্যেই কম্পিউটার বন্ধ হয়ে যাবে। মাইক্রোকন্ট্রোলারে এরকম তাপ অপসারণের কোন সুযোগ দরকার হয়না কেননা এরা অনেক কম গতিসম্পন্ন ক্লকস্পীডে চলে এবং তাই ততটা তাপ তৈরী করেনা।
> 💁 কিছু পিসি বা ম্যাক দ্রুত গতির হাই-পাওয়ার কোর এবং ধীর গতির লো-পাওয়ার কোর ব্যবহার শুরু করছে যাতে ব্যাটারি পাওয়ার বাঁচানো যায়। উদাহরণস্বরূপ, লেটেস্ট অ্যাপল ল্যাপটপে M1 চিপ ব্যবহার করে হচ্ছে, যা ৪টি পার্ফম্যান্স কোর এবং ৪টি ইফিশিয়েন্ট কোর এর মধ্যে কাজ ভাগ করতে পারে,যাতে করে পরিমিত ব্যাটারি লাইফ পাওয়া যায় আবার কাজের গতিও ঠিক থাকে।
✅ ছোট্ট একটা কাজ করিঃ সিপিইউ সম্পর্কে আরো একটু বিষদভাবে জানার চেষ্টা করি, এই [Wikipedia CPU article](https://wikipedia.org/wiki/Central_processing_unit) থেকে।
#### কাজ
Wio Terminal পর্যালোচনা করা ।
এই লেসনের জন্য আমরা Wio Terminal ব্যবহার করলে, এটার সিপিইউ কী খুঁজে দেখতে পারি ? [Wio Terminal প্রোডাক্ট পেইজ](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) এ গিয়ে, একটু নিচে গেলেই *Hardware Overview* নামে একটি অংশ পাওয়া যাবে যেখানে Wio Terminal এর ভেতরের সব দেখা যায় - সিপিইউ আমরা সেখান থেকেই দেখতে পাবো।
### মেমোরি
মাইক্রোকন্ট্রোলারে সাধারণত ২ ধরণের মেমোরি থাকে - প্রোগ্রাম মেমোরি এবং র‍্যান্ডম একসেস মেমোরি (র‍্যাম)
প্রোগ্রাম মেমোরি অপরিবর্তনশীল, যার অর্থ এটিতে যা লেখা থাকে তা যখন ডিভাইসে পাওয়ার (ইলেক্ট্রিক সংযোগ) না থাকলেও, এটি ডিভাইসে স্টোর করা থাকে । আমাদের প্রোগ্রাম কোড মূলত এই মেমোরিতেই সংরক্ষিত থাকে ।
র‍্যাম ব্যবহার করে প্রোগ্রামগুলো চালানো হয় যা সেই সময়কালীন ভ্যারিয়েবল এবং প্রাপ্ত ডেটা স্টোর করে। র‍্যাম পরিবর্তনশীল, পাওয়ার (ইলেক্ট্রিক সংযোগ) বিচ্ছিন্ন হয়ে গেলে, এতে থাকা সব তথ্যও হারিয়ে যায় - বলতে গেলে পুরো প্রোগ্রামটাই প্রাথমিক অবস্থায় চলে আসে।
> 🎓 প্রোগ্রাম মেমোরি আমাদের কোড গুলো সংরক্ষণ করে থাকে যা পাওয়ার (ইলেক্ট্রিক সংযোগ) না থাকলেও, ডিভাইসে থেকে যায়।
> 🎓 র‍্যাম মূলত প্রোগ্রামকে রান করায় এবং পাওয়ার না থাকলে সবকিছু একদম শুরুর অবস্থায় চলে আসে।
মাইক্রোকন্ট্রোলারের মেমোরি, পিসি বা ম্যাকের তুলনায় নিতান্তই ক্ষুদ্র । একটা সাধারণ পিসি তে ৮ গিগাবাইট (জিবি) অর্থাৎ ৮০০০০০০০০০০ বাইট র‍্যাম থাকে, যার প্রতি বাইটে একটি অক্ষর বা থেকে ২৫৫ এর মধ্যে কোন সংখ্যা রাখা যায়। সেই তুলনায়, মাইক্রোকন্ট্রোলারে কিলোবাইট পর্যায়ের র‍্যাম থাকে, যা প্রায় ১০০০ বাইটের সমান। এখানে আমরা যে Wio terminal ব্যবহার করছি, তার র‍্যাম ১৯২ কিলোবাইট অর্থাৎ ১৯২০০০ বাইট - গড়পড়তা পিসির তুলনায় , গুণ কম।
নীচের চিত্রটি 192KB এবং 8GB এর মধ্যে আপেক্ষিক আকারের পার্থক্য দেখায় - কেন্দ্রের ছোট ডটটি 192KB উপস্থাপন করে।
![A comparison between 192KB and 8GB - more than 40,000 times larger](../../../../images/ram-comparison.png)
প্রোগ্রাম মেমোরিও পিসির তুলনায় কম। একটি সাধারণ পিসিতে প্রোগ্রাম স্টোরেজের জন্য 500 গিগাবাইটের হার্ড ড্রাইভ থাকতে পারে, অন্যদিকে মাইক্রোকন্ট্রোলারের কাছে কেবল কিলোবাইট পর্যায়ের বা কয়েক মেগাবাইট (এমবি) স্টোরেজ থাকতে পারে (1 এমবি হলো 1000KB বা 1,000,000 বাইট এর সমান)। উইও টার্মিনালে 4MB প্রোগ্রাম স্টোরেজ রয়েছে।
✅ ছোট্ট একটা গবেষণা করা যাক : এই লেখা পড়তে যে কম্পিউটারটি ব্যবহার করছি তার র‍্যাম এবং কত স্টোরেজ ব্যবহার করে ত জানার চেষ্টা করি। কোন মাইক্রোকন্ট্রোলারের সাথে এটিকে কীভাবে তুলনা করা যায়?
### ইনপুট/আউটপুট
মাইক্রোকন্ট্রোলার সেন্সর থেকে ডেটা পড়তে এবং অ্যাকচুয়েটর দিয়ে নিয়ন্ত্রণ সংকেত প্রেরণের জন্য ইনপুট এবং আউটপুট সংযোগ প্রয়োজন। মাইক্রোকন্ট্রোলারে সাধারণত বেশ কয়েকটি জেনারেল-পারপাস ইনপুট / আউটপুট (জিপিআইও) পিন থাকে। এই পিনগুলিকে ইনপুট (সংকেত গ্রহণ) বা আউটপুট (সংকেত প্রেরণ) পিন হিসেবে কাজ করার জন্য সফ্টওয়্যারে কনফিগার করতে হবে ।
🧠⬅️ ইনপুট পিন দিয়ে সেন্সর থেকে তথ্য নেয়া হয়।
🧠➡️ আউটপুট পিন দিয়ে অ্যাকচুয়েটরে সংকেত পাঠানো হয়।
✅ পরবর্তী পাঠে এসব নিয়ে আমরা আরো বিস্তারিত জানতে পারবো।
#### কাজ
Wio Terminal পর্যালোচনা করি।
এই লেসনের জন্য আমরা Wio Terminal ব্যবহার করলে, এটার জিপিআইও পিনগুলো কী খুঁজে দেখতে পারি ? [Wio Terminal প্রোডাক্ট পেইজে](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) একটু নিচে গেলেই *Pinout diagram* নামে একটি অংশ পাওয়া যাবে যেখানে আমরা সহজেই পিনগুলো দেখতে পারি। Wio Terminal এ পিন নাম্বার দেয়ার জন্য, স্টিকার দেয়া হয়ে থাকে - এগুলো ব্যবহার না করে থাকলে, দেরি না করে এখনই করে ফেলা যাক।
### বাস্তবিক আকার
মাইক্রোকন্ট্রোলার আকারে বেশ ছোট হয়, যেমন [Freescale Kinetis KL03 MCU ](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/) এর কথাই ধরা যাক - এতই ছোট যে গলফ বলের ডিম্পলের সমান। কোন পিসিতে থাকা সিপিইউ 40 মিমি x 40 মিমি আকারের এবং এটি (অতিরিক্ত গরম হয়ে কয়েক সেকেন্ডের বন্ধ হয়ে যাওয়া ঠেকাতে প্রয়োজনীয়) হিট-সিংক ও ফ্যান বাদ দিয়ে তারপরের হিসেব। বোঝাই যাচ্ছে, মাইক্রোকন্ট্রোলারের চেয়ে সিপিইউ কত বড়! মাইক্রোকন্ট্রোলার বাহ্যিক কেস, স্ক্রিন এবং বিভিন্ন সংযোগ এবং উপাদানগুলির সাথে থাকা Wio Terminal Developer kits একটি Intel i9 এর শুধুমাত্র সিপিইউয়ের চেয়ে তেমন একটা বড় নাহ - এবং হিট সিঙ্ক এবং ফ্যান সহ হিসেব করলে সিপিইউর চেয়ে অনেক ছোট !
| যন্ত্র | আকার |
| ------------------------------- | --------------------- |
| Freescale Kinetis KL03 | 1.6mm x 2mm x 1mm |
| Wio terminal | 72mm x 57mm x 12mm |
| Intel i9 CPU, Heat sink and fan | 136mm x 145mm x 103mm |
### ফ্রেমওয়ার্ক এবং অপারেটিং সিস্টেম
গতি এবং মেমরির আকারের কারণে, মাইক্রোকন্ট্রোলার ডেস্কটপ অর্থে কোন অপারেটিং সিস্টেম (ওএস) চালায় না। আমাদের কম্পিউটার (উইন্ডোজ, লিনাক্স বা ম্যাক-ওএস) চালিত অপারেটিং সিস্টেমের কাজগুলি চালনার জন্য প্রচুর মেমরি এবং প্রসেসিং পাওয়ার প্রয়োজন - মাইক্রোকন্ট্রোলারের জন্য যা সম্পূর্ণ অপ্রয়োজনীয় । মনে রাখতে হবে যে, মাইক্রোকন্ট্রোলার সাধারণত এক বা একাধিক নির্দিষ্ট কাজ সম্পাদনের জন্য প্রোগ্রাম করা হয়; যা পিসি বা ম্যাকের মতো জেনারেল পারপাস যন্ত্র নাহ। পিসি বা ম্যাক এ এমন ইন্টারফেস রাখতে হয় যা সঙ্গীত বা সিনেমা চালাতে পারে, ডকুমেন্টেশন বা কোড লেখার সরঞ্জাম সরবরাহ করতে পারে, গেম খেলতে পারে বা ইন্টারনেট ব্রাউজ করতে পারে - যা কিনা মাইক্রোকন্ট্রোলারের কাজের ধরণের তুলনায় অনেক আলাদা।
কোন ওএস ছাড়াই একটি মাইক্রোকন্ট্রোলার প্রোগ্রাম করার জন্য আমাদেরকে কোন ধরণের কোডিং করতে হবে যাতে মাইক্রোকন্ট্রোলার চলতে পারে বা API ব্যবহার করে যে কোনও পার্শ্ববর্তী কিছুর সাথে সংযোগ রাখতে পারে। প্রতিটি মাইক্রোকন্ট্রোলার আলাদা হয়, তাই নির্মাতারা সাধারণত স্ট্যান্ডার্ড ফ্রেমওয়ার্কগুলিকে সমর্থন করে যা আপনাকে আমাদের কোড তৈরির জন্য একটি স্ট্যান্ডার্ড 'রেসিপি' অনুসরণ করার সুযোগ করে এবং সেই ফ্রেমওয়ার্কটিকে সাপোর্ট করে এমন কোনও মাইক্রোকন্ট্রোলারে প্রোগ্রাম রান করে।
আমরা কোন একটি ওএস ব্যবহার করে মাইক্রোকন্ট্রোলারগুলিকে প্রোগ্রাম করতে পারি - প্রায়শই এগুলোকে রিয়েল-টাইম অপারেটিং সিস্টেম (আরটিওএস) হিসাবে উল্লেখ করা হয়, কারণ এগুলি রিয়েল টাইমে পেরিফেরিয়ালগুলিতে এবং পাঠানো ডেটা হ্যান্ডেল করার জন্য তৈরি করা হয়। এই অপারেটিং সিস্টেমগুলি খুব লাইটওয়েট এবং এদের বৈশিষ্ট্যগুলি হলো-
* মাল্টি থ্রেডিং, আপনার কোডগুলি একই সাথে একাধিক কোর বা একটি কোর পর্যায়ক্রমে ব্যবহার করে একাধিক ব্লক কোড চালানোর অনুমতি দেয়।
* নেটওয়ার্কিং - নিরাপদে ইন্টারনেটের মাধ্যমে যোগাযোগের অনুমতি দেওয়ার জন্য
* স্ক্রিন রয়েছে এমন ডিভাইসে ব্যবহারকারীর ইন্টারফেস (ইউআই) তৈরির জন্য গ্রাফিকাল ইউজার ইন্টারফেস (জিইউআই) এর উপস্থিতি।
✅ বিভিন্ন RTOS এর ব্যপারে জানতে এসব পড়তে পারি : [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
#### আরডুইনো
![The Arduino logo](../../../../images/arduino-logo.svg)
[আরডুইনো](https://www.arduino.cc) খুব সম্ভবত সবচেয়ে জনপ্রিয় মাইক্রোকন্ট্রোলার ফ্রেমওয়ার্ক, বিশেষতঃ শিক্ষার্থী, শখের বশে আইওটিতে কাজ করতে আগ্রহীদের মাঝে। আরডুইনো একটি ওপেন সোর্স ইলেক্ট্রনিক্স প্ল্যাটফর্ম যা সফ্টওয়্যার এবং হার্ডওয়্যার সমন্বিত। আরডুইনো থেকে বা অন্য নির্মাতাদের কাছ থেকে আমরা আরডুইন সম্বলিত বোর্ড কিনে সেই ফ্রেমওয়ার্ক ব্যবহার করে কোড করতে পারবো।
আরডুইনো বোর্ডগুলি সি বা সি ++ এ কোড করা হয়। এই ভাষায় আমরা কোডগুলো খুব ছোট করে সংকলন করতে পারি এবং দ্রুত রান করতে পারি, যা একটি সীমাবদ্ধ ডিভাইসে যেমন মাইক্রোকন্ট্রোলারের জন্য বেশ গুরুত্বপূর্ণ। আরডুইনো অ্যাপ্লিকেশনটির মূল বিষয়কে স্কেচ হিসাবে উল্লেখ করা হয় এবং তা সি/সি++ এ কোড করা হয় মূলত ২টি ফাংশনে - `setup` এবং `loop`। বোর্ড চালু হয়ে গেলে, আরডুইনো ফ্রেমওয়ার্ক কোডটি একবার `setup` ফাংশনটি পরিচালনা করবে, তারপরে এটি `loop` ফাংশনটি বারবার রান করবে, পাওয়ার বন্ধ না হওয়া অবধি এটি অবিচ্ছিন্নভাবে চালিত হবে।
আমরা সেটআপ কোডটি `setup` ফাংশনে লিখবো, যেমন ওয়াইফাই এবং ক্লাউড সার্ভিসের সাথে সংযুক্ত হওয়া বা ইনপুট এবং আউটপুট জন্য পিন চালু হওয়া। আমাদের লুপ কোডটিতে তখন প্রসেসিং কোড থাকবে যেমন সেন্সর থেকে ডেটা নেয়া এবং ক্লাউডে তা পাঠানো । প্রতিটি লুপে সাধারণত একটি বিলম্ব (delay) অন্তর্ভুক্ত করতে হবে, উদাহরণস্বরূপ যদি আমরা কেবল 10 সেকেন্ড পরপর সেন্সর ডেটা প্রেরণ করতে চাই, তবে লুপের শেষে 10 সেকেন্ডের বিলম্ব যুক্ত করতে হবে, যাতে মাইক্রোকন্ট্রোলার তখন বিশ্রামে থাকে, শক্তি সঞ্চয় করে এবং তারপরে আবার 10 সেকেন্ড পরে যখন ডেটা প্রয়োজন হবে, তখন ল্যুপ চলবে।
![An arduino sketch running setup first, then running loop repeatedly](../../../../images/arduino-sketch.png)
✅ এই প্রোগ্রাম আর্কিটেকচারকে বলা হয় *event loop* অথবা *message loop*. অনেক অ্যাপ্লিকেশন এটি ব্যবহার করে এবং উইন্ডোজ, ম্যাক-ওএস বা লিনাক্সের মতো ওএসে চালিত বেশিরভাগ ডেস্কটপ অ্যাপ্লিকেশনগুলির জন্য এটি স্ট্যান্ডার্ড। `loop` এখানে বাটনের মতো ব্যবহারকারী বা ইন্টারফেস উপাদান বা কীবোর্ডের মতো ডিভাইসগুলির নির্দেশনা গ্রহণ করে এবং সেই অনুযায়ে সাড়া দেয়। আরো বিস্তারিত জানতে [ইভেন্ট ল্যুপ](https://wikipedia.org/wiki/Event_loop) সংক্রান্ত লেখাটি পড়তে পারি।
আরডুইনো মাইক্রোকন্ট্রোলার এবং আই/ও পিনের সাথে সংযোগের জন্য স্ট্যান্ডার্ড লাইব্রেরি সরবরাহ করে, বিভিন্ন মাইক্রোকন্ট্রোলারগুলিতে চালনার যা সহায়তা করে। উদাহরণস্বরূপ, [`delay` function](https://www.arduino.cc/reference/en/language/functions/time/delay/) কোন প্রোগ্রামকে নির্দিষ্ট সময়ের জন্য বন্ধ রাখবে, [`digitalRead` function](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) বোর্ডের পিনগুলি থেকে `HIGH` অথবা `LOW` ডেটা সংগ্রহ করে, তা যে বোর্ডেই কোড রান করা হোক না কেন। এই স্ট্যান্ডার্ড লাইব্রেরিগুলির অর্থ একটি বোর্ডের জন্য লিখিত আরডুইনো কোড অন্য যে কোন আরডুইনো বোর্ডের জন্য পুনরায় ব্যবহার করা যেতে পারে এবং চলবে (পিনগুলি একই ধরে নিয়ে এবং বোর্ডগুলি একই বৈশিষ্ট্যগুলিকে সমর্থন কর - এমন হলে)
থার্ড-পার্টি আরডুইনো লাইব্রেরির একটি বড় সংগ্রহ রয়েছে যা আরডুইনো প্রকল্পগুলিতে অতিরিক্ত বৈশিষ্ট্য যুক্ত করার অনুমতি দেয় যেমন সেন্সর এবং অ্যাকচুয়েটর ব্যবহার করে বা ক্লাউড আইওটি সার্ভিসগুলিতে সংযুক্ত করা।
#### কাজ
Wio Terminal পর্যালোচনা করি।
এই লেসনের জন্য আমরা Wio Terminal ব্যবহার করলে, গত লেসনের কোডগুলো আবার একটু দেখি। [Wio Terminal প্রোডাক্ট পেইজে](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) একটু নিচে গেলেই *Pinout diagram* নামে একটি অংশ পাওয়া যাবে যেখানে আমরা সহজেই পিনগুলো দেখতে পারি। Wio Terminal এ পিন নাম্বার দেয়ার জন্য, স্টিকার দেয়া হয়ে থাকে - এগুলো ব্যবহার না করে থাকলে, দেরি না করে এখনই করে ফেলা যাক।
## সিংগেল-বোর্ড কম্পিউটারের আরো গভীরে
শেষ লেসনে আমরা সিংগেল-বোর্ড কম্পিউটার এর সাথে পরিচিত হয়েছিলাম। এখন তাদের আরও গভীরভাবে জানবো।
### রাস্পবেরি পাই
![The Raspberry Pi logo](../../../../images/raspberry-pi-logo.png)
[Raspberry Pi Foundation](https://www.raspberrypi.org) হলো মূলত স্কুল পর্যায়ে কম্পিউটার বিজ্ঞানের অধ্যয়নের প্রচারের জন্য ২০০৯ সালে প্রতিষ্ঠিত যুক্তরাজ্যের একটি দাতব্য সংস্থা। এই মিশনের অংশ হিসাবে তারা সিংগেল-বোর্ড কম্পিউটার তৈরী করে, যার নাম রাস্পবেরি পাই। এটি বর্তমানে ৩টি ভেরিয়েন্টে পাওয়া যা - একটি পূর্ণ আকারের সংস্করণ, ছোট পাই জিরো এবং একটি চূড়ান্ত মডিউল যা দিয়ে আমাদের আইওটি ডিভাইসে তৈরি করা যেতে পারে।
![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
পূর্ণ আকারের রাস্পবেরি পাইয়ের সর্বশেষ ভার্সন হল Raspberry Pi 4B । এটিতে একটি কোয়াড-কোর (4 কোর) সিপিইউ রয়েছে যা 1.5GHz এবং 2, 4, বা 8 জিবি র‍্যাম, গিগাবিট ইথারনেট, ওয়াইফাই, 2টি এইচডিএমআই পোর্ট 4K স্ক্রিন সমর্থন করে, একটি অডিও এবং মিশ্রিত ভিডিও আউটপুট পোর্ট, ইউএসবি পোর্টস (USB 2.0, 2 USB 3.0 ভার্সন), 40টি জিপিআইও পিন, রাস্পবেরি পাই ক্যামেরা মডিউলটির জন্য একটি ক্যামেরা সংযোজক এবং একটি এসডি কার্ড স্লট। এই সমস্ত বোর্ড যা রয়েছে সব মিলিয়ে 88mm x 58mm x 19.5mm সাইজ এবং এটি একটি 3A USB-C পাওয়ার সাপ্লাই দ্বারা চালিত। রাস্পবেরি পাইয়ের দাম 35 মার্কিন ডলার থেকে শুরু হয়, যা পিসি বা ম্যাক এর তুলনায় অনেক কম।
> 💁 Pi400 নামে একটি "একের-ভিতর-সব" কম্পিউটার রয়েছে, যার কীবোর্ডে Pi4 বিল্ট-ইন রয়েছে।
![A Raspberry Pi Zero](../../../../images/raspberry-pi-zero.jpg)
পাই জিরো এর আকার অনেক ছোট , যার পাওয়ার অনেক কম। এটিতে একটি একক কোর 1GHz সিপিইউ, 512 এমবি র‍্যাম, ওয়াইফাই (Zero W model এ ), একটি এইচডিএমআই পোর্ট, একটি মাইক্রো-ইউএসবি পোর্ট, 40টি জিপিআইও পিন, রাস্পবেরি পাই ক্যামেরা মডিউলটির সাথে একটি ক্যামেরা সংযোগকারী এবং একটি এসডি কার্ড স্লট রয়েছে।পাই এর আকার 65 মিমি x 30 মিমি x 5 মিমি এবং খুব অল্প পাওয়ার নিয়েই কাজ করতে পারে। পাই জিরো এর মূল্য 5 মার্কিন ডলার, আর ওয়াইফাই সহ , W ভার্সনটির দাম 10 মার্কিন ডলার।
> 🎓 এখানের সিপিইউ গুলো ARM processor এর, যা আমাদের পিসি বা ম্যাক এর রেগুলার Intel/AMD x86 বা x64 প্রসেসরের মতো নয়। তবে মাইক্রোকন্ট্রোলারের পাশাপাশি প্রায় সমস্ত মোবাইল ফোন, মাইক্রোসফ্ট সারফেস এক্স এবং নতুন অ্যাপল সিলিকন ভিত্তিক অ্যাপল ম্যাক এর সিপিইউগুলির সাথে এদের মিল রয়েছে।
রাস্পবেরি পাই এর সমস্ত ভ্যারিয়েন্ট রাস্পবেরি পাই ওএস নামে ডিবিয়ান লিনাক্সের একটি ভার্সন রান করে। এটি কোনও ডেস্কটপ ছাড়াই একটি ছোট ভার্সন হিসেবে পাওয়া যায় যা 'হেডলেস' প্রজেক্টগুলোর জন্য উপযুক্ত যেখানে ওয়েব ব্রাউজার, অফিস অ্যাপ্লিকেশন, কোডিং সরঞ্জাম এবং গেম চালানোর জন্য একটি স্ক্রিন বা একটি পূর্ণ ডেস্কটপ পরিবেশের কোন প্রয়োজনই নেই। এই ওএস হল ডেবিয়ান লিনাক্সের একটি সংস্করণ, যেটিতে আমরা ডেবিয়ানে চালিত কোন অ্যাপ্লিকেশন বা ট্যুল ইনস্টল করতে পারবো এবং এটি ARM প্রসেসরের জন্যই তৈরি।
#### কাজ
রাস্পবেরি পাই পর্যালোচনা
যদি এই লেসনটির জন্য আমরা রাস্পবেরি পাই ব্যবহার করি, তাহলে বোর্ডের বিভিন্ন হার্ডওয়্যার উপাদানগুলি সম্পর্কে ভালোভাবে জানতে হবে।
* প্রসেসর সম্পর্কিত ডিটেইলস [Raspberry Pi hardware documentation page](https://www.raspberrypi.org/documentation/hardware/raspberrypi/) এ পাওয়া যাবে। আমাদের ব্যবহার করা পাই এর প্রসেসর সম্পর্কে ঐ পেইজটি থেকে জানতে পারবো।
* GPIO পিনগুলো খুঁজে বের করি। [Raspberry Pi GPIO documentation](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md)থেকে এদের ব্যাপারে আরো বিস্তারিত জানতে পারবো। [GPIO Pin Usage guide](https://www.raspberrypi.org/documentation/usage/gpio/README.md) টি পড়লে পাই এর বিভিন্ন পিন সম্পর্কে আমরা বিস্তারিত জানবো।
### সিংগেল-বোর্ড কম্পিউটারে প্রোগ্রামিং
সিংগেল-বোর্ড কম্পিউটারগুলিকে সম্পূর্ণ কম্পিউটার বলা যা্য, যা একটি সম্পূর্ণ ওএস এ রান করে। এর অর্থ হল যে অনেকগুলো প্রোগ্রামিং ভাষা, ফ্রেমওয়ার্ক এবং ট্যুল ব্যবহার করে কোডিং করা যাবে যা কিনা মাইক্রোকন্ট্রোলার যেমনঃ আরডুইনো তে সচরাচর করা যায়না কারণ বোর্ড থেকে সাপোর্টেড রয়েছে কিনা - এরকম বিষয়গুলি এখানে প্রভাব রাখে। বেশিরভাগ প্রোগ্রামিং ভাষার লাইব্রেরি রয়েছে যা সেন্সর এবং অ্যাকচুয়েটর থেকে যথাক্রমে ডেটা গ্রহণ এবং প্রেরণ করতে GPIO পিনগুলিতে ব্যবহার করতে পারে।
✅ আমরা কোন কোন প্রোগ্রামিং ভাষার সাথে পরিচিত? তারা কি লিনাক্স এ সাপোর্টেড ?
রাস্পবেরি পাইতে আইওটি অ্যাপ্লিকেশন তৈরির সর্বাধিক সাধারণ প্রোগ্রামিং ল্যাঙ্গুয়েজ হল পাইথন। পাইয়ের জন্য বানানো একটি হার্ডওয়ারের এক বিশাল ইকোসিস্টেম রয়েছে এবং এগুলির প্রায় সবগুলিতেই পাইথন লাইব্রেরি হিসাবে তাদের ব্যবহার করার জন্য প্রয়োজনীয় প্রাসঙ্গিক কোড অন্তর্ভুক্ত রয়েছে। এর মধ্যে কিছু ইকোসিস্টেম হল 'হ্যাট' এর উপর ভিত্তি করে - টুপির মতো একটি লেয়ার যা পাইয়ের উপরে বসে 40টি জিপিআইও পিনের একটি বড় সকেটের সাথে সংযুক্ত থাকে। এই টুপিগুলি অতিরিক্ত কিছু সুবিধা দেয় যেমনঃ স্ক্রিন, সেন্সর, রিমোট কন্ট্রোল কার অথবা অ্যাডাপ্টারগুলিকে সেন্সর যুক্ত করা যায় স্ট্যান্ডার্ড ক্যাবল ব্যবহার করেই।
### প্রফেশনাল পর্যায়ে আইওটি তৈরীর ক্ষেত্রে সিংগেল-বোর্ড কম্পিউটারের ব্যবহার
সিংগেল-বোর্ড কম্পিউটারগুলি কেবলমাত্র ডেভলাপার কিট হিসাবে নয়,বরং প্রফেশনাল পর্যায়ে আইওটি তৈরীর ক্ষেত্রেও ব্যবহৃত হয়। তারা হার্ডওয়্যার নিয়ন্ত্রণ এবং মেশিন লার্নিং মডেলগুলি চালানোর মতো জটিল কাজগুলি চালনার শক্তিশালী উপায় সরবরাহ করতে পারে। উদাহরণস্বরূপ, একটি [রাস্পবেরি পাই-4 কম্পিউট মডিউল](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) রয়েছে যা রাস্পবেরি পাই-4 এর সমস্ত পাওয়ার সরবরাহ করে, তবে তা বেশ কমপ্যাক্ট এবং কম মানের ফর্ম ফ্যাক্টরে যা কাস্টম হার্ডওয়্যারে ইনস্টল করার জন্য নকশাকৃত যাতে বেশিরভাগ পোর্ট নেই।
---
## 🚀 চ্যালেঞ্জ
গত লেসনের চ্যালেঞ্জটি ছিল বাড়ি, স্কুল বা কর্মক্ষেত্রে যতগুলি আইওটি ডিভাইস রয়েছে তার তালিকা করা। এই তালিকার প্রতিটি ডিভাইসের জন্য কী মাইক্রোকন্ট্রোলার বা সিংগেল-বোর্ড কম্পিউটার ব্যবহৃত হয় ? নাকি উভয়ের মিশ্রণের ফলেই এরা নির্মিত?
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## রিভিউ এবং স্ব-অধ্যয়ন
* [Arduino getting started guide](https://www.arduino.cc/en/Guide/Introduction) টি পড়ে আরডুইনো প্লাটফর্ম সম্পর্কে আরো জানতে হবে।
* [introduction to the Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) পড়ে রাস্পবেরি পাই সম্পর্কে আরো জানতে হবে।
* বিভিন্ন কনসেপ্ট এবং সংক্ষিপ্ত শব্দ এর ব্যাপারে জানতে [What the FAQ are CPUs, MPUs, MCUs, and GPUs article in the Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/) আর্টিকেল টি উপকারী হবে।
✅ কোন হার্ডওয়্যার প্ল্যাটফর্মটি ব্যবহার করলে ভালো হবে বা শুধুমাত্র ভার্চুয়াল ডিভাইস ব্যবহার করবো কিনা তবে সিদ্ধান্ত নেওয়ার জন্য [হার্ডওয়্যার গাইডের](../../../../translations/hardware.bn.md) লিংকগুলোতে প্রদত্ত খরচ এর তুলনা করতে হবে।
## এসাইনমেন্ট
[মাইক্রোকন্ট্রোলার এবং সিংগেল-বোর্ড কম্পিউটারের তুলনা করে পার্থক্য দাঁড় করানো](assignment.bn.md)।

@ -1,266 +0,0 @@
# Une meilleure immersion dans l'IoT
![Un aperçu de cette leçon sous forme de sketch](../../../../sketchnotes/lesson-2.jpg)
> Sketchnote par [Nitya Narasimhan](https://github.com/nitya). Cliquez sur l'image pour l'agrandir.
Cette leçon a été dispensée dans le cadre de la [série Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) de [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). La leçon a été dispensée sous forme de deux vidéos - une leçon d'une heure et une heure aux heures de bureau pour approfondir certaines parties de la leçon et répondre aux questions.
[![Leçon 2 : Une meilleure immersion dans l'IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
[![Leçon 2 : Une meilleure immersion dans l'IoT - Heures de bureau](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
> 🎥 Cliquez sur les images ci-dessus pour regarder les vidéos
## Quiz préalable
[Quiz préalable](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## Introduction
Cette leçon approfondit certains des concepts abordés dans la dernière leçon.
Dans cette leçon, nous couvrirons :
* [Les composants d'une application IoT](#les-composants-d'une-application-iot)
* [Approfondissement des microcontrôleurs](#approfondissement-des-microcontrôleurs)
* [Approfondissement des ordinateurs monocartes](#approfondissement-des-ordinateurs-monocartes)
## Les composants d'une application IoT
Les deux composants d'une application IoT sont l' *Internet* et l' *objet* (the thing). Examinons ces deux composants de manière un peu plus détaillée.
### L'objet (The Thing)
![Une Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
La partie **Objet** (**Thing** en anglais) de l'IOT (Internet Of Thing) fait référence à un dispositif qui peut interagir avec le monde physique. Ces appareils sont généralement des ordinateurs de petite taille, peu coûteux, fonctionnant à faible vitesse et consommant peu d'énergie - par exemple, de simples microcontrôleurs dotés de kilooctets de RAM (par opposition aux gigaoctets d'un PC) et fonctionnant à seulement quelques centaines de mégahertz (par opposition aux gigahertz d'un PC), mais consommant parfois si peu d'énergie qu'ils peuvent fonctionner pendant des semaines, des mois, voire des années sur des piles.
Ces dispositifs interagissent avec le monde physique, soit en utilisant des capteurs pour recueillir des données sur leur environnement, soit en contrôlant des sorties ou des actionneurs pour apporter des changements physiques. L'exemple type est celui du thermostat intelligent, un appareil doté d'un capteur de température, d'un moyen de régler la température souhaitée (cadran ou écran tactile) et d'une connexion à un système de chauffage ou de refroidissement qui peut être activé lorsque la température détectée est en dehors de la plage souhaitée. Le capteur de température détecte que la pièce est trop froide et un actionneur met le chauffage en marche.
![Un diagramme montrant la température et un cadran comme entrées d'un dispositif IoT, et le contrôle d'un appareil de chauffage comme sortie.](../../../../images/basic-thermostat.png)
Il existe un large éventail d'objets différents qui peuvent agir comme des dispositifs IoT, du matériel dédié qui détecte une seule chose, aux appareils à usage général, même votre smartphone ! Un smartphone peut utiliser des capteurs pour détecter le monde qui l'entoure et des actionneurs pour interagir avec ce monde, par exemple en utilisant un capteur GPS pour détecter votre position et un haut-parleur pour vous donner des instructions de navigation vers une destination.
✅ Pensez à d'autres systèmes que vous avez autour de vous et qui lisent les données d'un capteur et les utilisent pour prendre des décisions. Un exemple serait le thermostat d'un four. Pouvez-vous en trouver d'autres ?
### L'Internet
Le côté **Internet** d'une application IoT (Internet Of Thing) se compose d'applications auxquelles le dispositif IoT peut se connecter pour envoyer et recevoir des données, ainsi que d'autres applications qui peuvent traiter les données du dispositif IoT et aider à prendre des décisions sur les demandes à envoyer aux actionneurs du dispositif IoT.
Une configuration typique consisterait à avoir une sorte de service cloud auquel le dispositif IoT se connecte, et ce service cloud gèrerait des aspect comme la sécurité, ainsi que la réception et le renvoi de messages au dispositif IoT. Ce service cloud se connecte ensuite à d'autres applications qui peuvent traiter ou stocker les données des capteurs, ou utiliser ces données avec celles d'autres systèmes pour prendre des décisions.
Par ailleurs, les appareils ne se connectent pas toujours directement à l'internet via des connexions WiFi ou filaires. Certains appareils utilisent un réseau maillé pour communiquer entre eux par le biais de technologies telles que le Bluetooth, en se connectant via un hub qui dispose d'une connexion Internet.
Dans l'exemple d'un thermostat intelligent, le thermostat se connecterait via le WiFi domestique à un service en nuage s'éxecutant dans le cloud. Il enverrait les données de température à ce service en nuage, et de là, elles seraient écrites dans une sorte de base de données permettant au propriétaire de vérifier les températures actuelles et passées à l'aide d'une application téléphonique. Un autre service cloud saura quelle température le propriétaire souhaite et enverra des messages à l'appareil IoT via le service cloud pour demander au système de chauffage de s'allumer ou de s'éteindre.
![Un diagramme montrant la température et un cadran comme entrées d'un dispositif IoT, le dispositif IoT avec une communication bidirectionnelle vers le cloud, qui à son tour a une communication bidirectionnelle vers un téléphone, et le contrôle d'un chauffage comme sortie du dispositif IoT.](../../../../images/mobile-controlled-thermostat.png)
Une version encore plus intelligente pourrait utiliser l'IA dans le cloud avec des données provenant d'autres capteurs connectés à d'autres appareils IoT, tels que des capteurs d'occupation qui détectent quelles pièces sont utilisées, ainsi que des données telles que la météo et même votre calendrier, pour prendre des décisions sur la façon de régler la température de manière intelligente. Par exemple, il pourrait éteindre votre chauffage s'il lit dans votre calendrier que vous êtes en vacances, ou éteindre le chauffage pièce par pièce en fonction des pièces que vous utilisez, apprenant des données pour être de plus en plus précis au fil du temps.
![Un diagramme montrant plusieurs capteurs de température et un cadran comme entrées d'un dispositif IoT, un dispositif IoT avec une communication bidirectionnelle vers le cloud, qui à son tour a une communication bidirectionnelle vers un téléphone, un calendrier et un service météorologique, et la commande d'un chauffage comme sortie du dispositif IoT.](../../../../images/smarter-thermostat.png)
✅ Quelles autres données pourraient contribuer à rendre un thermostat connecté à Internet plus intelligent ?
### IoT on the Edge
Bien que le "I" dans IoT soit l'abréviation d'Internet, ces dispositifs n'ont pas besoin de se connecter à l'Internet. Dans certains cas, les appareils peuvent se connecter à des appareils 'périphériques', c'est-à-dire des appareils représentant des passerelles qui fonctionnent sur votre réseau local, ce qui signifie que vous pouvez traiter des données sans passer par l'Internet. Cela peut être plus rapide lorsque vous avez beaucoup de données ou une connexion Internet lente, cela vous permet de fonctionner hors ligne lorsque la connectivité Internet n'est pas possible, comme sur un navire ou dans une zone sinistrée pour répondre à une crise humanitaire, et cela vous permet de garder les données privées. Certains appareils contiendront un code de traitement créé à l'aide d'outils en nuage et l'exécuteront localement pour recueillir des données et y répondre sans utiliser de connexion Internet pour prendre une décision.
Il s'agit par exemple d'un appareil domestique intelligent tel que le HomePod d'Apple, l'Alexa d'Amazon ou le Google Home, qui écoutera votre voix à l'aide de modèles d'IA formés dans le nuage, mais exécutés localement sur l'appareil. Ces appareils 's'activent' lorsqu'un certain mot ou une certaine phrase est prononcé(e) et n'envoient qu'après celà votre voix sur Internet pour la traiter. L'appareil cessera d'envoyer la parole à un moment approprié, par exemple lorsqu'il détectera une pause dans votre discours. Tout ce que vous dites avant de réveiller l'appareil avec le mot de réveil, et tout ce que vous dites après que l'appareil a cessé d'écouter, ne sera pas envoyé via internet au fournisseur de l'appareil, et sera donc privé.
✅ Pensez à d'autres scénarios dans lesquels la confidentialité est importante, de sorte que le traitement des données serait mieux fait à la périphérie plutôt que dans le cloud. À titre d'indication - pensez aux appareils IoT dotés de caméras ou d'autres dispositifs d'imagerie.
### La sécurité dans l'IoT
Avec toute connexion Internet, la sécurité est une considération importante. Une vieille plaisanterie dit que 'le S de IoT signifie sécurité' - il n'y a pas de 'S' dans IoT, ce qui implique qu'il n'est pas sécurisé.
Les appareils IoT se connectent à un service cloud et sont donc aussi sécuriés que ce dernier. Si votre service cloud permet à n'importe quel appareil de se connecter, des données malveillantes peuvent être envoyées ou des attaques virales peuvent avoir lieu. Cela peut avoir des conséquences très concrètes dans la mesure où les dispositifs IoT interagissent et contrôlent d'autres dispositifs. Par exemple, le [ver Stuxnet](https://wikipedia.org/wiki/Stuxnet) a manipulé les valves des centrifugeuses pour les endommager. Des pirates ont également profité d'une [sécurité insuffisante pour accéder à des moniteurs pour bébé](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable) et à d'autres dispositifs de surveillance domestique.
> 💁 Parfois, les appareils IoT et les périphériques fonctionnent sur un réseau complètement isolé d'Internet afin de préserver la confidentialité et la sécurité des données. C'est ce qu'on appelle l'[air-gapping](https://wikipedia.org/wiki/Air_gap_(networking)).
## Approfondissement des microcontrôleurs
Dans la dernière leçon, nous avons présenté les microcontrôleurs. Nous allons maintenant approfondir cette technologie.
### Le processeur (CPU)
Le processeur est le 'cerveau' du microcontrôleur. C'est le processeur qui exécute votre code et qui peut envoyer et recevoir des données de n'importe quel appareil connecté. Les CPU peuvent contenir un ou plusieurs noyaux - essentiellement un ou plusieurs CPU qui peuvent travailler ensemble pour exécuter votre code.
Les processeurs s'appuient sur une horloge qui ticote plusieurs millions ou milliards de fois par seconde. Chaque tic, ou cycle, synchronise les actions que l'unité centrale peut entreprendre. À chaque tic, l'unité centrale peut exécuter une instruction d'un programme, par exemple pour récupérer des données d'un périphérique externe ou effectuer un calcul mathématique. Ce cycle régulier permet de terminer toutes les actions avant de traiter l'instruction suivante.
Plus le cycle d'horloge est rapide, plus le nombre d'instructions pouvant être traitées chaque seconde est important, et donc plus le CPU est rapide. Les vitesses des processeurs sont mesurées en [Hertz (Hz)](https://wikipedia.org/wiki/Hertz), une unité standard où 1 Hz signifie un cycle ou un tic d'horloge par seconde.
> 🎓 Les vitesses des processeurs sont souvent indiquées en MHz ou en GHz. 1MHz correspond à 1 million de Hz, 1GHz à 1 milliard de Hz.
> 💁 Les CPU exécutent des programmes en utilisant le [cycle de récupération-décodage-exécution](https://wikipedia.org/wiki/Instruction_cycle). Pour chaque tic d'horloge, le CPU va chercher l'instruction suivante dans la mémoire, la décode, puis l'exécute, par exemple en utilisant une unité arithmétique et logique (UAL) pour additionner 2 nombres. Certaines exécutions prennent plusieurs ticks pour être exécutées, le cycle suivant sera donc exécuté au prochain tick après la fin de l'instruction.
![Les cycles de recherche, de décodage et d'exécution montrant la recherche prenant une instruction du programme stocké en RAM, puis la décodant et l'exécutant sur un CPU.](../../../../images/fetch-decode-execute.png)
Les microcontrôleurs ont des vitesses d'horloge beaucoup plus faibles que les ordinateurs de bureau ou portables, ou même que la plupart des smartphones. Le terminal Wio, par exemple, possède un processeur qui fonctionne à 120 MHz, soit 120 000 000 de cycles par seconde.
✅ Un PC ou un Mac moyen possède une unité centrale avec plusieurs cœurs fonctionnant à plusieurs GigaHertz, ce qui signifie que l'horloge tique des milliards de fois par seconde. Recherchez la vitesse d'horloge de votre ordinateur et comparez combien de fois il est plus rapide que le terminal Wio.
Chaque cycle d'horloge consomme de l'énergie et génère de la chaleur. Plus les tic-tac sont rapides, plus la consommation d'énergie et la production de chaleur sont importantes. Les PC sont équipés de dissipateurs thermiques et de ventilateurs pour évacuer la chaleur, sans quoi ils surchaufferaient et s'arrêteraient en quelques secondes. Les microcontrôleurs n'ont souvent ni l'un ni l'autre, car ils sont beaucoup plus froids et donc beaucoup plus lents. Les PC fonctionnent sur le secteur ou sur de grosses batteries pendant quelques heures, alors que les microcontrôleurs peuvent fonctionner pendant des jours, des mois, voire des années sur de petites batteries. Les microcontrôleurs peuvent également avoir des cœurs qui fonctionnent à des vitesses différentes, passant à des cœurs plus lents et de faible puissance lorsque la demande de l'unité centrale est faible afin de réduire la consommation d'énergie.
> 💁 Certains PC et Mac adoptent le même mélange de cœurs rapides à haute puissance et de cœurs plus lents à faible puissance, en basculant pour économiser la batterie. Par exemple, la puce M1 des derniers ordinateurs portables d'Apple peut basculer entre 4 cœurs de performance et 4 cœurs d'efficacité pour optimiser la durée de vie de la batterie ou la vitesse en fonction de la tâche exécutée.
✅ Faites un peu de recherche : Renseignez-vous sur les processeurs sur le site [Wikipedia CPU article](https://wikipedia.org/wiki/Central_processing_unit)
#### Tâche
Examinez le terminal Wio.
Si vous utilisez un terminal Wio pour ces leçons, essayez de trouver l'unité centrale. Consultez la section *Vue d'ensemble du matériel* de la [page produit du terminal Wio](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) pour obtenir une image des composants internes, et essayez de trouver l'unité centrale à travers la fenêtre en plastique transparent située à l'arrière.
### Mémoire
Les microcontrôleurs disposent généralement de deux types de mémoire : la mémoire de programme et la mémoire vive (RAM).
La mémoire de programme est non volatile, ce qui signifie que tout ce qui y est écrit est conservé lorsque l'appareil n'est pas alimenté. C'est la mémoire qui stocke votre code de programme.
La RAM est la mémoire utilisée par le programme pour s'exécuter, contenant les variables allouées par votre programme et les données recueillies auprès des périphériques. La RAM est volatile, lorsque l'alimentation est coupée, son contenu est perdu, ce qui a pour effet de réinitialiser votre programme.
> 🎓 La mémoire de programme stocke votre code et se conserve lorsqu'il n'y a pas d'alimentation.
> 🎓 La mémoire vive est utilisée pour exécuter votre programme et est réinitialisée lorsqu'il n'y a pas d'alimentation.
Comme pour l'unité centrale, la mémoire d'un microcontrôleur est plusieurs fois plus petite que celle d'un PC ou d'un Mac. Un PC typique peut avoir 8 gigaoctets (Go) de RAM, ou 8 000 000 000 d'octets, chaque octet étant suffisant pour stocker une seule lettre ou un nombre de 0 à 255. Un microcontrôleur n'aurait que des kilo-octets (Ko) de RAM, un kilo-octet étant égal à 1 000 octets. Le terminal Wio mentionné ci-dessus possède 192 Ko de RAM, soit 192 000 octets - plus de 40 000 fois moins qu'un PC moyen!
Le diagramme ci-dessous montre la différence de taille relative entre 192KB et 8GB - le petit point au centre représente 192KB.
! [Une comparaison entre 192KB et 8GB - plus de 40 000 fois plus grand](../../../../images/ram-comparison.png)
Le stockage des programmes est également plus petit que dans un PC. Un PC typique peut avoir un disque dur de 500 Go pour le stockage des programmes, alors qu'un microcontrôleur peut n'avoir que des kilo-octets ou peut-être quelques méga-octets (Mo) de stockage (1 Mo correspond à 1 000 Ko, ou 1 000 000 d'octets). Le terminal Wio dispose de 4 Mo de mémoire de programme.
✅ Faites une petite recherche : De quelle quantité de mémoire vive et de stockage dispose l'ordinateur que vous utilisez pour lire ces lignes? Comment cela se compare-t-il à un microcontrôleur?
### Les entrée / Les sortie (Input/Output)
Les microcontrôleurs ont besoin de connexions d'entrée et de sortie (E/S) pour lire les données des capteurs et envoyer des signaux de commande aux actionneurs. Ils contiennent généralement un certain nombre de broches d'entrée/sortie à usage général ('general-purpose input/output' ou GPIO en anglais). Ces broches peuvent être configurées par logiciel pour être des entrées (c'est-à-dire qu'elles reçoivent un signal) ou des sorties (elles envoient un signal).
🧠⬅️ Les broches d'entrée sont utilisées pour lire les valeurs des capteurs.
🧠➡️ Les broches de sortie envoient des instructions aux actionneurs.
Vous en apprendrez plus à ce sujet dans une prochaine leçon.
#### Tâche
Examinez le terminal Wio.
Si vous utilisez un terminal Wio pour ces leçons, trouvez les broches GPIO. Trouvez la section *Pinout diagram* de la [page produit du terminal Wio](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) pour savoir à quoi correspondent les broches. Le terminal Wio est livré avec un autocollant que vous pouvez apposer à l'arrière avec les numéros de broches, alors ajoutez-le maintenant si vous ne l'avez pas encore fait.
### Taille physique
Les microcontrôleurs sont généralement de petite taille, le plus petit étant un [Freescale Kinetis KL03 MCU est assez petit pour tenir dans la cavité d'une balle de golf](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/). L'unité centrale d'un PC peut mesurer 40 mm x 40 mm, sans compter les dissipateurs thermiques et les ventilateurs nécessaires pour que l'unité centrale puisse fonctionner pendant plus de quelques secondes sans surchauffe, ce qui est nettement plus grand qu'un microcontrôleur complet. Le kit de développement du terminal Wio, qui comprend un microcontrôleur, un boîtier, un écran et une série de connexions et de composants, n'est pas beaucoup plus grand qu'un processeur Intel i9 nu, et beaucoup plus petit qu'un processeur avec un dissipateur thermique et un ventilateur!
| Appareil | Taille |
| ------------------------------- | --------------------- |
| Freescale Kinetis KL03 | 1.6mm x 2mm x 1mm |
| Terminal Wio | 72mm x 57mm x 12mm |
| Processeur Intel i9, dissipateur de chaleur et ventilateur | 136mm x 145mm x 103mm |
### Frameworks et systèmes d'exploitation
En raison de leur faible vitesse et de la taille de leur mémoire, les microcontrôleurs n'utilisent pas de système d'exploitation (OS) au sens bureautique du terme. Le système d'exploitation qui fait fonctionner votre ordinateur (Windows, Linux ou macOS) a besoin de beaucoup de mémoire et de puissance de traitement pour exécuter des tâches qui sont totalement inutiles pour un microcontrôleur. N'oubliez pas que les microcontrôleurs sont généralement programmés pour exécuter une ou plusieurs tâches très spécifiques, contrairement à un ordinateur à usage général comme un PC ou un Mac qui doit prendre en charge une interface utilisateur, lire de la musique ou des films, fournir des outils pour écrire des documents ou du code, jouer à des jeux ou naviguer sur l'internet.
Pour programmer un microcontrôleur sans système d'exploitation, vous avez besoin d'un outil qui vous permette de construire votre code de manière à ce que le microcontrôleur puisse fonctionner, en utilisant des API qui peuvent communiquer avec tous les périphériques. Chaque microcontrôleur étant différent, les fabricants prennent normalement en charge des frameworks standards qui vous permettent de suivre une 'recette' standard pour créer votre code et le faire fonctionner sur n'importe quel microcontrôleur qui prend en charge ce framework.
Vous pouvez programmer les microcontrôleurs à l'aide d'un système d'exploitation - souvent appelé système d'exploitation en temps réel ('real-time operating system' ou RTOS en anglais), car il est conçu pour gérer l'envoi de données vers et depuis des périphériques en temps réel. Ces systèmes d'exploitation sont très légers et offrent des fonctionnalités telles que :
* Le multithreading, qui permet à votre code d'exécuter plus d'un bloc de code en même temps, soit sur plusieurs cœurs, soit en se relayant sur un cœur.
* la mise en réseau, qui permet de communiquer en toute sécurité sur l'internet
* des composants d'interface utilisateur graphique (GUI) pour construire des interfaces utilisateur (UI) sur des appareils dotés d'écrans.
✅ Renseignez-vous sur les différents RTOS : [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
#### Arduino
![Le logo Arduino](../../../../images/arduino-logo.svg)
[Arduino](https://www.arduino.cc) est probablement le microcontrôleur le plus populaire, en particulier parmi les étudiants, les amateurs et les créateurs. Arduino est une plateforme électronique open source combinant logiciel et matériel. Vous pouvez acheter des cartes compatibles Arduino auprès d'Arduino ou d'autres fabricants, puis coder à l'aide de la structure Arduino.
Les cartes Arduino sont codées en C ou en C++. L'utilisation de C/C++ permet de compiler un code très petit et de l'exécuter rapidement, ce qui est nécessaire sur un dispositif contraignant tel qu'un microcontrôleur. Le cœur d'une application Arduino est appelé sketch et est un code C/C++ avec 2 fonctions - `setup` et `loop`. Lorsque la carte démarre, le code du framework Arduino exécute la fonction `setup` une fois, puis il exécute la fonction `loop` encore et encore, l'exécutant continuellement jusqu'à ce que l'alimentation soit coupée.
Vous écrirez votre code d'installation dans la fonction `setup`, comme la connexion aux services WiFi et cloud ou l'initialisation des broches pour l'entrée et la sortie. Votre code de boucle contiendrait alors le code de traitement, comme la lecture d'un capteur et l'envoi de la valeur au nuage. Vous devez normalement inclure un délai dans chaque boucle, par exemple, si vous voulez que les données du capteur soient envoyées toutes les 10 secondes, vous devez ajouter un délai de 10 secondes à la fin de la boucle pour que le microcontrôleur puisse dormir, économisant ainsi de l'énergie, puis exécuter la boucle à nouveau lorsque cela est nécessaire 10 secondes plus tard.
![Un croquis d'arduino exécutant d'abord la fonction setup, puis exécutant la fonction loop à plusieurs reprises](../../../../images/arduino-sketch.png)
✅ Cette architecture de programme est connue sous le nom de *boucle d'événements* ou *boucle de messages*. De nombreuses applications l'utilisent en arrière plan et c'est la norme pour la plupart des applications de bureau qui fonctionnent sur des systèmes d'exploitation comme Windows, macOS ou Linux. La `boucle` ('loop') écoute les messages provenant des composants de l'interface utilisateur tels que les boutons, ou des périphériques tels que le clavier, et y répond. Pour en savoir plus, consultez cet [article sur la boucle d'événements](https://wikipedia.org/wiki/Event_loop).
Arduino fournit des bibliothèques standard pour interagir avec les microcontrôleurs et les broches d'I/O (Entrée/Sorties), avec différentes implémentations en arrière plan pour fonctionner sur différents microcontrôleurs. Par exemple, la [fonction `delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) met le programme en pause pendant une période donnée, la [fonction `digitalRead`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) lit une valeur `HIGH` ou `LOW` sur la broche donnée, quelle que soit la carte sur laquelle le code est exécuté. Ces bibliothèques standard signifient que le code Arduino écrit pour une carte peut être recompilé pour n'importe quelle autre carte Arduino et fonctionnera, en supposant que les broches sont les mêmes et que les cartes supportent les mêmes fonctionnalités.
Il existe un vaste écosystème de bibliothèques Arduino tierces qui vous permettent d'ajouter des fonctionnalités supplémentaires à vos projets Arduino, telles que l'utilisation de capteurs et d'actionneurs ou la connexion à des services cloud IoT.
##### Tâche
Étudiez le terminal Wio.
Si vous utilisez un terminal Wio pour ces leçons, relisez le code que vous avez écrit dans la dernière leçon. Trouvez les fonctions `setup` et `loop`. Surveillez la sortie série pour voir si la fonction loop est appelée de façon répétée. Essayez d'ajouter du code à la fonction `setup` pour écrire sur le port série et observez que ce code n'est appelé qu'une seule fois à chaque redémarrage. Essayez de redémarrer votre appareil avec l'interrupteur d'alimentation sur le côté pour montrer que ce code est appelé à chaque redémarrage de l'appareil.
## Approfondissement des ordinateurs monocartes
Dans la dernière leçon, nous avons présenté les ordinateurs monocartes. Nous allons maintenant les étudier plus en détail.
### Raspberry Pi
![Le logo Raspberry Pi](../../../../images/raspberry-pi-logo.png)
La [Raspberry Pi Foundation](https://www.raspberrypi.org) est une organisation caritative britannique fondée en 2009 pour promouvoir l'étude de l'informatique, en particulier dans les écoles. Dans le cadre de cette mission, elle a développé un ordinateur monocarte, appelé Raspberry Pi. Les Raspberry Pis sont actuellement disponibles en trois variantes : une version pleine grandeur, le Pi Zero, plus petit, et un module de calcul qui peut être intégré dans votre appareil IoT final.
![Un Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg)
La dernière itération du Raspberry Pi grandeur nature est le Raspberry Pi 4B. Il dispose d'un processeur quadricœur (4 cœurs) cadencé à 1,5 GHz, de 2, 4 ou 8 Go de RAM, d'un réseau Ethernet gigabit, du WiFi, de 2 ports HDMI supportant les écrans 4k, d'un port de sortie audio et vidéo composite, de ports USB (2 USB 2.0, 2 USB 3.0), de 40 broches GPIO, d'un connecteur pour un module caméra Raspberry Pi, et d'un emplacement pour carte SD. Le tout sur une carte de 88 mm x 58 mm x 19,5 mm, alimentée par une alimentation USB-C de 3A. Ces cartes sont proposées à partir de 35 dollars, bien moins chères qu'un PC ou un Mac.
> 💁 Il existe également un ordinateur tout-en-un Pi400 avec un Pi4 intégré dans un clavier.
![Un Raspberry Pi Zero](../../../../images/raspberry-pi-zero.jpg)
Le Pi Zero est beaucoup plus petit et moins puissant. Il dispose d'un processeur à cœur unique de 1 GHz, de 512 Mo de RAM, du WiFi (dans le modèle Zero W), d'un port HDMI unique, d'un port micro-USB, de 40 broches GPIO, d'un connecteur pour un module caméra Raspberry Pi et d'un emplacement pour carte SD. Il mesure 65 mm x 30 mm x 5 mm et consomme très peu d'énergie. Le Zero coûte 5 dollars, la version W avec WiFi 10 dollars.
> 🎓 Les processeurs de ces deux appareils sont des processeurs ARM, par opposition aux processeurs Intel/AMD x86 ou x64 que l'on trouve dans la plupart des PC et des Mac. Ces processeurs sont similaires à ceux que l'on trouve dans certains microcontrôleurs, ainsi que dans presque tous les téléphones portables, la Surface X de Microsoft et les nouveaux Mac d'Apple basés sur le silicium.
Toutes les variantes du Raspberry Pi utilisent une version de Debian Linux appelée Raspberry Pi OS. Cette version est disponible en version allégée sans bureau, ce qui est parfait pour les projets 'headless' où vous n'avez pas besoin d'écran, ou en version complète avec un environnement de bureau complet, avec un navigateur web, des applications de bureau, des outils de codage et des jeux. Le système d'exploitation étant une version de Debian Linux, vous pouvez installer n'importe quelle application ou outil fonctionnant sous Debian et conçu pour le processeur ARM du Pi.
#### Tâche
Étudiez le Raspberry Pi.
Si vous utilisez un Raspberry Pi pour ces leçons, renseignez-vous sur les différents composants matériels de la carte.
* Vous pouvez trouver des détails sur les processeurs utilisés sur la [page de documentation sur le matériel du Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/). Renseignez-vous sur le processeur utilisé dans le Pi que vous utilisez.
* Localisez les broches GPIO. Pour en savoir plus, consultez la [documentation GPIO du Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md). Utilisez le [Guide d'utilisation des broches GPIO](https://www.raspberrypi.org/documentation/usage/gpio/README.md) pour identifier les différentes broches de votre Pi.
### Programmation d'ordinateurs monocartes
Les ordinateurs monocartes sont des ordinateurs à part entière, dotés d'un système d'exploitation complet. Cela signifie qu'il existe un large éventail de langages de programmation, de cadres et d'outils que vous pouvez utiliser pour les coder, contrairement aux microcontrôleurs qui dépendent de la prise en charge de la carte dans des cadres tels qu'Arduino. La plupart des langages de programmation disposent de bibliothèques qui peuvent accéder aux broches GPIO pour envoyer et recevoir des données de capteurs et d'actionneurs.
✅ Quels sont les langages de programmation qui vous sont familiers? Sont-ils pris en charge par Linux?
Le langage de programmation le plus courant pour créer des applications IoT sur un Raspberry Pi est Python. Il existe un vaste écosystème de matériel conçu pour le Pi, et presque tous incluent le code nécessaire à leur utilisation sous forme de bibliothèques Python. Certains de ces écosystèmes sont basés sur des `chapeaux` (ou `hat` en anglais), ainsi appelés parce qu'ils se placent sur le Pi comme un chapeau et se connectent aux 40 broches GPIO à l'aide d'une grande prise. Ces chapeaux offrent des fonctionnalités supplémentaires, telles que des écrans, des capteurs, des voitures télécommandées ou des adaptateurs permettant de brancher des capteurs à l'aide de câbles standardisés.
### Utilisation d'ordinateurs monocartes dans les déploiements professionnels de l'IoT
Les ordinateurs monocartes sont utilisés pour les déploiements IoT professionnels, et pas seulement comme kits de développement. Ils peuvent constituer un moyen puissant de contrôler le matériel et d'exécuter des tâches complexes telles que l'exécution de modèles d'apprentissage automatique. Par exemple, il existe un [module de calcul Raspberry Pi 4 ](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) qui offre toute la puissance d'un Raspberry Pi 4, mais dans un format compact et moins cher, sans la plupart des ports, conçu pour être installé dans du matériel personnalisé.
---
## 🚀 Défi
Le défi de la dernière leçon consistait à dresser une liste du plus grand nombre possible d'appareils IoT présents chez vous, à l'école ou sur votre lieu de travail. Pour chaque appareil de cette liste, pensez-vous qu'ils sont construits autour de microcontrôleurs ou d'ordinateurs monocartes, ou même d'un mélange des deux ?
## Quiz de validation des connaissances
[Quiz de validation des connaissances](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## Révision et auto-apprentissage
* Lire le [Guide de démarrage Arduino](https://www.arduino.cc/en/Guide/Introduction) pour en savoir plus sur la plateforme Arduino.
* Lire [l'introduction au Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) pour en savoir plus sur les Raspberry Pis.
* Apprenez-en plus sur certains concepts et acronymes dans l'article [What the FAQ are CPUs, MPUs, MCUs, and GPUs article in the Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/).
✅ Utilisez ces guides, ainsi que les coûts indiqués en suivant les liens dans le [guide du matériel](../../../../hardware.md) pour décider de la plate-forme matérielle que vous souhaitez utiliser, ou si vous préférez utiliser un dispositif virtuel.
## Affectation
[Comparez les microcontrôleurs et les ordinateurs monocartes](assignment.fr.md)

@ -1,266 +0,0 @@
# IoT में गहराई से अध्ययन करें
![इस पाठ का एक संक्षिप्त विवरण](https://github.com/microsoft/IoT-For-Beginners/blob/main/sketchnotes/lesson-2.jpg?raw=true)
> स्केचनोट [नित्य नरसिम्हन](https://github.com/nitya) द्वारा बनाया गया है। एक बड़े संस्करण के लिए छवि पर क्लिक करें।
यह पाठ [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) के हिस्से के रूप में [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=अकादमिक-17441-jabenn) से पढ़ाया गया था। पाठ को 2 वीडियो में पढ़ाया गया था - 1 घंटे का पाठ, और 1 घंटे का कार्यालय समय जिसमे पाठ के कुछ हिस्सों में गहराई से अध्ययन करते हैं और सवालों के जवाब देते हैं।
[![पाठ 2: IoT में एक गहरी डुबकी](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
[![पाठ 2: IoT - कार्यालय समय में एक गहरी गोता](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
> वीडियो देखने के लिए ऊपर की छवियों पर क्लिक करें
## पूर्व व्याख्यान प्रश्नोत्तरी
[व्याख्यान पूर्व प्रश्नोत्तरी](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## परिचय
यह पाठ पिछले पाठ में शामिल कुछ अवधारणाओं में गहराई से अध्ययन करता है।
इस पाठ में हम कवर करेंगे:
* [एक IoT एप्लिकेशन के अंश](#एक-IoT-एप्लिकेशन-के-अंश)
* [माइक्रोकंट्रोलर्स में गहराई से अध्ययन करें](#माइक्रोकंट्रोलर-में-गहराई-से-अध्ययन-करें)
* [सिंगल-बोर्ड कंप्यूटरों में गहराई से अध्ययन करें](#सिंगल-बोर्ड-कंप्यूटर-में-गहराई-से-अध्ययन-करें)
## एक IoT एप्लिकेशन के अंश
IoT एप्लिकेशन के दो घटक हैं *इंटरनेट* और *थिंग*। आइए इन दो अंशों को थोड़ा और विस्तार से देखें।
### थिंग
![एक रास्पबेरी पाई 4](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-4.jpg)
IoT का **थिंग** भाग एक ऐसे उपकरण को संदर्भित करता है जो भौतिक दुनिया के साथ इंटरैक्ट कर सकता है। ये उपकरण आमतौर पर छोटे, कम कीमत वाले कंप्यूटर होते हैं, जो कम गति पर चलते हैं और कम शक्ति का उपयोग करते हैं - उदाहरण के लिए, किलोबाइट रैम के साथ साधारण माइक्रोकंट्रोलर (पीसी में गीगाबाइट के विपरीत) केवल कुछ सौ मेगाहर्ट्ज़ पर चल रहे हैं (पीसी में गीगाहर्ट्ज़ के विपरीत), लेकिन कभी-कभी इतनी कम बिजली की खपत करते हुए कि वे बैटरी पर हफ्तों, महीनों या वर्षों तक चल सकते हैं।
ये उपकरण भौतिक दुनिया के साथ बातचीत करते हैं, या तो सेंसर का उपयोग करके अपने आसपास से डेटा इकट्ठा करते हैं या भौतिक परिवर्तन करने के लिए आउटपुट या एक्चुएटर्स को नियंत्रित करते हैं। इसका विशिष्ट उदाहरण एक स्मार्ट थर्मोस्टेट है - एक उपकरण जिसमें एक तापमान सेंसर होता है, एक वांछित तापमान जैसे डायल या टचस्क्रीन सेट करने का साधन, और एक हीटिंग या कूलिंग सिस्टम से एक कनेक्शन जिसे तापमान का पता चलने पर चालू किया जा सकता है वांछित सीमा से बाहर है। तापमान संवेदक यह पता लगाता है कि कमरा बहुत ठंडा है और एक एक्चुएटर हीटिंग को चालू कर देता है।
![एक IoT डिवाइस के इनपुट के रूप में तापमान और एक डायल, और आउटपुट के रूप में हीटर का नियंत्रण दिखाने वाला एक आरेख](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/basic-thermostat.png)
विभिन्न चीजों की एक विशाल श्रृंखला है जो IoT उपकरणों के रूप में कार्य कर सकती है, समर्पित हार्डवेयर से जो एक चीज को समझती है, सामान्य प्रयोजन के उपकरणों तक, यहां तक ​​कि आपका स्मार्टफोन भी! एक स्मार्टफोन अपने आसपास की दुनिया का पता लगाने के लिए सेंसर का उपयोग कर सकता है, और दुनिया के साथ बातचीत करने के लिए एक्ट्यूएटर्स का उपयोग कर सकता है - उदाहरण के लिए आपके स्थान का पता लगाने के लिए एक जीपीएस सेंसर का उपयोग करना और एक स्पीकर का उपयोग करके आपको गंतव्य पर नेविगेशन निर्देश देना।
✅अपने आस-पास मौजूद अन्य प्रणालियों के बारे में सोचें जो सेंसर से डेटा पढ़ती हैं और निर्णय लेने के लिए इसका उपयोग करती हैं। एक उदाहरण ओवन पर थर्मोस्टैट होगा। क्या आप और खोज सकते हैं?
### इंटरनेट
IoT एप्लिकेशन के **इंटरनेट** पक्ष में ऐसे एप्लिकेशन होते हैं जिन्हें IoT डिवाइस डेटा भेजने और प्राप्त करने के लिए कनेक्ट कर सकता है, साथ ही अन्य एप्लिकेशन जो IoT डिवाइस से डेटा को प्रोसेस कर सकते हैं और IoT डिवाइस एक्ट्यूएटर्स को कौन से अनुरोध भेजने के लिए निर्णय लेने में मदद करते हैं।
एक विशिष्ट सेटअप में किसी प्रकार की क्लाउड सेवा होगी जिससे IoT डिवाइस कनेक्ट होता है, और यह क्लाउड सेवा सुरक्षा जैसी चीज़ों को संभालती है, साथ ही IoT डिवाइस से संदेश प्राप्त करती है, और डिवाइस पर संदेश वापस भेजती है। यह क्लाउड सेवा तब अन्य अनुप्रयोगों से कनेक्ट होगी जो सेंसर डेटा को संसाधित या संग्रहीत कर सकते हैं, या निर्णय लेने के लिए अन्य सिस्टम के डेटा के साथ सेंसर डेटा का उपयोग कर सकते हैं।
डिवाइस हमेशा वाई-फ़ाई या वायर्ड कनेक्शन के माध्यम से सीधे इंटरनेट से कनेक्ट नहीं होते हैं। कुछ डिवाइस ब्लूटूथ जैसी तकनीकों पर एक-दूसरे से बात करने के लिए जाल नेटवर्किंग का उपयोग करते हैं, एक हब डिवाइस के माध्यम से जुड़ते हैं जिसमें इंटरनेट कनेक्शन होता है।
एक स्मार्ट थर्मोस्टेट के उदाहरण के साथ, थर्मोस्टैट होम वाईफाई का उपयोग करके क्लाउड में चल रही क्लाउड सेवा से जुड़ जाएगा। यह इस क्लाउड सेवा को तापमान डेटा भेजेगा, और वहां से इसे किसी प्रकार के डेटाबेस में लिखा जाएगा जिससे मकान मालिक फोन ऐप का उपयोग करके वर्तमान और पिछले तापमान की जांच कर सके। क्लाउड में एक अन्य सेवा को पता होगा कि मकान मालिक को कौन सा तापमान चाहिए, और हीटिंग सिस्टम को चालू या बंद करने के लिए कहने के लिए क्लाउड सेवा के माध्यम से IoT डिवाइस पर संदेश वापस भेजें।
![एक आईओटी डिवाइस के इनपुट के रूप में तापमान और एक डायल दिखाने वाला एक आरेख, आईओटी डिवाइस क्लाउड से 2 तरह से संचार करता है, जो बदले में एक फोन के लिए 2-तरफा संचार होता है, और आईओटी से आउटपुट के रूप में हीटर का नियंत्रण होता है। डिवाइस](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/mobile-controlled-thermostat.png)
एक और भी स्मार्ट संस्करण क्लाउड में AI का उपयोग अन्य IoT उपकरणों से जुड़े अन्य सेंसर से डेटा के साथ कर सकता है जैसे कि ऑक्यूपेंसी सेंसर जो यह पता लगाते हैं कि कौन से कमरे उपयोग में हैं, साथ ही डेटा जैसे मौसम और यहां तक ​​​​कि आपका कैलेंडर, इस पर निर्णय लेने के लिए कि कैसे तापमान को स्मार्ट तरीके से सेट करें। उदाहरण के लिए, यदि यह आपके कैलेंडर से पढ़ता है कि आप छुट्टी पर हैं, तो यह आपके हीटिंग को बंद कर सकता है, या आपके द्वारा उपयोग किए जाने वाले कमरों के आधार पर कमरे-दर-कमरे के आधार पर हीटिंग को बंद कर सकता है, डेटा से अधिक से अधिक सटीक होना सीखता है अधिक समय तक।
![एक आईओटी डिवाइस के इनपुट के रूप में कई तापमान सेंसर और एक डायल दिखाते हुए एक आरेख, क्लाउड के लिए 2-तरफा संचार वाला आईओटी डिवाइस, जिसके बदले में फोन, कैलेंडर और मौसम सेवा के लिए 2-तरफा संचार होता है, और IoT डिवाइस से आउटपुट के रूप में हीटर का नियंत्रण](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/smarter-thermostat.png)
✅कौन सा अन्य डेटा इंटरनेट से जुड़े थर्मोस्टेट को स्मार्ट बनाने में मदद कर सकता है?
### किनारे पर IoT
हालाँकि IoT में I का अर्थ इंटरनेट है, इन उपकरणों को इंटरनेट से कनेक्ट करने की आवश्यकता नहीं है। कुछ मामलों में, डिवाइस 'एज' डिवाइस से कनेक्ट हो सकते हैं - गेटवे डिवाइस जो आपके स्थानीय नेटवर्क पर चलते हैं, जिसका अर्थ है कि आप इंटरनेट पर कॉल किए बिना डेटा को प्रोसेस कर सकते हैं। यह तब तेज हो सकता है जब आपके पास बहुत अधिक डेटा या धीमा इंटरनेट कनेक्शन हो, यह आपको ऑफ़लाइन चलाने की अनुमति देता है जहां इंटरनेट कनेक्टिविटी संभव नहीं है जैसे कि जहाज पर या आपदा क्षेत्र में मानवीय संकट का जवाब देते समय, और आपको डेटा को निजी रखें। कुछ उपकरणों में क्लाउड टूल्स का उपयोग करके बनाए गए प्रोसेसिंग कोड होंगे और निर्णय लेने के लिए इंटरनेट कनेक्शन का उपयोग किए बिना डेटा एकत्र करने और प्रतिक्रिया देने के लिए इसे स्थानीय रूप से चलाएंगे।
इसका एक उदाहरण ऐप्पल होमपॉड, अमेज़ॅन एलेक्सा, या Google होम जैसे स्मार्ट होम डिवाइस हैं, जो क्लाउड में प्रशिक्षित एआई मॉडल का उपयोग करके आपकी आवाज सुनेंगे, लेकिन डिवाइस पर स्थानीय रूप से चल रहे हैं। जब कोई निश्चित शब्द या वाक्यांश बोला जाता है तो ये उपकरण 'जागृत' होंगे, और उसके बाद ही प्रसंस्करण के लिए इंटरनेट पर अपना भाषण भेजेंगे। डिवाइस उचित बिंदु पर भाषण भेजना बंद कर देगा जैसे कि जब यह आपके भाषण में विराम का पता लगाता है। वेक शब्द के साथ डिवाइस को जगाने से पहले आप जो कुछ भी कहते हैं, और डिवाइस के सुनना बंद करने के बाद आप जो कुछ भी कहते हैं वह इंटरनेट पर डिवाइस प्रदाता को नहीं भेजा जाएगा, और इसलिए निजी होगा।
✅अन्य परिदृश्यों के बारे में सोचें जहां गोपनीयता महत्वपूर्ण है इसलिए डेटा का प्रसंस्करण क्लाउड के बजाय किनारे पर बेहतर ढंग से किया जाएगा। एक संकेत के रूप में - उन IoT उपकरणों के बारे में सोचें जिनमें कैमरे या अन्य इमेजिंग डिवाइस हैं।
### आईओटी सुरक्षा
किसी भी इंटरनेट कनेक्शन के साथ, सुरक्षा एक महत्वपूर्ण विचार है। एक पुराना मजाक है कि 'आईओटी में एस सुरक्षा के लिए खड़ा है' - आईओटी में कोई 'एस' नहीं है, जिसका अर्थ है कि यह सुरक्षित नहीं है।
IoT डिवाइस क्लाउड सेवा से कनेक्ट होते हैं, और इसलिए केवल उस क्लाउड सेवा की तरह ही सुरक्षित होते हैं - यदि आपकी क्लाउड सेवा किसी डिवाइस को कनेक्ट करने की अनुमति देती है तो दुर्भावनापूर्ण डेटा भेजा जा सकता है, या वायरस के हमले हो सकते हैं। इसके बहुत ही वास्तविक दुनिया के परिणाम हो सकते हैं क्योंकि IoT डिवाइस अन्य उपकरणों को इंटरैक्ट और नियंत्रित करते हैं। उदाहरण के लिए, [स्टक्सनेट वर्म](https://wikipedia.org/wiki/Stuxnet) ने सेंट्रीफ्यूज में वाल्वों को खराब करने के लिए हेरफेर किया। हैकर्स ने [बेबी मॉनिटर तक पहुंचने के लिए खराब सुरक्षा](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable) का भी फायदा उठाया है और अन्य घरेलू निगरानी उपकरण।
> 💁कभी-कभी IoT डिवाइस और एज डिवाइस डेटा को निजी और सुरक्षित रखने के लिए इंटरनेट से पूरी तरह से अलग नेटवर्क पर चलते हैं। इसे [एयर-गैपिंग](https://wikipedia.org/wiki/Air_gap_(networking)) के नाम से जाना जाता है।
## माइक्रोकंट्रोलर में गहराई से अध्ययन करें
पिछले पाठ में, हमने माइक्रोकंट्रोलर पेश किए थे। आइए अब उनमें गहराई से देखें।
### सी पी यू
सीपीयू माइक्रोकंट्रोलर का 'दिमाग' है। यह प्रोसेसर है जो आपके कोड को चलाता है और किसी भी कनेक्टेड डिवाइस से डेटा भेज सकता है और डेटा प्राप्त कर सकता है। सीपीयू में एक या अधिक कोर हो सकते हैं - अनिवार्य रूप से एक या अधिक सीपीयू जो आपके कोड को चलाने के लिए एक साथ काम कर सकते हैं।
सीपीयू एक सेकंड में कई लाख या अरबों बार टिक करने के लिए एक घड़ी पर भरोसा करते हैं। प्रत्येक टिक, या चक्र, सीपीयू द्वारा की जाने वाली क्रियाओं को सिंक्रनाइज़ करता है। प्रत्येक टिक के साथ, सीपीयू एक प्रोग्राम से एक निर्देश निष्पादित कर सकता है, जैसे बाहरी डिवाइस से डेटा पुनर्प्राप्त करना या गणितीय गणना करना। यह नियमित चक्र अगले निर्देश के संसाधित होने से पहले सभी कार्यों को पूरा करने की अनुमति देता है।
घड़ी का चक्र जितना तेज़ होता है, उतने ही अधिक निर्देश जो प्रत्येक सेकंड में संसाधित किए जा सकते हैं, और इसलिए सीपीयू जितना तेज़ होता है। CPU की गति [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) में मापी जाती है, एक मानक इकाई जहां 1 Hz का अर्थ है प्रति सेकंड एक चक्र या घड़ी का टिक।
> 🎓CPU की गति अक्सर MHz या GHz में दी जाती है। 1MHz 1 मिलियन हर्ट्ज है, 1GHz 1 बिलियन हर्ट्ज है।
> 💁 CPU [fetch-decode-execute cycle](https://wikipedia.org/wiki/Instruction_cycle) का उपयोग करके प्रोग्राम निष्पादित करते हैं। प्रत्येक घड़ी की टिक के लिए, सीपीयू मेमोरी से अगला निर्देश प्राप्त करेगा, इसे डीकोड करेगा, फिर इसे निष्पादित करेगा जैसे कि 2 नंबर जोड़ने के लिए अंकगणितीय तर्क इकाई (एएलयू) का उपयोग करना। कुछ निष्पादन चलाने के लिए कई टिक लगेंगे, इसलिए अगला चक्र निर्देश पूरा होने के बाद अगले टिक पर चलेगा।
![फ़ेच डिकोड, रैम में संग्रहीत प्रोग्राम से फ़ेच लेने का निर्देश दिखाते हुए चक्रों को निष्पादित करता है, फिर इसे सीपीयू पर डिकोडिंग और निष्पादित करता है](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/fetch-decode-execute.png)
माइक्रोकंट्रोलर की घड़ी की गति डेस्कटॉप या लैपटॉप कंप्यूटर, या यहां तक ​​कि अधिकांश स्मार्टफ़ोन की तुलना में बहुत कम होती है। उदाहरण के लिए वाईओ टर्मिनल में एक सीपीयू है जो 120 मेगाहट्र्ज या 120,000,000 चक्र प्रति सेकेंड पर चलता है।
✅एक औसत पीसी या मैक में कई गीगाहर्ट्ज़ पर चलने वाले कई कोर के साथ एक सीपीयू होता है, जिसका अर्थ है कि घड़ी एक सेकंड में अरबों बार टिकती है। अपने कंप्यूटर की घड़ी की गति पर शोध करें और तुलना करें कि यह Wio टर्मिनल से कितनी बार तेज है।
प्रत्येक घड़ी चक्र शक्ति खींचता है और गर्मी उत्पन्न करता है। जितनी तेजी से टिक होते हैं, उतनी ही अधिक बिजली की खपत होती है और अधिक गर्मी उत्पन्न होती है। पीसी में गर्मी को दूर करने के लिए हीट सिंक और पंखे होते हैं, जिसके बिना वे गर्म हो जाते हैं और सेकंड के भीतर बंद हो जाते हैं। माइक्रोकंट्रोलर के पास अक्सर न तो होता है क्योंकि वे अधिक कूलर चलाते हैं और इसलिए बहुत धीमे होते हैं। पीसी की रन ऑफ मेन पावर या बड़ी बैटरी कुछ घंटों के लिए, माइक्रोकंट्रोलर छोटी बैटरी से दिनों, महीनों या वर्षों तक चल सकते हैं। माइक्रोकंट्रोलर में कोर भी हो सकते हैं जो अलग-अलग गति से चलते हैं, जब बिजली की खपत कम करने के लिए सीपीयू की मांग कम होती है, तो धीमी कम पावर कोर पर स्विच किया जाता है।
> 💁 कुछ पीसी और मैक तेज हाई पावर कोर और धीमी लो पावर कोर के समान मिश्रण को अपना रहे हैं, बैटरी बचाने के लिए स्विच कर रहे हैं। उदाहरण के लिए, नवीनतम Apple लैपटॉप में M1 चिप चल रहे कार्य के आधार पर बैटरी जीवन या गति को अनुकूलित करने के लिए 4 प्रदर्शन कोर और 4 दक्षता कोर के बीच स्विच कर सकती है।
✅थोड़ा शोध करें: सीपीयू के बारे में [विकिपीडिया सीपीयू लेख](https://wikipedia.org/wiki/Central_processing_unit) पर पढ़ें।
#### टास्क
वाईओ टर्मिनल की जांच करें।
यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो CPU खोजने का प्रयास करें। इंटर्नल की तस्वीर के लिए [Wio Terminal उत्पाद पृष्ठ](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) का *हार्डवेयर ओव्हरव्यू* अनुभाग ढूंढें और पीछे की ओर स्पष्ट प्लास्टिक विंडो के माध्यम से CPU को खोजने का प्रयास करें।
### मेमरी
माइक्रोकंट्रोलर में आमतौर पर दो प्रकार की मेमोरी होती है - प्रोग्राम मेमोरी और रैंडम-एक्सेस मेमोरी (RAM)।
प्रोग्राम मेमोरी गैर-वाष्पशील होती है, जिसका अर्थ है कि इसमें जो कुछ भी लिखा जाता है वह तब रहता है जब डिवाइस में कोई शक्ति नहीं होती है। यह वह मेमोरी है जो आपके प्रोग्राम कोड को स्टोर करती है।
RAM प्रोग्राम द्वारा चलाने के लिए उपयोग की जाने वाली मेमोरी है, जिसमें आपके प्रोग्राम द्वारा आवंटित चर और बाह्य उपकरणों से एकत्रित डेटा होता है। रैम अस्थिर है, जब बिजली चली जाती है तो सामग्री खो जाती है, प्रभावी रूप से आपके प्रोग्राम को रीसेट कर देती है।
> 🎓प्रोग्राम मेमोरी आपके कोड को स्टोर करती है और पावर न होने पर रहती है।
> 🎓RAM का उपयोग आपके प्रोग्राम को चलाने के लिए किया जाता है और बिजली न होने पर रीसेट हो जाता है
सीपीयू की तरह, एक माइक्रोकंट्रोलर पर मेमोरी एक पीसी या मैक से छोटे परिमाण के आदेश हैं। एक सामान्य पीसी में 8 गीगाबाइट (GB) RAM, या 8,000,000,000 बाइट्स हो सकते हैं, प्रत्येक बाइट में एक अक्षर या 0-255 की संख्या को संग्रहीत करने के लिए पर्याप्त स्थान होता है। एक माइक्रोकंट्रोलर में केवल किलोबाइट (KB) RAM होगी, जिसमें एक किलोबाइट 1,000 बाइट्स होगा। ऊपर बताए गए Wio टर्मिनल में 192KB RAM या 192,000 बाइट्स हैं - एक औसत PC से 40,000 गुना कम!
नीचे दिया गया चित्र 192KB और 8GB के बीच के सापेक्ष आकार के अंतर को दर्शाता है - केंद्र में छोटा बिंदु 192KB का प्रतिनिधित्व करता है।
![192KB और 8GB के बीच की तुलना - 40,000 गुना से अधिक बड़ी](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/ram-comparison.png)
प्रोग्राम स्टोरेज भी पीसी से छोटा होता है। एक विशिष्ट पीसी में प्रोग्राम स्टोरेज के लिए 500GB हार्ड ड्राइव हो सकती है, जबकि एक माइक्रोकंट्रोलर में केवल किलोबाइट्स या शायद कुछ मेगाबाइट्स (MB) स्टोरेज (1MB 1,000KB, या 1,000,000 बाइट्स) हो सकता है। Wio टर्मिनल में 4MB प्रोग्राम स्टोरेज है।
✅ थोड़ा शोध करें: इसे पढ़ने के लिए आप जिस कंप्यूटर का उपयोग कर रहे हैं उसमें कितनी रैम और स्टोरेज है? यह एक माइक्रोकंट्रोलर से कैसे तुलना करता है?
### इनपुट आउटपुट
माइक्रोकंट्रोलर्स को सेंसर से डेटा पढ़ने और एक्चुएटर्स को कंट्रोल सिग्नल भेजने के लिए इनपुट और आउटपुट (I/O) कनेक्शन की जरूरत होती है। उनमें आमतौर पर कई सामान्य-उद्देश्य इनपुट/आउटपुट (GPIO) पिन होते हैं। इन पिनों को सॉफ्टवेयर में इनपुट के रूप में कॉन्फ़िगर किया जा सकता है (अर्थात वे एक संकेत प्राप्त करते हैं), या आउटपुट (वे एक संकेत भेजते हैं)।
️🧠⬅️सेंसर से मूल्यों को पढ़ने के लिए इनपुट पिन का उपयोग किया जाता है
️🧠➡️आउटपुट पिन एक्चुएटर्स को निर्देश भेजते हैं
✅आप इसके बारे में अगले पाठ में और जानेंगे।
#### टास्क
वाईओ टर्मिनल की जांच करें।
यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो GPIO पिन खोजें। यह जानने के लिए कि कौन से पिन कौन से हैं, [Wio Terminal उत्पाद पृष्ठ](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) के *पिनआउट डायग्राम* अनुभाग खोजें। Wio Terminal एक स्टिकर के साथ आता है जिसे आप पिन नंबर के साथ पीछे की तरफ माउंट कर सकते हैं, इसलिए इसे अभी जोड़ें यदि आपने पहले से नहीं किया है।
### भौतिक माप
माइक्रोकंट्रोलर आमतौर पर आकार में छोटे होते हैं, सबसे छोटे के साथ, [फ़्रीस्केल काइनेटिस KL03 MCU गोल्फ़ बॉल के डिंपल में फ़िट होने के लिए पर्याप्त छोटा होता है](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)। बस एक पीसी में सीपीयू 40 मिमी x 40 मिमी माप सकता है, और इसमें हीट सिंक और पंखे शामिल नहीं हैं जो यह सुनिश्चित करने के लिए आवश्यक हैं कि सीपीयू बिना ओवरहीटिंग के कुछ सेकंड से अधिक समय तक चल सके, एक पूर्ण माइक्रोकंट्रोलर से काफी बड़ा। माइक्रोकंट्रोलर, केस, स्क्रीन, और कनेक्शन और घटकों की एक श्रृंखला के साथ Wio टर्मिनल डेवलपर किट एक खुला हुआ Intel i9 CPU से बहुत बड़ा नहीं है, और एक हीट सिंक और पंखे के साथ CPU से काफी छोटा है!
| डिवाइस | आकार |
| ----------------------------- | --------------------- |
| फ्रीस्केल काइनेटिस KL03 | 1.6 मिमी x 2 मिमी x 1 मिमी |
| वाईओ टर्मिनल | 72मिमी x 57मिमी x 12मिमी |
| इंटेल i9 सीपीयू, हीट सिंक और पंखा | 136 मिमी x 145 मिमी x 103 मिमी |
### फ्रेमवर्क और ऑपरेटिंग सिस्टम
उनकी कम गति और स्मृति आकार के कारण, माइक्रोकंट्रोलर शब्द के डेस्कटॉप अर्थ में एक ऑपरेटिंग सिस्टम (OS) नहीं चलाते हैं। ऑपरेटिंग सिस्टम जो आपके कंप्यूटर को चलाता है (Windows, Linux, या macOS) को माइक्रोकंट्रोलर के लिए पूरी तरह से अनावश्यक कार्यों को चलाने के लिए बहुत अधिक मेमोरी और प्रोसेसिंग पावर की आवश्यकता होती है। याद रखें कि माइक्रोकंट्रोलर्स को आमतौर पर एक या अधिक विशिष्ट कार्यों को करने के लिए प्रोग्राम किया जाता है, पीसी या मैक जैसे सामान्य-उद्देश्य वाले कंप्यूटर के विपरीत, जिसे उपयोगकर्ता इंटरफ़ेस का समर्थन करने, संगीत या फिल्में चलाने, दस्तावेज़ या कोड लिखने, गेम खेलने के लिए उपकरण प्रदान करने की आवश्यकता होती है, या इंटरनेट ब्राउज़ करें।
ओएस के बिना माइक्रोकंट्रोलर प्रोग्राम करने के लिए आपको कुछ टूलिंग की आवश्यकता होती है ताकि आप अपना कोड इस तरह से बना सकें कि माइक्रोकंट्रोलर चल सके, एपीआई का उपयोग करके जो किसी भी बाह्य उपकरणों से बात कर सके। प्रत्येक माइक्रोकंट्रोलर अलग होता है, इसलिए निर्माता सामान्य रूप से मानक ढांचे का समर्थन करते हैं जो आपको अपना कोड बनाने के लिए एक मानक 'नुस्खा' का पालन करने की अनुमति देते हैं और इसे किसी भी माइक्रोकंट्रोलर पर चलाते हैं जो उस ढांचे का समर्थन करता है।
आप ओएस का उपयोग करके माइक्रोकंट्रोलर प्रोग्राम कर सकते हैं - जिसे अक्सर रीयल-टाइम ऑपरेटिंग सिस्टम (आरटीओएस) के रूप में संदर्भित किया जाता है, क्योंकि इन्हें रीयल-टाइम में बाह्य उपकरणों से डेटा भेजने के लिए डिज़ाइन किया गया है। ये ऑपरेटिंग सिस्टम बहुत हल्के होते हैं और इस तरह की सुविधाएँ प्रदान करते हैं:
* मल्टी-थ्रेडिंग, आपके कोड को एक ही समय में कोड के एक से अधिक ब्लॉक चलाने की अनुमति देता है, या तो कई कोर पर या एक कोर को चालू करके
* इंटरनेट पर सुरक्षित रूप से संचार करने की अनुमति देने के लिए नेटवर्किंग
* स्क्रीन वाले उपकरणों पर यूजर इंटरफेस (यूआई) के निर्माण के लिए ग्राफिकल यूजर इंटरफेस (जीयूआई) घटक।
✅ कुछ अलग RTOS के बारे में पढ़ें: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [ज़ेफिर](https://www.zephyrproject.org)
#### अरुडिनो
![Arduino logo](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/arduino-logo.svg)
[Arduino](https://www.arduino.cc) शायद सबसे लोकप्रिय माइक्रोकंट्रोलर फ्रेमवर्क है, खासकर छात्रों, शौक़ीन लोगों और निर्माताओं के बीच। Arduino एक ओपन-सोर्स इलेक्ट्रॉनिक्स प्लेटफॉर्म है जो सॉफ्टवेयर और हार्डवेयर को मिलाता है। आप Arduino से स्वयं या अन्य निर्माताओं से Arduino संगत बोर्ड खरीद सकते हैं, फिर Arduino फ्रेमवर्क का उपयोग करके कोड कर सकते हैं।
Arduino बोर्डों को C या C++ में कोड किया गया है। C या C++ का उपयोग करने से आपके कोड को बहुत छोटा संकलित किया जा सकता है और तेजी से चलाया जा सकता है, एक सीमित डिवाइस जैसे कि माइक्रोकंट्रोलर पर कुछ आवश्यक है। एक Arduino एप्लिकेशन के मूल को एक स्केच के रूप में संदर्भित किया जाता है और 2 कार्यों के साथ C/C++ कोड है - `setup` और `loop`। जब बोर्ड शुरू होता है, तो Arduino फ्रेमवर्क कोड एक बार `setup` फ़ंक्शन चलाएगा, फिर यह `loop` फ़ंक्शन को बार-बार चलाएगा, इसे तब तक लगातार चलाएगा जब तक कि बिजली बंद न हो जाए।
आप अपना setup कोड `setup` फ़ंक्शन में लिखेंगे, जैसे कि वाईफाई और क्लाउड सेवाओं से कनेक्ट करना या इनपुट और आउटपुट के लिए पिन इनिशियलाइज़ करना। तब आपके लूप कोड में प्रोसेसिंग कोड होगा, जैसे सेंसर से पढ़ना और मान को क्लाउड पर भेजना। आप सामान्य रूप से प्रत्येक लूप में देरी शामिल करेंगे, उदाहरण के लिए, यदि आप चाहते हैं कि हर 10 सेकंड में केवल सेंसर डेटा भेजा जाए तो आप लूप के अंत में 10 सेकंड की देरी जोड़ देंगे ताकि माइक्रोकंट्रोलर सो सके, बिजली बचा सके, फिर 10 सेकंड बाद जरूरत पड़ने पर लूप को फिर से चला सकें।
![पहले एक Arduino स्केच रनिंग सेटअप, फिर बार-बार लूप चलाना](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/arduino-sketch.png)
✅इस प्रोग्राम के आर्किटेक्चर को *इवेंट लूप* या *मैसेज लूप* के रूप में जाना जाता है। कई एप्लिकेशन हुड के तहत इसका उपयोग करते हैं और अधिकांश डेस्कटॉप एप्लिकेशन के लिए मानक हैं जो विंडोज, मैकओएस या लिनक्स जैसे ओएस पर चलते हैं। `loop` उपयोगकर्ता इंटरफ़ेस घटकों जैसे बटन, या कीबोर्ड जैसे उपकरणों के संदेशों को सुनता है, और उनका जवाब देता है। आप इस [इवेंट लूप पर लेख](https://wikipedia.org/wiki/Event_loop) में और अधिक पढ़ सकते हैं।
Arduino माइक्रोकंट्रोलर और I/O पिन के साथ इंटरैक्ट करने के लिए मानक पुस्तकालय प्रदान करता है, विभिन्न माइक्रोकंट्रोलर पर चलने के लिए हुड के तहत विभिन्न कार्यान्वयन के साथ। उदाहरण के लिए, [`delay` फ़ंक्शन](https://www.arduino.cc/reference/en/language/functions/time/delay/) एक निश्चित अवधि के लिए कार्यक्रम को रोक देगा, [`digitalRead` फ़ंक्शन](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) दिए गए पिन से `HIGH` या `LOW` का मान पढ़ेगा, चाहे किसी भी बोर्ड पर कोड चालू है। इन मानक पुस्तकालयों का मतलब है कि एक बोर्ड के लिए लिखे गए Arduino कोड को किसी अन्य Arduino बोर्ड के लिए पुन: संकलित किया जा सकता है और यह मानते हुए चलेगा कि पिन समान हैं और बोर्ड समान सुविधाओं का समर्थन करते हैं।
तृतीय-पक्ष Arduino पुस्तकालयों का एक बड़ा पारिस्थितिकी तंत्र है जो आपको अपने Arduino प्रोजेक्ट्स में अतिरिक्त सुविधाएँ जोड़ने की अनुमति देता है, जैसे सेंसर और एक्चुएटर्स का उपयोग करना या क्लाउड IoT सेवाओं से जुड़ना।
##### टास्क
वाईओ टर्मिनल की जांच करें।
यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो पिछले पाठ में आपके द्वारा लिखे गए कोड को दोबारा पढ़ें। `setup` और `loop` फ़ंक्शन ढूंढें। लूप फ़ंक्शन को बार-बार कॉल करने के लिए सीरियल आउटपुट की निगरानी करें। सीरियल पोर्ट पर लिखने के लिए `setup` फ़ंक्शन में कोड जोड़ने का प्रयास करें और देखें कि यह कोड केवल एक बार रीबूट करने पर ही कॉल किया जाता है। अपने डिवाइस को साइड में पावर स्विच के साथ रीबूट करने का प्रयास करें यह दिखाने के लिए कि हर बार डिवाइस रीबूट होने पर इसे कहा जाता है।
## सिंगल-बोर्ड कंप्यूटर में गहराई से अध्ययन करें
पिछले पाठ में, हमने सिंगल-बोर्ड कंप्यूटर पेश किए थे। आइए अब उनमें गहराई से देखें।
### रास्पबेरी पाई
![रास्पबेरी पाई लोगो](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-logo.png)
[रास्पबेरी पाई फाउंडेशन](https://www.raspberrypi.org) यूके की एक चैरिटी है जिसकी स्थापना 2009 में कंप्यूटर विज्ञान के अध्ययन को बढ़ावा देने के लिए की गई थी, खासकर स्कूल स्तर पर। इस मिशन के हिस्से के रूप में, उन्होंने एक सिंगल-बोर्ड कंप्यूटर विकसित किया, जिसे रास्पबेरी पाई कहा जाता है। रास्पबेरी पाई वर्तमान में 3 प्रकारों में उपलब्ध है - एक पूर्ण आकार का संस्करण, छोटा पाई ज़ीरो, और एक गणना मॉड्यूल जिसे आपके अंतिम IoT डिवाइस में बनाया जा सकता है।
![एक रास्पबेरी पाई 4](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-4.jpg)
पूर्ण आकार के रास्पबेरी पाई का नवीनतम पुनरावृत्ति रास्पबेरी पाई 4 बी है। इसमें एक क्वाड-कोर (4 कोर) सीपीयू है जो 1.5GHz, 2, 4, या 8GB RAM, गीगाबिट ईथरनेट, वाईफाई, 4k स्क्रीन को सपोर्ट करने वाले 2 HDMI पोर्ट, एक ऑडियो और कम्पोजिट वीडियो आउटपुट पोर्ट, USB पोर्ट (2 USB) पर चलता है। 2.0, 2 यूएसबी 3.0), 40 जीपीआईओ पिन, रास्पबेरी पाई कैमरा मॉड्यूल के लिए एक कैमरा कनेक्टर और एक एसडी कार्ड स्लॉट। यह सब एक बोर्ड पर है जो 88mm x 58mm x 19.5mm है और यह 3A USB-C बिजली की आपूर्ति द्वारा संचालित है। ये 35 अमेरिकी डॉलर से शुरू होते हैं, जो पीसी या मैक से काफी सस्ता है।
> 💁एक कीबोर्ड में निर्मित Pi4 के साथ एक सभी कंप्यूटर में एक Pi400 भी है।
![एक रास्पबेरी पाई ज़ीरो](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-zero.jpg)
पाई ज़ीरो बहुत छोटा है, कम शक्ति के साथ। इसमें सिंगल-कोर 1GHz CPU, 512MB RAM, WiFi (ज़ीरो W मॉडल में), एक सिंगल HDMI पोर्ट, एक माइक्रो-USB पोर्ट, 40 GPIO पिन, एक रास्पबेरी पाई कैमरा मॉड्यूल के लिए एक कैमरा कनेक्टर और एक SD है। कार्ड का स्थान। यह 65 मिमी x 30 मिमी x 5 मिमी मापता है, और बहुत कम शक्ति खींचता है। ज़ीरो यूएस $ 5 है, वाई-फाई यूएस $ 10 के साथ डब्ल्यू संस्करण के साथ।
>🎓 इन दोनों में सीपीयू एआरएम प्रोसेसर हैं, इंटेल/एएमडी x86 या x64 प्रोसेसर के विपरीत जो आपको अधिकांश पीसी और मैक में मिलते हैं। ये कुछ माइक्रोकंट्रोलर्स के साथ-साथ लगभग सभी मोबाइल फोन, माइक्रोसॉफ्ट सर्फेस एक्स और नए ऐप्पल सिलिकॉन-आधारित ऐप्पल मैक में पाए जाने वाले सीपीयू के समान हैं।
रास्पबेरी पाई के सभी वेरिएंट रास्पबेरी पाई ओएस नामक डेबियन लिनक्स का एक संस्करण चलाते हैं। यह बिना डेस्कटॉप के एक लाइट संस्करण के रूप में उपलब्ध है, जो 'हेडलेस' परियोजनाओं के लिए एकदम सही है, जहां आपको स्क्रीन की आवश्यकता नहीं है, या एक पूर्ण डेस्कटॉप वातावरण के साथ एक पूर्ण संस्करण, एक वेब ब्राउज़र, कार्यालय अनुप्रयोगों, कोडिंग टूल, और खेल चूंकि ओएस डेबियन लिनक्स का एक संस्करण है, आप डेबियन पर चलने वाले किसी भी एप्लिकेशन या टूल को इंस्टॉल कर सकते हैं और पीआई के अंदर एआरएम प्रोसेसर के लिए बनाया गया है।
#### टास्क
रास्पबेरी पाई की जांच करें।
यदि आप इन पाठों के लिए रास्पबेरी पाई का उपयोग कर रहे हैं, तो बोर्ड पर विभिन्न हार्डवेयर घटकों के बारे में पढ़ें।
* आप [रास्पबेरी पाई हार्डवेयर डॉक्यूमेंटेशन पेज](https://www.raspberrypi.org/documentation/hardware/raspberrypi/) पर इस्तेमाल किए गए प्रोसेसर के बारे में जानकारी पा सकते हैं। आप जिस पाई का उपयोग कर रहे हैं उसमें प्रयुक्त प्रोसेसर के बारे में पढ़ें।
* GPIO पिन का पता लगाएँ। [रास्पबेरी पाई GPIO दस्तावेज़ीकरण](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md) पर उनके बारे में और पढ़ें। अपने पाई पर अलग-अलग पिन की पहचान करने के लिए [GPIO पिन यूसेज गाइड](https://www.raspberrypi.org/documentation/usage/gpio/README.md) का इस्तेमाल करें।
### प्रोग्रामिंग सिंगल-बोर्ड कंप्यूटर
सिंगल-बोर्ड कंप्यूटर पूर्ण कंप्यूटर हैं, जो एक पूर्ण OS चला रहे हैं। इसका मतलब यह है कि माइक्रोकंट्रोलर के विपरीत प्रोग्रामिंग भाषाओं, ढांचे और टूल की एक विस्तृत श्रृंखला है जिसका उपयोग आप उन्हें कोड करने के लिए कर सकते हैं, जो Arduino जैसे ढांचे में बोर्ड के समर्थन पर भरोसा करते हैं। अधिकांश प्रोग्रामिंग भाषाओं में पुस्तकालय होते हैं जो सेंसर और एक्चुएटर्स से डेटा भेजने और प्राप्त करने के लिए GPIO पिन तक पहुंच सकते हैं।
✅ आप किन प्रोग्रामिंग भाषाओं से परिचित हैं? क्या वे लिनक्स पर समर्थित हैं?
रास्पबेरी पाई पर IoT अनुप्रयोगों के निर्माण के लिए सबसे आम प्रोग्रामिंग भाषा पायथन है। पाई के लिए डिज़ाइन किए गए हार्डवेयर का एक विशाल पारिस्थितिकी तंत्र है, और इनमें से लगभग सभी में संबंधित कोड शामिल हैं जो उन्हें पायथन पुस्तकालयों के रूप में उपयोग करने के लिए आवश्यक हैं। इनमें से कुछ पारिस्थितिक तंत्र 'टोपी' पर आधारित होते हैं - तथाकथित क्योंकि वे एक टोपी की तरह पाई के ऊपर बैठते हैं और एक बड़े सॉकेट से 40 GPIO पिन से जुड़ते हैं। ये टोपियां अतिरिक्त क्षमताएं प्रदान करती हैं, जैसे स्क्रीन, सेंसर, रिमोट-नियंत्रित कार, या एडेप्टर आपको मानकीकृत केबल के साथ सेंसर प्लग-इन करने की अनुमति देते हैं
### पेशेवर IoT परिनियोजन में सिंगल-बोर्ड कंप्यूटर का उपयोग
एकल-बोर्ड कंप्यूटर का उपयोग पेशेवर IoT परिनियोजन के लिए किया जाता है, न कि केवल डेवलपर किट के रूप में। वे हार्डवेयर को नियंत्रित करने और मशीन लर्निंग मॉडल चलाने जैसे जटिल कार्यों को चलाने के लिए एक शक्तिशाली तरीका प्रदान कर सकते हैं। उदाहरण के लिए, एक [रास्पबेरी पाई 4 कंप्यूट मॉड्यूल](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) है जो रास्पबेरी पाई 4 की सारी शक्ति प्रदान करता है लेकिन एक में अधिकांश पोर्ट के बिना कॉम्पैक्ट और सस्ता फॉर्म फैक्टर, जिसे कस्टम हार्डवेयर में स्थापित करने के लिए डिज़ाइन किया गया है।
---
## 🚀चुनौती
पिछले पाठ में चुनौती थी कि आप अपने घर, स्कूल या कार्यस्थल में जितने हो सके उतने IoT उपकरणों को सूचीबद्ध करें। इस सूची में प्रत्येक डिवाइस के लिए, क्या आपको लगता है कि वे माइक्रोकंट्रोलर या सिंगल-बोर्ड कंप्यूटर, या यहां तक ​​कि दोनों के मिश्रण के आसपास बनाए गए हैं?
## व्याख्यान के बाद प्रश्नोत्तरी
[व्याख्यान के बाद प्रश्नोत्तरी](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## समीक्षा और आत्म अध्ययन
* Arduino प्लेटफॉर्म के बारे में अधिक समझने के लिए [Arduino गेटिंग स्टार्ट गाइड](https://www.arduino.cc/en/Guide/Introduction) पढ़ें।
* रास्पबेरी पाई के बारे में अधिक जानने के लिए [रास्पबेरी पाई 4 का परिचय](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) पढ़ें।
* [इलेक्ट्रिकल इंजीनियरिंग जर्नल में सीपीयू, एमपीयू, एमसीयू और जीपीयू के अक्सर पूछे जाने वाले सवाल क्या हैं](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/) में कुछ अवधारणाओं और शब्दों के बारे में और जानें।
✅आप किस हार्डवेयर प्लेटफॉर्म का उपयोग करना चाहते हैं, या यदि आप इसके बजाय यह तय करने के लिए [हार्डवेयर गाइड](https://github.com/microsoft/IoT-For-Beginners/blob/main/hardware.md) में लिंक का पालन करके दिखाए गए लागतों के साथ इन गाइड का उपयोग करें वर्चुअल डिवाइस का उपयोग करें।
## कार्यभार
[माइक्रोकंट्रोलर और सिंगल-बोर्ड कंप्यूटरों की तुलना और तुलना करें](https://github.com/microsoft/IoT-For-Beginners/blob/main/1-getting-started/lessons/2-deeper-dive/assignment.md)

@ -1,260 +0,0 @@
# IoT에 대한 심화 학습
![../../../../sketchnotes/lesson-2.jpg](../../../../sketchnotes/lesson-2.jpg)
> Nitya Narasumhan의 스케치 노트. 클릭하시면 이미지를 더 크게 보실 수 있습니다.
이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)에서 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 의 일부로 제공되었습니다. 이 수업은 1시간짜리 수업과 1시간짜리의 강의에 대한 집중탐구 및 질의 응답으로 총 2개의 비디오로 구성되어 있습니다.
![https://img.youtube.com/vi/t0SySWw3z9M/0.jpg](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)
![https://img.youtube.com/vi/tTZYf9EST1E/0.jpg](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)
> 🎥 상단의 이미지를 클릭하여 비디오를 시청하실 수 있습니다.
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## 개요
이 수업은 지난 수업에 다뤘던 개념의 일부에 대한 심화 학습입니다.
이 단원에서는 다음을 다룹니다:
- [IoT 애플리케이션의 구성 요소](#iot-애플리케이션의-구성-요소)
- [마이크로컨트롤러 심화 학습](#마이크로컨트롤러-심화-학습)
- [싱글 보드 컴퓨터 심화 학습](#싱글-보드-컴퓨터-심화-학습)
## IoT 애플리케이션의 구성 요소
IoT를 구성하는 2개의 요소는 _인터넷__사물_ 입니다. 이 두 가지 구성요소에 대해 조금 더 자세히 살펴보도록 하겠습니다.
### 사물
![../../../../images/raspberry-pi-4.jpg](../../../../images/raspberry-pi-4.jpg)
**사물**은 IoT의 한 부분으로서 물리적인 세계와 상호작용할 수 있는 장치를 의미합니다. 이러한 장치들은 일반적으로 낮은 전력을 소비하며 느린 속도로 돌아가는 저렴하고 작은 컴퓨터입니다. - 예를 들어, 수백 메가헤르츠(PC의 기가헤르츠와 달리)의 RAM(PC의 기가바이트가 아닌)에 불과하지만 때때로 배터리를 사용하여 몇 주, 몇 달, 심지어 1년 동안 작동할 수 있는 매우 적은 전력을 소비하는 간단한 마이크로컨트롤러입니다.
이러한 장치는 센서를 사용하여 자신의 주변 환경에서 데이터를 수집하거나, 출력 또는 액추에이터를 제어하여 물리적 변경을 수행함으로써 물리적 세계와 상호 작용합니다. 이러한 장치의 전형적인 예시는 스마트 온도 조절기입니다. 스마트 온도 조절기는 온도 센서, 다이얼 또는 터치스크린과 같은 원하는 온도를 설정하기 위한 수단, 감지된 온도가 원하는 범위를 벗어날 때 켜질 수 있는 냉난방 시스템에 대한 연결을 갖는 장치입니다. 온도 센서가 실내가 너무 춥다는 것을 감지하면 액추에이터가 난방을 켭니다.
![../../../../images/basic-thermostat.png](../../../../images/basic-thermostat.png)
IoT 장치로 동작할 수 있는 다른 사물들은 한 가지를 감지하는 전용 하드웨어로부터, 심지어는 당신의 스마트폰과 같은 범용 기기들을 포함하는 넓은 범위를 갖습니다! 스마트폰은 우리 주변을 감지하는 센서로 사용할 수 있고, 세상과 상호작용하기 위한 액추에이터로도 사용할 수 있습니다. 예를 들어, 당신의 위치를 감지하기 위해 GPS 센서를 사용하고 스피커를 사용하여 당신에게 목적지까지의 길을 안내합니다.
✅ 센서에서 데이터를 읽고 이를 사용하여 결정을 내리는 주변의 다른 시스템을 생각해 보십시오. 오븐의 온도 조절 장치를 하나의 예로 들을 수 있습니다. 다른 예시를 더 찾을 수 있습니까?
### 인터넷
IoT 애플리케이션의 **인터넷** 측면은 IoT 장치가 데이터를 송수신하기 위해 연결할 수 있는 애플리케이션뿐만 아니라 IoT 장치의 데이터를 처리하고 IoT 장치 액추에이터에 보낼 요청을 결정하는 데 도움을 줄 수 있는 다른 애플리케이션으로 구성됩니다.
일반적인 설정 중 하나는 IoT 장치가 연결되는 일종의 클라우드 서비스를 갖는 것이고, 이러한 클라우드 서비스는 IoT 장치에서 메시지를 수신하고 장치로 메시지를 다시 보내는 것뿐만 아니라 보안과 같은 것들을 처리합니다. 이 클라우드 서비스는 센서의 데이터를 처리하거나 저장하는 다른 애플리케이션들에 연결하거나 다른 시스템으로 부터 얻은 데이터와 센서의 데이터를 사용하여 결정을 내리는 데에 사용합니다.
장치들이 항상 WiFi나 유선 연결을 통해 인터넷에 직접 연결되는 것은 아닙니다. 일부 장치들은 인터넷에 연결된 허브 장치를 통해 연결하는 블루투스 같은 기술을 통해 서로 대화하기 위해 메시 네트워킹을 사용합니다.
스마트 온도 조절기의 예시를 살펴보면, 온도 조절기는 가정의 WiFi를 통해 클라우드에서 실행되는 클라우스 서비스에 연결합니다. 온도 조절기는 이 클라우드 서비스에 온도 데이터를 보내고, 클라우드에서는 휴대폰의 앱을 사용하여 집주인이 현재와 과거의 온도를 확인 할 수 있도록하는 데이터베이스에 기록됩니다. 클라우드의 다른 서비스에서는 집주인이 원하는 온도를 인지하고 클라우드 서비스를 통해 IoT 장치에 메시지를 보내 난방 시스템을 켜거나 끄도록 명령합니다.
![../../../../images/mobile-controlled-thermostat.png](../../../../images/mobile-controlled-thermostat.png)
더욱 스마트한 버전에서는 사용 중인 방을 감지하는 점유 센서와 같은 다른 IoT 장치에 연결된 다른 센서의 데이터와 날씨 및 캘린더와 같은 데이터와 함께 클라우드의 AI를 사용하여 어떻게 온도를 영리하게 설정할 것인지 결정할 수 있습니다. 예를 들어, 당신이 휴가 중이라는 사실을 당신의 캘린더에서 읽어와 난방을 끈다든지, 당신이 사용하는 방에 따라 난방을 끈다든지, 시간이 지남에 따라 데이터로부터 학습하여 더욱 더 정확해질 수 있습니다.
![../../../../images/smarter-thermostat.png](../../../../images/smarter-thermostat.png)
✅ 인터넷이 연결된 온도 조절기를 좀 더 스마트하게 만드는 다른 데이터에는 무엇이 있습니까?
### Edge에서의 IoT
IoT에서 I 는 인터넷을 의미하지만, 이러한 장치들은 반드시 인터넷에 연결될 필요는 없습니다. 경우에 따라 장치들은 edge 장치에 연결할 수 있습니다. edge는 당신의 로컬 네트워크에서 동작하는 게이트웨이 장치로 인터넷을 통해 전화를 걸지 않고도 데이터를 처리할 수 있습니다. 이는 데이터가 많거나 인터넷 연결이 느릴 때 더 빠를 수 있으며, 인도적 위기에 대응할 때 선박이나 재난 지역과 같이 인터넷 연결이 불가능한 곳에서 오프라인으로 실행할 수 있게 해주며, 데이터를 비공개로 유지할 수 있도록 해줍니다. 일부 장치에는 클라우드 도구를 사용하여 생성된 처리 코드가 포함되어 있으며, 결정을 내리기 위해 이를 로컬에서 실행하여 인터넷 연결을 사용하지 않고 데이터를 수집하고 응답합니다.
하나의 예시로 Apple의 Homepod, Amazon의 Alexa, Google Home과 같은 스마트 홈 디바이스들은 당신의 목소리를 클라우드에서 학습된 AI 모델로 듣지만 디바이스에서 로컬 환경으로 동작합니다. 이러한 디바이스들은 특정한 단어나 구문을 말할 때 ‘깨어나’게 되고 처리를 위해 당신의 음성을 인터넷을 통해 전송합니다. 이 장치들은 당신이 말하는 것을 멈추는 것을 감지하는 경우와 같은 적절한 시점에서 음성을 전송하는 것을 멈춥니다. 깨우기 단어로 장치를 깨우기 전에 말하는 모든 내용과 장치가 듣기를 멈춘 뒤 말하는 모든 내용은 인터넷을 통해 장치 공급자에게 전송되지 않으므로 비공개됩니다.
✅ 개인 정보의 중요성에 의해 클라우드보다 edge에서 수행하는 것이 더 나은 다른 시나리오를 생각해 보십시오. 힌트를 드리자면, 카메라나 다른 이미징 장치를 가지고 있는 IoT 장치를 생각해 보십시오.
### IoT 보안
모든 인터넷 연결에서 보안은 아주 중요한 고려사항입니다. IoT의 S는 보안을 의미한다’라는 오래된 농담이 있습니다. IoT에는 S가 없으므로 안전하지 않다는 뜻입니다.
IoT 장치들은 클라우드 서비스에 연결되어 있으므로 해당 클라우드 서비스만큼 안전합니다. 만약 당신의 클라우드 서비스가 어떤 장치에 연결되도록 허용한다면, 악의적인 데이터가 전송되거나 바이러스 공격이 발생할 수 있습니다. 이는 IoT 장치가 다른 장치와 상호 작용하고 제어할 때 매우 실제적인 결과를 초래할 수 있습니다. 예를 들어, [Stuxnet worm](https://wikipedia.org/wiki/Stuxnet) 은 원심분리기의 밸브를 조작하여 밸브를 손상시킵니다. 해커들은 또한 [열악한 보안을 이용해 아기 모니터](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable)와 다른 가정용 감시 장치에 접근했습니다.
> 💁 일부 IoT 장치들과 edge 장치들은 데이터를 안전하고 비공개로 유지하기 위해 네트워크에서 인터넷과 완전히 고립된 상태로 동작합니다. 이것은 air-gapping 이라고 불립니다.
## 마이크로컨트롤러 심화 학습
지난 수업에서 우리는 마이크로컨트롤러를 소개했습니다. 이제 그것에 대해 더 자세히 알아봅시다.
### CPU
CPU는 마이크로컨트롤러의 ‘두뇌‘입니다. 이것은 당신의 코드를 실행하고 다른 연결된 장치들에 데이터를 송수신하는 처리장치입니다. CPU는 하나 이상의 코어를 포함할 수 있습니다. 필수적으로 하나 이상의 CPU들이 당신의 코드를 실행하기 위해 함께 동작할 수 있습니다.
CPU는 클럭에 의존하여 초당 수백만 또는 수십억 번 tick합니다. 각 tick 또는 주기는 CPU가 수행할 수 있는 작업과 동기화합니다. 각 tick마다 CPU는 외부 장치에서 데이터를 검색하거나 수학적 계산을 수행하는 것과 같이 프로그램에서 명령을 실행할 수 있습니다. 이 규칙적인 사이클을 통해 다음 명령이 처리되기 전에 모든 작업을 완료할 수 있습니다.
클럭 주기가 빠를수록 초당 처리할 수 있는 명령어가 많아지므로 CPU가 빨라집니다. CPU 속도는 [헤르츠(Hz)](https://wikipedia.org/wiki/Hertz)로 측정되는데, 1Hz는 초당 1 사이클 또는 클럭 tick을 의미하는 표준 단위입니다.
> 🎓 CPU의 속도는 주로 MHz 또는 GHz로 주어집니다. 1MHz는 100만 Hz이고, 1GHz는 10억Hz입니다.
> 💁 CPU는 프로그램을 페치-디코딩-실행 사이클을 사용하여 실행합니다. 클럭의 tick마다 CPU는 메모리로부터 다음 명령어를 가져오고, 그것을 디코딩하고, 두 숫자를 더하기 위해 산술논리연산장치(ALU)를 사용하는 것과 같이 그것을 실행합니다. 몇몇 실행은 동작하는 데에 다수의 tick이 필요하므로 다음 사이클은 명령이 완료된 이후의 다음 tick에서 실행됩니다.
![../../../../images/fetch-decode-execute.png](../../../../images/fetch-decode-execute.png)
마이크로컨트롤러는 데스크탑이나 노트북 컴퓨터, 심지어 대부분의 스마트폰보다 훨씬 낮은 클럭 속도를 가집니다. 예를 들어 Wio Terminal은 120MHz 또는 초당 120,000,000 사이클에서 실행되는 CPU를 가집니다.
✅ 일반적인 PC 또는 Mac에는 여러 기가헤르츠에서 실행되는 다중 코어가 있는 CPU가 있습니다. 이는 클럭이 초당 수십억 번 tick한다는 의미입니다. 당신의 컴퓨터의 클럭 속도를 조사하고 Wio Terminal보다 몇 배나 빠른지 비교하십시오.
각각의 클럭 사이클은 전력을 끌어오고 열을 생성합니다. tick이 더 빠를수록, 더 많은 전력이 소비되고 더 많은 열을 발생시킵니다. PC는 열을 제거하기 위한 방열판과 팬들을 가지고 있으며, 이 기능이 없다면 과열되어 수 초만에 종료됩니다. 마이크로컨트롤러는 훨씬 더 낮은 온도에서 실행되고 따라서 훨씬 느리게 동작하기 때문에 둘 다 없는 경우도 있습니다. PC는 주 전원이나 대용량 배터리로 몇 시간 동안만 작동하며, 마이크로컨트롤러는 작은 배터리로 며칠, 몇 달 또는 몇 년 동안 작동할 수 있습니다. 마이크로컨트롤러 또한 다른 속도로 실행되는 코어를 가질 수 있으며, CPU의 수요가 낮을 때 전력 소비를 줄이기 위해 더 느린 저전력 코어로 전환할 수 있습니다.
> 💁 몇몇 PC와 Mac들은 배터리를 절약하기 위해 빠른 고전력 코어와 느린 저전력 코어를 동일하게 혼합하여 사용하고 있습니다. 예를 들어, Apple의 최신 노트북에 들어가는 M1 칩은 4개의 성능 코어와 4개의 효율 코어 사이를 전환해가며 배터리 수명을 최적화하거나 속도를 최적화할 수 있습니다.
✅ 간단한 조사를 해봅시다 : [Wikipedia CPU article](https://wikipedia.org/wiki/Central_processing_unit)에서 CPU에 대해 읽어봅시다.
### 작업
Wio Terminal을 조사하십시오.
당신이 Wio Terminal을 이번 수업을 위해 사용한다면, CPU를 찾아보십시오. 내부 사진을 보려면 [Wio Terminal product page](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 의 _하드웨어 개요_ 섹션을 찾아 뒷면의 투명한 플라스틱 창을 통해 CPU를 찾으십시오.
### 메모리
마이크로컨트롤러는 대부분 프로그램 메모리와 RAM(Random-Access Memory)의 두 가지 유형의 메모리를 가집니다.
프로그램 메모리는 비휘발성입니다. 즉, 장치에 전원이 공급되지 않더라도 작성된 내용이 유지됩니다. 이것은 프로그램 코드를 저장하는 메모리입니다.
RAM은 프로그램이 실행하는 데 사용하는 메모리로, 프로그램에서 할당한 변수와 주변 장치에서 수집한 데이터를 포함합니다. RAM은 휘발성이며, 전원이 꺼지면 내용이 손실되어 프로그램을 효과적으로 재설정합니다.
> 🎓 프로그램 메모리는 당신의 코드를 저장하고 전원이 들어오지 않는 경우에도 유지합니다.
> 🎓 RAM은 당신의 프로그램을 실행하는 데 사용되며 전원이 차단되면 리셋합니다.
CPU와 마찬가지로, 마이크로컨트롤러의 메모리는 PC나 Mac의 메모리보다 훨씬 작습니다. 일반적인 PC는 8기가바이트(GB) 또는 8,000,000,000 바이트의 램을 가지고 있으며, 각각의 바이트에는 하나의 문자나 0에서 255까지의 숫자를 저장하는 충분한 공간이 있습니다. 마이크로컨트롤러는 킬로바이트(KB)의 램만 있습니다. 킬로바이트는 1,000 바이트를 의미합니다. 위에서 언급된 Wio Terminal은 192KB(192,000 바이트)의 램을 가지고있습니다. 이는 평균적인 PC보다 40,000배 이상 작습니다!
하단의 다이어그램은 192KB와 8GB 사이의 상대적인 크기 차이를 보여줍니다. 중앙의 작은 점이 192KB를 나타냅니다.
![../../../../images/ram-comparison.png](../../../../images/ram-comparison.png)
프로그램 저장 용량 또한 PC보다 작습니다. 일반적인 PC는 프로그램 저장을 위해 500GB의 하드 드라이브가 존재합니다. 반면에 마이크로컨트롤러는 킬로바이트 또는 몇 메가바이트(1MB는 1,000KB 또는 1,000,000바이트)의 저장 공간이 있을 수 있습니다. Wio Terminal은 4MB의 프로그램 저장 공간이 있습니다.
✅ 간단한 조사를 해봅시다 : 당신이 이것을 읽기 위해 컴퓨터에 얼마나 많은 RAM과 저장공간이 필요할까요? 마이크로컨트롤러와 비교했을 때에는 어떻습니까?
### 입/출력
마이크로컨트롤러는 센서로부터 데이를 읽어오고 액추에이터로 제어 신호를 보내기 위해 입력과 출력(I/O) 연결이 필요합니다. 마이크로컨트롤러는 대부분 다수의 범용 입출력 핀(GPIO)을 포함하고 있습니다. 이러한 핀들은 소프트웨어에서 입력(신호 수신) 또는 출력(신호 전송)으로 구성할 수 있습니다.
🧠⬅️ 입력 핀들은 센서로부터 값을 읽어오는 데에 사용됩니다.
🧠➡️ 출력 핀들은 명령들을 액추에이터에 전송합니다.
✅ 이것에 대해서는 차후의 수업에서 더 자세히 배웁니다.
### 작업
Wio Terminal에 대해 조사하십시오.
만약 이 수업에서 Wio Terminal을 사용하고 있다면, GPIO 핀을 찾아보십시오. 어떤 핀이 어떤 역할을 하는 지에 대해 배우기 위해서는 [Wio Terminal product page](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 에서 _핀아웃 다이어그램_ 섹션을 찾아보십시오. Wio Terminal에는 핀 번호가 있는 뒷면에 부착할 수 있는 스티커가 함께 제공되므로 아직 부착하지 않았다면 지금 부착하십시오.
### 물리적인 크기
마이크로컨트롤러는 일반적으로 크기가 작으며, 가장 작은 [Freescale Kinetis KL03 MCU](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)의 경우 골프공의 딤플에 들어갈 수 있을 정도로 충분히 작습니다. PC의 CPU만 측정했을 경우 40mm x 40mm이며, 여기에는 CPU가 과열 없이 몇 초 이상 작동할 수 있도록 하는 데 필요한 방열판과 팬은 포함되지 않습니다. 이것들은 완전한 마이크로컨트롤러보다도 훨씬 큽니다. Wio Terminal의 개발자 키트는 마이크로컨트롤러, 케이스, 화면, 다양한 연결 및 구성 요소를 포함하고 있으며, Intel의 i9 CPU보다 크지 않고 방열판과 팬이 있는 CPU보다도 훨씬 작습니다.
### 프레임워크와 운영 체제
느린 속도와 메모리 크기 때문에, 마이크로컨트롤러는 데스크탑에서의 운영체제(OS)를 구동하지 않습니다. 컴퓨터를 실행하는 운영 체제(Windows, Linux 또는 macOS)는 마이크로컨트롤러에게는 완전히 불필요한 작업을 실행하기 위해 많은 메모리와 처리 능력을 필요로 합니다. 사용자 인터페이스를 지원하고, 음악이나 영화를 재생하고, 문서나 코드를 작성하거나, 게임을 하거나, 인터넷을 탐색해야 하는 PC나 Mac과 같은 범용 컴퓨터와는 달리 마이크로컨트롤러는 일반적으로 하나 이상의 매우 구체적인 작업을 수행하도록 프로그래밍되어 있습니다.
OS 없이 마이크로컨트롤러를 프로그래밍하기 위해서는 모든 주변 장치와 통신할 수 있는 API를 사용하여 마이크로컨트롤러가 실행할 수 있는 방식으로 코드를 빌드할 수 있는 도구가 필요합니다. 각각의 마이크로컨트롤러는 다르기 때문에 제조업체는 일반적으로 표준 '레시피'를 따라 코드를 빌드하고 해당 프레임워크를 지원하는 모든 마이크로컨트롤러에서 실행할 수 있는 표준 프레임워크를 지원합니다.
실시간 운영 체제(RTOS)라고도 하는 OS를 사용하여 마이크로컨트롤러를 프로그래밍할 수 있습니다. 이러한 OS는 주변 장치와 실시간으로 데이터를 주고받도록 설계되었기 때문입니다. 이러한 운영 체제는 매우 가볍고 다음과 같은 기능을 제공합니다:
- 멀티 쓰레딩, 멀티 또는 싱글 코어에서 차례로 코드를 실행하여 동시에 둘 이상의 코드 블럭을 실행
- 인터넷을 통한 안전한 통신을 가능하게 하는 네트워킹
- 화면이 있는 장치에서 사용자 인터페이스(UI)를 구축하기 위한 GUI(그래픽 사용자 인터페이스)
✅ 다른 RTOS들에 대해 읽어보세요: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org/), [Zephyr](https://www.zephyrproject.org/)
### Arduino
![../../../../images/arduino-logo.svg](../../../../images/arduino-logo.svg)
[Arduino](https://www.arduino.cc/) 는 특히나 학생, 취미로 즐기는 사람, 제작자 사이에서 가장 유명한 마이크로컨트롤러 프레임워크일 것입니다. Arduino 소프트웨어와 하드웨어를 결합한 오픈 소스 전자 플랫폼입니다. Arduino 자체 또는 다른 제조업체에서 Arduinod와 호환되는 보드를 구입한 다음 Arduino 프레임워크를 사용하여 코딩할 수 있습니다.
Arduino 보드는 C나 C++로 코딩됩니다. C/C++를 사용하면 코드를 매우 작게 컴파일하고 빠르게 실행할 수 있는데, 이는 마이크로컨트롤러와 같은 제약이 있는 장치에서 필요합니다. Arduino 애플리케이션의 핵심은 스케치라고 불리며, `setup``loop`라고 하는 두가지 기능을 가진 C/C++ 코드입니다. 보드가 시작되면 Arduino 프레임워크 코드는 `setup`기능을 한 번 실행한 다음 전원이 꺼질 때까지 계속해서 `loop`기능을 계속해서 실행합니다.
WiFi나 클라우드 서비스에 연결하거나 입출력을 위한 핀들을 초기화 하는 설정 코드를 `setup` 함수 안에 작성합니다. loop 코드에는 센서로부터 읽어오거나 클라우드에 값을 전송하는 것과 같은 처리 코드가 포함됩니다. 각각의 loop에는 지연을 포함시킬 수 있는데, 예를 들면 센서 데이터가 10초마다 전송되도록 하기 위해선 루프 끝에 10초 지연을 추가하여 마이크로컨트롤러가 sleep 모드로 전환되어 전력을 절약한 다음, 10초 후에 필요할 때 다시 loop를 실행할 수 있도록 하면 됩니다.
![../../../../images/arduino-sketch.png](../../../../images/arduino-sketch.png)
✅ 이 프로그램 아키텍쳐는 _이벤트 루프_ 또는 _메세지 루프_ 로 알려져 있습니다. 많은 애플리케이션들이 이를 내부적으로 사용하며 Windows, macOs, Linux에서 실행되는 대부분의 데스크탑 애플리케이션의 표준입니다. 이 loop는 버튼과 같은 유저 인터페이스의 구성 요소나 키보드와 같은 장치에서 메세지를 수신하고 그들에게 응답합니다. 이 [이벤트 루프에 대한 글](https://en.wikipedia.org/wiki/Event_loop)에서 더 많은 내용을 읽을 수 있습니다.
Arduino는 마이크로 컨트롤러 및 I/O 핀과 상호 작용하기 위한 표준 라이브러리를 제공하며, 서로 다른 마이크로 컨트롤러에서 실행되도록 후드 아래에서 서로 다른 구현을 제공합니다. 예를 들어, [`delay` 함수](https://www.arduino.cc/reference/en/language/functions/time/delay/)는 주어진 시간동안 프로그램을 잠시 중단하고, [`digitalRead` 함수](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/)는 코드가 실행되는 보드와 상관없이 주어진 핀으로부터 값이 `HIGH`인지 `LOW`인지 읽어옵니다. 이러한 표준 라이브러리는 핀이 동일하고 보드가 동일한 기능을 지원한다는 가정 하에 특정한 보드를 위해 작성된 Arduino 코드가 다른 어떠한 Arduino 보드에서 재컴파일될 수 있고 실행 가능하다는 것을 의미합니다.
센서 및 액추에이터를 사용하거나 클라우드 IoT 서비스에 연결하는 등 Arduino 프로젝트에 추가 기능을 추가할 수 있는 서드파티 Arduino 라이브러리의 대규모 생태계가 존재합니다.
### 작업
Wio Terminal에 대해 조사하십시오.
만약 이 수업에서 Wio Terminal을 사용하고 있다면, 지난 시간에 작성한 코드를 다시 읽어보십시오. 그리고 `setup` 함수와 `loop` 함수를 찾아보십시오. `loop`함수가 반복적으로 호출되면서 나오는 일련의 출력들을 모니터링 하십시오. 일련의 포트에 작성할 코드를 `setup`함수에 추가하여 재부팅할 때마다 이 코드가 한 번만 호출되는지 확인하십시오. 장치가 재부팅될 때마다 호출된다는 것을 보여주려면 측면에 있는 전원 스위치로 장치를 재부팅하십시오.
## 싱글 보드 컴퓨터 심화 학습
지난 수업에서 우리는 싱글 보드 컴퓨터에 대해 소개했습니다. 더 자세히 알아보도록 합시다.
### Raspberry Pi
![../../../../images/raspberry-pi-logo.png](../../../../images/raspberry-pi-logo.png)
[Raspberry Pi Foundation](https://www.raspberrypi.org/)은 특히 학교 수준에서 컴퓨터 과학에 대한 학습을 촉진하기 위해 2009년에 설립된 영국의 자선단체 입니다. 이 임무의 일환으로 그들은 Raspberry Pi라고 불리는 싱글 보드 컴퓨터를 개발하였습니다. Raspberry Pi는 현재 전체 크기 버전, 더 작은 Pi Zero, 최종 IoT 장치에 구축할 수 있는 컴퓨팅 모델의 3가지 종류로 제공됩니다.
![../../../../images/raspberry-pi-4.jpg](../../../../images/raspberry-pi-4.jpg)
풀 사이즈 Raspberry Pi의 가장 최신 버전은 Raspberry Pi 4B입니다. 이것은 1.5GHz의 쿼드코어(4 코어) CPU를 가지고 있으며 2, 4 또는 8GB의 램, 기가비트 이더넷, WiFi, 4k 화면을 지원하는 2개의 HDMI 포트, 오디오 및 컴포지트 비디오 출력 포트, USB 포트들(2개의 USB 2.0, 2개의 USB 3.0)과 40개의 GPIO핀들, Raspberry Pi 카메라 모듈을 위한 카메라 커넥터, SD 카드 슬롯을 가지고 있습니다. 이 모든 것이 88mm x 58mm x 19.5mm 크기의 3A USB-C 전원 공급 장치로 구동되는 보드에 있습니다. PC나 Mac보다 훨씬 저렴한 35달러부터 시작합니다.
> 💁 또한 Pi4가 키보드에 내장된 Pi400 올인원 컴퓨터도 있습니다.
![../../../../images/raspberry-pi-zero.jpg](../../../../images/raspberry-pi-zero.jpg)
Pi Zero는 훨씬 작고, 더 적은 전력으로 구동 가능 합니다. 이것은 1GHz의 싱글 코어 CPU, 512MB의 램, WiFi(Zero W 모델의 경우), 하나의 HDMI 포트, micro-USB 포트, 40개의 GPIO 핀, Raspberry Pi 카메라 모듈을 위한 카메라 커넥터, SD카드 슬롯을 가지고 있습니다. 이것은 65mm x 30mm x 5mm의 크기를 가지고 있으며, 아주 적은 전력을 소모합니다. Zero 버전은 미화 5달러, WiFi 버전은 미화 10달러입니다.
> 🎓 이 두가지의 CPU는 대부분의 컴퓨터나 Mac에서 찾을 수 있는 Intel/AMD의 x86이나 x64와는 달리 모두 ARM 프로세서입니다. 이는 일부 마이크로컨트롤러뿐만 아니라 거의 모든 휴대폰, Microsoft Surface X 및 새로운 Apple Silicon 기반 Apple Mac에서 볼 수 있는 CPU와 유사합니다.
모든 Raspberry Pi는 Raspberry Pi OS라고 불리는 Debian Linux 버전을 실행합니다. 이것은 화면이 필요하지 않은 '헤드리스' 프로젝트에 적합한 데스크탑이 없는 라이트 버전 또는 웹 브라우저, 사무용 애플리케이션, 코딩 도구 및 게임이 포함된 전체 데스크탑 환경이 있는 정식 버전으로 제공됩니다. OS가 Debian Linux의 한 버전이기 때문에, Pi 내부의 ARM 프로세서용으로 구현된 Debian에서 동작하는 모든 애플리케이션이나 도구를 설치할 수 있습니다.
### 작업
Raspberry Pi에 대해 조사하십시오.
이번 강의를 위해 Raspberry Pi를 사용중이라면, 보드의 다른 하드웨어 구성요소에 대해 읽어 보십시오.
- [Raspberry Pi hardware documentation page](https://www.raspberrypi.org/documentation/hardware/raspberrypi/) 에서 프로세서에 대한 자세한 내용을 찾을 수 있습니다. 당신이 사용중인 Pi에 사용된 프로세서에 대해 읽어보십시오.
- GPIO핀을 찾으십시오. [Raspberry Pi GPIO documentation](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md)에서 더 많은 내용을 읽어보십시오. [GPIO Pin Usage guide](https://www.raspberrypi.org/documentation/usage/gpio/README.md)를 사용하여 Pi의 다른 핀들을 확인하십시오.
### 싱글 보드 컴퓨터 프로그래밍
싱글 보드 컴퓨터는 완전한 OS 실행하는 완전한 컴퓨터입니다. 이것은 Arduino와 같은 프레임워크에서 보드 지원에 의존하는 마이크로컨트롤러와 달리 이를 코딩하는 데 사용할 수 있는 다양한 프로그래밍 언어, 프레임워크 및 도구가 있음을 의미합니다. 대부분의 프로그래밍 언어는 센서와 액추에이터와 데이터를 송수신 하기 위해 GPIO에 접근할 수 있는 라이브러리들을 가지고 있습니다.
✅ 당신이 친숙한 프로그래밍 언어는 무엇인가요? Linux에서 지원되나요?
Raspberry Pi에서 IoT 애플리케이션을 구축하기 위한 가장 일반적인 프로그래밍 언어는 Python입니다. Pi를 위해 설계된 거대한 하드웨어 생태계가 있으며, 이것들의 대부분에는 Python 라이브러리로 사용하는 데 필요한 관련 코드가 포함되어 있습니다. 이러한 생태계 중 일부는 'hats'를 기반으로 합니다. 모자처럼 Pi 위에 앉아서 40개의 GPIO 핀에 큰 소켓을 연결하기 때문에 그렇게 부릅니다. 이 hats는 표준화된 케이블로 센서를 연결할 수 있도록 스크린, 센서, 원격 제어 자동차 또는 어댑터와 같은 추가 기능을 제공합니다.
### 전문적인 IoT 배포에서의 싱글 보드 컴퓨터의 사용
싱글 보드 컴퓨터는 단순한 개발자용 키트 뿐만 아니라, 전문적인 IoT 배포에 사용됩니다. 하드웨어를 제어하거나 머신러닝 모델을 실행하는 등 복잡한 임무를 수행하는 강력한 방법을 제공할 수 있습니다. 예를 들면, [Raspberry Pi 4 compute module](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) 는 Raspberry Pi 4 의 모든 기능을 제공하지만 대부분의 포트가 없는 작고 저렴한 폼 팩터로 사용자 지정 하드웨어에 설치되도록 설계되었습니다.
---
## 🚀 도전
지난 수업의 과제는 당신의 집, 학교, 회사에서 찾아 볼 수 있는 IoT 장치들에 대해 가능한 많이 나열하는 것이었습니다. 이 목록에 있는 모든 장치에 대해 마이크로컨트롤러나 싱글 보드 컴퓨터 또는 두 가지의 합작으로 되어있다고 생각하나요?
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## 복습 및 독학
- Arduino 플랫폼에 대한 자세한 내용은 [Arduino 시작 가이드](https://www.arduino.cc/en/Guide/Introduction)를 읽어보십시오.
- Raspberry Pi에 대해 더 배워보려면 [Raspberry Pi 4에 대한 소개](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/)를 읽어보십시오.
- [What the FAQ are CPUs, MPUs, MCUs, and GPUs article in the Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)에서 일부 개념과 약어에 대해 더 배우실 수 있습니다.
✅ 이 가이드와 [hardware guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/hardware.md)의 링크를 따라가면 나오는 비용을 고려하여 사용할 하드웨어 플랫폼을 결정하거나 가상 장치를 사용할 지 결정하십시오.
## 과제
[마이크로컨트롤러와 싱글 보드 컴퓨터를 비교하고 대조해보십시오.](assignment.ko.md)

@ -1,266 +0,0 @@
# 深入了解物联网
![本课程概述草图](../../../sketchnotes/lesson-2.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 单击图像可查看大图。
本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 是由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间使您能更深入地了解课程的各个部分并答疑解惑。
[![课程 2: 深入了解物联网](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
[![课程 2: 深入了解物联网 - 答疑解惑](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
> 🎥 点击以上图片观看视频教程
## 课前小测试
[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
## 介绍
本课程将深入探讨上一课程中介绍的一些概念。
在本课程中,我们将介绍:
* [物联网应用程序组件](#components-of-an-iot-application)
* [深入了解微控制器](#deeper-dive-into-microcontrollers)
* [深入了解单板计算机](#deeper-dive-into-single-board-computers)
## 物联网应用程序组件
物联网应用程序的两个组成部分是 *网络**物* 。现在让我们更详细地探讨这两个组件。
### 物
![树莓派 4](../../../images/raspberry-pi-4.jpg)
物联网的 **物** 部分是指可以与物理世界交互的设备。这些设备通常是小型,低价的计算机,它们使用低功耗并以低速运行 - 例如只有千字节RAM与PC中的千兆字节对比鲜明的简单微控制器仅以几百兆赫兹运行与PC中的千兆赫对比鲜明但其消耗的功率非常小它们可以仅通过电池供电就运行数周数月甚至数年。
这些设备与物理世界进行交互,通过使用传感器从周围环境收集数据,或者通过反馈输出或控制执行器改变物理世界。典型的例子是智能恒温器 - 一种具有温度传感器的设备,可通过表盘或触摸屏设置所需温度,该设备与加热或冷却系统的连接,当检测到的温度超出所需范围时进行调节。当温度传感器检测到房间太冷,就会触发执行器打开暖气。
![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../images/basic-thermostat.png)
有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如使用GPS传感器来检测您的位置并使用扬声器为您提供前往目的地的导航指令。
✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。比如烤箱上的恒温器。你能找到更多吗?
### 网络
物联网应用程序的 **网络** 由可以连接以发送和接收数据的应用,以及其它负责处理设备数据并帮助决定向执行器发送哪些请求的应用组成。
一种典型的场景是拥有物联网设备连接的云服务,此云服务可处理安全性等事项,并从物联网设备收发消息。然后,此云服务将连接到可以处理或存储传感器数据的其他应用程序,或者综合其他系统的数据一起来做出决策。
设备也并不总是通过WiFi或有线连接直连到互联网。一些设备使用蓝牙等技术通过 mesh网状网络的相互通信再通过集线器连接到互联网。
以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云端服务器。它将温度数据发送到云服务并写入数据库,房主便可使用手机应用程序查询当前和历史温度。云服务还可获取房主预设的温度,并将其发送给物联网设备,以控制供暖系统的开关。
![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如探测哪些房间正在使用的占用传感器,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
✅ 还有哪些数据可以帮助连接互联网的恒温器更智能?
### 边缘物联网
虽然物联网中的 I 代表网络,但这些设备不是必须连接到互联网。在某些情况下,设备可以连接到“边缘”设备 - 即在本地网络上运行的网关设备,这意味着你无需通过互联网进行即可处理数据。当有大量数据或网络连接速度较慢时,这可能会更快,它允许你在无法连接互联网的地方离线运行,例如在船上或在灾区应对危机时,还可保持数据的私密性。某些设备将云上创建的工具代码下发至本地运行以收集和响应数据,而无需使用互联网传输到云端再做出决策。
这方面的一个例子是智能家居设备,如 Apple HomePodAmazon Alexa 或 Google Home它们将在云上训练 AI 辨别你的声音,但在设备本地运行训练好的程序。当你说出某个单词或短语时,这些设备将被“唤醒”,然后通过互联网发送语音进行处理。设备将在适当的时间点停止发送语音,例如当它检测到语音暂停时。你在使用唤醒词唤醒设备之前说的内容,和在设备停止监听后说的内容都不会通过互联网发送给设备提供商,因此这些数据是私密的。
✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。提示 - 考虑带有摄像头或其他成像设备的物联网设备。
### 物联网安全
对于任何互联网连接安全性都是一个重要的考虑因素。有一个古老的笑话“物联网中的S代表安全” - 当然物联网中没有“S”这意味着它并不安全。
物联网设备会连接到云服务,因此安全性与该云服务一致 - 如果你的云服务允许任意设备连接,那么有可能收到恶意数据或者被病毒攻击。当物联网设备交互和控制其他设备时,则会产生非常严重的后果。例如,震网病毒通过操纵离心机中的阀门来实施破坏。黑客还会攻击婴儿监视器或其他家庭监控等安全防护薄弱的设备。
> 💁 有时物联网设备和边缘设备会运行在物理隔离网络上,以保持数据的私密性和安全性。这称为 [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking))。
## 深入了解微控制器
在上一课中,我们介绍了微控制器。现在让我们更深入地介绍它们。
### CPU
CPU 是微控制器的“大脑”。它是运行代码的处理器可以向任何连接的设备收发数据。CPU 可以包含一个或多个内核 - 实质上是一个或多个 CPU 可以协同工作运行代码。
CPU 依靠时钟每秒滴答数百万或数十亿次。每个时钟周期都会同步 CPU 可以执行的操作。每次时钟滴答时CPU 都可以执行来自程序的指令,例如从外部设备检索数据或执行数学计算。此常规循环会在处理下一条指令之前完成所有操作。
时钟周期越快每秒可以处理的指令就越多CPU 的速度就越快。 CPU 速度以赫兹 [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) 为单位, 这是一个标准单位,其中 1 Hz 表示每秒一个时钟周期。
> 🎓 CPU速度通常以MHz或GHz为单位1MHz是100万Hz1GHz是10亿Hz。
> 💁 CPU 使用 [获取-解码-执行周期](https://wikipedia.org/wiki/Instruction_cycle) 执行程序。 对于每个时钟滴答CPU 将从内存中获取下一条指令,对其进行解码,然后执行它,例如使用算术逻辑单元 ALU 将 2 个数字相加。某些执行需要多次滴答才能运行,因此下一个周期将在指令完成后的下一个时钟滴答运行。
![该取码解码执行周期图显示了从存储在RAM中的程序中获取指令然后在CPU上解码执行](../../../images/fetch-decode-execute.png)
微控制器的时钟速度比台式机或笔记本甚至大多数智能手机低得多。例如Wio 终端的 CPU 以120MHz或每秒 120000000个周期运行。
✅ 普通的 PC 或 Mac 的 CPU 具有多个内核,以多千兆赫兹运行,这意味着时钟每秒滴答数十亿次。研究计算机的时钟速度,并比较它比 Wio 终端快多少倍。
每个时钟周期都会消耗功率并产生热量。滴答声越快消耗的功率和产生的热量就越多。PC 具有散热器和风扇来散热否则它们会在几秒钟内因过热而关闭。微控制器通常两者都没有因为运行温度低得多因此速度也慢得多。PC 使用主电源或大电池运行几个小时,微控制器可以使用小型电池运行数天,数月甚至数年。微控制器还能以不同速率运行内核,当对 CPU 的需求较低时,将切换到较慢的低功耗模式。
> 💁 一些 PC 和 Mac 采用相同的快速高功率和较慢低功耗模式组合以节省电量。例如,最新的 Apple 笔记本电脑中的 M1 芯片可以在4个性能核心和4个效率核心之间切换以根据正在运行的任务优化电池寿命或速度。
✅ 做点研究:阅读[维基百科上的CPU文章](https://wikipedia.org/wiki/Central_processing_unit)
#### 任务
查阅 Wio 终端资料。
如果你使用 Wio 终端实现此课程开发,可尝试寻找其 CPU 位置。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *硬件概述* 部分以获取内部结构的图片,并尝试通过背面的透明塑料窗口找到 CPU。
### 内存
微控制器通常有两种类型的存储器 - 程序存储器和随机存取存储器RAM
程序存储器具有非易失性,这意味着当设备断电时,写入它的内容都会被保留。这是存储程序代码的内存。
RAM 随机存取存储器是程序用于运行时的内存包含程序分配的变量和从外围设备收集的数据。RAM 具有易失性,当断电时内容会丢失,状态会被重置。
> 🎓 程序存储器存储你的代码,并在断电时保留。
> 🎓 RAM 用于运行程序,并在断电时重置。
与 CPU 一样,微控制器上的内存比 PC 或 Mac 小几个数量级。一台典型的电脑可能有 8 千兆字节 GB 的 RAM即 8000000000 字节,每个字节的空间足以存储一个字母或 0-255 之间的数字。微控制器只有千字节 KB 的 RAM千字节为 1000 字节。上面提到的 Wio 终端只具有 192KB 的 RAM即192000字节 - 比普通 PC 少40000倍以上
下图显示了 192KB 和 8GB 之间的相对大小差异 - 中间的点表示 192KB。
![192KB和8GB之间的比较-差距超过40000倍](../../../images/ram-comparison.png)
程序存储也比 PC 小。典型的 PC 可能具有用于程序存储的500GB硬盘驱动器而微控制器可能只有千字节或几兆字节MB的存储空间1MB是1000KB或1000000字节。Wio 终端有4MB的程序存储空间。
✅ 做点研究:你的计算机有多少 RAM 和存储空间?与微控制器相比如何?
### 输入/输出
微控制器需要输入和输出I/O连接从传感器读取数据并将控制信号发送到执行器。它们通常包含多个通用输入/输出 GPIO 引脚。这些引脚可以在软件中配置为输入(即接收信号)或输出(发送信号)。
🧠⬅️ 输入引脚用于读取传感器值
🧠➡️ 输出引脚向执行器发送指令
✅ 你将在后续课程中了解此内容的更多信息。
#### 任务
查阅 Wio 终端资料。
如果你使用 Wio 终端实现此课程开发可尝试寻找其GPIO引脚。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *引脚排列图* 部分了解引脚用途。Wio 终端带有一个贴纸,你可以将引脚号贴在背面,如果没有,请立即添加。
### 物理尺寸
微控制器通常尺寸较小,[Freescale Kinetis KL03 MCU 可以藏入高尔夫球中](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)。PC 中仅CPU就有 40毫米 x 40毫米这还不包括散热所需的散热器和风扇这比完整的微控制器尺寸大得多。带有微控制器、外壳、屏幕以及一系列连接和组件的 Wio 终端开发套件并不比裸露的英特尔 i9 CPU 大多少,更比带有散热器和风扇的 CPU 小得多!
| 设备 | 尺寸 |
| ------------------------------- | -------------------------- |
| Freescale Kinetis KL03 | 1.6 毫米 x 2 毫米 x 1 毫米 |
| Wio 终端 | 72 毫米 x 57 毫米 x 12 毫米 |
| Intel i9 CPU, 散热器和风扇 | 136毫米 x 145毫米 x 103毫米 |
### 架构和操作系统
由于其低速度和内存限制微控制器不能运行桌面意义上的操作系统OS。PC 运行的操作系统WindowsLinux或macOS需要大量的内存和处理能力来运行微控制器完全不需要的任务。请记住微控制器通常被编程来完成一个或多个特定任务这与 PC 或 Mac 等通用计算机不同,后者需要支持用户界面、播放音乐或电影、提供编写文档或代码的工具、玩游戏或浏览互联网。
在没有操作系统的情况下对微控制器进行编程,确实需要一些工具,这些工具通过 API 来与外设通信,以达到构建代码的目的。每个微控制器都是不同的,因此制造商通常需支持标准架构,这些架构遵循标准“配方”来构建代码,并实现在支持该架构的任何微控制器上运行。
你可以使用操作系统(通常称为实时操作系统 RTOS )对微控制器进行编程,因为它们旨在实时处理与外设间的数据收发。这些操作系统是轻量级的,可提供以下功能:
* 多线程,允许你的代码同时运行多个代码块,无论是在多个内核上还是在一个内核上轮流执行
* 允许通过互联网地进行安全通信
* 图形用户界面 GUI 组件,用于在具有屏幕的设备上构建用户界面 UI
✅ 了解一些不同的RTOS: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
#### Arduino
![Arduino 的 logo](../../../images/arduino-logo.svg)
[Arduino](https://www.arduino.cc) 可能是最受欢迎的微控制器框架尤其是在学生业余爱好者和创客中。Arduino 是一个结合软件和硬件的开源电子平台。您可以从 Arduino 官方或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行开发。
Arduino 开发板使用 C 或 C++ 编码。使用 C/C++ 可以编译教小的代码且运行速度快这是在资源受限设备如微控制器上所需要的。Arduino 应用程序的核归纳为两个功能模块 - `setup``loop`当开发板启动时Arduino 框架代码将运行 `setup` 功能模块,然后循环运行 `loop` 直到断电。
你可以将启动代码写在 `setup` 函数中,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,将处理代码写入 `loop` 循环,例如从传感器读取数据并发送到云。通常会在每次循环中包含一个延迟,例如,如果只希望传感器数据每 10 秒发送一次,则可以在环路结束时添加 10 秒的延迟以便微控制器休眠节省功耗10 秒后再次循环。
![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../images/arduino-sketch.png)
✅ 此程序体系结构称为 *事件循环**消息循环*。许多应用程序在后台使用该结构,该结构也是 WindowsmacOS 或 Linux 等操作系统上大多数桌面应用的标准。监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其进行响应。可以在[这篇文章](https://wikipedia.org/wiki/Event_loop)中阅读有关事件循环的更多信息。
Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不同的微控制器上有不同的实现。例如,延迟函数将暂停程序一段时间,[`digitalRead` 函数](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/)将从给定引脚读取数据,而无论代码在哪个板上运行。这些标准库意味着在一个 Arduino 开发板编写的代码可以在其他 Arduino 开发板上重新编译运行,只要引脚正确且开发板支持相同功能。
有一个庞大的第三方 Arduino 库生态系统,可为 Arduino 项目添加额外的功能,例如使用传感器和执行器或连接到云物联网服务。
##### 任务
查阅 Wio 终端资料。
如果使用 Wio 终端进行课程开发,请重新阅读你在上一课程中编写的代码。找到 `setup``loop` 函数,观察重复调用循环函数的串口输出。尝试向 `setup` 函数添加代码在串口输出,并观察是否每次重启时会重新执行一次此代码。使用侧面的电源开关重启设备,并观察此代码是否在每次重启时调用。
## 深入了解单板计算机
在上一课程中,我们介绍了单板计算机。现在让我们更深入地研究它们。
### 树莓派
![树莓派 logo](../../../images/raspberry-pi-logo.png)
树莓派基金会是来自英国的慈善机构成立于2009年旨在促进计算机科学研究特别是学校层面。作为这项任务的一部分他们开发了一种单板计算机称为Raspberry Pi (树莓派)。树莓派目前有 3 种版本 - 全尺寸版本、尺寸较小的树莓派 Zero 和可以内置到物联网终端设备中的计算模块。
![树莓派 4](../../../images/raspberry-pi-4.jpg)
截至目前全尺寸树莓派最新版本是树莓派 4B。它有一个四核4 核CPU运行在 1.5GHz、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口2 个 USB 2.0、2 个 USB 3.0、40 个 GPIO 引脚、一个用于树莓派相机模块的相机连接器和一个 SD 卡插槽。所有这些都在一块 88毫米 x 58毫米 x 19.5毫米 的开发板上,由 3A USB-C 电源供电。起价为35美元比 PC 或 Mac 便宜得多。
> 💁 还有一个 Pi 400 一体机,键盘内置 Pi 4。
![树莓派 Zero](../../../images/raspberry-pi-zero.jpg)
树莓派 Zero要小得多功耗更低。它具有单核1GHz CPU512MB内存WiFi在Zero W型号中单个HDMI端口微型USB端口40个GPIO引脚树莓派相机模块的相机连接器和SD卡插槽。它的尺寸为 65毫米 x 30毫米 x 5毫米功耗极低。Zero是5美元WiFi版本是10美元。
> 🎓 这两种开发板中的 CPU 都是 ARM 架构,而不是大多数 PC 和 Mac 中的 Intel / AMD x86 或 x64 架构。这类似于某些微控制器以及几乎所有手机微软Surface X 和 基于Apple Silicon 的新 Apple Mac 中的 CPU。
树莓派的所有版本都可运行一个名为树莓派 OS 的 Debian Linux 分支系统。这是没有桌面的精简版非常适合不需要屏幕的“无头”项目也可运行具有完整桌面环境的版本其带有Web浏览器办公应用程序编码工具和游戏。由于该操作系统基于 Debian Linux你可以安装任何 ARM 架构下 Debian 的应用程序或工具。
#### 任务
查询树莓派相关资料。
如果你在此课程中使用树莓派作开发,请研究开发板上的不同硬件组件。
* 可以在[树莓派硬件文档页面](https://www.raspberrypi.org/documentation/hardware/raspberrypi/)上找到有关所用处理器的详细信息。查阅你正在使用的树莓派中的处理器信息。
* 找到 GPIO 引脚。使用[树莓派 GPIO文档](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md)中阅读有关的更多信息。使用[GPIO 引脚使用指南](https://www.raspberrypi.org/documentation/usage/gpio/README.md)来识别树莓派上的不同引脚。
### 单板计算机开发
单板计算机是运行完整操作系统的完整计算机。这意味着你可以使用多种编程语言、框架和工具来编写程序,这与 Arduino 一类的微控制器需要开发板架构支持不同。大多数编程语言都有可以访问 GPIO 引脚以收发来自传感器和执行器的数据。
✅ 你熟悉哪些编程语言?在 Linux 上受支持吗?
在树莓派上编写物联网应用程序的最常用语言是Python。在一个专为树莓派设计的庞大硬件生态中几乎所有硬件包括相关代码都会使用Python库。其中一些生态系统基于“帽子”扩展 - 之所以这样称呼是因为它们像帽子一样扩展在树莓派的顶部并通过一个大插座连接到40个GPIO引脚。“帽子”提供额外的功能如屏幕、传感器、遥控汽车或适配器通过其使用标准化接口扩展传感器。
### 在专业物联网部署中使用单板计算机
单板计算机用于专业的物联网部署而不仅仅是作为开发人员套件。它们提供一种有效的方法来控制硬件和运行复杂的任务比如运行机器学习模型。举个例子有一个树莓派4计算模块它可提供树莓派4的所有功能但外形紧凑且更便宜没有大多数端口旨在安装到定制硬件中。
---
## 🚀 挑战
上一课的挑战是列出尽可能多的物联网设备,这些设备位于你的家庭、学校或工作场所。对于此列表中的每个设备,你认为它们是围绕微控制器或单板计算机构建的,还是两者的混合?
## 课后小测试
[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
## 复习与自学
* 阅读 [Arduino 入门指南](https://www.arduino.cc/en/Guide/Introduction) 了解有关 Arduino 平台的更多信息。
* 阅读 [树莓派 4 介绍](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 了解更多关于树莓派的信息。
* 一些概念和首字母缩略词的信息可参阅《电气工程杂志》中[CPU、MPU、MCU 和 GPU 常见问题解答](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)一文。
✅ 使用本文和 [硬件指南](../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
## 作业
[比较与对比微控制器和单板计算机](assignment.zh-cn.md)

@ -1,16 +0,0 @@
<div dir="rtl">
# قارن بين المتحكمات الدقيقة وأجهزة الكمبيوتر أحادية اللوحة
## التعليمات
غطى هذا الدرس المتحكمات الدقيقة وأجهزة الكمبيوتر أحادية اللوحة. قم بإنشاء جدول لمقارنتها ، ولاحظ على الأقل سببين لاستخدام متحكم دقيق على جهاز كمبيوتر ذي لوحة واحدة ، وسببين على الأقل لاستخدام جهاز كمبيوتر من لوحة واحدة بدلاً من متحكم دقيق.
## نماذج
| معايير | نموذجي | مناسب | يحتاج الى تحسين |
| -------- | --------- | -------- | ----------------- |
| قم بإنشاء جدول يقارن المتحكمات الدقيقة بأجهزة الكمبيوتر أحادية اللوحة | إنشاء قائمة بالعناصر المتعددة للمقارنة والتباين بشكل صحيح | تم إنشاء قائمة تحتوي على عنصرين فقط | كان قادرًا على الخروج بعنصر واحد فقط ، أو لا توجد عناصر للمقارنة والتباين |
| أسباب استخدام أحدهما على الآخر | كان قادرًا على تقديم سببين أو أكثر لاجهزة التحكم الدقيق ، وسببين أو أكثر لأجهزة الكمبيوتر ذات اللوحة الواحدة | كان قادرًا فقط على تقديم 1-2 سبب لمتحكم دقيق ، وسببين أو اكثر لجهاز كمبيوتر لوحة واحدة | لم يكن قادرًا على تقديم سبب واحد أو أكثر لمتحكم دقيق أو لجهاز كمبيوتر أحادي اللوحة |
<div>

@ -1,13 +0,0 @@
# মাইক্রোকন্ট্রোলার এবং সিংগেল-বোর্ড কম্পিউটারের তুলনা করে পার্থক্য দাঁড় করানো
## নির্দেশনা
এই পাঠটিতে মাইক্রোকন্ট্রোলার এবং সিংগেল-বোর্ড কম্পিউটার নিয়ে আলোচনা হয়েছে । তাদের তুলনা করে এবং বিপরী্ত্য সম্বলিত একটি সারণী তৈরি করে কমপক্ষে ২টি কারণ লিখতে হবে যে কেন একটি সিংগেল-বোর্ড কম্পিউটারের পরিবর্তে মাইক্রোকন্ট্রোলার ব্যবহার করা উচিত। একইভাবে কমপক্ষে ২টি কারণ লিখতে হবে যে কেন একট মাইক্রোকন্ট্রোলারের পবিবর্তে সিংগেল-বোর্ড কম্পিউটার ব্যবহার করা উচিত।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা (সর্বোত্তম) | পর্যাপ্ত ব্যখ্যা (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) |
| -------- | ---------------------- | ------------------- | ------------------------- |
| একক-বোর্ড কম্পিউটারের সাথে মাইক্রোকন্ট্রোলার এর তুলনা করে একটি সারণী তৈরি করা | একাধিক আইটেম সঠিকভাবে তুলনা এবং বৈপরীত্যসহ একটি তালিকা তৈরি করেছে | কেবল অল্প কয়েকটি বিষয় নিয়ে একটি তালিকা তৈরি করেছে | শুধুমাত্র একটি বা শুণ্যটি তুলনা এবং বৈপরীত্যসহ তালিকা তৈরি করেছে |
| একটির পরিবর্তে অন্যটি ব্যবিহারের কারণ | ২ বা ততোধিক কারণ প্রদর্শন করেছে | ১ বা ২টি কারণ প্রদর্শন করেছে | ১ বা ততোধিক কারণ প্রদর্শন করতে পারেনি |

@ -1,12 +0,0 @@
# Comparer et opposer les microcontrôleurs et les ordinateurs monocarte
## Instructions
Cette leçon a porté sur les microcontrôleurs et les ordinateurs monocartes. Créez un tableau les comparant et les opposant, et notez au moins 2 raisons pour lesquelles vous utiliseriez un microcontrôleur plutôt qu'un ordinateur monocarte, et au moins 2 raisons pour lesquelles vous utiliseriez un ordinateur monocarte plutôt qu'un microcontrôleur.
## Rubrique
| Critères | Exemplaire | Adéquat | Besoin d'amélioration |
| -------- | --------- | -------- | ----------------- |
| Créer un tableau comparant les microcontrôleurs aux ordinateurs monocartes | Créer une liste avec plusieurs éléments en les comparant et en les contrastant correctement | Création d'une liste ne comportant que quelques éléments | N'avoir pu trouver qu'un seul élément ou aucun élément de comparaison et de contraste |
| Raisons d'utiliser l'un plutôt que l'autre | Avoir été capable de fournir 2 raisons ou plus pour les microcontrôleurs, et 2 ou plus pour les ordinateurs monocartes | N'avoir pu donner que 1 ou 2 raisons pour un microcontrôleur et 1 ou 2 raisons pour un ordinateur monocarte | N'avoir pas pu donner qu'une ou plusieurs raisons pour un microcontrôleur ou un ordinateur monocarte |

@ -1,12 +0,0 @@
# माइक्रोकंट्रोलर और सिंगल-बोर्ड कंप्यूटर की तुलना और अंतर करें
## निर्देश
इस पाठ में माइक्रोकंट्रोलर और सिंगल-बोर्ड कंप्यूटर शामिल थे। उनकी तुलना और तुलना करने के लिए एक तालिका बनाएं, और कम से कम 2 कारणों पर ध्यान दें कि आप सिंगल-बोर्ड कंप्यूटर पर माइक्रोकंट्रोलर का उपयोग क्यों करेंगे, और कम से कम 2 कारणों से आप माइक्रोकंट्रोलर पर सिंगल-बोर्ड कंप्यूटर का उपयोग क्यों करेंगे।
## रूब्रिक
| मानदंड | अनुकरणीय | पर्याप्त | सुधार की जरूरत |
| -------- | ------------- | -------- | ----------------- |
| माइक्रोकंट्रोलर की तुलना सिंगल-बोर्ड कंप्यूटर से करने के लिए एक टेबल बनाएं | कई मदों की सही तुलना और विषमता के साथ एक सूची बनाई | केवल कुछ वस्तुओं के साथ एक सूची बनाई | केवल एक आइटम के साथ आने में सक्षम था, या तुलना और इसके विपरीत करने के लिए कोई आइटम नहीं था |
| एक के ऊपर एक प्रयोग करने के कारण | माइक्रोकंट्रोलर के लिए 2 या अधिक कारण और सिंगल-बोर्ड कंप्यूटर के लिए 2 या अधिक कारण प्रदान करने में सक्षम था | माइक्रोकंट्रोलर के लिए केवल 1-2 कारण और सिंगल-बोर्ड कंप्यूटर के लिए 1-2 कारण प्रदान करने में सक्षम था | माइक्रोकंट्रोलर या सिंगल-बोर्ड कंप्यूटर के लिए 1 या अधिक कारण प्रदान करने में असमर्थ था |

@ -1,12 +0,0 @@
# 마이크로컨트롤러와 싱글 보드 컴퓨터의 비교 및 대조
## 지침
이 강의에서 마이크로컨트롤러와 싱글 보드 컴퓨터에 대해 다뤘습니다. 두 가지를 비교하고 대조하는 표를 만들고, 싱글 보드 컴퓨터보다 마이크로컨트롤러를 사용하는 이유와 마이크로컨트롤러보다 싱글 보드 컴퓨터를 사용하는 이유를 각각 최소 2개씩 작성하십시오.
## 평가 기준
| 기준 | 모범 답안 | 적절함 | 개선이 필요함 |
| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| 마이크로 컨트롤러와 싱글 보드 컴퓨터를 비교하는 표 만들기 | 여러 항목을 올바르게 비교하고 대조하는 목록을 만듦 | 몇 개의 항목만 있는 목록을 생성 | 하나의 항목만 생각해 낼 수 있거나 비교 및 ​​대조할 항목이 없음 |
| 다른 것보다 하나를 사용하는 이유 | 마이크로컨트롤러에 대해 2개 이상의 이유를 제공하고 싱글 보드 컴퓨터에 대해 2개 이상을 제공할 수 있음 | 마이크로컨트롤러에 대한 이유는 1-2개, 싱글 보드 컴퓨터에 대한 이유는 1-2개만 제공할 수 있음 | 마이크로컨트롤러 또는 싱글 보드 컴퓨터에 대해 하나 이상의 이유를 제공할 수 없음 |

@ -1,12 +0,0 @@
# 比较与对比微控制器和单板计算机
## 指示
这个课程涵盖了微控制器和单板计算机。创建一个表格来比较与对比它们,并记下至少两个微控制器和单板计算机相比之下选择微控制器的原因,还有至少两个微控制器和单板计算机相比之下选择单板计算机的原因。
## 评分表
| 标准 | 优秀 | 一般 | 需改进 |
| -------- | --------- | -------- | ----------------- |
| 创建一个表格来比较微控制器和单板计算机 | 创建一个有多项的列表来正确地比较和对比它们 | 创建一个只有几项的列表 | 只能想出一项,或一项也没有来比较和对比它们 |
| 两个相比之下选择某一个的原因 | 能够为微控制器提出至少两个原因,而且为单板计算机提出至少两个原因 | 只能为微控制器提出一两个原因,而且为单板计算机提出一两个原因 | 无法为微控制器或单板计算机提出至少一个原因 |

@ -1,211 +0,0 @@
# <div dir="rtl">تفاعل مع العالم المادي باستخدام المستشعرات والمحركات</div>
## <div dir="rtl"> اختبار ما قبل المحاضرة </div>
[<div dir="rtl"> اختبار ما قبل المحاضرة </div>](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
## <div dir="rtl"> المقدمة </div>
<div dir="rtl">
يقدم هذا الدرس اثنين من المفاهيم الهامة لجهاز إنترنت الأشياء الخاص بك - أجهزة الاستشعار والمشغلات. ستحصل أيضًا على تدريب عملي مع كليهما ، بإضافة مستشعر الضوء إلى مشروع إنترنت الأشياء الخاص بك ، ثم إضافة مؤشر LED يتم التحكم فيه بواسطة مستويات الإضاءة ، مما يؤدي إلى بناء ضوء ليلي بشكل فعال.
</br>
سنغطي في هذا الدرس:
* [ما هي المستشعرات؟](#what-are-sensors)
* [استخدم جهاز استشعار](#use-a-sensor)
* [أنواع أجهزة الاستشعار](#sensor-types)
* [ما هي المحركات؟](#what-are-actuators)
* [استخدم مشغل](#use-an-actuator)
* [أنواع المحركات](#actuator-types)
## ما هي المستشعرات؟
أجهزة الاستشعار هي أجهزة تستشعر العالم المادي - أي أنها تقيس خاصية واحدة أو أكثر من حولها وترسل المعلومات إلى جهاز إنترنت الأشياء. تغطي المستشعرات مجموعة كبيرة من الأجهزة حيث يوجد الكثير من الأشياء التي يمكن قياسها ، من الخصائص الطبيعية مثل درجة حرارة الهواء إلى التفاعلات الفيزيائية مثل الحركة.
تتضمن بعض المستشعرات الشائعة ما يلي:
* مستشعرات درجة الحرارة - تستشعر درجة حرارة الهواء أو درجة حرارة ما يتم غمرها فيه. بالنسبة للهواة والمطورين ، غالبًا ما يتم دمجها مع ضغط الهواء والرطوبة في مستشعر واحد.
* الأزرار - تشعر بها عند الضغط عليها.
* مستشعرات الضوء - تكتشف مستويات الضوء ويمكن أن تكون لألوان معينة أو ضوء الأشعة فوق البنفسجية أو ضوء الأشعة تحت الحمراء أو الضوء المرئي العام.
* الكاميرات - تستشعر التمثيل المرئي للعالم من خلال التقاط صورة أو دفق الفيديو.
* مقاييس التسارع - تستشعر هذه الحركة في اتجاهات متعددة.
* الميكروفونات - تستشعر الأصوات ، سواء كانت مستويات صوت عامة أو صوت اتجاهي.
✅ قم ببعض البحث. ما المستشعرات الموجودة بهاتفك؟
تشترك جميع المستشعرات في شيء واحد - فهي تحول كل ما تشعر به إلى إشارة كهربائية يمكن تفسيرها بواسطة جهاز إنترنت الأشياء. تعتمد كيفية تفسير هذه الإشارة الكهربائية على المستشعر ، بالإضافة إلى بروتوكول الاتصال المستخدم للتواصل مع جهاز إنترنت الأشياء.
## استخدم جهاز استشعار
اتبع الدليل ذي الصلة أدناه لإضافة مستشعر إلى جهاز إنترنت الأشياء الخاص بك:
* [Arduino - Wio Terminal](wio-terminal-sensor.md)
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi](pi-sensor.md)
* [كمبيوتر ذو لوحة واحدة - جهاز افتراضي](virtual-device-sensor.md)
## أنواع أجهزة الاستشعار
المستشعرات إما قياسية أو رقمية.
### المستعرات القياسية
بعض المستشعرات الأساسية هي أجهزة استشعار تمثيلية. تتلقى هذه المستشعرات فولت من جهاز إنترنت الأشياء ، وتقوم مكونات المستشعر بضبط هذا الفولت ، ويتم قياس الفولت الذي يتم إرجاعه من المستشعر لإعطاء قيمة المستشعر.
> 🎓 الفولت هو مقياس لمقدار الدفع لنقل الكهرباء من مكان إلى آخر ، مثل من طرف موجب للبطارية إلى الطرف السالب. على سبيل المثال ، بطارية AA القياسية هي 1.5 فولت (V هو رمز فولت) ويمكنها دفع الكهرباء بقوة 1.5 فولت من طرفها الموجب إلى الطرف السالب. تتطلب الأجهزة الكهربائية المختلفة فولتًا مختلفًا للعمل ، على سبيل المثال ، يمكن لمصباح LED أن يضيء بفولت يتراوح بين 2-3 فولت ، لكن المصباح الخيطي 100 وات يحتاج إلى 240 فولت. يمكنك قراءة المزيد عن الفولت على <a href="https://wikipedia.org/wiki/Voltage">صفحة الفولت على ويكيبيديا</a>
أحد الأمثلة على ذلك هو مقياس الفولت. هذا قرص يمكنك تدويره بين موضعين ويقيس المستشعر الدوران.
![A potentiometer set to a mid point being sent 5 volts returning 3.8 volts](../../../../images/potentiometer.png)
سيرسل جهاز إنترنت الأشياء إشارة كهربائية إلى مقياس الفولت ، مثل 5 فولت . عندما يتم ضبط مقياس الفولت فإنه يغير الفولت الذي يخرج من الجانب الآخر. تخيل أن لديك مقياس فولت مُصنَّف على أنه قرص يمتد من 0 إلى <a href="https://wikipedia.org/wiki/Up_to_eleven">11</a> ، مثل مقبض الصوت في مكبر الصوت. عندما يكون مقياس الفولت في وضع إيقاف التشغيل الكامل (0) ، فسيخرج 0 فولت (0 فولت). عندما يكون في وضع التشغيل الكامل (11) ، سيخرج 5 فولت (5 فولت).
> 🎓 هذا تبسيط مفرط ، ويمكنك قراءة المزيد عن مقاييس الفولت والمقاومات المتغيرة على <a href="https://wikipedia.org/wiki/Potentiometer">potentiometer Wikipedia page</a>
يتم بعد ذلك قراءة الفولت الذي يخرج من المستشعر بواسطة جهاز إنترنت الأشياء ، ويمكن للجهاز الاستجابة له. اعتمادًا على المستشعر ، يمكن أن يكون هذا الفولت قيمة عشوائية أو يمكن تعيينه إلى وحدة قياسية. على سبيل المثال ، يقوم مستشعر درجة الحرارة التناظرية المستند إلى <a href="https://wikipedia.org/wiki/Thermistor">thermistor</a> بتغيير مقاومته اعتمادًا على درجة الحرارة. يمكن بعد ذلك تحويل فولت الخرج إلى درجة حرارة بوحدة كلفن ، وبالتالي إلى درجة مئوية أو درجة فهرنهايت ، عن طريق الحسابات في الكود.
✅ ما الذي يحدث برأيك إذا قام المستشعر بإرجاع فولت أعلى مما تم إرساله (على سبيل المثال قادم من مصدر طاقة خارجي)؟ ⛔️ لا تختبر ذلك.
#### التحويل القياسي إلى الرقمي
أجهزة إنترنت الأشياء رقمية - لا يمكنها العمل مع القيم التناظرية ، فهي تعمل فقط مع 0 و 1. هذا يعني أنه يجب تحويل قيم المستشعرات التناظرية إلى إشارة رقمية قبل معالجتها. تحتوي العديد من أجهزة إنترنت الأشياء على محولات من التناظرية إلى الرقمية (ADC) لتحويل المدخلات التناظرية إلى تمثيلات رقمية لقيمتها. يمكن أن تعمل المستشعرات أيضًا مع ADC عبر لوحة موصل. على سبيل المثال ، في نظام Seeed Grove البيئي مع Raspberry Pi ، تتصل المستشعرات التناظرية بمنافذ محددة على "قبعة" مثبتة على Pi متصلة بدبابيس GPIO الخاصة بـ Pi ، وتحتوي هذه القبعة على ADC لتحويل الجهد إلى إشارة رقمية التي يمكن إرسالها من دبابيس GPIO الخاصة بـ Pi.
تخيل أن لديك مستشعر ضوء تناظري متصل بجهاز إنترنت الأشياء يستخدم 3.3 فولت ويعيد قيمة 1 فولت. لا يعني هذا 1V أي شيء في العالم الرقمي ، لذلك يجب تحويله. سيتم تحويل الجهد إلى قيمة تمثيلية باستخدام مقياس يعتمد على الجهاز والمستشعر. أحد الأمثلة على ذلك هو مستشعر الضوء Seeed Grove الذي ينتج قيمًا من 0 إلى 1023. بالنسبة لهذا المستشعر الذي يعمل عند 3.3 فولت ، سيكون خرج 1 فولت بقيمة 300. لا يمكن لجهاز إنترنت الأشياء التعامل مع 300 كقيمة تناظرية ، لذلك سيتم تحويل القيمة إلى "0000000100101100" ، التمثيل الثنائي 300 بواسطة Grove قبعة. ثم تتم معالجة ذلك بواسطة جهاز إنترنت الأشياء.
✅ إذا كنت لا تعرف النظام الثنائي ، فقم بإجراء قدر صغير من البحث لمعرفة كيفية تمثيل الأرقام بالأصفار والآحاد. تعتبر <a href="https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1">مقدمة BBC Bitesize للدرس الثنائي</a> مكانًا رائعًا للبدء.
من منظور الترميز ، يتم التعامل مع كل هذا عادةً بواسطة المكتبات التي تأتي مع أجهزة الاستشعار ، لذلك لا داعي للقلق بشأن هذا التحويل بنفسك. بالنسبة لمستشعر الضوء Grove ، يمكنك استخدام مكتبة Python واستدعاء خاصية "light" ، أو استخدام مكتبة Arduino واستدعاء "analogRead" للحصول على قيمة 300.
### المستشعرات الرقمية
تكتشف المستشعرات الرقمية ، مثل المستشعرات التناظرية ، العالم من حولها باستخدام التغيرات في الجهد الكهربائي. الفرق هو أنهم يخرجون إشارة رقمية ، إما عن طريق قياس حالتين فقط أو باستخدام ADC مدمج. أصبحت المستشعرات الرقمية أكثر شيوعًا لتجنب الحاجة إلى استخدام ADC إما في لوحة الموصل أو على جهاز إنترنت الأشياء نفسه.
أبسط مستشعر رقمي هو زر أو مفتاح. هذا جهاز استشعار بحالتين ، يعمل أو لا يعمل.
![A button is sent 5 volts. When not pressed it returns 0 volts, when pressed it returns 5 volts](../../../../images/button.png)
يمكن أن تقيس الدبابيس الموجودة على أجهزة إنترنت الأشياء مثل دبابيس GPIO هذه الإشارة مباشرة على أنها 0 أو 1. إذا كان الجهد المرسل هو نفس الجهد الذي تم إرجاعه ، فإن القيمة المقروءة هي 1 ، وإلا فإن القيمة المقروءة هي 0. ليست هناك حاجة للتحويل الإشارة ، يمكن أن تكون 1 أو 0 فقط.
> 💁 الفولتية لا تكون دقيقة أبدًا خاصة وأن المكونات الموجودة في المستشعر سيكون لها بعض المقاومة ، لذلك عادة ما يكون هناك تفاوت. على سبيل المثال ، تعمل دبابيس GPIO على Raspberry Pi على 3.3 فولت ، وتقرأ إشارة عودة أعلى من 1.8 فولت على أنها 1 ، وأقل من 1.8 فولت مثل 0.
* 3.3 فولت يذهب إلى الزر. الزر مغلق حتى يخرج 0 فولت ، مما يعطي القيمة 0
* 3.3 فولت يذهب إلى الزر. الزر في وضع التشغيل بحيث يخرج 3.3 فولت ، مما يعطي القيمة 1
تقوم المستشعرات الرقمية الأكثر تقدمًا بقراءة القيم التناظرية ، ثم تحويلها باستخدام ADC المدمجة إلى إشارات رقمية. على سبيل المثال ، سيظل مستشعر درجة الحرارة الرقمي يستخدم مزدوجًا حراريًا بنفس طريقة المستشعر التناظري ، وسيظل يقيس التغير في الجهد الناتج عن مقاومة المزدوجة الحرارية عند درجة الحرارة الحالية. بدلاً من إرجاع القيمة التناظرية والاعتماد على الجهاز أو لوحة الموصل للتحويل إلى إشارة رقمية ، ستقوم وحدة ADC المدمجة في المستشعر بتحويل القيمة وإرسالها كسلسلة من 0 و 1 إلى جهاز إنترنت الأشياء. يتم إرسال هذه القيم من 0 و 1 بنفس طريقة إرسال الإشارة الرقمية للزر حيث يمثل 1 جهدًا كاملاً و 0 يمثل 0 فولت.
![A digital temperature sensor converting an analog reading to binary data with 0 as 0 volts and 1 as 5 volts before sending it to an IoT device](../../../../images/temperature-as-digital.png)
يتيح إرسال البيانات الرقمية لأجهزة الاستشعار أن تصبح أكثر تعقيدًا وإرسال بيانات أكثر تفصيلاً ، حتى البيانات المشفرة لأجهزة الاستشعار الآمنة. مثال واحد هو الكاميرا. هذا مستشعر يلتقط صورة ويرسلها كبيانات رقمية تحتوي على تلك الصورة ، عادة بتنسيق مضغوط مثل JPEG ، ليقرأها جهاز إنترنت الأشياء. يمكنه حتى دفق الفيديو عن طريق التقاط الصور وإرسال إما إطار الصورة الكامل بإطار أو بث فيديو مضغوط.
## ما هي المحركات؟
المشغلات هي عكس المستشعرات - فهي تقوم بتحويل الإشارة الكهربائية من جهاز إنترنت الأشياء الخاص بك إلى تفاعل مع العالم المادي مثل إصدار الضوء أو الصوت أو تحريك المحرك.
تتضمن بعض المحركات الشائعة ما يلي:
* LED - ينبعث منها ضوء عند تشغيله
* مكبر الصوت - يصدر صوتًا بناءً على الإشارة المرسلة إليهم ، من الجرس الأساسي إلى مكبر الصوت الذي يمكنه تشغيل الموسيقى
* محرك متدرج - يقوم بتحويل الإشارة إلى مقدار محدد من الدوران ، مثل تدوير القرص بزاوية 90 درجة
* الترحيل - هذه هي المفاتيح التي يمكن تشغيلها أو إيقاف تشغيلها بواسطة إشارة كهربائية. إنها تسمح بجهد صغير من جهاز إنترنت الأشياء لتشغيل الفولتية الأكبر.
* الشاشات - هذه مشغلات أكثر تعقيدًا وتعرض معلومات على شاشة متعددة الأجزاء. تختلف الشاشات من شاشات LED البسيطة إلى شاشات الفيديو عالية الدقة.
✅ قم ببعض البحث. ما هي المشغلات التي يمتلكها هاتفك؟
## استخدام مشغل
اتبع الدليل ذي الصلة أدناه لإضافة مشغل إلى جهاز إنترنت الأشياء الخاص بك ، والذي يتحكم فيه المستشعر ، لإنشاء ضوء ليلي لإنترنت الأشياء. سيجمع مستويات الضوء من مستشعر الضوء ، ويستخدم مشغلًا على شكل LED لإصدار الضوء عندما يكون مستوى الضوء المكتشف منخفضًا جدًا.
![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-flow.png)
* [Arduino - Wio Terminal](wio-terminal-actuator.md)
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi](pi-actuator.md)
* [كمبيوتر ذو لوحة واحدة - Virtual device](virtual-device-actuator.md)
## أنواع المحرك
مثل المستشعرات ، تكون المحركات إما قياسية أو رقمية.
### المحركات القياسية
تأخذ المشغلات القياسية إشارة قياسية وتحولها إلى نوع من التفاعل ، حيث يتغير التفاعل بناءً على الجهد المزود.
أحد الأمثلة هو الضوء الخافت ، مثل الذي قد يكون لديك في منزلك. يحدد مقدار الجهد المقدم للضوء مدى سطوعه.
![A light dimmed at a low voltage and brighter at a higher voltage](../../../../images/dimmable-light.png)
كما هو الحال مع المستشعرات ، يعمل جهاز إنترنت الأشياء الفعلي على الإشارات الرقمية وليس التناظرية. هذا يعني لإرسال إشارة تناظرية ، يحتاج جهاز إنترنت الأشياء إلى محول رقمي إلى تناظري (DAC) ، إما على جهاز إنترنت الأشياء مباشرة ، أو على لوحة الموصل. سيؤدي هذا إلى تحويل 0 و 1 من جهاز إنترنت الأشياء إلى جهد تناظري يمكن أن يستخدمه المشغل.
✅ ما الذي يحدث برأيك إذا أرسل جهاز إنترنت الأشياء جهدًا أعلى مما يستطيع المشغل تحمله؟ ⛔️ لا تختبر ذلك.
#### تعديل عرض النبض
هناك خيار آخر لتحويل الإشارات الرقمية من جهاز إنترنت الأشياء إلى إشارة تمثيلية وهو تعديل عرض النبضة. يتضمن هذا إرسال الكثير من النبضات الرقمية القصيرة التي تعمل كما لو كانت إشارة تمثيلية.
على سبيل المثال ، يمكنك استخدام PWM للتحكم في سرعة المحرك.
تخيل أنك تتحكم في محرك مزود بمصدر 5 فولت. تقوم بإرسال نبضة قصيرة إلى المحرك الخاص بك ، حيث تقوم بتحويل الجهد إلى الجهد العالي (5 فولت) لمدة مائتي ثانية (0.02 ثانية). في ذلك الوقت ، يمكن لمحركك أن يدور عُشر الدوران ، أو 36 درجة. ثم تتوقف الإشارة مؤقتًا لمدة مائتي ثانية (0.02 ثانية) ، لإرسال إشارة منخفضة (0 فولت). كل دورة تشغيل ثم إيقاف تستمر 0.04 ثانية. ثم تتكرر الدورة.
![Pule width modulation rotation of a motor at 150 RPM](../../../../images/pwm-motor-150rpm.png)
هذا يعني أنه في ثانية واحدة لديك 25 نبضة 5 فولت من 0.02 ثانية والتي تقوم بتدوير المحرك ، يتبع كل منها توقف مؤقت بمقدار 0.02 ثانية بمقدار 0 فولت لا يقوم بتدوير المحرك. تقوم كل نبضة بتدوير المحرك بمقدار عُشر الدوران ، مما يعني أن المحرك يكمل 2.5 دورة في الثانية. لقد استخدمت إشارة رقمية لتدوير المحرك بمعدل 2.5 دورة في الثانية ، أو 150 <a href="https://wikipedia.org/wiki/Revolutions_per_minute">دورة في الدقيقة</a> ، وهو مقياس غير قياسي لسرعة الدوران).
```output
25 نبضة في الثانية × 0.1 دورة لكل نبضة = 2.5 دورة في الثانية
2.5 دورة في الثانية × 60 ثانية في الدقيقة = 150 دورة في الدقيقة
```
> 🎓 عندما تكون إشارة PWM قيد التشغيل لمدة نصف الوقت ، وإيقاف تشغيلها لنصف المدة ، يشار إليها على أنها <a href="https://wikipedia.org/wiki/Duty_cycle">50٪ دورة عمل</a>. يتم قياس دورات التشغيل كنسبة مئوية من الوقت تكون فيه الإشارة في حالة التشغيل مقارنة بحالة إيقاف التشغيل.
![Pule width modulation rotation of a motor at 75 RPM](../../../../images/pwm-motor-75rpm.png)
يمكنك تغيير سرعة المحرك عن طريق تغيير حجم النبضات. على سبيل المثال ، باستخدام نفس المحرك ، يمكنك الحفاظ على نفس وقت الدورة عند 0.04 ثانية ، مع خفض نبضة التشغيل إلى النصف إلى 0.01 ثانية ، وزيادة نبضة الإيقاف إلى 0.03 ثانية. لديك نفس عدد النبضات في الثانية (25) ، ولكن كل نبضة تساوي نصف الطول. نبضة بطول نصف تدير المحرك بمقدار عشرين من الدوران ، وعند 25 نبضة في الثانية ستكمل 1.25 دورة في الثانية أو 75 دورة في الدقيقة. من خلال تغيير سرعة النبض لإشارة رقمية ، تكون قد خفضت سرعة المحرك التناظري إلى النصف.
```output
25 نبضة في الثانية × 0.05 دورة لكل نبضة = 1.25 دورة في الثانية
1.25 دورة في الثانية × 60 ثانية في الدقيقة = 75 دورة في الدقيقة
```
✅ كيف تحافظ على سلاسة دوران المحرك ، خاصة عند السرعات المنخفضة؟ هل ستستخدم عددًا صغيرًا من النبضات الطويلة مع فترات توقف طويلة أم الكثير من النبضات القصيرة جدًا مع فترات توقف قصيرة جدًا؟
> 💁 تستخدم بعض المستشعرات أيضًا PWM لتحويل الإشارات التناظرية إلى إشارات رقمية.
> 🎓 يمكنك قراءة المزيد عن تعديل عرض النبض على <a href="https://wikipedia.org/wiki/Pulse-width_modulation">صفحة تعديل عرض النبض على ويكيبيديا</a>.
### المشغلات الرقمية
المشغلات الرقمية ، مثل المستشعرات الرقمية ، إما لها حالتان يتم التحكم فيهما بجهد مرتفع أو منخفض أو تحتوي على DAC مدمجة بحيث يمكنها تحويل إشارة رقمية إلى إشارة تمثيلية.
أحد المشغلات الرقمية البسيطة هو LED. عندما يرسل الجهاز إشارة رقمية بقيمة 1 ، يتم إرسال جهد عالي يضيء مؤشر LED. عند إرسال إشارة رقمية بقيمة 0 ، ينخفض الجهد إلى 0 فولت وينطفئ مؤشر LED.
![A LED is off at 0 volts and on at 5V](../../../../images/led.png)
✅ ما هي المشغلات البسيطة الأخرى ذات الحالتين التي يمكنك التفكير فيها؟ أحد الأمثلة على ذلك هو الملف اللولبي ، وهو مغناطيس كهربائي يمكن تنشيطه للقيام بأشياء مثل تحريك مسمار قفل الباب / فتح قفل الباب.
تتطلب المحركات الرقمية الأكثر تقدمًا ، مثل الشاشات ، إرسال البيانات الرقمية بتنسيقات معينة. عادةً ما تأتي مع مكتبات تسهل إرسال البيانات الصحيحة للتحكم فيها.
---
## 🚀 التحدي
كان التحدي في الدرسين الأخيرين هو سرد أكبر عدد ممكن من أجهزة إنترنت الأشياء الموجودة في منزلك أو مدرستك أو مكان عملك وتحديد ما إذا كانت مبنية على وحدات تحكم دقيقة أو أجهزة كمبيوتر أحادية اللوحة ، أو حتى مزيج من الاثنين معًا.
لكل جهاز أدرجته ، ما المستشعرات والمشغلات التي يتصلون بها؟ ما هو الغرض من كل حساس ومشغل متصل بهذه الأجهزة؟
## اختبار ما بعد المحاضرة
<a href="https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6">اختبار ما بعد المحاضرة</a>
## مراجعة ودراسة ذاتية
* اقرأ عن الكهرباء والدوائر على <a href="http://thinglearn.jenlooper.com/curriculum/">ThingLearn</a>.
* اقرأ عن الأنواع المختلفة من مستشعرات درجة الحرارة في <a href="https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/">دليل مستشعرات درجة الحرارة في الاستوديوها</a>
* اقرأ عن مصابيح LED على <a href="https://wikipedia.org/wiki/Light-emitting_diode">صفحة Wikipedia LED</a>
## الواجب
[أجهزة الاستشعار والمحركات البحثية](assignment.md)
</div>

@ -1,203 +0,0 @@
# সেন্সর এবং অ্যাকচুয়েটরের সাহায্যে বাহ্যিক জগতের সাথে যোগাযোগ
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-3.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার পূর্ববর্তী কুইজ
[লেকচার পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
## পরিচিতি
এই লেসনটি আমাদের আইওটি ডিভাইসের জন্য দুটি গুরুত্বপূর্ণ ধারণার পরিচয় করিয়ে দেয় - সেন্সর এবং অ্যাকচুয়েটর । আইওটি প্রজেক্টে লাইট সেন্সর যুক্ত করে, তারপরে আলোর মাত্রা দ্বারা নিয়ন্ত্রিত একটি এলইডি সংযুক্ত করার মাধ্যমে কার্যকরভাবে একটি রাতের আলোকীয় যন্ত্র বা 'নাইটলাইট' তৈরি করা যাবে।
এই পাঠ্যে আমরা দেখবো :
* [সেন্সর কী?](#সেন্সর-কী)
* [একটি সেন্সর ব্যবহার](#একটি-সেন্সর-ব্যবহার)
* [সেন্সর কত প্রকার](#সেন্সর-কত-প্রকার)
* [অ্যাকচুয়েটর কী?](#অ্যাকচুয়েটর-কী)
* [একটি অ্যাকচুয়েটর ব্যবহার](#একটি-অ্যাকচুয়েটর-ব্যবহার)
* [অ্যাকচুয়েটর কত প্রকার](#অ্যাকচুয়েটর-কত-প্রকার)
## সেন্সর কী?
সেন্সরগুলি এমন একটি হার্ডওয়্যার ডিভাইস যা বাহ্যিক জগতকে বুঝতে পারে - অর্থাৎ তারা তাদের চারপাশে এক বা একাধিক বৈশিষ্ট্য পরিমাপ করে এবং তথ্যগুলো আইওটি ডিভাইসে প্রেরণ করে। প্রাকৃতিক বৈশিষ্ট্য যেমন বায়ু তাপমাত্রা থেকে শুরু করে শারীরিক মিথস্ক্রিয়া যেমন চলাফেরার মতো প্রাকৃতিক বৈশিষ্ট্য থেকে পরিমাপ করা যায় এমন অনেকগুলি জিনিস রয়েছে বলে সেন্সরগুলি বিস্তৃত ডিভাইস কভার করে।
সেন্সর দ্বারা অনেকগুলো বিষয় পরিমাপ করা সম্ভব; প্রাকৃতিক বৈশিষ্ট্য যেমন বায়ু তাপমাত্রা থেকে শুরু করে শারীরিক মিথস্ক্রিয়া যেমন চলাফেরার মতো অনেককিছুতেই এটির ব্যবহার লক্ষ্যণীয় ।
কিছু অতি ব্যবহৃত সেন্সর হলো:
* তাপমাত্রা সেন্সর - এগুলি বায়ুর তাপমাত্রা বা যে মাধ্যমে নিমজ্জিত রয়েছে সেটির তাপমাত্রা নির্ণয় করতে পারে। শৌখিন এবং প্রফেশনাল ডেভলাপারদের জন্য প্রায়ই এই একটি সেন্সরেই বায়ুচাপ এবং আর্দ্রতার ও নির্ণয়ের সুবিধা প্রদান করা হয়।
* বাটন - কেউ যদি বাটনে প্রেস করে তখন তারা তা বুঝতে পারে।
* আলোকীয় সেন্সর - এগুলি আলোর মাত্রা সনাক্ত করে এবং নির্দিষ্ট রঙ, ইউভি আলো, আইআর লাইট বা সাধারণ দৃশ্যমান আলোর জন্য সুনির্দিষ্টভাবে কাজ করতে পারে।
* ক্যামেরা - এগুলি কোন ছবি বা স্ট্রিমিং ভিডিও গ্রহণ করে বিশ্বের চিত্রিত প্রতিরূপ তৈরী করতে পারে।
* একসেলেরোমিটার - বিভিন্ন দিকে গতিবিধির পরিবর্তন বুঝতে পারে।
* মাইক্রোফোন - সাধারণ শব্দ স্তর বা সুনির্দিষ্ট কোন দিক থেকে আসা শব্দ বুঝতে পারে।
✅ ছোট্ট একটি কাজ করা যাক এখন। আমাদের ব্যবহৃত ফোনে কী কী সেন্সর রয়েছে তা চিন্তা করি।
সব সেন্সর এর মধ্যে একটি সাধারণ বিষয় রয়েছে - তারা যা কিছু সেন্স করতে পারে, তা বৈদ্যুতিক সংকেতে রূপান্তর করে যে ডেটা আইওটি ডিভাইস ব্যবহার করতে পারে। এই বৈদ্যুতিক সংকেতটি কীভাবে ব্যবহৃত হবে, তা সেন্সরের উপর নির্ভর করে, পাশাপাশি আইওটি ডিভাইসের সাথে যোগাযোগ করার জন্য ব্যবহৃত যোগাযোগ প্রোটোকলও এই ক্ষেত্রে প্রভাব রাখে।
## একটি সেন্সর ব্যবহার
আইওটি ডিভাইসে সেন্সর যুক্ত করতে নীচের কোন একটি প্রাসঙ্গিক গাইড অনুসরণ করতে হবে:
* [Arduino - Wio Terminal](wio-terminal-sensor.md)
* [Single-board computer - Raspberry Pi](pi-sensor.md)
* [Single-board computer - Virtual device](virtual-device-sensor.md)
## সেন্সর কত প্রকার
সেন্সরগুলি মূলত ২ প্রকার - অ্যানালগ এবং ডিজিটাল।
### অ্যানালগ সেন্সর
সবথেকে বেসিক সেন্সর হল এনালগ সেন্সর। এগুলো আইওটি ডিভাইস থেকে একটি ভোল্টেজ গ্রহণ করে, সেন্সর উপাদানগুলি এই ভোল্টেজটি সামঞ্জস্য করে এবং সেন্সর থেকে ফিরে আসা ভোল্টেজটিই মান পরিমাপ করে।
> 🎓ভোল্টেজ এমন এক রাশি যা বিদ্যুৎ এক জায়গা থেকে অন্য জায়গায় প্রবাহিত হবে কিনা তা ঠিক করে, যেমন ব্যাটারির পসিটিভ টার্মিনাল থেকে নেগেটিভ টার্মিনালে যায়। উদাহরণস্বরূপ, একটি স্ট্যান্ডার্ড ডাবল-এ ব্যাটারি 1.5V (V হলো ভোল্টের প্রতীক) এবং এটি পসিটিভ টার্মিনাল থেকে নেগেটিভ টার্মিনালে 1.5V এর শক্তি দিয়ে বিদ্যুৎকে প্রবাহিত করতে পারে। বিভিন্ন বৈদ্যুতিক হার্ডওয়্যারের কাজ করার জন্য বিভিন্ন ভোল্টেজের প্রয়োজন হয়, উদাহরণস্বরূপ, একটি এলইডি ২-৩ ভোল্টেজের মধ্যে আলোকিত হতে পারে, তবে একটি 100ওয়াট ফিলামেন্ট লাইটবাল্বের জন্য 240V প্রয়োজন হবে। [ভোল্টেজ - উইকিপিডিয়া পেইজ](https://wikipedia.org/wiki/Voltage) পড়লে এই সংক্রান্ত বিস্তারিত জানা যাবে।
উদাহরণস্বরূপ পোটেনশিওমিটার এর কথা ধরা যাক। এটি এমন একটি ডায়াল যা আমরা দুটি অবস্থানের মধ্যে ঘোরাই এবং সেন্সরটি ঘূর্ণনটি পরিমাপ করে প্রয়োজনীয় তথ্য সংগ্রহ করে।
![A potentiometer set to a mid point being sent 5 volts returning 3.8 volts](../../../../images/potentiometer.png)
আইওটি ডিভাইসগুলো কোন নির্দিষ্ট ভোল্টেজে (যেমনঃ 5V) পোটেনশিওমিটারে বৈদ্যুতিক সংকেত পাঠাবে। পটেনশিওমিটার অ্যাডজাস্ট করার সাথে সাথে এটি অন্য দিক থেকে আগত ভোল্টেজকে পরিবর্তন করে। কল্পনা করি যে ভলিউম নব এর মতো আমাদের ডায়াল হিসাবে 0 থেকে [11](https://wikedia.org/wiki/Up_to_eleven) লেবেলযুক্ত একটি পটেনশিওমিটার রয়েছে। যখন পেন্টিয়োমিটার পূর্ণ অফ অবস্থানে (0) থাকবে তখন 0V (0 ভোল্ট)আর যখন এটি সম্পূর্ণ অন পজিশনে থাকবে (11), তখন 5V (5 ভোল্ট) মান দিবে।
> 🎓 পুরো বিষয়টিকে অত্যন্ত সহজভাবে বোঝানোর চেষ্টা করা হয়েছে। পোটেনশিওমিটার এবং পরিবর্তনযোগ্য রোধক সম্পর্কে [পোটেনশিওমিটার উইকিপিডিয়া পেইজ](https://wikipedia.org/wiki/Potentiometer) এ বিশদ ব্যখ্যা রয়েছে।
সেন্সর প্রদত্ত ভোল্টেজটি আইওটি ডিভাইস গ্রহণ করে এবং ডিভাইস এটিতে সাড়া দিতে পারে। সেন্সরের উপর নির্ভর করে, এই ভোল্টেজ যেকোন মান এর হতে পারে বা একটি আদর্শ মান ধারণ করতে পারে। উদাহরণস্বরূপ, [থার্মিস্টর] (https://wikedia.org/wiki/Thermistor) এর উপর ভিত্তি করে তৈরী একটি অ্যানালগ তাপমাত্রা সেন্সর, তাপমাত্রার উপর নির্ভর করে তার রেসিস্ট্যান্ট বা রোধ এর মান পরিবর্তন করে। আউটপুট ভোল্টেজটি তখন ক্যালভিন তাপমাত্রায় রূপান্তরিত করা যাবে এবং কোডিং এর মাধ্যমে সেলসিয়াস বা ফারেনহাইটে পরিবর্তনযোগ্য।
✅ সেন্সর যদি প্রদত্ত ভোল্টেজ (যেমনঃ কোন এক্সটার্নাল পাওয়ার সাপ্লাই থেকে) এর চাইতে বেশি রিটার্ন করে , তাহলে কী ঘটবে বলে মনে হয় ? ⛔️ এটার বাস্তবিক টেস্ট করা থেকে সর্বাবস্থায় বিরত থাকা উচিত।
#### অ্যানালগ থেকে ডিজিটালে রূপান্তর
আইওটি ডিভাইসগুলি হলো ডিজিটাল যন্ত্র - এগুলো অ্যানালগ মান নিয়ে কাজ করতে পারে না, তারা কেবল 0 এবং 1 এর মাধ্যমে কাজ করে। এর অর্থ হল এনালগ সেন্সর মানগুলি নিয়ে কাজ করার আগে, তাদেরকে ডিজিটাল সিগন্যালে রূপান্তর করা দরকার। অনেক আইওটি ডিভাইসে এনালগ ইনপুটগুলিকে তাদের মানের ডিজিটাল ফর্মে রূপান্তর করতে 'অ্যানালগ-থেকে-ডিজিটাল কনভার্টার (এডিসি)' থাকে। সেন্সরগুলি সংযোগকারী বোর্ডের মাধ্যমেও এডিসিগুলির সাথে কাজ করতে পারে। উদাহরণস্বরূপ, রাস্পবেরি পাই সহ সীড গ্রোভ ইকোসিস্টেমে, অ্যানালগ সেন্সরগুলি একটি 'হ্যাট'- এর নির্দিষ্ট পোর্টের সাথে সংযোগ করে যা পাই এর জিপিআইও পিনের সাথে যুক্ত হয়ে পাইতে বসে এবং এই হ্যাটটির একটি 'অ্যানালগ-থেকে-ডিজিটাল কনভার্টার (এডিসি)' রয়েছে যা প্রাপ্ত মানকে ডিজিটাল সিগন্যালে পরিণত করে যা জিপিআইও দ্বারা প্রেরিত হয়।
কল্পনা করি যে আমাদের আইওটি ডিভাইসের সাথে সংযুক্ত একটি এনালগ লাইট সেন্সর রয়েছে যা 3.3V ব্যবহার করে এবং 1V রিটার্ন করছে । এই 1V বিষয়টি ডিজিটাল জগতে কোন কিছুই বোঝায়না, তাই এটি রূপান্তর করা দরকার। ভোল্টেজটিকে ডিভাইস এবং সেন্সরের উপর নির্ভর করে, নির্দিষ্ট স্কেলে ব্যবহার করে অ্যানালগ মানে রূপান্তরিত করা হবে। উদাহরণস্বরূপ, সীড গ্রোভ লাইট সেন্সর যা 0 থেকে 1023 পর্যন্ত মান আউটপুট দেয়। 3.3V-তে চলমান এই সেন্সরটির জন্য, 1V আউটপুটটির মান হবে 300 । একটি আইওটি ডিভাইস 300 এনালগ মান হিসাবে পরিচালনা করতে পারে না, সুতরাং মানটি `0000000100101100` এ রূপান্তরিত হবে, যা গ্রোভের দ্বারা রুপান্তরিত 300 এর বাইনারি রূপ এবং এটি পরে আইওটি ডিভাইস দ্বারা প্রক্রিয়া করা হবে।
✅ বাইনারি সম্পর্কে জানা না থাকলে, 0 এবং 1 দ্বারা লিখিত এই সংখ্যাপদ্ধতি সম্পর্কে আমাদের জানতে হবে। এই [BBC Bitesize introduction to binary lesson](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) থেকে আমরা আমাদের বাইনারি সংক্রান্ত জ্ঞান আহরণ শুরু করতে পারি।
কোডিং দৃষ্টিকোণ থেকে, এইসব বিষয় সাধারণত সেন্সরগুলির সাথে থাকা লাইব্রেরি দ্বারা পরিচালিত হয়, সুতরাং আমাদেরকে আসলে এই রূপান্তর সম্পর্কে অতোটা চিন্তা করার দরকার নেই। গ্রোভ লাইট সেন্সরের জন্য আমরা পাইথন লাইব্রেরিটি ব্যবহার করবো এবং `light` নামক প্রপার্টিকে কল করলে বা আরডুইনো লাইব্রেরিটি ব্যবহার করে `analogRead` কল করলে, 300 এর মান পাওয়া যাবে।
### ডিজিটাল সেন্সর
অ্যানালগ সেন্সরের মতো ডিজিটাল সেন্সরগুলি বৈদ্যুতিক ভোল্টেজের পরিবর্তনগুলি ব্যবহার করে চারপাশের বাহ্যিক জগৎ সনাক্ত করে। পার্থক্য হল ডিজিটাল সেন্সরগুলো হয় ২টি ভিন্ন স্টেট এর মাঝে তুলনা করে বা বিল্ট-ইন এডিসি ব্যবহার করে একটি ডিজিটাল সিগন্যাল আউটপুট দেয়। বর্তমানে বিভিন্ন কানেক্টর বোর্ড বা আইওটি ডিভাইসে এডিসি এর ব্যবহার এড়ানোর জন্য ডিজিটাল সেন্সরগুলোই বেশি ব্যবহৃত হচ্ছে।
সবচেয়ে সহজ সাধারণ ডিজিটাল সেন্সর হলো বাটন বা স্যুইচ। এটি ২টি অবস্থা সম্পন্ন একটি সেন্সর , অবস্থা দুটি হলো চালু (on) এবং বন্ধ (off) ।
![A button is sent 5 volts. When not pressed it returns 0 volts, when pressed it returns 5 volts](../../../../images/button.png)
আইওটি ডিভাইসে থাকা পিনগুলি যেমন জিপিআইও পিনগুলি এই সংকেতটি সরাসরি 0 বা 1 হিসাবে পরিমাপ করতে পারে। প্রেরিত এবং প্রাপ্ত ভোল্টেজ সমান হলে, এর মান হয় 1, অন্যথায় মানটি হয় 0। এক্ষেত্রে সিগন্যাল রূপান্তর করার দরকার নেই কারণ এদের মান কেবল 1 বা 0 হতে পারে।
> 💁 ভোল্টেজগুলি কখনই হুবহু মিলেনা না, বিশেষত যেহেতু একটি সেন্সরের উপাদানগুলির রোধ থাকে, তাই এক্ষেত্রে ভোল্টেজের হেরফের হয়। উদাহরণস্বরূপ, জিপিআইও পিনগুলি একটি রাস্পবেরি পাইতে 3.3V-তে কাজ করে এবং রিটার্ন সিগন্যালে 1.8V এর উপর ভোল্টেজ এর মানকে 1 হিসেবে বিবেচনা করে এবং 1.8V এর কম হলে 0 হিসাবে বিবেচনা করে থাকে।
* 3.3V বাটনে যায়। এটি বন্ধ (off), তাই 0V বেরিয়ে আসে, তাই এর মান হয় 0 ।
* 3.3V বাটনে যায়। এটি চালু (on), তাই 3.3V বেরিয়ে আসে,তাই এর মান হয় 1 ।
আরও উন্নত ডিজিটাল সেন্সরগুলো অ্যানালগ মানগুলি গ্রহণ করে, তারপরে অন-বোর্ড এডিসি ব্যবহার করে ডিজিটাল সিগন্যালে রূপান্তর করে। উদাহরণস্বরূপ, একটি ডিজিটাল টেম্পারেচার সেন্সর, এনালগ সেন্সরের মতোই থার্মোকাপল ব্যবহার করবে এবং বর্তমান তাপমাত্রায় থার্মোকাপলের রোধের কারণে সৃষ্ট ভোল্টেজের পরিবর্তনকে পরিমাপ করবে। এনালগ ভ্যালু রিটার্ন করে এটিকে ডিজিটাল সিগন্যালে রূপান্তরের জন্য যন্ত্র বা কানেক্টর বোর্ডের উপর নির্ভর করার পরিবর্তে, সেন্সরের বিল্ট-ইন সেন্সরটিই এই রূপান্তর করে দেয় এবং 0 আর 1 সিরিজবিশিষ্ট মান রিটার্ন করে আইওটি ডিভাইসে। একটি বাটন যেমন 1 বলতে ফুল ভোল্টেজ এবং 0 বলতে শূণ্য ভোল্টেজ বোঝায়, এখানেও একইভাবে সম্পূর্ন বাইনারি সিরিজটি প্রেরিত হয়।
![A digital temperature sensor converting an analog reading to binary data with 0 as 0 volts and 1 as 5 volts before sending it to an IoT device](../../../../images/temperature-as-digital.png)
ডিজিটাল ডেটা প্রেরণের জন্য সেন্সরগুলো আরও জটিল হয়ে উঠতে শুরু করেছে। একইসাথে অনেক বেশি বিস্তারিরভাবে তথ্য প্রেরণ করা হচ্ছে, এমনকি সুরক্ষিত সেন্সরগুলির জন্য এনক্রিপ্ট করা ডেটা প্রেরণের ব্যবস্থাও লক্ষ্যণীয়। এর একটি উদাহরণ হলো ক্যামেরা - এটি এমন একটি সেন্সর যা একটি চিত্র ধারণ করে এবং আইওটি ডিভাইস এর জন্য সাধারণত JPEG এর মতো সংকোচিত বিন্যাসে এটি ডিজিটাল ডেটা হিসাবে প্রেরিত হয়। চিত্রধারণ করে, ক্যামেরার পক্ষে ভিডিও স্ট্রীমিংও সম্ভব । হয় পুরো ছবিকে ফ্রেম বাই ফ্রেম সাজিয়ে বা কম্প্রেস করে পাঠানোর মাধ্যমে স্ট্রীমিং হয়ে থাকে।
## অ্যাকচুয়েটর কী?
অ্যাকচুয়েটর হলো সেন্সর এর বিপরীত - এগুলো আইওটি ডিভাইস থেকে বৈদ্যুতিক সংকেতকে বাহ্যিক জগতের সাথে মিথস্ক্রিয়ায় রূপান্তর করে। যেমন, আলোক বা শব্দ নির্গমন করা বা একটি মোটরকে চালানো।
কিছু অতিব্যবহৃত অ্যাকচুয়েটর হিসেবে বলা যায় -
* এলইডি - চালু করলে, এগুলি আলোকিত হয়।
* স্পিকার - একটি সাধারণ buzzer থেকে শুরু করে, অডিও চালাতে সক্ষম এমন যন্ত্রগুলোই স্পিকার। এরা প্রেরিত সিগন্যালের উপর ভিত্তি করে শব্দ তৈরী করে।
* স্টেপার মোটর - এগুলি সংকেতকে একটি সুনির্দিষ্ট পরিমাণ ঘূর্ণনে রূপান্তর করে, যেমন কোন ডায়ালকে 90° কোণে বাঁকানো।
* রিলে - এগুলো এমন সুইচ যা বৈদ্যুতিক সংকেতের সাহায্যে অন/অফ করা যায়। এগুলো আইওটি ডিভাইস থেকে প্রাপ্ত ক্ষুদ্র মানের ভোল্টেজ দ্বারা বৃহত্তর মানের ভোল্টেজ চালু করে।
* স্ক্রিন - এগুলো বেশ জটিল ধরণের অ্যাকচুয়েটর যা একটি পর্দা (display) এর বিভিন্ন অংশে বিভিন্ন তথ্য প্রদর্শন করে। সাধারণ LED display থেকে শুরু করে হাই-রেস্যুলেশন পর্যন্ত প্রদর্শনযোগ্য স্ক্রিন রয়েছে।
✅ ছোট্ট একটি কাজ করা যাক এখন। আমাদের ব্যবহৃত ফোনে কী কী অ্যাকচুয়েটর রয়েছে তা চিন্তা করি।
## একটি অ্যাকচুয়েটর ব্যবহার
আইওটি ডিভাইসে সেন্সর যুক্ত করতে নীচের কোন একটি প্রাসঙ্গিক গাইডটি অনুসরণ করতে হবে। এই ডিভাইসটি সেন্সর নিয়ন্ত্রিত,আর সাহায্যে nightlight এর প্রজেক্টটি করা হবে। এটি সেন্সর দ্বারা পরিবেশে আলোর মাত্রা শনাক্ত করবে, অ্যাকচুয়েটর হিসেবে এলইডি ব্যবহার করবে যেটি (সেন্সর প্রাপ্ত ডাটা অনুসারে) আলোর মাত্রা কম থাকলে, নিজেই জ্বলে উঠবে।
![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-flow.png)
* [Arduino - Wio Terminal](wio-terminal-actuator.md)
* [Single-board computer - Raspberry Pi](pi-actuator.md)
* [Single-board computer - Virtual device](virtual-device-actuator.md)
## অ্যাকচুয়েটর কত প্রকার
সেন্সর এর মতো, অ্যাকচুয়েটরও মূলত ২ প্রকার - অ্যানালগ এবং ডিজিটাল।
### অ্যানালগ অ্যাকচুয়েটর
অ্যানালগ অ্যাকচুয়েটর একটি অ্যানালগ সংকেত নিয়ে এটিকে বাহ্যিক জগতের মিথস্ক্রিয়ায় রূপান্তর করে, যেখানে প্রদত্ত ভোল্টেজের ভিত্তিতে মিথস্ক্রিয়া পরিবর্তিত হয়। উদাহরণ হিসেবে, আমাদের বাসাবাড়িতে ব্যবহৃত নিয়ন্ত্রণযোগ্য লাইটের কথা চিন্তা করা যেতে পারে। এটি প্রাপ্ত ভোল্টেজের ভিত্তিতেই নির্ধারিত হয় যে, এই আলোর ঔজ্জ্বল্য কতটা হবে।
![A light dimmed at a low voltage and brighter at a higher voltage](../../../../images/dimmable-light.png)
সেন্সরগুলির মতো, প্রকৃত আইওটি ডিভাইস ডিজিটাল সিগন্যালে কাজ করে, এনালগ এ নয়। একটি এনালগ সিগন্যাল প্রেরণ করার জন্য, আইওটি ডিভাইসটির জন্য ডিজিটাল টু এনালগ কনভার্টার (DAC) দরকার হয়। DAC হয় আইওটি ডিভাইসে সরাসরি, বা কোনও সংযোজক বোর্ডের সাহায্যে যুক্ত করতে হবে। এটি 0 এবং 1 গুলি আইওটি ডিভাইস থেকে অ্যানালগ ভোল্টেজকে রূপান্তর করবে যা অ্যাকচুয়েটর ব্যবহার করতে পারে।
✅ আইওটি ডিভাইসটি যদি অ্যাকচুয়েটর এর সহ্যসীমার বেশি ভোল্টেজ প্রদান করে , তাহলে কী ঘটবে বলে মনে হয় ? ⛔️ এটার বাস্তবিক টেস্ট করা থেকে সর্বাবস্থায় বিরত থাকা উচিত।
#### পালস-উইথ মড্যুলেশন (PWM)
আইওটি ডিভাইস থেকে অ্যানালগ সিগন্যালে রূপান্তর করার জন্য আর একটি বিকল্প হল পালস-উইথ মড্যুলেশন। এর মধ্যে প্রচুর সংক্ষিপ্ত ডিজিটাল পালস সিগন্যাল প্রেরণ করা হয় যা এটি অ্যানালগ সিগন্যাল হিসাবে কাজ করে। উদাহরণস্বরূপ, PWM দ্বারা মোটরের গতি নিয়ন্ত্রণ করা যাবে।
কল্পনা করি যে আমরা 5V পাওয়ার সাপ্লাই দিয়ে, মোটরটি নিয়ন্ত্রণ করছি। ভোল্টেজটি .০২ সেকেন্ডের জন্য high অর্থাৎ 5V রাখার মাধ্যমে, মোটরে একটি সংক্ষিপ্ত পালস প্রেরণ করি। সেই সময়ে মোটরটি একটি পূর্ণ ঘূর্ণনের দশমাংশ বা 36° ঘুরতে পারে। এর পরে লো সিগন্যাল দিয়ে অর্থাৎ 0V প্রেরণ করে, সিগন্যালটি 0.02 সেকেন্ডের জন্য বিরতি দেয়। তারপরে অন-অফ এর প্রতিটি চক্র 0.04s অবধি চলে। তারপরে আবারও পুনরাবৃত্তি করে।
![Pule width modulation rotation of a motor at 150 RPM](../../../../images/pwm-motor-150rpm.png)
তাহলে প্রতি সেকেন্ডে ২৫টি পালস দেয়া হচ্ছে যেখানে ৫ভোল্টের প্রতি সিগন্যালে .০২ সেকেন্ডে মোটর ঘুরছে আবার ভোল্টের জন্য .০২ সেকেন্ডে মোটর বিরতি নিচ্ছে। প্রতিটি পালস এখানে মোটরকে একটি ঘূর্ণনের দশমাংশে ঘুরায়, যার অর্থ মোটর প্রতি সেকেন্ডে 2.5 ঘূর্ণন সম্পন্ন করে। এখানে ডিজিটাল সিগন্যাল ব্যবহার করে আমরা একটি মোটরকে প্রতি সেকেন্ডে ২.৫টি করে ঘূর্ণন প্রদান করেছি অর্থাৎ ১৫০ আরপিএম বা [revolutions per minute](https://wikipedia.org/wiki/Revolutions_per_minute) এ ঘুরিয়েছি।
```output
25 pulses per second x 0.1 rotations per pulse = 2.5 rotations per second
2.5 rotations per second x 60 seconds in a minute = 150rpm
```
> 🎓 কোন PWM সিগন্যাল যদি অর্ধেক সময় ON থাকে এবং বাকি অর্ধেক সময় OFF থাকে, তবে এই বিষয়টিকে বলা হয় [50% ডিউটি সাইকেল](https://wikipedia.org/wiki/Duty_cycle)। ডিউটি সাইকেল হলো মূলত অন-অফ এই দুই অবস্থার সময়ের দৈর্ঘ্যের তুলনা।
![Pule width modulation rotation of a motor at 75 RPM](../../../../images/pwm-motor-75rpm.png)
পালসের আকার পরিবর্তন করে মোটরের গতি পরিবর্তন করা যাবে। উদাহরণস্বরূপ, একই মোটর দিয়ে আমরা 0.04 সেকেন্ডের একই চক্র রাখতে পারবো যেখানে ON পালসটি 0.01 ধরে থাকবে এবং OFF পালসটি 0.03 সেকেন্ড সময় ধরে থাকবে। আমাদের প্রতি সেকেন্ডে পালসের সংখ্যার পরিমাণ একই রয়েছে (25) তবে পালসের ON অবস্থার দৈর্ঘ্য এখন অর্ধেক। একটি অর্ধ দৈর্ঘ্যের পালস মোটরটিকে কেবল একটি ঘূর্ণনের এক বিংশতম পর্যন্ত ঘুরতে দেয় এবং 25 পালস দ্বারা প্রতি সেকেন্ডে 1.25টি ঘূর্ণন সম্পন্ন হব অর্থাৎ ৭৫ আরপিএম । ডিজিটাল সিগন্যালের পালসের গতি পরিবর্তন করে এভাবে অ্যানালগ মোটরের গতি অর্ধেকে নামিয়ে ফেলা যাবে।
```output
25 pulses per second x 0.05 rotations per pulse = 1.25 rotations per second
1.25 rotations per second x 60 seconds in a minute = 75rpm
```
✅ কীভাবে মোটর রোটেশন (বিশেষত কম গতিতে) মসৃণ রাখা যায় ? এখানে দীর্ঘ বিরতি সহ স্বল্প সংখ্যক লম্বা পালস নাকি খুব সংক্ষিপ্ত বিরতি দিয়ে প্রচুর সংক্ষিপ্ত পালস - কোনটি ব্যবহার করা উচিত ?
> 💁 কিছু সেন্সরও PWM ব্যবহার করে অ্যানালগ সিগন্যালগুলিকে ডিজিটাল সিগন্যালে রূপান্তর করে।
> 🎓 পালস-উইথ মড্যুলেশন (PWM) এর ব্যপারে আরো জানতে [ঊইকিপিডিয়ার এই আর্টিকেল](https://wikipedia.org/wiki/Pulse-width_modulation) পড়া ভালো হবে।
### ডিজিটাল অ্যাকচুয়েটর
ডিজিটাল অ্যাকচুয়েটরও ডিজিটাল সেন্সরগুলর মতো হয় উচ্চ বা নিম্ন ভোল্টেজের দ্বারা নিয়ন্ত্রিত দুটি স্টেট এ থাকে বা একটি DAC বিল্ট-ইন থাকে, যাতে ডিজিটাল সিগন্যালটিকে এনালগকে রূপান্তর করতে পারে।
একটি সাধারণ ডিজিটাল অ্যাকচুয়েটর এর উদাহরণ হল একটি এলইডি। যখন কোন ডিভাইস ডিজিটাল সিগন্যাল হিসেবে 1 প্রেরণ করে, তখন একটি উচ্চ ভোল্টেজ প্রেরণ করা হয় যা LED জ্বালায় । আবার 0 এর একটি ডিজিটাল সিগন্যাল প্রেরণ করা হলে, ভোল্টেজ 0V এ নেমে আসে এবং LED বন্ধ হয়ে যায়।
![A LED is off at 0 volts and on at 5V](../../../../images/led.png)
✅ ২-অবস্থা বিশিষ্ট আর কোন অ্যাকচুয়েটর কী আশেপাশে দেখা যায় ? একটি উদাহরণ হলো সলিনয়েড, একটি ইলেক্ট্রোম্যাগনেট যা দ্বারা কোন দরজার নব নিয়ন্ত্রণ করে খোলা-বন্ধ করা যাবে।
আরও উন্নত ডিজিটাল অ্যাকচুয়েটর যেমন স্ক্রিনের জন্য ডিজিটাল ডেটা নির্দিষ্ট ফর্ম্যাটে প্রেরণ করা প্রয়োজন। এগুলি সাধারণত প্রোগ্রাম লাইব্রেরিতে থাকে যা এগুলি নিয়ন্ত্রণ করতে সঠিক ডেটা প্রেরণকে সহজ করে।
---
## 🚀 চ্যালেঞ্জ
শেষ দুটি পাঠের চ্যালেঞ্জ ছিল বাসস্থান, স্কুল বা কর্মক্ষেত্রে যতগুলি আইওটি ডিভাইস রয়েছে তা তালিকাভুক্ত করা এবং তারা মাইক্রোকন্ট্রোলার বা একক-বোর্ড কম্পিউটার, বা উভয়ের মিশ্রণের দ্বারা নির্মিত কিনা তা সিদ্ধান্ত নেওয়া। এবারের চ্যালেঞ্জ হলো, তালিকাভুক্ত প্রতিটি ডিভাইসের জন্য, তারা কোন সেন্সর এবং অ্যাকচুয়েটর সাথে সংযুক্ত আছে? এই ডিভাইসগুলির সাথে সংযুক্ত প্রতিটি সেন্সর এবং অ্যাকচুয়েটরের উদ্দেশ্য কী?
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6)
## রিভিউ এবং স্ব-অধ্যয়ন
* [ThingLearn](http://thinglearn.jenlooper.com/curriculum/) থেকে ইলেক্ট্রিসিটি ও সার্কিটের ব্যাপারে পড়া।
* [Seeed Studios Temperature Sensors guide](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) থেকে বিভিন্ন ধরণের তাপমাত্রা সেন্সরের ব্যাপারে জানা।
* এলইডি সম্পর্কে [Wikipedia LED page](https://wikipedia.org/wiki/Light-emitting_diode) থেকে আরো বিস্তারিত ধারণা লাভ করা।
## এসাইনমেন্ট
[সেন্সর এবং অ্যাকচুয়েটর নিয়ে গবেষণা ](assignment.bn.md)

@ -1,217 +0,0 @@
# Interagir avec le monde physique à l'aide de capteurs et d'actionneurs
![Un aperçu de cette leçon sous forme de sketchnote](../../../../sketchnotes/lesson-3.jpg)
> Sketchnote de [Nitya Narasimhan](https://github.com/nitya). Cliquez sur l'image pour l'agrandir.
Cette leçon a été enseignée dans le cadre de la [série Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) du [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). La leçon a été enseignée sous forme de deux vidéos - une leçon d'une heure et une heure de bureau pour approfondir certaines parties de la leçon et répondre aux questions.
[![Leçon 3 : Interagir avec le monde physique à l'aide de capteurs et d'actionneurs](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4)
[![Leçon 3 : Interagir avec le monde physique à l'aide de capteurs et d'actionneurs - Heures de bureau](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA)
> 🎥 Cliquez sur les images ci-dessus pour visionner les vidéos
## Quiz préalable
[Quiz préalable](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
## Introduction
Cette leçon présente deux concepts importants pour votre appareil IoT : les capteurs et les actionneurs. Vous en ferez une prise en main en ajoutant un capteur de lumière à votre projet IoT, puis en ajoutant une LED contrôlée par les niveaux de lumière, ce qui vous permettra de développer une veilleuse.
Dans cette leçon, nous aborderons les points suivants
* [Qu'est-ce qu'un capteur?](#quest-ce-quun-capteur)
* [Utiliser un capteur](#utiliser-un-capteur)
* [Les types de capteurs](#les-types-de-capteurs)
* [Qu'est-ce que les actionneurs?](#quest-ce-que-les-actionneurs)
* [Utiliser un actionneur](#utiliser-un-actionneur)
* [Les types d'actionneurs](#les-types-dactionneurs)
## Qu'est-ce qu'un capteur?
Les capteurs sont des dispositifs matériels qui détectent le monde physique, c'est-à-dire qu'ils mesurent une ou plusieurs propriétés autour d'eux et envoient l'information à un dispositif IoT. Les capteurs couvrent une vaste gamme d'appareils car il y a beaucoup de choses qui peuvent être mesurées, des propriétés naturelles telles que la température de l'air aux interactions physiques telles que le mouvement.
Les capteurs les plus courants sont les suivants :
* Capteurs de température - ils détectent la température de l'air ou la température de ce dans quoi ils sont immergés. Pour les amateurs et les développeurs, ces capteurs sont souvent combinés avec la pression atmosphérique et l'humidité dans un seul capteur.
* Boutons - ils détectent le moment où ils ont été pressés.
* Capteurs de lumière : ils détectent les niveaux de lumière et peuvent concerner des couleurs spécifiques, la lumière UV, la lumière IR ou la lumière visible en général.
* Les caméras : elles détectent une représentation visuelle du monde en prenant une photo ou en diffusant une vidéo.
* Accéléromètres : ils détectent les mouvements dans plusieurs directions.
* Microphones - ils détectent les sons, qu'il s'agisse de niveaux sonores généraux ou de sons directionnels.
✅ Faites des recherches. Quels sont les capteurs de votre téléphone ?
Tous les capteurs ont un point commun : ils convertissent ce qu'ils détectent en un signal électrique qui peut être interprété par un appareil IoT. La manière dont ce signal électrique est interprété dépend du capteur, ainsi que du protocole de communication utilisé pour communiquer avec l'appareil IoT.
## Utiliser un capteur
Suivez le guide approprié ci-dessous pour ajouter un capteur à votre appareil IoT :
* [Arduino - Terminal Wio](wio-terminal-sensor.fr.md)
* [Ordinateur monocarte - Raspberry Pi](pi-sensor.fr.md)
* [Ordinateur monocarte - Dispositif virtuel](virtual-device-sensor.fr.md)
## Les types de capteurs
Les capteurs sont soit analogiques, soit numériques.
### Capteurs analogiques
Les capteurs analogiques comptent parmi les capteurs les plus élémentaires. Ces capteurs reçoivent une tension de l'appareil IoT, les composants du capteur ajustent cette tension et la tension renvoyée par le capteur est mesurée pour donner la valeur du capteur.
> 🎓 La tension ("Voltage" en anglais) est une mesure de la force exercée pour déplacer l'électricité d'un endroit à un autre, par exemple de la borne positive d'une pile à la borne négative. Par exemple, une pile AA standard a une tension de 1,5V (V est le symbole des volts) et peut pousser l'électricité avec une force de 1,5V de sa borne positive à sa borne négative. Par exemple, une LED peut s'allumer avec une tension de 2 à 3V, alors qu'une ampoule à filament de 100W nécessite une tension de 240V. Pour en savoir plus sur la tension, consultez la [page sur la tension sur Wikipédia](https://wikipedia.org/wiki/Voltage).
Le potentiomètre en est un exemple. Il s'agit d'un cadran que l'on peut faire tourner entre deux positions et dont le capteur mesure la rotation.
![Un potentiomètre réglé sur un point médian reçoit 5 volts et renvoie 3,8 volts](../../../../images/potentiometer.png).
L'appareil IoT envoie un signal électrique au potentiomètre à une tension, par exemple 5 volts (5V). Lorsque le potentiomètre est ajusté, il modifie la tension qui sort de l'autre côté. Imaginez que vous ayez un potentiomètre étiqueté comme un cadran qui va de 0 à [11](https://wikipedia.org/wiki/Up_to_eleven), comme le bouton de volume d'un amplificateur. Lorsque le potentiomètre est en position complètement désactivée (0), 0V (0 volt) sort. Lorsqu'il est en position d'activation totale (11), 5V (5 volts) sont émis.
> 🎓 Il s'agit d'une simplification excessive, et vous pouvez en savoir plus sur les potentiomètres et les résistances variables sur la [page Wikipédia sur les potentiomètres](https://wikipedia.org/wiki/Potentiometer).
La tension qui sort du capteur est alors lue par l'appareil IoT, qui peut alors y répondre. Selon le capteur, cette tension peut être une valeur arbitraire ou correspondre à une unité standard. Par exemple, un capteur de température analogique basé sur une [thermistance](https://wikipedia.org/wiki/Thermistor) modifie sa résistance en fonction de la température. La tension de sortie peut alors être convertie en température en Kelvin, et donc en °C ou °F, par des calculs en code.
✅ Que pensez-vous qu'il se passe si le capteur renvoie une tension plus élevée que celle qui a été envoyée (par exemple en provenance d'une alimentation externe)? ⛔️ NE TESTEZ PAS cela.
#### Conversion analogique-numérique (CAN)
Les appareils IoT sont numériques - ils ne peuvent pas fonctionner avec des valeurs analogiques, ils ne fonctionnent qu'avec des 0 et des 1. Cela signifie que les valeurs analogiques des capteurs doivent être converties en un signal numérique avant de pouvoir être traitées. De nombreux appareils IoT sont équipés de convertisseurs analogique-numérique (CAN) (ou analog-to-digital converters abrégé en "ADC" en anglais) pour convertir les entrées analogiques en représentations numériques de leur valeur. Les capteurs peuvent également fonctionner avec des convertisseurs analogiques-numériques par l'intermédiaire d'une carte de connexion. Par exemple, dans l'écosystème Seeed Grove avec un Raspberry Pi, les capteurs analogiques se connectent à des ports spécifiques sur un 'chapeau' ('hat' en anglais) qui se trouve sur le Pi connecté aux broches GPIO du Pi, et ce chapeau a un CAN pour convertir la tension en un signal numérique qui peut être envoyé hors des broches GPIO du Pi.
Imaginez que vous ayez un capteur de lumière analogique connecté à un dispositif IoT qui utilise 3,3V et renvoie une valeur de 1V. Cette valeur de 1V ne signifie rien dans le monde numérique et doit donc être convertie. La tension sera convertie en valeur analogique à l'aide d'une échelle qui dépend de l'appareil et du capteur. Le capteur de lumière Seeed Grove, par exemple, émet des valeurs comprises entre 0 et 1023. Pour ce capteur fonctionnant à 3,3V, une sortie de 1V correspondrait à une valeur de 300. Un appareil IoT ne peut pas traiter 300 comme une valeur analogique, donc la valeur serait convertie en `0000000100101100`, la représentation binaire de 300 par le chapeau Grove. Cette valeur serait ensuite traitée par l'appareil IoT.
✅ Si vous ne connaissez pas le binaire, faites quelques recherches pour apprendre comment les nombres sont représentés par des 0 et des 1. La [leçon d'introduction au binaire de BBC Bitesize](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) est un excellent point de départ.
Du point de vue du codage, tout cela est généralement géré par les bibliothèques fournies avec les capteurs, de sorte que vous n'avez pas à vous préoccuper de cette conversion vous-même. Pour le capteur de lumière Grove, vous devez utiliser la bibliothèque Python et appeler la propriété `light`, ou utiliser la bibliothèque Arduino et appeler `analogRead` pour obtenir une valeur de 300.
### Capteurs numériques
Les capteurs numériques, comme les capteurs analogiques, détectent le monde qui les entoure en utilisant les changements de tension électrique. La différence est qu'ils émettent un signal numérique, soit en mesurant seulement deux états, soit en utilisant un CAN intégré. Les capteurs numériques sont de plus en plus courants pour éviter d'avoir à utiliser un CAN, que ce soit sur une carte de connexion ou sur l'appareil IoT lui-même.
Le capteur numérique le plus simple est un bouton ou un interrupteur. Il s'agit d'un capteur à deux états, marche ou arrêt.
![Un bouton reçoit 5 volts. Lorsqu'il n'est pas enfoncé, il renvoie 0 volt, lorsqu'il est enfoncé, il renvoie 5 volts.](../../../../images/button.png)
Les broches des appareils IoT, telles que les broches GPIO, peuvent mesurer ce signal directement sous la forme d'un 0 ou d'un 1. Si la tension envoyée est la même que la tension renvoyée, la valeur lue est 1, sinon la valeur lue est 0. Il n'est pas nécessaire de convertir le signal, il ne peut être que 1 ou 0.
> 💁 Les tensions ne sont jamais exactes, en particulier parce que les composants d'un capteur ont une certaine résistance, et il y a donc généralement une tolérance. Par exemple, les broches GPIO d'un Raspberry Pi fonctionnent sur 3,3V et lisent un signal de retour supérieur à 1,8V comme un 1, inférieur à 1,8 V comme un 0.
* 3,3V entrent dans le bouton. Le bouton étant éteint, 0V en sort, ce qui donne une valeur de 0
* 3,3V entrent dans le bouton. Le bouton est allumé, donc 3,3V sort, ce qui donne une valeur de 1
Les capteurs numériques plus avancés lisent les valeurs analogiques, puis les convertissent en signaux numériques à l'aide de convertisseurs analogiques/numériques embarqués. Par exemple, un capteur de température numérique utilise toujours un thermocouple de la même manière qu'un capteur analogique et mesure toujours la variation de tension causée par la résistance du thermocouple à la température actuelle. Au lieu de renvoyer une valeur analogique et de compter sur l'appareil ou la carte de connexion pour la convertir en un signal numérique, un CAN intégré au capteur convertira la valeur et l'enverra sous la forme d'une série de 0 et de 1 à l'appareil IoT. Ces 0 et 1 sont envoyés de la même manière que le signal numérique d'un bouton, 1 étant la pleine tension et 0 étant 0v.
![Un capteur de température numérique convertissant une lecture analogique en données binaires avec 0 comme 0 volt et 1 comme 5 volts avant de l'envoyer à un dispositif IoT.](../../../../images/temperature-as-digital.png)
L'envoi de données numériques permet aux capteurs de devenir plus complexes et d'envoyer des données plus détaillées, voire des données cryptées pour les capteurs sécurisés. L'appareil photo en est un exemple. Il s'agit d'un capteur qui capture une image et l'envoie sous forme de données numériques contenant cette image, généralement dans un format compressé tel que JPEG, pour qu'elle soit lue par l'appareil IoT. Il peut même diffuser de la vidéo en capturant des images et en envoyant soit l'image complète image par image, soit un flux vidéo compressé.
## Qu'est-ce que les actionneurs?
Les actionneurs sont l'opposé des capteurs : ils convertissent un signal électrique provenant de votre appareil IoT en une interaction avec le monde physique, par exemple en émettant une lumière ou un son, ou en faisant bouger un moteur.
Les actionneurs les plus courants sont les suivants
* LED - elles émettent de la lumière lorsqu'elles sont allumées.
* Haut-parleur : il émet un son en fonction du signal qui lui est envoyé, qu'il s'agisse d'un simple buzzer ou d'un haut-parleur audio capable de diffuser de la musique.
* Moteur pas à pas : il convertit un signal en une quantité définie de rotation, par exemple en tournant un cadran de 90°.
* Relais : il s'agit d'interrupteurs qui peuvent être activés ou désactivés par un signal électrique. Ils permettent à une petite tension provenant d'un appareil IoT d'activer des tensions plus importantes.
* Écrans - il s'agit d'actionneurs plus complexes qui affichent des informations sur un écran à segments multiples. Les écrans varient d'un simple affichage LED à des moniteurs vidéo haute résolution.
✅ Faites des recherches. Quels sont les actionneurs de votre téléphone ?
## Utiliser un actionneur
Suivez le guide ci-dessous pour ajouter un actionneur à votre appareil IoT, contrôlé par le capteur, afin de créer une veilleuse IoT. Elle recueillera les niveaux de lumière du capteur de lumière et utilisera un actionneur sous la forme d'une LED pour émettre de la lumière lorsque le niveau de lumière détecté est trop faible.
![Organigramme de la mission montrant la lecture et le contrôle des niveaux d'éclairage, et le début de la commande des LED](../../../../images/assignment-1-flow.png)
* [Arduino - Terminal Wio](wio-terminal-actuator.fr.md)
* [Ordinateur monocarte - Raspberry Pi](pi-actuator.fr.md)
* [Ordinateur monocarte - Dispositif virtuel](virtual-device-actuator.fr.md)
## Les types d'actionneurs
Comme les capteurs, les actionneurs sont soit analogiques, soit numériques.
### Actionneurs analogiques
Les actionneurs analogiques prennent un signal analogique et le convertissent en une sorte d'interaction, où l'interaction change en fonction de la tension fournie.
Un exemple est celui d'une lampe à intensité variable, comme celles que vous avez peut-être dans votre maison. La quantité de tension fournie à la lampe détermine sa luminosité.
![Une lumière atténuée à une basse tension et plus brillante à une tension plus élevée](../../../../images/dimmable-light.png)
Comme pour les capteurs, l'appareil IoT proprement dit fonctionne avec des signaux numériques et non analogiques. Cela signifie que pour envoyer un signal analogique, l'appareil IoT a besoin d'un convertisseur numérique-analogique (CNA), soit directement sur l'appareil IoT, soit sur une carte de connexion. Cela convertira les 0 et les 1 de l'appareil IoT en une tension analogique que l'actionneur peut utiliser.
✅ À votre avis, que se passe-t-il si l'appareil IoT envoie une tension plus élevée que celle que l'actionneur peut gérer ?
⛔️ NE PAS tester cela.
#### Modulation de largeur d'impulsion (ou Pulse-Width Modulation en anglais abrégé en PWM)
Une autre option pour convertir les signaux numériques d'un appareil IoT en un signal analogique est la modulation de largeur d'impulsion. Il s'agit d'envoyer de nombreuses impulsions numériques courtes qui agissent comme s'il s'agissait d'un signal analogique.
Par exemple, vous pouvez utiliser la modulation de largeur d'impulsion pour contrôler la vitesse d'un moteur.
Imaginez que vous contrôliez un moteur avec une alimentation de 5V. Vous envoyez une brève impulsion à votre moteur, en faisant passer la tension à un niveau élevé (5V) pendant deux centièmes de seconde (0,02s). Pendant ce temps, votre moteur peut effectuer un dixième de tour, soit 36°. Le signal s'interrompt ensuite pendant deux centièmes de seconde (0,02 s), envoyant un signal bas (0V). Chaque cycle de marche puis d'arrêt dure 0,04s. Le cycle se répète ensuite.
![Rotation par modulation de largeur d'impulsion d'un moteur à 150 RPM](../../../../images/pwm-motor-150rpm.png)
Cela signifie qu'en une seconde, 25 impulsions de 5V de 0,02s font tourner le moteur, chacune étant suivie d'une pause de 0V de 0,02s qui ne fait pas tourner le moteur. Chaque impulsion fait tourner le moteur d'un dixième de tour, ce qui signifie que le moteur effectue 2,5 rotations par seconde. Vous avez utilisé un signal numérique pour faire tourner le moteur à 2,5 tours par seconde, soit 150 [tours par minute](https://wikipedia.org/wiki/Revolutions_per_minute) (une mesure non standard de la vitesse de rotation).
```sortie
25 pulses per second x 0.1 rotations per pulse = 2.5 rotations per second
2.5 rotations per second x 60 seconds in a minute = 150rpm
```
> 🎓 Lorsqu'un signal PWM est activé pendant la moitié du temps et désactivé pendant l'autre moitié, on parle d'un [cycle de service de 50 %](https://wikipedia.org/wiki/Duty_cycle). Les rapports cycliques sont mesurés en pourcentage du temps pendant lequel le signal est activé par rapport au temps pendant lequel il est désactivé.
![Rotation par modulation de largeur d'impulsion d'un moteur à 75 RPM](../../../../images/pwm-motor-75rpm.png)
Vous pouvez modifier la vitesse du moteur en changeant la taille des impulsions. Par exemple, avec le même moteur, vous pouvez conserver le même temps de cycle de 0,04 s, en réduisant de moitié l'impulsion de marche à 0,01 s et en augmentant l'impulsion d'arrêt à 0,03 s. Vous avez le même nombre d'impulsions par seconde (25), mais chaque impulsion de marche est réduite de moitié. Vous avez le même nombre d'impulsions par seconde (25), mais chaque impulsion de marche est deux fois moins longue. Une impulsion de demi-longueur ne fait tourner le moteur que d'un vingtième de tour, et à 25 impulsions par seconde, le moteur effectue 1,25 rotation par seconde, soit 75 tours par minute. En modifiant la vitesse d'impulsion d'un signal numérique, vous avez réduit de moitié la vitesse d'un moteur analogique.
```sortie
25 pulses per second x 0.05 rotations per pulse = 1.25 rotations per second
1.25 rotations per second x 60 seconds in a minute = 75rpm
```
✅ Comment assurer la fluidité de la rotation du moteur, en particulier à faible vitesse ? Utilisez-vous un petit nombre d'impulsions longues avec de longues pauses ou un grand nombre d'impulsions très courtes avec de très courtes pauses?
> 💁 Certains capteurs utilisent également le PWM pour convertir les signaux analogiques en signaux numériques.
> 🎓 Pour en savoir plus sur la modulation de largeur d'impulsion, consultez la page consacrée à [la modulation de largeur d'impulsion sur Wikipédia](https://wikipedia.org/wiki/Pulse-width_modulation).
### Actionneurs numériques
Les actionneurs numériques, comme les capteurs numériques, ont soit deux états contrôlés par une tension haute ou basse, soit un convertisseur numérique-analogique intégré qui permet de convertir un signal numérique en un signal analogique.
Un actionneur numérique simple est une LED. Lorsqu'un dispositif envoie un signal numérique de 1, une haute tension est envoyée et allume la LED. Lorsqu'un signal numérique de 0 est envoyé, la tension chute à 0V et la LED s'éteint.
![Une LED est éteinte à 0 volt et allumée à 5V](../../../../images/led.png)
✅ À quels autres actionneurs simples à deux états pouvez-vous penser ? Un exemple est le solénoïde, qui est un électro-aimant qui peut être activé pour faire des choses comme déplacer un pêne de porte qui verrouille/déverrouille une porte.
Les actionneurs numériques plus avancés, tels que les écrans, exigent que les données numériques soient envoyées dans certains formats. Ils sont généralement livrés avec des bibliothèques qui facilitent l'envoi des données correctes pour les contrôler.
---
## 🚀 Challenge
Le défi des deux dernières leçons consistait à dresser la liste du plus grand nombre possible d'appareils IoT présents chez vous, à l'école ou sur votre lieu de travail, et de déterminer s'ils sont construits autour de microcontrôleurs ou d'ordinateurs monocartes, ou même d'un mélange des deux.
Pour chaque appareil que vous avez répertorié, à quels capteurs et actionneurs sont-ils connectés? Quelle est l'utilité de chaque capteur et actionneur connecté à ces dispositifs?
## Quiz de validation des connaissances
[Quiz de validation des connaissances](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6)
## Révision et auto-apprentissage
* En apprendre plus sur l'électricité et les circuits sur [ThingLearn](http://thinglearn.jenlooper.com/curriculum/).
* Pour en savoir plus sur les différents types de capteurs de température, consultez le [guide des capteurs de température de Seeed Studios](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/)
* Pour en savoir plus sur les LED, consultez [la page LED de Wikipédia](https://wikipedia.org/wiki/Light-emitting_diode)
## Affectation
[Recherche sur les capteurs et les actionneurs](assignment.fr.md)

@ -1,222 +0,0 @@
# 센서 및 액추에이터(actuator)를 통한 물리적 환경과의 상호작용
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-3.jpg)
> [Nitya Narasimhan](https://github.com/nitya) 의 스케치노트입니다. 이미지를 클릭하여 크게 보세요.
이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 에서 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 시리즈의 일부로 제공되었습니다. . 수업은 2개의 비디오로 진행되었습니다. 1시간의 수업과 1시간의 추가 공부 시간을 통해 수업의 내용을 더 깊이 파고들어 질문에 답하고자 합니다.
[![Lesson 3: Interact with the Physical World with Sensors and Actuators](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4)
[![Lesson 3: Interact with the Physical World with Sensors and Actuators - Office hours](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA)
> 🎥 동영상을 보려면 위의 이미지를 클릭하세요
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
## 소개
이 수업은 IoT 장치를 위한 두 가지 중요한 개념인 센서와 액추에이터를 소개한다. 당신은 또한 IoT 프로젝트에 광센서를 추가하고, 조도에 의해 제어되는 LED를 추가하여, 효과적으로 야간 조명을 구축할 수 있습니다.
이 수업에서는 다음을 다룹니다:
* [센서란 무엇인가](#센서란-무엇인가)
* [센서를 사용해보자](#센서를-사용해보자)
* [센서의 종류](#센서의-종류)
* [액추에이터란 무엇인가](#액추에이터란-무엇인가)
* [액추에이터를 사용해보자](#액추에이터를-사용해보자)
* [액추에이터의 종류](#액추에이터의-종류)
## 센서란 무엇인가
센서는 물리적 세계를 감지하는 하드웨어 장치입니다. 즉, 센서는 주변의 하나 이상의 속성을 측정하고 정보를 IoT 장치로 보냅니다. 센서는 대기 온도와 같은 자연적 특성부터 움직임과 같은 물리적 상호 작용까지, 측정할 수 있는 것이 매우 많아 방대한 범위의 장치를 포괄합니다.
일반적인 센서에는 다음이 포함됩니다.
- 온도 센서 - 공기 온도 또는 물에 담그는 곳의 온도를 감지합니다. 애호가들과 개발자들에게, 이것들은 종종 단일 센서에서 기압과 습도와 결합됩니다.
- 버튼 - 버튼을 눌렀을 때 신호가 감지됩니다.
- 광센서 - 광도를 감지하고 특정 색상, 자외선, 적외선 또는 일반적인 가시광선일 수 있습니다.
- 카메라 - 사진을 찍거나 비디오를 스트리밍함으로써 세계의 시각적 표현을 감지합니다.
- 가속도계 - 여러 방향으로의 움직임을 감지합니다.
- 마이크 - 일반적인 소리 수준 또는 방향성 소리를 감지합니다.
✅ 생각해봅시다. 여러분의 휴대전화에는 어떤 센서가 있나요?
모든 센서는 감지하는 모든 것을 IoT 장치로 해석할 수 있는 전기 신호로 변환한다는 한 가지 공통점이 있습니다. 이 전기 신호가 어떻게 해석되는지는 IoT 장치와 통신하는 데 사용되는 통신 프로토콜뿐만 아니라 센서에 따라 다릅니다.
## 센서를 사용해보자
아래의 관련 안내에 따라 IoT 장치에 센서를 추가하십시오.
* [아두이노 - Wio Terminal](wio-terminal-sensor.md)
* [싱글보드 컴퓨터 - Raspberry Pi](pi-sensor.md)
* [싱글보드 컴퓨터 - 가상기기](virtual-device-sensor.md)
## 센서의 종류
센서는 아날로그 센서와 디지털 센서가 있습니다.
### 아날로그 센서
가장 기본적인 센서 중 하나는 아날로그 센서입니다. 이러한 센서는 IoT 장치로부터 전압을 공급받고, 센서 컴포넌트가 전압을 조정하며, 센서로부터 반환되는 전압을 측정하여 센서 값을 제공합니다.
> 🎓전압은 배터리의 +극에서 -극 으로 전기를 이동시키기 위해 한 장소에서 다른 장소로 얼마나 밀리는지를 측정하는 것입니다. 예를 들어, 표준 AA 배터리는 1.5V(V는 볼트 기호)이며, 양극 단자에서 음극 단자로 1.5V의 힘으로 전기를 밀어낼 수 있다. 다른 전기 하드웨어가 작동하려면 다른 전압이 필요합니다. 예를 들어 LED 캔은 2~3V 사이에서 켜지지만 100W 필라멘트 전구는 240V가 필요합니다. 전압에 대한 자세한 내용은 [Wikipedia 에서 Voltage 검색](https://wikipedia.org/wiki/Voltage) 시 확인 가능합니다.
이것의 한 예는 Potentiometer (포텐셔미터)입니다. 이것은 두 위치 사이에서 회전할 수 있고 센서가 회전을 측정하는 다이얼입니다.
![중간 지점에 설정된 potentiometer가 5V를 전송하여 3.8V를 반환합니다.]
(../../../images/potentiometer.png)
IoT 장치는 포텐셔미터에 5V와 같은 전압으로 전기 신호를 보냅니다. 포텐셔미터가 조정되면 반대쪽에서 나오는 전압이 바뀝니다. 앰프의 볼륨 조정기와 같이 0에서 [11](https://wikipedia.org/wiki/Up_to_eleven)로 이동하는 다이얼로 표시된 포텐셔미터가 있다고 가정해 봅시다. 포텐셔미터가 완전히 꺼진 위치(0)에 있으면 0V(0V)가 나옵니다. 최대 ON 위치(11)에 있으면 5V(5V)가 나옵니다.
> 🎓 이것은 지나치게 단순화된 것이며, [Wikipedia에서 potentiometer 검색 시](https://wikipedia.org/wiki/Potentiometer) 포텐셔미터 및 가변 저항기에 대해 더 많은 정보를 얻을 수 있습니다..
센서에서 나오는 전압은 IoT 장치에 의해 읽혀지고, 그 장치는 그것에 반응할 수 있습니다. 센서에 따라 이 전압은 임의 값이거나 표준 장치에 매핑될 수 있습니다. 예를 들어, [서미스터](https://wikipedia.org/wiki/Thermistor) 에 기반한 아날로그 온도 센서는 온도에 따라 저항이 변화합니다. 출력 전압은 코드 계산을 통해 켈빈 단위로, 그에 따라 °C 또는 °F 단위로 변환될 수 있습니다.
✅ 센서가 전송된 전압보다 높은 전압을 반환할 경우(예: 외부 전원 공급 장치에서 나오는 전압) 어떻게 된다고 생각하십니까?
⛔️ 호기심에 실험 해 보진 마십시오.
#### 아날로그에서 디지털로의 변환
IoT는 디지털 장치입니다. 아날로그 값으로는 작동할 수 없고 0과 1에서만 작동합니다. 즉, 아날로그 센서 값을 처리하기 전에 디지털 신호로 변환해야 합니다. 많은 IoT 장치들은 아날로그 입력을 디지털 값 표현으로 변환하는 아날로그-디지털 변환기(ADC)를 가지고 있습니다. 센서는 커넥터 보드를 통해 ADC와 함께 작동할 수도 있습니다. 예를 들어, Raspberry Pi가 있는 seeed Grove ecosystem에서 아날로그 센서는 Pi에 있는 'hat'의 특정 포트에 연결됩니다. 이 포트는 Pi의 GPIO 핀에 연결되어 있습니다. 또한 이 “hat”은 전압을 파이의 GPIO 핀에서 보낼 수 있는 디지털 신호로 변환하기 위한 ADC가 있습니다.
3.3V를 사용하고 1V의 값을 반환하는 IoT 장치에 연결된 아날로그 광 센서가 있다고 가정 해 봅시다. 이 1V는 디지털 세계에서 아무런 의미가 없기 때문에 변환이 필요합니다. 전압은 장치와 센서에 따라 스케일을 사용하여 아날로그 값으로 변환됩니다. 한 가지 예는 0에서 1,023까지의 값을 출력하는 씨드 그로브 광 센서입니다. 3.3V에서 작동하는 이 센서의 경우 1V 출력은 300입니다. IoT 기기는 300을 아날로그 값으로 처리할 수 없기 때문에 300을 Grove hat로 이진법으로 표현한 `0000000100101100`으로 변환됩니다. 그러면 이것은 IoT 장치에 의해 처리될 것 입니다.
✅ 2진법을 모르면 숫자가 0과 1로 어떻게 표현되는지 알아보기 위해 약간의 공부를 추천합니다. [BBC Bitesize introduction to binary lesson](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1)는 이진법을 공부하기 좋은 곳입니다.
코딩의 관점에서 볼 때, 이 모든 것은 보통 센서와 함께 제공되는 라이브러리에 의해 처리되므로, 당신은 이 변환에 대해 스스로 걱정할 필요가 없습니다. Grove 광센서의 경우 파이썬 라이브러리를 사용하여 `light (빛)` 속성을 호출하거나 아두이노 라이브러리를 사용하여 `analogRead` 를 호출하여 300의 값을 얻을 수 있습니다.
### 디지털 센서
아날로그 센서와 같은 디지털 센서는 전압의 변화를 이용하여 주변 세계를 감지합니다. 차이점은 두 개의 상태만 측정하거나 내장된 ADC를 사용하여 디지털 신호를 출력한다는 것입니다. 디지털 센서는 커넥터 보드 또는 IoT 장치 자체에서 ADC를 사용할 필요성을 피하기 위해 점점 더 보편화되고 있습니다.
가장 간단한 디지털 센서는 버튼 또는 스위치입니다. 이것은 켜지거나 꺼지는 두 가지 상태의 센서입니다.
![버튼은 5V로 전송됩니다. 이 스위치를 누르지 않으면 0V가 반환되고, 누르면 5V가 반환됩니다](../../../../images/button.png)
GPIO 핀과 같은 IoT 장치의 핀은 이 신호를 직접 0 또는 1로 측정할 수 있습니다. 전송된 전압이 반환된 전압과 같으면 판독값이 1이고, 그렇지 않으면 판독값이 0입니다. 신호를 변환할 필요가 없습니다. 1 또는 0만 가능합니다.
> 💁 전압은 절대 정확하지 않습니다. 특히 센서의 구성 요소에는 약간의 저항이 있기 때문에 일반적으로 공차가 있습니다. 예를 들어, 라즈베리 파이 상의 GPIO 핀은 3.3V에서 작동하며 1.8V 이상은 1로, 1.8V는 0으로 읽습니다.
* 3.3V가 버튼에 들어갑니다. 버튼이 꺼져 있으므로 0V가 나오고 값이 0입니다.
* 3.3V가 버튼에 들어갑니다. 버튼은 3번으로 되어 있어요.3V가 나오고 값이 1입니다.
더 발전된 디지털 센서는 아날로그 값을 판독한 다음, 온보드 ADC를 사용하여 디지털 신호로 변환합니다. 예를 들어, 디지털 온도 센서는 아날로그 센서와 동일한 방식으로 열전대를 사용하며, 현재 온도에서 열전대의 저항으로 인한 전압 변화를 계속 측정합니다. 아날로그 값을 반환하고 장치나 커넥터 보드에 의존해 디지털 신호로 변환하는 대신 센서에 내장된 ADC가 값을 변환해 IoT 장치에 0과 1의 직렬로 전송합니다. 이러한 0과 1은 1이 최대 전압이고 0이 0v인 버튼에 대한 디지털 신호와 동일한 방식으로 전송됩니다.
![IoT 장치로 전송하기 전에 아날로그 판독값을 0V, 1V를 5V로 하는 이진 데이터로 변환하는 디지털 온도 센서](../../../../images/temperature-as-digital.png)
디지털 데이터를 전송하면 센서가 더욱 복잡해지고 더 자세한 데이터, 심지어 보안 센서를 위해 암호화된 데이터까지 전송할 수 있습니다. 카메라를 생각해봅시다. 카메라는 이미지를 캡처하여 IoT 장치에서 읽을 수 있도록 보통 JPEG와 같은 압축 형식으로 해당 이미지를 전송합니다. 이미지를 캡처하고 전체 이미지 프레임을 프레임별로 전송하거나 압축된 비디오 스트림을 전송하여 비디오를 스트리밍할 수도 있습니다.
## 액추에이터란 무엇인가
액추에이터는 센서의 반대입니다. IoT 장치에서 나오는 전기 신호를 빛이나 소리를 방출하거나 모터를 움직이는 것과 같은 물리적 세계와의 상호 작용으로 변환합니다.
일반적인 액추에이터에는 다음이 포함됩니다 :
* LED - 켜지면 빛이 방출됩니다.
* 스피커 - 기본 부저에서 음악을 재생할 수 있는 오디오 스피커로 전송된 신호에 따라 소리를 냅니다.
* 스테퍼 모터 - 신호를 다이얼 90° 회전과 같이 정의된 회전량으로 변환합니다.
* 릴레이 - 전기 신호에 의해 켜지거나 끌 수 있는 스위치입니다. 그것들은 IoT 장치의 작은 전압이 큰 전압을 켜도록 합니다.
* 화면 - 보다 복잡한 액추에이터로 멀티 세그먼트 디스플레이에 정보를 표시합니다. 화면은 단순한 LED 디스플레이부터 고해상도 비디오 모니터까지 다양합니다.
✅ 생각해봅시다. 당신의 휴대전화에는 어떤 액추에이터가 있습니까?
## 액추에이터를 사용해보자
아래의 관련 안내에 따라 센서에 의해 제어되는 IoT 장치에 작동기를 추가하여 IoT 야간 조명을 만드십시오. 광센서로부터 광도를 모으고, 검출된 광도가 너무 낮을 때 발광하기 위해 LED 형태의 액추에이터를 사용합니다.
![조명 값을 읽어오고 확인 후 LED 제어 시작을 보여주는 할당 흐름도](../../../../images/assignment-1-flow.png)
* [아두이노 - 위오 터미널](wio-terminal-actuator.md)
* [싱글 보드 컴퓨터 - 라즈베리 파이](pi-actuator.md)
* [싱글 보드 컴퓨터 - 가상 ](virtual-device-actuator.md)
## 액추에이터의 종류
센서와 마찬가지로 액추에이터도 아날로그 또는 디지털입니다.
### 아날로그 액추에이터(actuator)
아날로그 액추에이터는 아날로그 신호를 받아 일종의 상호 작용으로 변환하며, 상호 작용은 공급되는 전압에 따라 변화합니다.
한 가지 예는 여러분이 집에 가지고 있을 수 있는 것과 같은 희미한 불빛입니다. 조명에 공급되는 전압의 양에 따라 조명의 밝기가 결정됩니다.
![낮은 전압에서는 희미해지고 높은 전압에서는 밝아지는 조명](../../../../images/dimmable-light.png)
센서와 마찬가지로 실제 IoT 장치는 아날로그가 아닌 디지털 신호에서 작동합니다. 즉, 아날로그 신호를 보내려면 IoT 장치가 직접 IoT 장치 또는 커넥터 보드에 디지털-아날로그 변환기(DAC)가 필요합니다. 그러면 IoT 장치의 0과 1이 액추에이터가 사용할 수 있는 아날로그 전압으로 변환됩니다.
✅ IoT 장치가 액추에이터가 처리할 수 있는 것보다 높은 전압을 전송하면 어떻게 된다고 생각하십니까?
⛔️ 실험 해 보진 마십시오.
### 펄스 폭 변조 (Pulse-Width Modulation)
IoT 장치에서 아날로그 신호로 디지털 신호를 변환하는 또 다른 옵션은 펄스 폭 변조입니다. 이것은 마치 아날로그 신호인 것처럼 작동하는 많은 짧은 디지털 펄스를 보내는 것을 포함합니다.
예를 들어 PWM을 사용하여 모터의 속도를 제어할 수 있습니다.
5V 전원으로 모터를 제어한다고 가정해 보십시오. 모터에 짧은 펄스를 전송하여 전압을 200분의 2초(0.02초) 동안 High(5V)로 전환합니다. 그 시간 동안 당신의 모터는 10분의 1 또는 36° 회전할 수 있습니다. 그런 다음 신호가 200분의 2초(0.02초) 동안 일시 중지되어 낮은 신호(0V)를 전송합니다. 각 ON/OFF 사이클은 0.04초 동안 지속됩니다. 그런 다음 주기가 반복됩니다.
![150rpm에서 모터의 PULE 폭 변조 회전](../../../../images/pwm-motor-150rpm.png)
즉, 1초 동안 모터를 회전시키는 0.02초의 255V 펄스가 있고, 그 후 모터를 회전하지 않는 0.02초의 0.02초의 일시 중지 상태가 있음을 의미합니다. 각 펄스는 모터를 회전의 10분의 1로 회전시킵니다. 즉, 모터가 초당 2.5회전을 완료한다는 의미입니다. 디지털 신호를 사용하여 모터를 초당 2.5회전 또는 [분당 150회](https://wikipedia.org/wiki/Revolutions_per_minute) (비표준 회전 속도 측정)으로 회전했습니다.
```output
초당 25펄스 x 펄스당 0.1회전 = 초당 2.5회전
초당 2.5회전 x 1분에 60초 = 150rpm
```
> 🎓 PWM 신호가 절반 동안 켜져 있고 절반 동안 꺼져 있는 경우를 [50% duty cycle](https://wikipedia.org/wiki/Duty_cycle) 이라고 합니다. 듀티 사이클은 신호가 꺼진 상태와 비교하여 켜진 상태에 있는 시간의 백분율로 측정됩니다.
![75rpm에서 모터의 PULE 폭 변조 회전](../../../../images/pwm-motor-75rpm.png)
펄스 크기를 변경하여 모터 속도를 변경할 수 있습니다. 예를 들어, 동일한 모터를 사용하여 0.04초의 동일한 사이클 시간을 유지할 수 있으며, 온 펄스는 0.01초로 절반으로, 오프 펄스는 0.03초로 증가할 수 있습니다. 초당 펄스 수(25)는 동일하지만 각 펄스의 길이는 절반입니다. 1/2 길이의 펄스는 모터를 20분의 1 회전만 돌리게 하며, 25펄스에서는 초당 1.25회전을 완료하거나 75rpm으로 회전합니다. 디지털 신호의 펄스 속도를 변경함으로써 아날로그 모터 속도를 절반으로 줄였습니다.
```output
초당 25펄스 x 펄스당 0.05회전 = 초당 1.25회전
초당 1.25회 회전 x 1분 동안 60초 = 75rpm
```
✅ 특히 저속 주행 시 모터 회전을 원활하게 유지하려면 어떻게 해야 합니까? 긴 일시 중지를 사용하는 긴 펄스 수를 사용할 것입니까, 아니면 매우 짧은 일시 중지를 사용하는 짧은 펄스 수를 사용할 것입니까?
> 💁 일부 센서는 PWM을 사용하여 아날로그 신호를 디지털 신호로 변환하기도 합니다.
> 🎓 [Wikipedia에서 펄스 폭 변조 검색](https://wikipedia.org/wiki/Pulse-width_modulation) 시 자세한 정보를 얻을 수 있습니다.
### 디지털 액추에이터(actuator)
디지털 센서와 같은 디지털 액추에이터는 고전압 또는 저전압에 의해 제어되는 두 가지 상태를 가지고 있거나 디지털 신호를 아날로그 신호로 변환할 수 있도록 DAC가 내장되어 있습니다.
하나의 간단한 디지털 작동기는 LED입니다. 장치가 1의 디지털 신호를 보내면 LED를 켜는 고전압이 전송됩니다. 0의 디지털 신호가 전송되면 전압이 0V로 떨어지고 LED가 꺼집니다.
![LED는 0V에서 꺼지고 5V에서 켜집니다.](../../../../images/led.png)
✅ 다른 간단한 2-state 액추에이터는 무엇입니까? 한 예로 솔레노이드가 있는데, 이는 도어 볼트를 움직이기 위해 작동하거나 도어를 잠금/잠금 해제하는 등의 작업을 수행할 수 있는 전자석입니다.
화면과 같은 더 발전된 디지털 작동기는 디지털 데이터가 특정 형식으로 전송되어야 합니다. 그들은 보통 그들을 제어하기 위해 정확한 데이터를 더 쉽게 보낼 수 있는 라이브러리와 함께 제공됩니다.
---
## 🚀 도전
이전 두 강의의 과제는 가정, 학교 또는 직장에 있는 가능한 한 많은 IoT 장치를 나열하고 그것들이 마이크로컨트롤러 또는 단일 보드 컴퓨터 또는 심지어 둘의 혼합으로 구축되었는지 결정하는 것이었습니다.
생각해 낸 모든 장치들은 어떤 센서와 액추에이터에 연결되어 있습니까? 이러한 장치에 연결된 각 센서와 액추에이터의 용도는 무엇입니까?
## 복습 퀴즈
[복습 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6)
## 리뷰 & 추가 개별학습
* 전기 및 회로에 대한 정보를 읽어보세요 [ThingLearn](http://thinglearn.jenlooper.com/curriculum/).
* 다양한 유형의 온도 센서에 대한 자세한 내용은 [Seeed Studios Temperature Sensors guide](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) 를 참조하세요
* LED에 관한 내용은 [Wikipedia LED page](https://wikipedia.org/wiki/Light-emitting_diode) 에서 확인하세요
## 과제
[센서와 액추에이터에 대하여 알아보자](assignment.md)

@ -1,21 +0,0 @@
<div dir="rtl">
# بحث مستشعرات و مشغلات
## تعليمات
غطى هذا الدرس أجهزة الاستشعار والمحركات. ابحث وأوصف مستشعرًا ومشغلًا واحدًا يمكن استخدامه مع مجموعة أدوات تطوير إنترنت الأشياء ، بما في ذلك:
* ماذا يفعل
* الأجهزة الإلكترونية / الأجهزة المستخدمة بالداخل
* هل هو تناظري أم رقمي
* ما هي وحدات ونطاق المدخلات أو القياسات
## الموضوع
| المعايير | نموذجي | كافية | يحتاج إلى تحسين |
| -------- | --------- | -------- | ----------------- |
| وصف جهاز استشعار | وصف جهاز استشعار بما في ذلك تفاصيل عن جميع الأقسام الأربعة المذكورة أعلاه. | وصف جهاز استشعار ، ولكنه كان قادرًا فقط على توفير 2-3 من الأقسام أعلاه | وصف جهاز استشعار ، لكنه كان قادرًا فقط على توفير 1 من الأقسام أعلاه |
| وصف المشغل | وصف المشغل بما في ذلك التفاصيل لجميع الأقسام الأربعة المذكورة أعلاه. | وصف مشغل ، لكنه كان قادرًا فقط على توفير 2-3 من الأقسام أعلاه | وصف مشغل ، لكنه كان قادرًا فقط على توفير 1 من الأقسام أعلاه |
</div>

@ -1,17 +0,0 @@
# সেন্সর এবং অ্যাকচুয়েটর সংক্রান্ত গবেষণা
## নির্দেশনা
এই পাঠটিতে সেন্সর এবং অ্যাকচুয়েটর আলোচনা হয়েছে। একটি আইওটি ডেভলাপার কিটে ব্যবহার করা যেতে পারে এমন একটি সেন্সর এবং একটি অ্যাকচুয়েটর বর্ণনা করতে হবে, যেখানে উল্লেখ থাকবে:
* এটি কী কাজ করে
* ভিতরে ব্যবহৃত ইলেকট্রনিক্স/হার্ডওয়্যার
* এটি কি অ্যানালগ নাকি ডিজিটাল
* ইনপুট বা পরিমাপের একক কী এবং যন্ত্রটির ব্যবহার্য সীমা (range) কতটুকু
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা (সর্বোত্তম) | পর্যাপ্ত ব্যখ্যা (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) |
| -------- | --------- | -------- | ----------------- |
| একটি সেন্সর সংক্রান্ত বর্ণনা | উপরে তালিকাভুক্ত 4 টি বিভাগের বিশদ ব্যখ্যা সহ সেন্সর বর্ণিত হয়েছে | একটি সেন্সর বর্ণিত হয়েছ, তবে উপরের তালিকা থেকে কেবল 2-3টি বিষয় ব্যখ্যা করতে সক্ষম হয়েছে | একটি সেন্সর বর্ণিত হয়েছ, তবে উপরের তালিকা থেকে কেবল 1টি বিষয় ব্যখ্যা করতে সক্ষম হয়েছে |
| একটি অ্যাকচুয়েটর সংক্রান্ত বর্ণনা | উপরে তালিকাভুক্ত 4 টি বিভাগের বিশদ ব্যখ্যা সহ অ্যাকচুয়েটর বর্ণিত হয়েছে | একটি অ্যাকচুয়েটর বর্ণিত হয়েছ, তবে উপরের তালিকা থেকে কেবল 2-3টি বিষয় ব্যখ্যা করতে সক্ষম হয়েছে | একটি অ্যাকচুয়েটর বর্ণিত হয়েছ, তবে উপরের তালিকা থেকে কেবল 1টি বিষয় ব্যখ্যা করতে সক্ষম হয়েছে |

@ -1,17 +0,0 @@
# Recherche sur les capteurs et actionneurs
## Instructions
Cette leçon a porté sur les capteurs et les actionneurs. Recherchez et décrivez un capteur et un actionneur pouvant être utilisés avec un kit de développement IoT :
* Sa fonction
* L'électronique/le matériel utilisé à l'intérieur
* Est-il analogique ou numérique ?
* Quelles sont les unités et la gamme d'entrées ou de mesures?
## Rubrique
| Critères | Exemplaire | Adéquat | Besoin d'amélioration |
| -------- | --------- | -------- | ----------------- |
| Décrire un capteur | Décrire un capteur en détaillant les 4 sections énumérées ci-dessus. | Avoir pu décrire un capteur, mais n'avoir pu fournir que 2 ou 3 des sections ci-dessus. | Avoir pu décrire un capteur, mais n'avoir pu fournir qu'une seule des sections ci-dessus. |
| Décrire un actionneur | Description d'un actionneur comprenant des détails pour les 4 sections énumérées ci-dessus. | Avoir décrit un actionneur, mais n'avoir pu fournir que 2 ou 3 des sections ci-dessus. | Avoir décrit un actionneur, mais n'avoir pu fournir qu'une seule des sections ci-dessus. |

@ -1,17 +0,0 @@
# रिसर्च सेंसर और एक्चुएटर्स
## निर्देश
इस पाठ में सेंसर और एक्चुएटर्स शामिल थे। अनुसंधान करें और एक सेंसर तथा एक एक्चुएटर का वर्णन करें जिसका उपयोग IoT देव किट के साथ किया जा सकता है, जिसमें शामिल हैं:
* यह क्या करता है
* अंदर इस्तेमाल होने वाले इलेक्ट्रॉनिक्स / हार्डवेयर
* क्या यह एनालॉग या डिजिटल है
* इनपुट या माप की यूनिट और रेंज क्या है
## रूब्रिक
| मानदंड | अनुकरणीय | पर्याप्त | सुधार की जरूरत |
| -------- | ------------- | -------- | ----------------- |
| एक सेंसर का वर्णन करें | ऊपर सूचीबद्ध सभी 4 अनुभागों के विवरण सहित एक सेंसर का वर्णन किया गया है। | एक सेंसर का वर्णन किया गया है, लेकिन ऊपर के केवल 2-3 अनुभाग प्रदान करने में सक्षम थे | एक सेंसर का वर्णन किया है, लेकिन ऊपर दिए गए अनुभागों में से केवल 1 प्रदान करने में सक्षम थे |
| एक एक्चुएटर का वर्णन करें | ऊपर सूचीबद्ध सभी 4 वर्गों के विवरण सहित एक एक्चुएटर का वर्णन किया गया है। | एक एक्चुएटर का वर्णन किया गया है, लेकिन ऊपर के केवल 2-3 अनुभाग प्रदान करने में सक्षम थे | एक एक्चुएटर का वर्णन किया है, लेकिन ऊपर के केवल 1 अनुभाग प्रदान करने में सक्षम थे |

@ -1,17 +0,0 @@
# 센서와 액추에이터에 대하여 알아보자
## 소개
이 수업에서는 센서와 액추에이터에 대해 설명했습니다. IoT 개발 키트와 함께 사용할 수 있는 센서 하나와 액추에이터 하나를 알아봅시다. 여기에는 다음이 포함됩니다.
* 무슨 일을 하나요?
* 사용되는 전자 장치/하드웨어는 무엇이 있나요?
* 아날로그 장치인가요 디지털장치인가요?
* 입력 또는 측정의 단위 및 범위는 무엇입니까?
## 평가기준(Rubric)
| 기준 | 모범 답안 | 적절함 | 개선이 필요함 |
| -------- | --------- | -------- | ----------------- |
| 센서 설명 | 위에 나열된 4개 섹션에 대한 세부 정보를 포함하여 센서에 대해 설명합니다. | 센서에 대해 설명했지만 위의 섹션 중 2-3개만 제공할 수 있었습니다. | 센서에 대해 설명했지만 위의 섹션 중 1개만 제공할 수 있었습니다. |
| 액추에이터 설명 | 위에 나열된 4개 섹션에 대한 세부 정보를 포함하여 액추에이터에 대해 설명합니다. | 액추에이터에 대해 설명했지만 위의 섹션 중 2-3개만 제공할 수 있었습니다. | 액추에이터에 대해 설명했지만 위의 섹션 중 1개만 제공할 수 있었습니다. |

@ -1,128 +0,0 @@
<div dir="rtl">
# قم ببناء ضوء ليلي - Raspberry Pi
في هذا الجزء من الدرس ، ستضيف مؤشر LED إلى Raspberry Pi الخاص بك وتستخدمه لإنشاء ضوء ليلي.
## المعدات
يحتاج ضوء الليل الآن إلى مشغل.
المشغل هو ** LED ** ، <a href="https://wikipedia.org/wiki/Light-emitting_diode"> الصمام الثنائي الباعث للضوء</a> الذي ينبعث منه الضوء عندما يتدفق التيار خلاله. هذا مشغل رقمي له حالتان ، تشغيل وإيقاف. يؤدي إرسال القيمة 1 إلى تشغيل مؤشر LED و 0 يؤدي إلى إيقاف تشغيله. LED هو مشغل Grove خارجي ويجب توصيله بقبعة Grove Base على Raspberry Pi.
منطق ضوء الليل في الكود الزائف هو:
```output
تحقق من مستوى الضوء.
إذا كان الضوء أقل من 300
قم بتشغيل LED
غير ذلك
قم بإيقاف تشغيل LED
```
### قم بتوصيل الصمام
يأتي Grove LED كوحدة نمطية مع مجموعة مختارة من مصابيح LED ، مما يسمح لك باختيار اللون.
#### المهمة - قم بتوصيل LED
قم بتوصيل الصمام.
![A grove LED](../../../../images/grove-led.png)
1. اختر مؤشر LED المفضل لديك وأدخل الأرجل في الفتحتين على وحدة LED.
المصابيح هي صمامات ثنائية باعثة للضوء ، والصمامات الثنائية هي أجهزة إلكترونية يمكنها حمل التيار في اتجاه واحد فقط. هذا يعني أن مؤشر LED يحتاج إلى الاتصال بالطريقة الصحيحة ، وإلا فلن يعمل.
أحد أرجل مؤشر LED هو الدبوس الموجب ، والآخر هو الدبوس السالب. LED ليس مستديرًا تمامًا وهو مسطح قليلاً من جانب واحد. الجانب المسطح قليلاً هو الدبوس السالب. عندما تقوم بتوصيل مؤشر LED بالوحدة ، تأكد من توصيل دبوس الجانب المستدير بالمقبس المميز بعلامة ** + ** على الجزء الخارجي من الوحدة ، وأن الجانب المسطح متصل بالمقبس الأقرب إلى منتصف الجزء وحدة.
1. تحتوي وحدة LED على زر دوران يسمح لك بالتحكم في السطوع. اقلب هذا على طول الطريق لتبدأ بتدويره عكس اتجاه عقارب الساعة بقدر ما سيذهب باستخدام مفك براغي صغير من فيليبس.
1. أدخل أحد طرفي كبل Grove في المقبس الموجود في وحدة LED. سوف تذهب في اتجاه واحد فقط.
1. مع إيقاف تشغيل Raspberry Pi ، قم بتوصيل الطرف الآخر من كابل Grove بالمقبس الرقمي المميز بعلامة ** D5 ** على قبعة Grove Base المرفقة بـ Pi. هذا المقبس هو الثاني من اليسار ، على صف المقابس بجوار دبابيس GPIO.
![The grove LED connected to socket D5](../../../../images/pi-led.png)
## برمجة ضوء الليل
يمكن الآن برمجة ضوء الليل باستخدام مستشعر الضوء Grove و Grove LED.
### المهمة - برمجة ضوء الليل
برمجة ضوء الليل.
1. قم بتشغيل Pi وانتظر حتى يتم التمهيد
1. افتح مشروع Nightlight في VS Code الذي أنشأته في الجزء السابق من هذه المهمة ، سواء كان يعمل مباشرة على Pi أو متصل باستخدام امتداد Remote SSH.
1. أضف الكود التالي إلى ملف `app.py` للاتصال لاستيراد المكتبة المطلوبة. يجب إضافة هذا إلى الأعلى ، أسفل سطور "الاستيراد" الأخرى.
```python
from grove.grove_led import GroveLed
```
تستورد العبارة `from grove.grove_led import GroveLed`` GroveLed` من مكتبات Grove Python. تحتوي هذه المكتبة على رمز للتفاعل مع Grove LED.
1. أضف الكود التالي بعد إعلان "light_sensor" لإنشاء مثيل للفئة التي تدير مؤشر LED:
```python
led = GroveLed(5)
```
يُنشئ السطر `led = GroveLed (5)` مثيلًا لفئة `GroveLed` التي تتصل بالطرف ** D5 ** - دبوس Grove الرقمي الذي يتصل به مؤشر LED.
> 💁 جميع المقابس لها أرقام دبوس فريدة. الدبابيس 0 و 2 و 4 و 6 هي دبابيس تمثيلية ، والدبابيس 5 و 16 و 18 و 22 و 24 و 26 هي دبابيس رقمية.
1. أضف فحصًا داخل حلقة "while" وقبل "time.sleep" للتحقق من مستويات الإضاءة وتشغيل مؤشر LED أو إيقاف تشغيله:
</div>
```python
if light < 300:
led.on()
else:
led.off()
```
<div dir="rtl">
يتحقق هذا الرمز من قيمة "light". إذا كان هذا أقل من 300 ، فإنه يستدعي طريقة "on" لفئة "GroveLed" التي ترسل قيمة رقمية 1 إلى LED ، وتشغيلها. إذا كانت قيمة الضوء أكبر من أو تساوي 300 ، فإنها تستدعي طريقة "إيقاف التشغيل" ، وإرسال قيمة رقمية بقيمة 0 إلى LED ، وإيقاف تشغيلها.
> 💁 يجب وضع مسافة بادئة لهذا الرمز إلى نفس مستوى خط الطباعة ('Light level:'، light) `ليكون داخل حلقة while!
> 💁 عند إرسال القيم الرقمية إلى المشغلات ، تكون القيمة 0 هي 0 فولت ، والقيمة 1 هي أقصى جهد للجهاز. بالنسبة لـ Raspberry Pi مع مستشعرات ومشغلات Grove ، يكون الجهد 1 هو 3.3 فولت.
1. من VS Code Terminal ، قم بتشغيل ما يلي لتشغيل تطبيق Python:
```sh
python3 app.py
```
Light values will be output to the console.
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. قم بتغطية وكشف مستشعر الضوء. لاحظ كيف سيضيء مؤشر LED إذا كان مستوى الضوء 300 أو أقل ، وينطفئ عندما يكون مستوى الضوء أكبر من 300.
> 💁 إذا لم يتم تشغيل مؤشر LED ، فتأكد من توصيله بالطريقة الصحيحة ، وأن زر الدوران مضبوط على الوضع الكامل.
![The LED connected to the Pi turning on and off as the light level changes](../../../../images/pi-running-assignment-1-1.gif)
> 💁 يمكنك العثور على هذا الرمز في المجلد
[code-actuator/pi](../code-actuator/pi)
😀 كان برنامج الإضاءة الليلية الخاص بك ناجحًا!
</div>

@ -1,116 +0,0 @@
# Créer une veilleuse - Raspberry Pi
Dans cette partie de la leçon, vous allez ajouter une LED à votre Raspberry Pi et l'utiliser pour créer une veilleuse.
## Matériel
La veilleuse a maintenant besoin d'un actionneur.
L'actionneur est une **LED**, une [diode électroluminescente](https://wikipedia.org/wiki/Light-emitting_diode) qui émet de la lumière lorsqu'elle est traversée par un courant. Il s'agit d'un actionneur numérique qui a deux états, marche et arrêt (`on` et `off` en anglais). L'envoi d'une valeur de 1 allume la LED et celle de 0 l'éteint. La LED est un actionneur Grove externe et doit être connectée au chapeau Grove Base du Raspberry Pi.
La logique de la veilleuse en pseudo-code est la suivante :
```sortie
Vérifier le niveau de lumière.
Si la lumière est inférieure à 300
Allumer la LED
Sinon
Eteindre la LED
```
### Connecter la LED
Le Grove LED se présente sous la forme d'un module avec une sélection de LED, ce qui vous permet de choisir la couleur.
#### Tâche - connecter la LED
Connectez la LED.
![Une LED grove](../../../../images/grove-led.png)
1. Choisissez votre LED préférée et insérez les pattes dans les deux trous du module LED.
Les LEDs sont des diodes électroluminescentes, et les diodes sont des dispositifs électroniques qui ne peuvent transporter le courant que dans un sens. Cela signifie que la LED doit être connectée dans le bon sens, sinon elle ne fonctionnera pas.
L'une des pattes de la LED est la broche positive, l'autre est la broche négative. La LED n'est pas parfaitement ronde et est légèrement plus plate d'un côté. Le côté légèrement plus plat est la broche négative. Lorsque vous connectez la LED au module, assurez-vous que la broche du côté arrondi est connectée à la prise marquée **+** à l'extérieur du module, et que le côté plus plat est connecté à la prise plus proche du milieu du module.
1. Le module LED est doté d'un bouton rotatif qui vous permet de contrôler la luminosité. Pour commencer, réglez-le à fond en le tournant dans le sens inverse des aiguilles d'une montre jusqu'à la butée à l'aide d'un petit tournevis cruciforme.
1. Insérez l'une des extrémités d'un câble Grove dans la prise du module LED. Il ne peut être inséré que dans un seul sens.
1. Le Raspberry Pi étant hors tension, connectez l'autre extrémité du câble Grove à la prise numérique marquée **D5** sur le chapeau de base Grove attaché au Pi. Cette prise est la deuxième en partant de la gauche, sur la rangée de prises à côté des broches GPIO.
![La LED grove connectée à la prise D5](../../../../images/pi-led.png)
## Programmer la veilleuse
La veilleuse peut maintenant être programmée à l'aide du capteur de lumière Grove et de la LED Grove.
### Tâche - programmer la veilleuse
Programmez la veilleuse.
1. Allumez le Pi et attendez qu'il démarre
1. Ouvrez le projet nightlight que vous avez créé dans la partie précédente de ce travail dans VS Code, soit en l'exécutant directement sur le Pi, soit en le connectant à l'aide de l'extension Remote SSH.
1. Ajoutez le code suivant au fichier `app.py` pour vous connecter à l'importation d'une bibliothèque requise. Il doit être ajouté en haut, en dessous des autres lignes `import`.
```python
from grove.grove_led import GroveLed
```
L'instruction `from grove.grove_led import GroveLed` importe la bibliothèque `GroveLed` des bibliothèques Grove Python. Cette bibliothèque contient du code pour interagir avec une LED Grove.
1. Ajoutez le code suivant après la déclaration `light_sensor` pour créer une instance de la classe qui gère la LED :
```python
led = GroveLed(5)
```
La ligne `led = GroveLed(5)` crée une instance de la classe `GroveLed` qui se connecte à la broche **D5** - la broche digitale Grove à laquelle la LED est connectée.
> 💁 Toutes les prises ont des numéros de broches uniques. Les broches 0, 2, 4 et 6 sont des broches analogiques, les broches 5, 16, 18, 22, 24 et 26 sont des broches numériques.
1. Ajoutez une vérification à l'intérieur de la boucle `while`, et avant le `time.sleep` pour vérifier les niveaux de lumière et allumer ou éteindre la LED :
```python
if light < 300:
led.on()
else:
led.off()
```
Ce code vérifie la valeur de `light`. Si elle est inférieure à 300, il appelle la méthode `on` de la classe `GroveLed` qui envoie une valeur numérique de 1 à la LED, l'allumant ainsi. Si la valeur de la lumière est supérieure ou égale à 300, il appelle la méthode `off`, qui envoie une valeur numérique de 0 à la LED, pour l'éteindre.
> 💁 Ce code doit être indenté au même niveau que la ligne `print('Light level:', light)` pour être à l'intérieur de la boucle while !
> 💁 Lors de l'envoi de valeurs numériques à des actionneurs, une valeur 0 correspond à 0V, et une valeur 1 correspond à la tension maximale de l'appareil. Pour le Raspberry Pi avec les capteurs et actionneurs Grove, la tension 1 est de 3,3V.
1. Depuis le terminal VS Code, exécutez ce qui suit pour lancer votre application Python :
```sh
python3 app.py
```
Les valeurs de lumière seront affichées dans la console.
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. Couvrez et découvrez le capteur de lumière. Remarquez que la LED s'allume si le niveau de lumière est inférieur ou égal à 300, et s'éteint lorsque le niveau de lumière est supérieur à 300.
> 💁 Si la LED ne s'allume pas, assurez-vous qu'elle est connectée dans le bon sens et que le bouton de rotation est réglé sur "full on".
![La LED connectée au Pi s'allume et s'éteint au fur et à mesure que le niveau de lumière change](../../../../images/pi-running-assignment-1-1.gif)
> 💁 Vous trouverez ce code dans le dossier [code-actuator/pi](../code-actuator/pi).
😀 Votre programme de veilleuse est un succès!

@ -1,116 +0,0 @@
# रात का चिराग़ बनाएं - रास्पबेरी पाई
पाठ के इस भाग में, आप अपने रास्पबेरी पाई में एक एलईडी जोड़ेंगे और इसका उपयोग रात का चिराग़ बनाने के लिए करेंगे।
## हार्डवेयर
नाइटलाइट को अब एक एक्चुएटर की जरूरत है।
एक्चुएटर एक **LED**, एक [प्रकाश उत्सर्जक डायोड](https://wikipedia.org/wiki/Light-emmitting_diode) है जो करंट प्रवाहित होने पर प्रकाश का उत्सर्जन करता है। यह एक डिजिटल एक्ट्यूएटर है जिसमें 2 स्थिति हैं, चालू और बंद। 1 का मान भेजने से एलईडी चालू हो जाती है, और 0 इसे बंद कर देता है। एलईडी एक बाहरी ग्रोव एक्ट्यूएटर है और इसे रास्पबेरी पाई पर ग्रोव बेस हैट से जोड़ा जाना चाहिए।
सुडो कोड में नाइटलाइट तर्क है:
```आउटपुट
प्रकाश स्तर की जाँच करें।
यदि प्रकाश 300 . से कम है
एलईडी चालू करें
अन्यथा
एलईडी बंद करें
```
### एलईडी कनेक्ट करें
ग्रोव एलईडी एलईडी के चयन के साथ एक मॉड्यूल के रूप में आता है, जिससे आप रंग चुन सकते हैं।
#### कार्य - एलईडी कनेक्ट करें
एलईडी कनेक्ट करें।
![एक ग्रोव एलईडी](../../../images/grove-led.png)
1. अपनी पसंदीदा एलईडी चुनें और इसके पैरों को एलईडी मॉड्यूल के दो छेदों में डालें।
एल ई डी प्रकाश उत्सर्जक डायोड हैं, और डायोड इलेक्ट्रॉनिक उपकरण हैं जो केवल एक ही तरह से करंट ले जा सकते हैं। इसका मतलब है कि एलईडी को सही तरीके से जोड़ने की जरूरत है, अन्यथा यह काम नहीं करेगा।
एलईडी के पैरों में से एक पॉसिटिव पिन है, दूसरा नेगेटिव पिन है। एलईडी पूरी तरह गोल नहीं है और एक तरफ से थोड़ी चपटी है। थोड़ा बढ़ा हुआ पक्ष नेगेटिव पिन है। जब आप एलईडी को मॉड्यूल से कनेक्ट करते हैं, तो सुनिश्चित करें कि गोलाकार तरफ वाला पिन मॉड्यूल के बाहर + चिह्नित सॉकेट से जुड़ा है, और बढ़ा हुआा पक्ष सॉकेट से मध्य के करीब जुड़ा हुआ है।
1. एलईडी मॉड्यूल में एक स्पिन बटन है जो आपको चमक को नियंत्रित करने की अनुमति देता है। इसे शुरू करने के लिए इसे दक्षिणावर्त घुमाकर शुरू करें, जहां तक ​​​​यह एक छोटे से फिलिप्स हेड स्क्रूड्राइवर का उपयोग करके जाएगा।
1. एलईडी मॉड्यूल पर सॉकेट में ग्रोव केबल का एक सिरा डालें। यह केवल एक ही तरह से घूमेगा।
1. रास्पबेरी पाई के बंद होने के साथ, ग्रोव केबल के दूसरे छोर को पाई से जुड़ी ग्रोव बेस हैट पर **D5** चिह्नित डिजिटल सॉकेट से कनेक्ट करें। यह सॉकेट GPIO पिन के बगल में सॉकेट की पंक्ति में बाईं ओर से दूसरा है।
![सॉकेट D5 से जुड़ी ग्रोव एलईडी](../../../images/pi-led.png)
## रात के उजाले का प्रोग्राम
नाइटलाइट को अब ग्रोव लाइट सेंसर और ग्रोव एलईडी का उपयोग करके प्रोग्राम किया जा सकता है।
### कार्य - रात के चिराग़ का प्रोग्राम
रात के समय प्रोग्राम करें।
1. पाई को पावर दें और इसके बूट होने की प्रतीक्षा करें
1. वीएस कोड में नाइटलाइट प्रोजेक्ट खोलें जिसे आपने इस असाइनमेंट के पिछले भाग में बनाया था, या तो सीधे पाई पर चल रहा है या रिमोट एसएसएच एक्सटेंशन का उपयोग करके जुड़ा हुआ है।
1. आवश्यक लाइब्रेरी आयात करने के लिए कनेक्ट करने के लिए `app.py` फ़ाइल में निम्न कोड जोड़ें। इसे अन्य `import` लाइनों के नीचे, शीर्ष पर जोड़ा जाना चाहिए।
```python
from grove.grove_led import GroveLed
```
`from Grove.grove_led import GroveLed` कथन GroveLed` को Grove Python पुस्तकालयों से आयात करता है। इस पुस्तकालय में ग्रोव एलईडी के साथ बातचीत करने के लिए कोड है।
1. एलईडी का प्रबंधन करने वाले वर्ग का एक उदाहरण बनाने के लिए `light_sensor` घोषणा के बाद निम्नलिखित कोड जोड़ें:
```python
led = GroveLed(5)
```
लाइन `led = GroveLed(5)` `GroveLed` वर्ग को पिन से जोड़ने का एक उदाहरण बनाता है **D5** - वह डिजिटल ग्रोव पिन जिससे एलईडी जुड़ा है।
> 💁 सभी सॉकेट में अद्वितीय पिन नंबर होते हैं। पिन 0, 2, 4, और 6 एनालॉग पिन हैं, पिन 5, 16, 18, 22, 24 और 26 डिजिटल पिन हैं।
1. प्रकाश के स्तर की जांच करने और एलईडी को चालू या बंद करने के लिए `while` लूप के अंदर, और `time.sleep` से पहले एक चेक जोड़ें:
```python
if light < 300:
led.on()
else:
led.off()
```
यह कोड `light` के मूल्य की जांच करता है। यदि यह ३०० से कम है तो यह `GroveLed` वर्ग की `on` विधि को कॉल करता है जो एलईडी को 1 का डिजिटल मान भेजता है, इसे चालू करता है। यदि प्रकाश मान ३०० से अधिक या उसके बराबर है, तो यह `off` विधि को कॉल करता है, एलईडी को 0 का डिजिटल मान भेजकर, इसे बंद कर देता है।
> 💁 इस कोड को `print('Light level:', light)` लाइन के समान स्तर पर इंडेंट किया जाना चाहिए, while loop के अंदर होना चाहिए!
> 💁 एक्ट्यूएटर्स को डिजिटल मान भेजते समय, 0 मान 0V होता है, और 1 मान डिवाइस के लिए अधिकतम वोल्टेज होता है। ग्रोव सेंसर और एक्चुएटर्स के साथ रास्पबेरी पाई के लिए, 1 वोल्टेज 3.3V है।
1. वीएस कोड टर्मिनल से, अपना पायथन ऐप चलाने के लिए निम्नलिखित चलाएँ:
```sh
python3 app.py
```
कंसोल के लिए लाइट मान आउटपुट होंगे।
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. प्रकाश संवेदक को ढकें और उजागर करें। ध्यान दें कि यदि प्रकाश का स्तर 300 या उससे कम है, तो एलईडी कैसे जलेगी, और जब प्रकाश का स्तर 300 से अधिक हो तो बंद कर दें।
> 💁 यदि एलईडी चालू नहीं होती है, तो सुनिश्चित करें कि यह सही तरीके से जुड़ा हुआ है, और स्पिन बटन को सेट किया गया है
![प्रकाश स्तर में परिवर्तन के रूप में पाई से जुड़ी एलईडी चालू और बंद हो जाती है](../../../images/pi-running-assignment-1-1.gif)
> 💁 आप इस कोड को [code-actuator/pi](code-actuator/pi) फोल्डर में पा सकते हैं।
😀आपका रात्रिकालीन प्रोग्राम सफल रहा!

@ -1,117 +0,0 @@
# 야간 조명 만들기 - Raspberry Pi
라즈베리 파이에 LED를 추가하여 야간 조명을 만들어봅시다.
## 하드웨어
이 야간 조명에는 액추에이터가 필요합니다.
사용되는 액추에이터는 **LED**로, 전류가 흐를 때 빛을 방출하는 [발광 다이오드](https://wikipedia.org/wiki/Light-emitting_diode) 입니다. LED는 on /off 두 가지 상태를 가진 디지털 액추에이터입니다. 1을 값으로 전송하면 LED가 켜지고 0을 전송하면 꺼집니다. LED는 외부 Grove 액추에이터이며 라즈베리 파이의 Grove Base Hat에 연결해야 합니다
의사 코드에서 야간 조명의 로직은 다음과 같습니다.:
```output
탐지되는 빛의 정도(level)를 확인합니다
빛의 정도가 300 미만일 경우
LED를 켭니다
그렇지 않을 경우
LED를 끕니다
```
### LED 연결하기
Grove LED는 다양한 LED가 포함된 모듈로 제공되므로 색상을 선택할 수 있습니다.
#### 할 일 - LED 연결
LED에 연결 해 봅시다.
![grove LED](../../../../images/grove-led.png)
1. 좋아하는 LED를 선택하고 LED 모듈의 두 구멍에 다리를 삽입합니다.
LED는 발광 다이오드이며, 다이오드는 전류를 한 방향으로만 전달할 수 있는 전자 장치입니다. 즉, LED를 올바른 방향으로 연결해야 합니다. 그렇지 않으면 작동하지 않습니다.
LED 다리 중 하나는 양극 핀이고 다른 하나는 음극 핀입니다. LED는 완벽하게 둥글지 않고 한쪽이 약간 평평합니다. 약간 평평한 면이 음극 핀입니다. LED를 모듈에 연결할 때 둥근 쪽의 핀이 모듈 외부에 +로 표시된 소켓에 연결되고 평평한 쪽이 모듈 중앙에 더 가까운 소켓에 연결되었는지 확인하십시오.
1. LED 모듈에는 밝기를 제어할 수 있는 회전 버튼이 있습니다. 작은 십자 드라이버를 사용하여 시계 반대 방향으로 끝까지 돌립니다.
1. Grove 케이블의 한쪽 끝을 LED 모듈의 소켓에 삽입합니다. 이는 한 방향으로만 돌아갈 것 입니다.
1. Rasberry Pi 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base 모자에 D5로 표시된 디지털 소켓에 연결합니다. 이 소켓은 왼쪽에서 두 번째, GPIO 핀 옆에 있는 소켓 줄입니다.
![소켓 D5에 연결된 Grove LED](../../../../images/pi-led.png)
## 야간 조명을 프로그래밍 해봅시다
Grove 조명 센서와 Grove LED를 사용하여 야간 조명 프로그래밍을 진행할 수 있습니다.
### 할 일 - 야간 조명 동작에 대한 프로그래밍을 해 봅시다.
야간 조명에 대한 프로그래밍을 합니다.
1. 라즈베리 파이 전원을 켜고 부팅될 때 까지 기다립니다.
1. 이 할당의 이전 부분에서 만든 VS Code에서 야간 조명 프로젝트를 Pi에서 직접 실행하거나 원격 SSH 확장을 사용하여 연결합니다.
1. 필요한 라이브러리를 가져오려면 아래 코드를 `app.py` 파일에 추가하십시오. 이는 다른`import` 줄 바로 아래 추가되어야 합니다.
```python
from grove.grove_led import GroveLed
```
`from grove.grove_led import GroveLed` 문은 Grove Python 라이브러리에서 `GroveLed` 를 import 한다. 이 라이브러리에는 Grove LED와 상호 작용하는 코드가 있습니다.
1. `light_sensor` 선언 뒤에 다음 코드를 추가하여 LED를 관리하는 클래스의 인스턴스를 만듭니다.
```python
led = GroveLed(5)
```
`led = GroveLed(5)` 코드는 핀 **D5**(LED가 연결된 디지털 Grove 핀)에 연결하는 `GroveLed` 클래스의 인스턴스를 생성합니다.
> 💁 모든 소켓에 고유한 핀 번호가 있습니다. 핀 0, 2, 4, 6은 아날로그 핀이고 핀 5, 16, 18, 22, 24 및 26은 디지털 핀입니다.
1. `while` 루프 내부에 확인용 변수를 추가합니다, `time.sleep` 전에 조명 레벨을 확인하고 LED를 켜거나 끌 수 있습니다.
```python
if light < 300:
led.on()
else:
led.off()
```
이 코드는 감지되는 `빛` 의값을 확인합니다. 이 값이 300 미만인 경우 `GroveLed` 클래스의 `on` 메서드를 호출하여 LED에 디지털 값 1을 전송하고 LED를 켭니다. 조명 값이 300보다 크거나 같으면 꺼짐 방법을 호출하여 디지털 값 0을 LED로 전송하고 LED를 끕니다.
> 💁 이 코드는 `print('Light level:', light)` 라인과 동일한 레벨로 들여써야 하며, while 루프 안에 있어야 합니다!
> 💁 액추에이터로 디지털 값을 전송할 때 0 값은 0V, 1 값은 장치의 최대 전압입니다. Grove 센서 및 액추에이터가 장착된 라즈베리 파이의 경우 1 전압은 3.3V입니다.
1. VS Code Terminal에서 다음을 실행하여 Python 앱을 실행합니다.:
```sh
python3 app.py
```
조명 값이 콘솔에 출력됩니다.
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. 조명 센서를 가려도 봅시다. 조명 레벨이 300 이하인 경우 LED가 어떻게 켜지고, 조명 레벨이 300 이상인 경우 LED가 꺼지는지 확인합니다.
> 💁 LED가 동작하지 않는다면 제대로 연결 되어있는지 확인하고 스핀 버튼이 완전히 켜져 있는지 확인 해 보세요
![Light Level 변화에 따라 Pi에 연결된 LED가 켜지고 꺼집니다.](../../../../images/pi-running-assignment-1-1.gif)
> 💁 [code-actuator/pi](code-actuator/pi) 폴더 안에서 이 코드를 찾을 수 있습니다..
😀 여러분이 만든 야간 조명 프로젝트는 성공적으로 동작합니다!

@ -1,115 +0,0 @@
# 开发一个夜灯 - 树莓派
在这个部分的课程中,你会把一个 LED 加到树莓派上并使用它来创建一个夜灯。
## 硬件
现在夜灯需要一个执行器。
这个执行器是 **LED**,一个[发光二极管](https://wikipedia.org/wiki/Light-emitting_diode),当电流通过它时会发光。这是一个有两个打开或者关闭状态的数字执行器,发送一个 1 值把灯打开,发送 0 值把灯关闭。这个 LED 是一个外部 Grove 执行器,而且需要被连接到树莓派上的 Grove 基础扩展板。
这个夜灯的逻辑用伪代码表示是:
```output
检查光照等级。
如果光照小于 300
打开 LED
否则
关闭 LED
```
### 连接 LED
Grove LED 作为一个模块出现,以及一系列可供你选择颜色的 LED。
#### 任务 - 连接 LED
连接 LED。
![一个grove LED](../../../../images/grove-led.png)
1. 选择你最喜欢的 LED 然后把引脚插到 LED 模块的两个洞里面。
LED 是发光二极管,而且二极管是只允许电流单个方向通过的电子设备。这意味 LED 需要被连接在正确的方向,不然就不会工作。
LED 引脚中的一个是正极引脚另一个是负极引脚。LED 不是完全的圆形,而且在一边是有些平的。这略平的一边是负极引脚。当你连接 LED 到这个模块的时候,需要确保圆形这边的引脚是连接到模块上外边标着 **+** 的插孔,而扁平的这边是连接到靠近模块中间的插孔。
1. LED 模块有一个允许你控制亮度的旋转按钮,用一个小十字螺丝起子逆时针旋转它拧到头来完全打开它。
1. 把 Grove 线缆的一端插到 LED 模块的插孔中,这个只能从一个方向插入。
1. 在树莓派断电的情况下,把 Grove 线缆的另一端连接到树莓派上插着的 Grove 基础扩展板标着 **D5** 的数字插孔。这个插孔在靠近 GPIO 引脚的一排,左数第二个。
![连接到D5插孔的Grove LED](../../../../images/pi-led.png)
## 编写夜灯程序
现在夜灯可以用 Grove 光照传感器和 Grove LED 来编码了。
### 任务 - 编写夜灯程序
编写夜灯程序
1. 打开树莓派并等待启动完成。
1. 直接在树莓派上或者通过远程 SSH 扩展,打开你在这个作业上一部分创建的 VS Code 中的夜灯项目。
1. 把下面的代码加到 `app.py` 文件中来导入一个需要的函数库。这一行需要加在文件顶部,在其他 `import` 代码行下面。
```python
from grove.grove_led import GroveLed
```
`from grove.grove_led import GroveLed` 语句从 Grove Python 函数库中导入了 `GroveLED`。这个函数库中有和 Grove LED 交互的代码。
1. 把下面的代码加到 `light_sensor` 声明之后来创建一个管理 LED 的类的实例:
```python
led = GroveLed(5)
```
`led = GroveLed(5)` 这一行创建了一个连接到 **D5** 引脚的 `GroveLED` 类的实例,**D5** 也就是 LED 连接的那个数字 Grove 引脚。
> 💁 所有的插孔都有唯一的引脚号,引脚 0、2、4 和 6 是模拟引脚,引脚 5、16、18、22、24 和 26 是数字引脚。
1. 在 `while` 循环中增加一个判断,在 `time.sleep` 之前来检查光照等级并控制 LED 打开或者关闭:
```python
if light < 300:
led.on()
else:
led.off()
```
这块代码检查了 `light` 的值,如果小于 300 就调用 `GroveLED` 类的 `on` 方法,来发送一个数字值 1 到 LED把它点亮。如果 `light` 值大于或等于 300就调用 `off` 方法,发送一个数字值 0 给 LED把它关闭。
> 💁 这段代码需要放到 while 循环里面,缩进到和 `print('Light level:', light)` 行一个水平。
> 💁 当发送数字值到执行器的时候0 值就是 0V1 值就是设备的最大电压。对于插着 Grove 传感器和执行器的树莓派而言1 的电压就是 3.3V。
1. 从 VS Code 终端,运行下面的命令来运行你的 Python 应用:
```sh
python3 app.py
```
光照值在终端里输出。
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
1. 遮挡和揭开光照传感器,会观察到光照等级等于 300 或更小时 LED 会点亮,如果光照等级比 300 大 LED 就会关闭。
> 💁 如果 LED 没有点亮,确保它是正确方向连接的,而且旋转按钮是设置成全开的。
![连接到树莓派的LED随着光照等级改变点亮和关闭](../../../../images/pi-running-assignment-1-1.gif)
> 💁 你可以在 [code-actuator/pi](../code-actuator/pi) 文件夹里找到这份代码。
😀 你的夜灯程序就成功了!

@ -1,96 +0,0 @@
# Construire une veilleuse - Raspberry Pi
Dans cette partie de la leçon, vous allez ajouter un capteur de lumière à votre Raspberry Pi.
## Matériel
Le capteur utilisé pour cette leçon est un **capteur de lumière** qui utilise une [photodiode](https://wikipedia.org/wiki/Photodiode) pour convertir la lumière en un signal électrique. Il s'agit d'un capteur analogique qui envoie une valeur entière de 0 à 1000 indiquant une quantité relative de lumière qui ne correspond à aucune unité de mesure standard telle que le [lux](https://fr.wikipedia.org/wiki/Lux_(unit%C3%A9)).
Le capteur de lumière est un capteur Grove et doit être connecté au chapeau de base Grove sur le Raspberry Pi.
### Connecter le capteur de lumière
Le capteur de lumière Grove utilisé pour détecter les niveaux de lumière doit être connecté au Raspberry Pi.
#### Tâche - connecter le capteur de lumière
Connecter le capteur de lumière
![Un capteur de lumière Grove](../../../../images/grove-light-sensor.png)
1. Insérez une extrémité d'un câble Grove dans la prise du module du capteur de lumière. Il ne peut être inséré que dans un seul sens.
1. Le Raspberry Pi étant éteint, connectez l'autre extrémité du câble Grove à la prise analogique marquée **A0** sur le chapeau de base Grove fixé au Pi. Cette prise est la deuxième en partant de la droite, sur la rangée de prises à côté des broches GPIO.
![Le capteur de lumière Grove connecté à la prise A0](../../../../images/pi-light-sensor.png)
## Programmer le capteur de lumière
L'appareil peut maintenant être programmé à l'aide du capteur de lumière Grove.
### Tâche - programmer le capteur de lumière
Programmez l'appareil.
1. Allumez le Pi et attendez qu'il démarre
1. Ouvrez le projet nightlight dans VS Code que vous avez créé dans la partie précédente de ce travail, soit en l'exécutant directement sur le Pi, soit en le connectant à l'aide de l'extension Remote SSH.
1. Ouvrez le fichier `app.py` et supprimez tout le code qu'il contient.
1. Ajoutez le code suivant au fichier `app.py` pour importer certaines bibliothèques nécessaires :
```python
import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor
```
L'instruction `import time` importe le module `time` qui sera utilisé plus tard dans ce travail.
L'instruction `from grove.grove_light_sensor_v1_2 import GroveLightSensor` importe le module `GroveLightSensor` des bibliothèques Grove Python. Cette bibliothèque contient du code pour interagir avec un capteur de lumière Grove, et a été installée globalement lors de l'installation du Pi.
1. Ajoutez le code suivant après le code ci-dessus pour créer une instance de la classe qui gère le capteur de lumière :
```python
light_sensor = GroveLightSensor(0)
```
La ligne `light_sensor = GroveLightSensor(0)` crée une instance de la classe `GroveLightSensor` se connectant à la broche **A0** - la broche analogique Grove à laquelle le capteur de lumière est connecté.
1. Ajoutez une boucle infinie après le code ci-dessus pour interroger la valeur du capteur de lumière et l'imprimer sur la console :
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
Ceci va lire le niveau de lumière actuel sur une échelle de 0-1023 en utilisant la propriété `light` de la classe `GroveLightSensor`. Cette propriété lit la valeur analogique de la broche. Cette valeur est ensuite imprimée sur la console.
1. Ajoutez une petite mise en veille d'une seconde à la fin de la `boucle` (`loop`) car les niveaux de lumière n'ont pas besoin d'être vérifiés en permanence. Une mise en veille réduit la consommation d'énergie de l'appareil.
```python
time.sleep(1)
```
1. Depuis le terminal VS Code, exécutez la commande suivante pour lancer votre application Python :
```sh
python3 app.py
```
Les valeurs lumineuses sont transmises à la console. Couvrez et découvrez le capteur de lumière, et les valeurs changeront :
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
> 💁 Vous trouverez ce code dans le dossier [code-sensor/pi](../code-sensor/pi).
😀 L'ajout d'un capteur à votre programme de veilleuse a été un succès!

@ -1,96 +0,0 @@
# रात का चिराग़ बनाएं - रास्पबेरी पाई
पाठ के इस भाग में, आप अपने रास्पबेरी पाई में एक प्रकाश सेंसर जोड़ेंगे।
## हार्डवेयर
इस पाठ के लिए सेंसर एक **प्रकाश संवेदक** है जो प्रकाश को विद्युत संकेत में बदलने के लिए [फोटोडायोड](https://wikipedia.org/wiki/Photodiode) का उपयोग करता है। यह एक एनालॉग सेंसर है जो 0 से 1,000 तक एक पूर्णांक मान भेजता है जो प्रकाश की सापेक्ष मात्रा को इंगित करता है जो माप की किसी भी मानक इकाई जैसे [lux](https://wikipedia.org/wiki/Lux) पर मैप नहीं करता है।
प्रकाश संवेदक एक टिकाऊ ग्रोव सेंसर है और इसे रास्पबेरी पाई पर ग्रोव बेस टोपी से जोड़ा जाना चाहिए।
### लाइट सेंसर कनेक्ट करें
प्रकाश के स्तर का पता लगाने के लिए उपयोग किए जाने वाले ग्रोव लाइट सेंसर को रास्पबेरी पाई से जोड़ा जाना चाहिए।
#### टास्क - लाइट सेंसर कनेक्ट करें
प्रकाश संवेदक कनेक्ट करें
![एक ग्रोव लाइट सेंसर](../../../images/grove-light-sensor.png)
1. लाइट सेंसर मॉड्यूल के सॉकेट में ग्रोव केबल का एक सिरा डालें। यह केवल एक ही तरह से घूमेगा।
1. रास्पबेरी पाई के बंद होने के साथ, ग्रोव केबल के दूसरे छोर को पाई से जुड़ी ग्रोव बेस हैट पर **A0** चिह्नित एनालॉग सॉकेट से कनेक्ट करें। यह सॉकेट GPIO पिन के बगल में सॉकेट की पंक्ति में दाईं ओर से दूसरा है।
![सॉकेट A0 से जुड़ा ग्रोव लाइट सेंसर](../../../images/pi-light-sensor.png)
## लाइट सेंसर प्रोग्राम करें
डिवाइस को अब ग्रोव लाइट सेंसर का उपयोग करके प्रोग्राम किया जा सकता है।
### टास्क - लाइट सेंसर प्रोग्राम करें
डिवाइस को प्रोग्राम करें।
1. पाई को पावर दें और इसके बूट होने की प्रतीक्षा करें।
1. वीएस कोड में नाइटलाइट प्रोजेक्ट खोलें जिसे आपने इस असाइनमेंट के पिछले भाग में बनाया था, या तो सीधे पाई पर चल रहा है या रिमोट एसएसएच एक्सटेंशन का उपयोग करके जुड़ा हुआ है।
1. `app.py` फ़ाइल खोलें और उसमें से सभी कोड हटा दें।
1. कुछ आवश्यक पुस्तकालयों को आयात करने के लिए निम्न कोड को `app.py` फ़ाइल में जोड़ें:
```python
import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor
```
`import time` विवरण `time` मॉड्यूल को आयात करता है जिसे बाद में इस असाइनमेंट में उपयोग किया जाएगा।
`from grove.grove_light_sensor_v1_2 import GroveLightSensor` कथन Grove Python पुस्तकालयों से `GroveLightSensor` आयात करता है। इस लाइब्रेरी में ग्रोव लाइट सेंसर के साथ बातचीत करने के लिए कोड है, और पाई सेटअप के दौरान विश्व स्तर पर स्थापित किया गया था।
1. प्रकाश संवेदक को प्रबंधित करने वाले वर्ग का एक उदाहरण बनाने के लिए ऊपर दिए गए कोड के बाद निम्नलिखित कोड जोड़ें:
```python
light_sensor = GroveLightSensor(0)
```
लाइन `light_sensor = GroveLightSensor(0)`, `GroveLightSensor` वर्ग को पिन **A0** से जोड़ने का एक उदाहरण बनाती है - एनालॉग ग्रोव पिन जिससे लाइट सेंसर जुड़ा होता है।
1. ऊपर दिए गए कोड के बाद एक अनंत लूप जोड़ें ताकि प्रकाश संवेदक मान का पता लगाया जा सके और इसे कंसोल पर प्रिंट किया जा सके:
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
यह `GroveLightSensor` वर्ग की `light` संपत्ति का उपयोग करके 0-1,023 के पैमाने पर वर्तमान प्रकाश स्तर को पढ़ेगा। यह गुण पिन से अनुरूप मान को पढ़ता है। यह मान तब कंसोल पर मुद्रित होता है।
1. लूप के अंत में एक सेकंड की एक छोटी sleep function जोड़ें क्योंकि प्रकाश के स्तर को लगातार जांचने की आवश्यकता नहीं होती है। एक sleep function डिवाइस की बिजली की खपत को कम करती है।
```python
time.sleep(1)
```
1. वीएस कोड टर्मिनल से, अपना पायथन ऐप चलाने के लिए निम्नलिखित चलाएँ:
```sh
python3 app.py
```
कंसोल के लिए लाइट मान आउटपुट होंगे। प्रकाश संवेदक को कवर और उजागर करें, और मान बदल जाएंगे:
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
> 💁 आप इस कोड को [कोड-सेंसर/पाई](code-sensor/pi) फ़ोल्डर में पा सकते हैं।
😀 आपके नाइटलाइट प्रोग्राम में सेंसर जोड़ना सफल रहा!

@ -1,97 +0,0 @@
# 야간 조명 만들기 - Raspberry Pi
이 강의에서 여러분의 라즈베리 파이에 광센서를 적용해봅시다
## 하드웨어
본 강의용 센서는 [광다이오드](https://wikipedia.org/wiki/Photodiode)를 사용하여 빛을 전기신호로 변환하는 **광센서** 입니다. 이는 [lux](https://wikipedia.org/wiki/Lux) 와 같은 표준 측정단위에 매핑되지 않는 0부터 1000까지의 빛의 상대적인 양을 나타내는 정수값을 보내는 아날로그 센서입니다.
광센서는 eternal Grove 센서이며 라즈베리 파이의 Grove base hat에 연결해야 합니다.
### 광센서와 연결해봅시다
광도를 감지하는데 사용되는 Grove 광센서는 라즈베리 파이에 연결해야 합니다.
#### 할 일 - 광센서와 연결 해 봅시다.
광센서와 연결해봅시다.
![Grove 광센서](../../../../images/grove-light-sensor.png)
1. Grove 케이블의 한쪽 끝을 광센서 모듈의 소켓에 삽입합니다. 그것은 한 방향으로만 돌아갈 것입니다.
1. Rasberry Pi 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base Hat의 **A0** 라고 표시된 아날로그 소켓에 연결합니다. 이 소켓은 오른쪽에서 두 번째, GPIO 핀 옆에 있는 소켓 열입니다.
![소켓 A0에 연결된 그로브 라이트 센서](../../../../images/pi-light-sensor.png)
## 광센서를 프로그래밍 해 봅시다.
이제 Grove light 센서를 사용하여 장치를 프로그래밍할 수 있습니다.
### 할 일 - 광센서를 프로그래밍한다.
구현 해 봅시다.
1. 라즈베리 파이의 전원은 켜고 부팅 될 때까지 기다립니다.
1. 이 과제의 이전 부분에서 생성한 VS Code에서 야간 조명 프로젝트를 Pi에서 직접 실행하거나 원격 SSH 확장을 사용하여 연결합니다.
1. `app.py` 파일을 열고 이 파일의 모든 코드를 지웁니다.
1. 몇가지 라이브러리 파일을 요청하기 위해 `app.py` 파일에 아래 있는 코드를 추가합니다:
```python
import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor
```
`import time` 은 이 과제 이후에 사용될 `time` 모듈을 import 합니다.
`from grove.grove_light_sensor_v1_2 import GroveLightSensor` 는 Grove Python 라이브러리로부터 `GroveLightSensor` 를 import 합니다. 이 라이브러리는 Grove 광센서와 상호작용 할 수 있는 코드를 가지고 있으며 라즈베리 파이 설정 중에 전역으로 설치되었습니다.
1. 아래 코드를 위에서 작성한 코드 뒤에 추가하여 광센서를 관리하는 클래스의 인스턴스를 만듭니다.
```python
light_sensor = GroveLightSensor(0)
```
`light_sensor = GroveLightSensor(0)`는 핀 **A0**(광센서와 연결되어있는 아날로그 Grove 핀)와 연결되어있는 `GroveLightSensor` class의 인스턴스를 생성합니다.
1. 위에서 작성한 코드 뒤에 무한 루프를 추가하여 광 센서 값을 측정하고 콘솔에 출력합니다 :
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
이는 `GroveLightSensor` 클래스의 `light` 속성을 사용하여 0-1,023의 척도로 현재 빛의 밝기를 판독합니다. 이 속성은 핀에서 아날로그 값을 읽습니다. 이후 이 값이 콘솔에 출력됩니다.
1. 계속 밝기를 확인할 필요가 없으므로 `루프` 끝에 1초의 짧은 절전 시간을 추가한다. 절전 모드는 장치의 전력 소비를 줄여줍니다.
```python
time.sleep(1)
```
1. VS Code의 터미널에서 아래 코드로 Python 앱을 실행 해 봅시다.
```sh
python3 app.py
```
밝기 값이 콘솔에 출력될 것이다. 광센서를 손으로 가려도 보면서 값이 어떻게 변하는지 확인 해 봅시다 :
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
> 💁 [code-sensor/pi](code-sensor/pi) 폴더에서 이 코드를 찾을 수 있습니다.
😀 여러분의 야간 조명 프로그렘에 성공적으로 센서를 적용했습니다!

@ -1,96 +0,0 @@
# 开发一个夜灯 - 树莓派
在这个部分的课程中,你会把一个光照传感器加到你的树莓派上。
## 硬件
这节课程的传感器是使用[光电二极管](https://wikipedia.org/wiki/Photodiode)来把光照转化为电子信号的光照传感器。这是一个发送从 0 到 1,000 整数值的模拟传感器,表示光照值的相对量而不对应任何比如[勒克斯lux](https://wikipedia.org/wiki/Lux)的标准计量单位。
这个光照传感器是一个外部 Grove 传感器,需要被连接到树莓派上的 Grove 基础扩展板。
### 连接光照传感器
用来检测光照等级的 Grove 光照传感器需要被连接到树莓派上。
#### 任务 - 连接光照传感器
连接光照传感器
![一个 grove 光照传感器](../../../../images/grove-light-sensor.png)
1. 把 Grove 线缆的一端插到光照传感器模块的插孔中,这个只能从一个方向插入。
1. 在树莓派断电的情况下,把 Grove 线缆的另一端连接到树莓派上插着的 Grove 基础扩展板标着 **A0** 的模拟插孔。这个插孔在靠近 GPIO 引脚的一排,右数第二个。
![插在 A0 插孔的 grove 光照传感器](../../../../images/pi-light-sensor.png)
## 编写光照传感器程序
现在设备可以用 Grove 光照传感器来编码了。
### 任务 - 编写光照传感器程序
编写设备程序。
1. 打开树莓派并等待启动完成。
1. 直接在树莓派上或者通过远程SSH扩展打开你在这个作业上一部分创建的 VS Code 中的夜灯项目。
1. 打开 `app.py` 文件并删除里面的所有代码。
1. 把下面的代码加到 `app.py` 文件中来导入一些需要的函数库:
```python
import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor
```
`import time` 语句导入了 `time` 模块,在这个作业的后面会用到这个模块。
`from grove.grove_light_sensor_v1_2 import GroveLightSensor` 语句从 Grove Python 函数库导入了 `GroveLightSensor`。这个函数库里有和 Grove 光照传感器交互的代码,在设置树莓派的时候就已经全局安装了。
1. 在上面代码的后面增加下面的代码来创建一个管理光照传感器的类的实例:
```python
light_sensor = GroveLightSensor(0)
```
`light_sensor = GroveLightSensor(0)` 这一行创建了一个连接到 **A0** 引脚的 `GroveLightSensor` 类的实例,**A0** 也就是光照传感器连接的那个引脚。
1. 在上面的代码后面增加一段无限循环代码,来获取光照传感器数值并打印到终端:
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
使用 `GroveLightSensor` 类的 `light` 属性可以来获取 0-1023 的当前光照等级值,这个属性从引脚读取模拟量,然后这个值会被打印到终端。
1. 在 `loop` 的结尾增加一个 1 秒的短暂休眠,因为光照等级不需要一直不断地读取。一个休眠可以减少设备的能源消耗。
```python
time.sleep(1)
```
1. 从 VS Code 终端,运行下面的命令来运行你的 Python 应用:
```sh
python3 app.py
```
光照等级会在终端输出,遮挡和揭开光照传感器,输出的值也会相应变化:
```output
pi@raspberrypi:~/nightlight $ python3 app.py
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290
```
> 💁 你可以在 [code-sensor/pi](../code-sensor/pi) 文件夹找到这份代码。
😀 给你的夜灯增加一个传感器程序就成功了!

@ -1,110 +0,0 @@
# Créer une veilleuse - Matériel IoT virtuel
Dans cette partie de la leçon, vous allez ajouter une LED à votre dispositif IoT virtuel et l'utiliser pour créer une veilleuse.
## Matériel virtuel
La veilleuse a besoin d'un actionneur, créé dans l'application CounterFit.
L'actionneur est une **LED**. Dans un dispositif IoT physique, il s'agirait d'une [diode électroluminescente](https://wikipedia.org/wiki/Light-emitting_diode) qui émet de la lumière lorsqu'elle est traversée par un courant. Il s'agit d'un actionneur numérique qui a deux états : allumé (`on`) et éteint (`off`). L'envoi d'une valeur de 1 allume la diode et celle de 0 l'éteint.
La logique de la veilleuse en pseudo-code est la suivante :
```sortie
Vérifier le niveau de lumière.
Si la lumière est inférieure à 300
Allumer la LED
Sinon
Eteindre la LED
```
### Ajouter l'actionneur à CounterFit
Pour utiliser une LED virtuelle, vous devez l'ajouter à l'application CounterFit.
#### Tâche - ajouter l'actionneur à CounterFit
Ajoutez la LED à l'application CounterFit.
1. Assurez-vous que l'application web CounterFit est en cours d'exécution depuis la partie précédente de ce travail. Si ce n'est pas le cas, démarrez-la et ajoutez à nouveau le capteur de lumière.
1. Créez une LED :
1. Dans la case *Créer un actionneur* du volet *Actionneur*, dérouler la case *Type d'actionneur* et sélectionner *LED*.
1. Réglez la *broche* sur *5*
1. Sélectionnez le bouton **Ajouter** pour créer la LED sur la broche 5.
![Les paramètres de la LED](../../../../images/counterfit-create-led.png)
La LED sera créée et apparaîtra dans la liste des actionneurs.
![La LED créée](../../../../images/counterfit-led.png)
Une fois la LED créée, vous pouvez changer sa couleur en utilisant le sélecteur *Color*. Sélectionnez le bouton **Set** pour modifier la couleur après l'avoir sélectionnée.
### Programmer la veilleuse
La veilleuse peut maintenant être programmée à l'aide du capteur de lumière et de la LED CounterFit.
#### Tâche - programmer la veilleuse
Programmez la veilleuse.
1. Ouvrez le projet de veilleuse dans VS Code que vous avez créé dans la partie précédente de ce travail. Fermez et recréez le terminal pour vous assurer qu'il fonctionne en utilisant l'environnement virtuel si nécessaire.
1. Ouvrez le fichier `app.py`
1. Ajoutez le code suivant au fichier `app.py` pour vous connecter à l'importation d'une bibliothèque requise. Ceci doit être ajouté en haut, en dessous des autres lignes `import`.
```python
from counterfit_shims_grove.grove_led import GroveLed
```
L'instruction `from counterfit_shims_grove.grove_led import GroveLed` importe la `GroveLed` des bibliothèques Python de CounterFit Grove shim. Cette bibliothèque contient du code pour interagir avec une LED créée dans l'application CounterFit.
1. Ajoutez le code suivant après la déclaration `light_sensor` pour créer une instance de la classe qui gère la LED :
```python
led = GroveLed(5)
```
La ligne `led = GroveLed(5)` crée une instance de la classe `GroveLed` se connectant à la broche **5** - la broche CounterFit Grove à laquelle la LED est connectée.
1. Ajoutez une vérification à l'intérieur de la boucle `while`, et avant le `time.sleep` pour vérifier les niveaux de lumière et allumer ou éteindre la LED :
```python
if light < 300:
led.on()
else:
led.off()
```
Ce code vérifie la valeur de `light`. Si cette valeur est inférieure à 300, il appelle la méthode `on` de la classe `GroveLed` qui envoie une valeur numérique de 1 à la LED, l'allumant ainsi. Si la valeur de la lumière est supérieure ou égale à 300, elle appelle la méthode `off`, qui envoie une valeur numérique de 0 à la LED, l'éteignant.
> 💁 Ce code doit être indenté au même niveau que la ligne `print('Light level:', light)` pour être à l'intérieur de la boucle while!
1. Depuis le terminal VS Code, exécutez ce qui suit pour lancer votre application Python :
```sh
python3 app.py
```
Les valeurs de lumière seront affichées sur la console.
```sortie
(.venv) ➜ GroveTest python3 app.py
Light level: 143
Light level: 244
Light level: 246
Light level: 253
```
1. Modifiez les paramètres *Value* ou *Random* pour faire varier le niveau d'éclairage au-dessus et au-dessous de 300. La LED s'allume et s'éteint.
![La LED dans l'application CounterFit s'allume et s'éteint lorsque le niveau de lumière change](../../../../images/virtual-device-running-assignment-1-1.gif)
> 💁 Vous trouverez ce code dans le dossier [code-actuator/virtual-device](../code-actuator/virtual-device).
😀 Votre programme de veilleuse a été réalisé avec succès!

@ -1,110 +0,0 @@
# Créer une veilleuse - Matériel IoT virtuel
Dans cette partie de la leçon, vous allez ajouter un capteur de lumière à votre dispositif IoT virtuel.
## Matériel virtuel
La veilleuse a besoin d'un actionneur, créé dans l'application CounterFit.
Le capteur est un **capteur de lumière**. Dans un dispositif IoT physique, il s'agirait d'une [photodiode](https://wikipedia.org/wiki/Photodiode) qui convertit la lumière en un signal électrique. Les capteurs de lumière sont des capteurs analogiques qui envoient une valeur entière indiquant une quantité relative de lumière, qui ne correspond à aucune unité de mesure standard telle que le [lux](https://wikipedia.org/wiki/Lux).
### Ajouter les capteurs à CounterFit
Pour utiliser un capteur de lumière virtuel, vous devez l'ajouter à l'application CounterFit.
#### Tâche - ajouter les capteurs à CounterFit
Ajoutez le capteur de lumière à l'application CounterFit.
1. Assurez-vous que l'application web CounterFit est en cours d'exécution depuis la partie précédente de ce travail. Si ce n'est pas le cas, démarrez-la.
1. Créez un capteur de lumière :
1. Dans la case *Create sensor* du volet *Sensors*, déroulez la case *Sensor type* et sélectionnez *Light*.
1. Laissez les *Unités* (*Units* en anglais) réglées sur *NoUnits*
1. Assurez-vous que l'option *Pin* est réglée sur *0*.
1. Sélectionnez le bouton **Add** pour créer le capteur de lumière sur la broche 0.
![Les paramètres du capteur de lumière](../../../../images/counterfit-create-light-sensor.png)
Le capteur de lumière sera créé et apparaîtra dans la liste des capteurs.
![Le capteur de lumière créé](../../../../images/counterfit-light-sensor.png)
## Programmer le capteur de lumière
L'appareil peut maintenant être programmé pour utiliser le capteur de lumière intégré.
### Tâche - programmer le capteur de lumière
Programmez l'appareil.
1. Ouvrez le projet nightlight dans VS Code que vous avez créé dans la partie précédente de ce travail. Fermez et recréez le terminal pour vous assurer qu'il fonctionne en utilisant l'environnement virtuel si nécessaire.
1. Ouvrez le fichier `app.py`
1. Ajouter le code suivant au début du fichier `app.py` avec le reste des déclarations `import` pour se connecter à l'importation de certaines bibliothèques requises :
```python
import time
from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor
```
L'instruction `import time` importe le module Python `time` qui sera utilisé plus tard dans ce travail.
L'instruction `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` importe le `GroveLightSensor` des bibliothèques Python CounterFit Grove shim. Cette bibliothèque contient du code pour interagir avec un capteur de lumière créé dans l'application CounterFit.
1. Ajoutez le code suivant au bas du fichier pour créer des instances de classes qui gèrent le capteur de lumière :
```python
light_sensor = GroveLightSensor(0)
```
La ligne `light_sensor = GroveLightSensor(0)` crée une instance de la classe `GroveLightSensor` se connectant au pin **0** - le pin du CounterFit Grove auquel le capteur de lumière est connecté.
1. Ajoutez une boucle infinie après le code ci-dessus pour interroger la valeur du capteur de lumière et l'imprimer sur la console :
```python
while True:
light = light_sensor.light
print('Light level:', light)
```
Ceci permet de lire le niveau de lumière actuel en utilisant la propriété `light` de la classe `GroveLightSensor`. Cette propriété lit la valeur analogique de la broche. Cette valeur est ensuite imprimée sur la console.
1. Ajoutez une petite mise en veille d'une seconde à la fin de la boucle `while` car les niveaux de lumière n'ont pas besoin d'être vérifiés continuellement. Une mise en veille réduit la consommation d'énergie de l'appareil.
```python
time.sleep(1)
```
1. Depuis le terminal VS Code, exécutez les commandes suivantes pour lancer votre application Python :
```sh
python3 app.py
```
Les valeurs lumineuses seront affichées sur la console. Initialement, cette valeur sera de 0.
1. Depuis l'application CounterFit, changez la valeur du capteur de lumière qui sera lue par l'application. Vous pouvez le faire de deux façons :
* Saisissez un nombre dans la case *Value* du capteur de lumière, puis sélectionnez le bouton **Set**. Le nombre que vous saisissez sera la valeur renvoyée par le capteur.
* Cochez la case *Aléatoire* et entrez une valeur *Min* et *Max*, puis cliquez sur le bouton **Set**. Chaque fois que le capteur lira une valeur, il lira un nombre aléatoire entre *Min* et *Max*.
Les valeurs que vous avez définies seront affichées sur la console. Modifiez les paramètres *Value* ou *Random* pour modifier la valeur.
```sortie
(.venv) ➜ GroveTest python3 app.py
Light level: 143
Light level: 244
Light level: 246
Light level: 253
```
> 💁 Vous trouverez ce code dans le dossier [code-sensor/virtual-device](../code-sensor/virtual-device).
😀 Votre programme de veilleuse a été un succès!

@ -1,110 +0,0 @@
# Créer une veilleuse - le terminale Wio
Dans cette partie de la leçon, vous ajouterez une LED à votre terminal Wio et l'utiliserez pour créer une veilleuse.
## Matériel
La veilleuse a maintenant besoin d'un actionneur.
L'actionneur est une **LED**, une [diode électroluminescente](https://wikipedia.org/wiki/Light-emitting_diode) qui émet de la lumière lorsqu'elle est traversée par un courant. Il s'agit d'un actionneur numérique qui a deux états : allumé (`on`) et éteint (`off`). L'envoi d'une valeur de 1 allume la LED et de 0 l'éteint. Il s'agit d'un actionneur Grove externe qui doit être connecté au terminal Wio.
La logique de la veilleuse en pseudo-code est la suivante :
```sortie
Vérifier le niveau de lumière.
Si la lumière est inférieure à 300
Allumer la LED
Sinon
Eteindre la LED
```
### Connecter la LED
La LED Grove est livrée sous forme de module avec une sélection de LED, ce qui vous permet de choisir la couleur.
#### Tâche - connecter la LED
Connecter la LED.
![Une LED grove](../../../../images/grove-led.png)
1. Choisissez votre LED préférée et insérez les pattes dans les deux trous du module LED.
Les LEDs sont des diodes électroluminescentes, et les diodes sont des dispositifs électroniques qui ne peuvent transporter le courant que dans un sens. Cela signifie que la LED doit être connectée dans le bon sens, sinon elle ne fonctionnera pas.
L'une des pattes de la LED est la broche positive, l'autre est la broche négative. La LED n'est pas parfaitement ronde, elle est légèrement plus plate d'un côté. Le côté légèrement plus plat est la broche négative. Lorsque vous connectez la LED au module, assurez-vous que la broche du côté arrondi est connectée à la prise marquée **+** à l'extérieur du module, et que le côté plus plat est connecté à la prise plus proche du milieu du module.
1. Le module LED est doté d'un bouton rotatif qui vous permet de contrôler la luminosité. Pour commencer, réglez-le à fond en le tournant dans le sens inverse des aiguilles d'une montre jusqu'à la butée à l'aide d'un petit tournevis cruciforme.
1. Insérez l'une des extrémités d'un câble Grove dans la prise du module LED. Il ne peut être inséré que dans un seul sens.
1. Le terminal Wio étant déconnecté de votre ordinateur ou de toute autre source d'alimentation, connectez l'autre extrémité du câble Grove à la prise Grove du côté droit du terminal Wio lorsque vous regardez l'écran. Il s'agit de la prise la plus éloignée du bouton d'alimentation.
> 💁 La prise Grove de droite peut être utilisée avec des capteurs et des actionneurs analogiques ou numériques.La prise de gauche est réservée aux capteurs et actionneurs I<sup>2</sup>C et numériques. L'I<sup>2</sup>C sera abordé dans une leçon ultérieure.
![La LED grove connectée à la prise de droite](../../../../images/wio-led.png)
## Programmer la veilleuse
La veilleuse peut maintenant être programmée à l'aide du capteur de lumière intégré et de la LED Grove.
### Tâche - programmer la veilleuse
Programmer la veilleuse.
1. Ouvrez le projet de veilleuse dans VS Code que vous avez créé dans la partie précédente de ce devoir
1. Ajoutez la ligne suivante à la fin de la fonction `setup` :
```cpp
pinMode(D0, OUTPUT);
```
Cette ligne configure la broche utilisée pour communiquer avec la LED via le port Grove.
La broche `D0` est la broche numérique pour la prise Grove de droite. Cette broche est réglée sur `OUTPUT`, ce qui signifie qu'elle se connecte à un actionneur et que des données seront écrites sur la broche.
1. Ajoutez le code suivant immédiatement avant le `delay` dans la fonction loop :
```cpp
if (light < 300)
{
digitalWrite(D0, HIGH);
}
else
{
digitalWrite(D0, LOW);
}
```
Ce code vérifie la valeur `light`. Si cette valeur est inférieure à 300, il envoie une valeur `HIGH` à la broche numérique `D0`. Ce `HIGH` a une valeur de 1, ce qui allume la LED. Si la lumière est supérieure ou égale à 300, une valeur `LOW` de 0 est envoyée à la broche, ce qui éteint la LED.
> 💁 Lors de l'envoi de valeurs numériques à des actionneurs, une valeur BASSE correspond à 0 V et une valeur HAUTE correspond à la tension maximale de l'appareil. Pour le terminal Wio, la tension HAUTE ("HIGH" en anglais) est de 3,3V.
1. Reconnectez le terminal Wio à votre ordinateur et téléchargez le nouveau code comme vous l'avez fait précédemment.
1. Connectez le moniteur série. Les valeurs lumineuses seront transmises au terminal.
```sortie
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Light value: 4
Light value: 5
Light value: 4
Light value: 158
Light value: 343
Light value: 348
Light value: 344
```
1. Couvrez et découvrez le capteur de lumière. Remarquez que la LED s'allume lorsque le niveau de luminosité est inférieur ou égal à 300, et s'éteint lorsque le niveau de luminosité est supérieur à 300.
![La LED connectée au WIO s'allume et s'éteint en fonction de l'intensité lumineuse.](../../../../images/wio-running-assignment-1-1.gif)
> 💁 Vous trouverez ce code dans le dossier [code-actuator/wio-terminal](../code-actuator/wio-terminal).
😀 Votre programme de veilleuse a été un succès!

@ -1,73 +0,0 @@
# Ajouter un capteur - le terminal Wio
Dans cette partie de la leçon, vous utiliserez le capteur de lumière sur votre terminal Wio.
## Matériel
Le capteur de cette leçon est un **capteur de lumière** qui utilise une [photodiode](https://fr.wikipedia.org/wiki/Photodiode) pour convertir la lumière en un signal électrique. Il s'agit d'un capteur analogique qui envoie une valeur entière comprise entre 0 et 1023 indiquant une quantité relative de lumière qui ne correspond à aucune unité de mesure standard telle que le [lux](https://wikipedia.org/wiki/Lux).
Le capteur de lumière est intégré au terminal Wio et est visible à travers la fenêtre en plastique transparent située à l'arrière.
![Le capteur de lumière au dos du terminal Wio](../../../../images/wio-light-sensor.png)
## Programmer le capteur de lumière
L'appareil peut maintenant être programmé pour utiliser le capteur de lumière intégré.
### Tâche
Programmez l'appareil.
1. Ouvrez le projet nightlight dans VS Code que vous avez créé dans la partie précédente de ce travail.
1. Ajoutez la ligne suivante à la fin de la fonction `setup` :
```cpp
pinMode(WIO_LIGHT, INPUT);
```
Cette ligne configure les broches utilisées pour communiquer avec le capteur.
La broche `WIO_LIGHT` est le numéro de la broche GPIO connectée au capteur de lumière embarqué. Cette broche est réglée sur `INPUT`, ce qui signifie qu'elle se connecte à un capteur et que les données seront lues à partir de la broche.
1. Effacez le contenu de la fonction `loop`.
1. Ajoutez le code suivant à la fonction `loop` maintenant vide.
```cpp
int light = analogRead(WIO_LIGHT);
Serial.print("Light value: ");
Serial.println(light);
```
Ce code lit une valeur analogique sur la broche `WIO_LIGHT`. Il lit une valeur comprise entre 0 et 1023 à partir du capteur de lumière embarqué. Cette valeur est ensuite envoyée au port série afin que vous puissiez la lire dans le Serial Monitor lorsque ce code est exécuté. `Serial.print` écrit le texte sans nouvelle ligne à la fin, de sorte que chaque ligne commence par `Light value:` et se termine par la valeur réelle de la lumière.
1. Ajoutez un petit délai d'une seconde (1000 ms) à la fin de la `boucle` (`loop` en anglais), car les niveaux de lumière n'ont pas besoin d'être vérifiés en permanence. Un délai réduit la consommation d'énergie de l'appareil.
```cpp
delay(1000);
```
1. Reconnectez le terminal Wio à votre ordinateur et téléchargez le nouveau code comme vous l'avez fait précédemment.
1. Connectez le moniteur série. Des valeurs lumineuses seront émises vers le terminal. Couvrez et découvrez le capteur de lumière à l'arrière du terminal Wio, et les valeurs changeront.
```sortie
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Light value: 4
Light value: 5
Light value: 4
Light value: 158
Light value: 343
Light value: 348
Light value: 344
```
> 💁 Vous trouverez ce code dans le dossier [code-sensor/wio-terminal](../code-sensor/wio-terminal).
😀 L'ajout d'un capteur à votre programme de veilleuses a été un succès!

@ -1,461 +0,0 @@
# <div dir="rtl">قم بتوصيل جهازك بالإنترنت</div>
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-4.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
## <div dir="rtl">اختبار ما قبل المحاضرة</div>
[اختبار ما قبل المحاضرة](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7)
## <div dir="rtl">المقدمة</div>
<div dir="rtl">
يرمز ** I ** in IoT إلى ** الإنترنت ** - الاتصال السحابي والخدمات التي تتيح الكثير من ميزات أجهزة إنترنت الأشياء ، من جمع القياسات من المستشعرات المتصلة بالجهاز ، إلى إرسال الرسائل للتحكم في المشغلات . تتصل أجهزة إنترنت الأشياء عادةً بخدمة سحابية واحدة لإنترنت الأشياء باستخدام بروتوكول اتصال قياسي ، وهذه الخدمة متصلة ببقية تطبيق إنترنت الأشياء الخاص بك ، بدءًا من خدمات الذكاء الاصطناعي لاتخاذ قرارات ذكية حول بياناتك ، إلى تطبيقات الويب للتحكم أو إعداد التقارير.
> 🎓 البيانات التي يتم جمعها من أجهزة الاستشعار وإرسالها إلى السحابة تسمى القياس عن بعد.
يمكن لأجهزة إنترنت الأشياء استقبال الرسائل من السحابة. غالبًا ما تحتوي الرسائل على أوامر - وهي إرشادات لتنفيذ إجراء إما داخليًا (مثل إعادة التشغيل أو تحديث البرامج الثابتة) ، أو باستخدام مشغل (مثل تشغيل الضوء).
يقدم هذا الدرس بعض بروتوكولات الاتصال التي يمكن أن تستخدمها أجهزة إنترنت الأشياء للاتصال بالسحابة وأنواع البيانات التي قد ترسلها أو تتلقاها. ستحصل أيضًا على تدريب عملي مع كليهما ، وإضافة التحكم في الإنترنت إلى ضوء الليل ، ونقل منطق التحكم في LED إلى كود "السيرفر" الذي يعمل محليًا.
سنغطي في هذا الدرس:
* [بروتوكولات الاتصال](#communication-protocols)
* [النقل عن بعد لخدمة وضع الرسائل في قائمة انتظار (MQTT)](#message-queueing-telemetry-transport-mqtt)
* [القياس عن بعد](#telemetry)
* [أوامر](#commands)
## بروتوكولات الاتصال
هناك عدد من بروتوكولات الاتصال الشائعة التي تستخدمها أجهزة إنترنت الأشياء للاتصال بالإنترنت. الأكثر شيوعًا يعتمد على نشر / اشتراك الرسائل عبر نوع من الوسطاء. تتصل أجهزة إنترنت الأشياء بالوسيط وتنشر التتبع عن بعد والاشتراك في الأوامر. تتصل الخدمات السحابية أيضًا بالوسيط وتشترك في جميع رسائل التتبع عن بُعد وتنشر الأوامر إما على أجهزة محددة أو إلى مجموعات من الأجهزة.
![IoT devices connect to a broker and publish telemetry and subscribe to commands. Cloud services connect to the broker and subscribe to all telemetry and send commands to specific devices.](../../../../images/pub-sub.png)
MQTT هو بروتوكول الاتصال الأكثر شيوعًا لأجهزة إنترنت الأشياء ويتم تناوله في هذا الدرس. تشمل البروتوكولات الأخرى AMQP و HTTP / HTTPS.
## نقل القياس عن بُعد لخدمة وضع الرسائل في قائمة انتظار (MQTT)
<a href="http://mqtt.org">MQTT</a> هو بروتوكول مراسلة قياسي خفيف الوزن ومفتوح يمكنه إرسال الرسائل بين الأجهزة. تم تصميمه في عام 1999 لمراقبة خطوط أنابيب النفط ، قبل طرحه كمعيار مفتوح بعد 15 عامًا من قبل شركة IBM.
MQTT لديها وسيط واحد وعملاء متعددين. يتصل جميع العملاء بالوسيط ، ويقوم الوسيط بتوجيه الرسائل إلى العملاء المعنيين. يتم توجيه الرسائل باستخدام موضوعات محددة ، بدلاً من إرسالها مباشرة إلى عميل فردي. يمكن للعميل النشر في موضوع ، وسيتلقى أي عميل يشترك في هذا الموضوع الرسالة.
![IoT device publishing telemetry on the /telemetry topic, and the cloud service subscribing to that topic](../../../../images/mqtt.png)
✅ قم ببعض البحث. إذا كان لديك الكثير من أجهزة إنترنت الأشياء ، كيف يمكنك التأكد من أن وسيط MQTT الخاص بك يمكنه التعامل مع جميع الرسائل؟
### قم بتوصيل جهاز إنترنت الأشياء الخاص بك بـ MQTT
الجزء الأول من إضافة التحكم في الإنترنت إلى ضوء الليل الخاص بك هو توصيله بوسيط MQTT.
#### مهمة
قم بتوصيل جهازك بوسيط MQTT.
في هذا الجزء من الدرس ، ستقوم بتوصيل ضوء إنترنت الأشياء الخاص بك بالإنترنت للسماح بالتحكم فيه عن بُعد. لاحقًا في هذا الدرس ، سيرسل جهاز إنترنت الأشياء الخاص بك رسالة قياس عن بُعد عبر MQTT إلى وسيط MQTT عام بمستوى خفيف ، حيث سيتم التقاطه بواسطة بعض كود السيرفر الذي ستكتبه. سيتحقق هذا الرمز من مستوى الضوء ويرسل رسالة أوامر إلى الجهاز تخبره بتشغيل أو إيقاف تشغيل مؤشر LED.
يمكن أن تكون حالة الاستخدام في العالم الحقيقي لمثل هذا الإعداد هي جمع البيانات من مستشعرات ضوئية متعددة قبل اتخاذ قرار بتشغيل الأضواء ، في موقع به الكثير من الأضواء ، مثل الملعب. يمكن أن يؤدي ذلك إلى إيقاف تشغيل الأضواء إذا تم تغطية مستشعر واحد فقط بواسطة السحب أو الطائر ، لكن أجهزة الاستشعار الأخرى اكتشفت ضوءًا كافيًا.
✅ ما المواقف الأخرى التي تتطلب تقييم البيانات من أجهزة استشعار متعددة قبل إرسال الأوامر؟
بدلاً من التعامل مع تعقيدات إعداد وسيط MQTT كجزء من هذه المهمة ، يمكنك استخدام سيرفر اختبار عام يقوم بتشغيل <a href="https://www.mosquitto.org">Eclipse Mosquitto</a> ، وسيط MQTT مفتوح المصدر. وسيط الاختبار هذا متاح للجمهور على <a href="https://test.mosquitto.org">test.mosquitto.org</a> ، ولا يتطلب إعداد حساب ، مما يجعله أداة رائعة لاختبار عملاء وخوادم MQTT.
> 💁 وسيط الاختبار هذا عام وغير آمن. يمكن لأي شخص أن يستمع إلى ما تنشره ، لذا لا ينبغي استخدامه مع أي بيانات تحتاج إلى الحفاظ على خصوصيتها
![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-internet-flow.png)
اتبع الخطوة ذات الصلة أدناه لتوصيل جهازك بوسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-mqtt.md)
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi/Virtual IoT device](single-board-computer-mqtt.md)
### الغوص بشكل أعمق في MQTT
يمكن أن تحتوي الموضوعات على تسلسل هرمي ، ويمكن للعملاء الاشتراك في مستويات مختلفة من التسلسل الهرمي باستخدام أحرف البدل. على سبيل المثال ، يمكنك إرسال رسائل قياس درجة الحرارة عن بُعد إلى الموضوع `/ القياس عن بُعد / درجة الحرارة` ورسائل الرطوبة إلى الموضوع` / القياس عن بُعد / الرطوبة` ، ثم في تطبيق السحابة الخاص بك ، اشترك في `/ القياس عن بُعد / *` الموضوع لتلقي كلا الموضوعين رسائل قياس درجة الحرارة والرطوبة.
يمكن إرسال الرسائل بجودة الخدمة (QoS) ، والتي تحدد ضمان استلام الرسالة.
* مرة واحدة على الأكثر - يتم إرسال الرسالة مرة واحدة فقط ولا يتخذ العميل والوسيط أي خطوات إضافية للإقرار بالتسليم (إطلاق النار والنسيان).
* مرة واحدة على الأقل - أعاد المرسل محاولة إرسال الرسالة عدة مرات حتى استلام الإقرار (تسليم مُعترف به).
* مرة واحدة بالضبط - يشترك المرسل والمتلقي في مصافحة ثنائية المستوى لضمان استلام نسخة واحدة فقط من الرسالة (تسليم مضمون).
✅ ما المواقف التي قد تتطلب رسالة تسليم مضمونة على النار ونسيان الرسالة؟
على الرغم من أن الاسم هو خدمة "وضع الرسائل في قائمة انتظار" (الأحرف الأولى من MQTT) ، إلا أنها لا تدعم قوائم انتظار الرسائل بالفعل. هذا يعني أنه في حالة قطع اتصال العميل ، فلن يتلقى الرسائل التي تم إرسالها أثناء قطع الاتصال بعد إعادة الاتصال ، باستثناء تلك الرسائل التي بدأ بالفعل معالجتها باستخدام عملية QoS. يمكن أن تحتوي الرسائل على علامة محتجزة عليها. إذا تم تعيين هذا ، فسيقوم وسيط MQTT بتخزين آخر رسالة تم إرسالها حول موضوع بهذه العلامة ، وإرسالها إلى أي عملاء اشتركوا لاحقًا في الموضوع. بهذه الطريقة ، سيحصل العملاء دائمًا على أحدث رسالة.
يدعم MQTT أيضًا وظيفة البقاء على قيد الحياة التي تتحقق مما إذا كان الاتصال لا يزال على قيد الحياة أثناء الفجوات الطويلة بين الرسائل.
> 🦟 <a href="https://mosquitto.org">Mosquitto from the Eclipse Foundation</a> لديه وسيط MQTT مجاني يمكنك تشغيله بنفسك لتجربة MQTT ، جنبًا إلى جنب مع وسيط MQTT عام يمكنك استخدامه لاختبار الكود الخاص بك ، والذي يتم استضافته في <a href="https://test.mosquitto.org">test.mosquitto.org</a>).
يمكن أن تكون اتصالات MQTT عامة ومفتوحة أو مشفرة ومؤمنة باستخدام أسماء المستخدمين وكلمات المرور أو الشهادات.
> 💁 يتصل MQTT عبر TCP / IP ، وهو نفس بروتوكول الشبكة الأساسي مثل HTTP ، ولكن على منفذ مختلف. يمكنك أيضًا استخدام MQTT عبر مآخذ الويب للتواصل مع تطبيقات الويب التي تعمل في مستعرض ، أو في المواقف التي تحظر فيها جدران الحماية أو قواعد الشبكات الأخرى اتصالات MQTT القياسية.
## القياس عن بعد
كلمة القياس عن بعد مشتقة من جذور يونانية تعني القياس عن بعد. القياس عن بعد هو عملية جمع البيانات من أجهزة الاستشعار وإرسالها إلى السحابة.
> 💁 تم اختراع أحد أقدم أجهزة القياس عن بعد في فرنسا عام 1874 وأرسل الطقس في الوقت الفعلي وأعماق الثلوج من مونت بلانك إلى باريس. استخدمت الأسلاك المادية لأن التقنيات اللاسلكية لم تكن متوفرة في ذلك الوقت.
لنلق نظرة على مثال منظم الحرارة الذكي من الدرس 1.
![An Internet connected thermostat using multiple room sensors](../../../../images/telemetry.png)
يحتوي منظم الحرارة على مستشعرات لدرجة الحرارة لجمع القياس عن بعد. من المرجح أن يحتوي على مستشعر درجة حرارة واحد مدمج ، وقد يتصل بأجهزة استشعار درجة حرارة خارجية متعددة عبر بروتوكول لاسلكي مثل <a href="https://wikipedia.org/wiki/Bluetooth_Low_Energy">Bluetooth Low Energy</a>
مثال على بيانات القياس عن بعد التي سترسلها يمكن أن يكون:
| الاسم | القيمة | الوصف |
| ---- | ----- | ----------- |
| "درجة حرارة الحرارة" | 18 درجة مئوية | درجة الحرارة المقاسة بواسطة مستشعر درجة الحرارة المدمج في منظم الحرارة |
| "درجة حرارة غرفة المعيشة" | 19 درجة مئوية | تم قياس درجة الحرارة بواسطة مستشعر درجة الحرارة عن بعد والذي تم تسميته "غرفة المعيشة" لتحديد الغرفة الموجودة بها |
| "حجرة النوم" | 21 درجة مئوية | تم قياس درجة الحرارة بواسطة جهاز استشعار درجة الحرارة عن بعد والذي تم تسميته "غرفة نوم" لتحديد الغرفة الموجودة بها |
يمكن للخدمة السحابية بعد ذلك استخدام بيانات القياس عن بُعد هذه لاتخاذ قرارات حول الأوامر التي يجب إرسالها للتحكم في التسخين.
### إرسال القياس عن بعد من جهاز إنترنت الأشياء الخاص بك
الجزء التالي في إضافة التحكم في الإنترنت إلى ضوء الليل هو إرسال مقياس مستوى الضوء إلى وسيط MQTT حول موضوع القياس عن بُعد.
#### مهمة
أرسل قياس مستوى الضوء إلى وسيط MQTT.
يتم إرسال البيانات بترميز JSON - اختصار لـ JavaScript Object Notation ، وهو معيار لتشفير البيانات في النص باستخدام أزواج المفاتيح / القيمة.
✅ إذا لم تكن قد صادفت JSON من قبل ، فيمكنك معرفة المزيد عنها على <a href="https://www.json.org/">JSON.org documentation</a>
اتبع الخطوة ذات الصلة أدناه لإرسال بيانات القياس من جهازك إلى وسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-telemetry.md)
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi/Virtual IoT device](single-board-computer-telemetry.md)
### تلقي القياس عن بعد من وسيط MQTT
ليس هناك فائدة من إرسال التتبع عن بعد إذا لم يكن هناك شيء على الطرف الآخر للاستماع إليه. يحتاج القياس عن بعد لمستوى الضوء إلى شيء يستمع إليه لمعالجة البيانات. رمز `` السيرفر '' هذا هو نوع الكود الذي ستنشره في خدمة سحابية كجزء من تطبيق إنترنت الأشياء أكبر ، ولكن هنا ستقوم بتشغيل هذا الرمز محليًا على جهاز الكمبيوتر الخاص بك (أو على Pi إذا كنت تقوم بالتشفير مباشرة هناك ). يتكون رمز السيرفر من تطبيق Python الذي يستمع إلى رسائل القياس عن بُعد عبر MQTT بمستويات الضوء. لاحقًا في هذا الدرس ، ستجعله يرد برسالة أوامر تحتوي على إرشادات لتشغيل أو إيقاف تشغيل مؤشر LED.
✅ قم ببعض البحث: ماذا يحدث لرسائل MQTT إذا لم يكن هناك مستمع؟
#### تثبيت Python و VS Code
إذا لم يكن لديك Python و VS Code مثبتًا محليًا ، فستحتاج إلى تثبيتهما لتشفير السيرفر. إذا كنت تستخدم جهازًا افتراضيًا ، أو كنت تعمل على Raspberry Pi ، فيمكنك تخطي هذه الخطوة.
##### مهمة
قم بتثبيت Python و VS Code.
1. تثبيت بايثون. راجع <a href="https://www.python.org/downloads">Python downloads page</a> للحصول على إرشادات حول تثبيت أحدث إصدار من Python.
1. قم بتثبيت Visual Studio Code (VS Code). هذا هو المحرر الذي ستستخدمه لكتابة رمز جهازك الافتراضي في Python. راجع <a href="https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn">VS Code documentation</a> للحصول على إرشادات حول تثبيت VS Code.
> 💁 لك مطلق الحرية في استخدام أي محرر Python IDE أو محرر لهذه الدروس إذا كان لديك أداة مفضلة ، ولكن الدروس ستعطي إرشادات تستند إلى استخدام VS Code.
1. قم بتثبيت امتداد VS Code Pylance. هذا امتداد لـ VS Code الذي يوفر دعم لغة Python. راجع <a href="https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance">Pylance extension documentation</a> للحصول على إرشادات حول تثبيت هذا الامتداد في VS Code.
#### تكوين بيئة Python الافتراضية
إحدى الميزات القوية في Python هي القدرة على تثبيت <a href="https://pypi.org">pip packages</a> - وهي حزم من التعليمات البرمجية كتبها أشخاص آخرون وتم نشرها على الإنترنت. يمكنك تثبيت حزمة pip على جهاز الكمبيوتر الخاص بك بأمر واحد ، ثم استخدام تلك الحزمة في التعليمات البرمجية الخاصة بك. ستستخدم النقطة لتثبيت حزمة للتواصل عبر MQTT.
بشكل افتراضي ، عندما تقوم بتثبيت حزمة تكون متاحة في كل مكان على جهاز الكمبيوتر الخاص بك ، وقد يؤدي ذلك إلى مشاكل مع إصدارات الحزمة - مثل تطبيق واحد يعتمد على إصدار واحد من الحزمة التي تتعطل عند تثبيت إصدار جديد لتطبيق مختلف. للتغلب على هذه المشكلة ، يمكنك استخدام <a href="https://docs.python.org/3/library/venv.html">Python virtual environment</a> ، وهي بالأساس نسخة من Python في مجلد مخصص ، وعند تثبيت النقطة الحزم التي يتم تثبيتها على هذا المجلد فقط.
##### مهمة
قم بتكوين بيئة Python الافتراضية وتثبيت حزم MQTT pip.
1. من المحطة الطرفية أو سطر الأوامر ، قم بتشغيل ما يلي في موقع من اختيارك لإنشاء دليل جديد والانتقال إليه:
```sh
mkdir nightlight-server
cd nightlight-server
```
1. قم الآن بتشغيل ما يلي لإنشاء بيئة افتراضية في المجلد ".venv"
```sh
python3 -m venv .venv
```
> 💁 تحتاج إلى استدعاء `python3` لإنشاء بيئة افتراضية فقط في حالة تثبيت Python 2 بالإضافة إلى Python 3 (أحدث إصدار). إذا كان لديك Python2 مثبتًا ، فإن استدعاء `python` سيستخدم Python 2 بدلاً من Python 3
1. تفعيل البيئة الافتراضية:
* على نظام التشغيل Windows:
</div>
.venv\Scripts\activate.bat
<div dir="rtl">
* على نظام macOS أو Linux ، قم بتشغيل:
</div>
source ./.venv/bin/activate
<div dir="rtl">
1. بمجرد تنشيط البيئة الافتراضية ، سيقوم الأمر الافتراضي "python" بتشغيل إصدار Python الذي تم استخدامه لإنشاء البيئة الافتراضية. قم بتشغيل ما يلي للحصول على الإصدار:
</div>
python --version
<div dir="rtl">
سيكون الإخراج مشابهًا لما يلي:
</div>
(.venv) ➜ nightlight-server python --version
Python 3.9.1
<div dir="rtl">
> 💁 قد يكون إصدار Python الخاص بك مختلفًا - طالما أنه الإصدار 3.6 أو أعلى فأنت جيد. إذا لم يكن كذلك ، فاحذف هذا المجلد ، وقم بتثبيت إصدار أحدث من Python وحاول مرة أخرى.
1. قم بتشغيل الأوامر التالية لتثبيت حزمة pip لـ <a href="https://pypi.org/project/paho-mqtt/">Paho-MQTT</a> ، مكتبة MQTT شائعة.
</div>
pip install paho-mqtt
<div dir="rtl">
سيتم تثبيت حزمة النقطة هذه في البيئة الافتراضية فقط ، ولن تكون متاحة خارج هذا النطاق.]
#### اكتب كود السيرفر
يمكن الآن كتابة رمز السيرفر بلغة بايثون.
##### مهمة
اكتب كود السيرفر.
1. من المحطة الطرفية أو سطر الأوامر ، قم بتشغيل ما يلي داخل البيئة الافتراضية لإنشاء ملف Python يسمى "app.py":
* من تشغيل Windows:
type nul > app.py
* على نظام macOS أو Linux ، قم بتشغيل:
touch app.py
1. افتح المجلد الحالي في VS Code:
```sh
code .
```
1. عند إطلاق VS Code ، سيتم تنشيط بيئة Python الافتراضية. سيتم الإبلاغ عن ذلك في شريط الحالة السفلي:
![VS Code showing the selected virtual environment](../../../../images/vscode-virtual-env.png)
1. إذا كان VS Code Terminal قيد التشغيل بالفعل عند بدء تشغيل VS Code ، فلن يتم تنشيط البيئة الافتراضية فيه. أسهل ما يمكنك فعله هو قتل المحطة باستخدام زر ** Kill the active terminalary **:
![VS Code Kill the active terminal instance button](../../../../images/vscode-kill-terminal.png)
1. قم بتشغيل VS Code Terminal الجديدة عن طريق تحديد * Terminal -> New Terminal ، أو الضغط على `` CTRL + ''. ستحمل المحطة الجديدة البيئة الافتراضية ، وستظهر المكالمة لتنشيط هذا في الجهاز. سيكون اسم البيئة الافتراضية (`.venv`) أيضًا في الموجه:
```output
➜ nightlight source .venv/bin/activate
(.venv) ➜ nightlight
```
1. افتح ملف `app.py` من مستكشف VS Code وأضف الكود التالي:
</div>
import json
import time
import paho.mqtt.client as mqtt
id = '<ID>'
client_telemetry_topic = id + '/telemetry'
client_name = id + 'nightlight_server'
mqtt_client = mqtt.Client(client_name)
mqtt_client.connect('test.mosquitto.org')
mqtt_client.loop_start()
def handle_telemetry(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
mqtt_client.subscribe(client_telemetry_topic)
mqtt_client.on_message = handle_telemetry
while True:
time.sleep(2)
<div dir="rtl">
استبدل `<ID>` في السطر 6 بالمعرف الفريد الذي استخدمته عند إنشاء رمز جهازك.
⚠️ هذا ** يجب ** أن يكون هو نفس المعرف الذي استخدمته على جهازك ، وإلا فلن يشترك رمز السيرفر أو ينشر في الموضوع الصحيح.
ينشئ هذا الرمز عميل MQTT باسم فريد ، ويتصل بالوسيط * test.mosquitto.org *. ثم تبدأ حلقة معالجة يتم تشغيلها في سلسلة رسائل خلفية تستمع للرسائل حول أي موضوع مشترك.
يشترك العميل بعد ذلك في الرسائل المتعلقة بموضوع التتبع عن بُعد ، ويحدد الوظيفة التي يتم استدعاؤها عند تلقي رسالة. عندما يتم تلقي رسالة القياس عن بعد ، يتم استدعاء وظيفة "handle_telemetry" ، وطباعة الرسالة المستلمة إلى وحدة التحكم.
أخيرًا ، تحافظ حلقة لا نهائية على تشغيل التطبيق. يستمع عميل MQTT إلى الرسائل الموجودة على مؤشر ترابط في الخلفية ويعمل طوال الوقت الذي يتم فيه تشغيل التطبيق الرئيسي.
1. من محطة VS Code ، قم بتشغيل ما يلي لتشغيل تطبيق Python:
```sh
python app.py
```
سيبدأ التطبيق في الاستماع إلى الرسائل من جهاز إنترنت الأشياء.
1. تأكد من تشغيل جهازك وإرسال رسائل القياس عن بُعد. اضبط مستويات الإضاءة التي اكتشفها جهازك الفعلي أو الافتراضي. ستتم طباعة الرسائل التي يتم استلامها على الجهاز.
</div>
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Message received: {'light': 400}
<div dir="rtl">
يجب تشغيل ملف app.py في البيئة الافتراضية لضوء الليل لملف app.py في البيئة الافتراضية لسيرفر ضوء الليل لتلقي الرسائل التي يتم إرسالها.
</div>
> 💁 يمكنك العثور على هذا الرمز في المجلد [code-server/server](code-server/server).
<div dir="rtl">
### كم مرة يجب إرسال القياس عن بُعد؟
أحد الاعتبارات المهمة في القياس عن بُعد هو كم مرة يتم قياس البيانات وإرسالها؟ الجواب هو، فإنه يعتمد. إذا كنت تقيس كثيرًا ، يمكنك الاستجابة بشكل أسرع للتغييرات في القياسات ، لكنك تستخدم المزيد من الطاقة وعرض النطاق الترددي وتوليد المزيد من البيانات وتحتاج إلى المزيد من موارد السحابة للمعالجة. تحتاج إلى القياس في كثير من الأحيان بما فيه الكفاية ، ولكن ليس في كثير من الأحيان.
بالنسبة إلى منظم الحرارة ، ربما يكون القياس كل بضع دقائق أكثر من كافٍ لأن درجات الحرارة لا تتغير كثيرًا. إذا قمت بالقياس مرة واحدة فقط في اليوم ، فقد ينتهي بك الأمر بتسخين منزلك لدرجات حرارة الليل في منتصف يوم مشمس ، بينما إذا قمت بقياس كل ثانية ، فستحصل على الآلاف من قياسات درجة الحرارة المكررة غير الضرورية التي ستؤثر على سرعة الإنترنت للمستخدمين وعرض النطاق الترددي (مشكلة للأشخاص الذين لديهم خطط نطاق ترددي محدود) ، استخدم المزيد من الطاقة التي يمكن أن تكون مشكلة للأجهزة التي تعمل بالبطاريات مثل أجهزة الاستشعار عن بعد ، وزيادة تكلفة معالجة موارد الحوسبة السحابية وتخزينها.
إذا كنت تراقب بيانات حول قطعة من الآلات في مصنع قد تتسبب في حدوث أضرار كارثية وملايين الدولارات في الإيرادات المفقودة ، فقد يكون القياس عدة مرات في الثانية ضروريًا. من الأفضل إهدار النطاق الترددي بدلاً من تخطي القياس عن بُعد الذي يشير إلى أن الجهاز يحتاج إلى التوقف والإصلاح قبل أن ينكسر.
> 💁 في هذه الحالة ، قد تفكر في امتلاك جهاز حافة لمعالجة القياس عن بُعد أولاً لتقليل الاعتماد على الإنترنت.
### فقدان الاتصال
قد تكون اتصالات الإنترنت غير موثوقة ، مع حدوث حالات انقطاع شائعة. ما الذي يجب أن يفعله جهاز إنترنت الأشياء في ظل هذه الظروف - هل يفقد البيانات ، أم يجب أن يخزنها حتى يتم استعادة الاتصال؟ مرة أخرى ، الجواب يعتمد.
بالنسبة إلى منظم الحرارة ، من المحتمل أن تُفقد البيانات بمجرد إجراء قياس درجة حرارة جديد. لا يهتم نظام التدفئة بأنه قبل 20 دقيقة كانت 20.5 درجة مئوية إذا كانت درجة الحرارة الآن 19 درجة مئوية ، فإن درجة الحرارة الآن هي التي تحدد ما إذا كان يجب تشغيل التدفئة أو إيقاف تشغيلها.
بالنسبة للآلات ، قد ترغب في الاحتفاظ بالبيانات ، خاصة إذا تم استخدامها للبحث عن الاتجاهات. هناك نماذج للتعلم الآلي يمكنها اكتشاف الحالات الشاذة في تدفقات البيانات من خلال النظر في البيانات من فترة زمنية محددة (مثل الساعة الأخيرة) واكتشاف البيانات الشاذة. غالبًا ما يستخدم هذا للصيانة التنبؤية ، والبحث عن مؤشرات على أن شيئًا ما قد ينكسر قريبًا حتى تتمكن من إصلاحه أو استبداله قبل حدوث ذلك. قد ترغب في إرسال كل جزء من القياس عن بُعد لجهاز ما حتى يمكن معالجته لاكتشاف الشذوذ ، لذلك بمجرد أن يتمكن جهاز إنترنت الأشياء من إعادة الاتصال ، سيرسل جميع عمليات القياس عن بُعد التي تم إنشاؤها أثناء انقطاع الإنترنت.
يجب أن يفكر مصممو أجهزة إنترنت الأشياء أيضًا في إمكانية استخدام جهاز إنترنت الأشياء أثناء انقطاع الإنترنت أو فقدان الإشارة بسبب الموقع. يجب أن يكون منظم الحرارة الذكي قادرًا على اتخاذ بعض القرارات المحدودة للتحكم في التدفئة إذا لم يتمكن من إرسال القياس عن بُعد إلى السحابة بسبب انقطاع التيار.
[![This ferrari got bricked because someone tried to upgrade it underground where there's no cell reception](../../../../images/bricked-car.png)](https://twitter.com/internetofshit/status/1315736960082808832)
لكي يتعامل MQTT مع فقدان الاتصال ، يجب أن يكون رمز الجهاز والسيرفر مسؤولين عن ضمان تسليم الرسائل إذا لزم الأمر ، على سبيل المثال من خلال المطالبة بالرد على جميع الرسائل المرسلة برسائل إضافية في موضوع الرد ، وإذا لم يكن الأمر كذلك يتم وضعها في قائمة الانتظار يدويًا ليتم إعادة تشغيلها لاحقًا.
## الأوامر
الأوامر هي رسائل ترسلها السحابة إلى جهاز ، وتطلب منه القيام بشيء ما. في معظم الأوقات ، يتضمن ذلك تقديم نوع من الإخراج عبر مشغل ، ولكن يمكن أن يكون تعليمات للجهاز نفسه ، مثل إعادة التشغيل ، أو جمع بيانات قياس عن بعد إضافية وإعادتها كرد فعل على الأمر.
![An Internet connected thermostat receiving a command to turn on the heating](../../../../images/commands.png)
يمكن أن يتلقى منظم الحرارة أمرًا من السحابة لتشغيل التدفئة. استنادًا إلى بيانات القياس عن بُعد من جميع أجهزة الاستشعار ، إذا قررت الخدمة السحابية تشغيل التسخين ، فإنها ترسل الأمر ذي الصلة.
### إرسال أوامر إلى وسيط MQTT
تتمثل الخطوة التالية في ضوء الليل الذي يتم التحكم فيه عبر الإنترنت في أن يرسل رمز السيرفر أمرًا إلى جهاز إنترنت الأشياء للتحكم في الضوء استنادًا إلى مستويات الضوء التي يستشعرها.
1. افتح رمز السيرفر في VS Code
1. أضف السطر التالي بعد إعلان "client_telemetry_topic" لتحديد الموضوع الذي تريد إرسال الأوامر إليه:
</div>
server_command_topic = id + '/commands'
<div dir="rtl">
1. أضف الكود التالي إلى نهاية وظيفة `handle_telemetry`:
command = { 'led_on' : payload['light'] < 300 }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
يرسل هذا رسالة JSON إلى موضوع الأمر مع ضبط قيمة `led_on` على صواب أو خطأ اعتمادًا على ما إذا كان الضوء أقل من 300 أم لا. إذا كان الضوء أقل من 300 ، فسيتم إرسال true لإرشاد الجهاز إلى تشغيل مؤشر LED.
1. قم بتشغيل الكود كما كان من قبل
1. اضبط مستويات الضوء التي اكتشفها جهازك الفعلي أو الافتراضي. ستتم كتابة الرسائل التي يتم استلامها والأوامر التي يتم إرسالها إلى الجهاز:
</div>
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Sending message: {'led_on': True}
Message received: {'light': 400}
Sending message: {'led_on': False}
<div dir="rtl">
> 💁 يتم إرسال الأوامر والقياس عن بعد في موضوع واحد لكل منهما. هذا يعني أن التتبع عن بُعد من أجهزة متعددة سيظهر في نفس موضوع القياس عن بُعد ، وستظهر أوامر لأجهزة متعددة في نفس موضوع الأوامر. إذا كنت تريد إرسال أمر إلى جهاز معين ، فيمكنك استخدام مواضيع متعددة ، مسماة بمعرف جهاز فريد ، مثل `/ commands / device1` ،` / commands / device2`. بهذه الطريقة يمكن للجهاز الاستماع إلى الرسائل المخصصة لهذا الجهاز فقط.
</div>
> 💁 يمكنك العثور على هذا الرمز في مجلد [code-commands/server](code-commands/server).
### التعامل مع الأوامر على جهاز إنترنت الأشياء
الآن بعد أن تم إرسال الأوامر من السيرفر ، يمكنك الآن إضافة رمز إلى جهاز إنترنت الأشياء للتعامل معها والتحكم في مؤشر LED.
اتبع الخطوة ذات الصلة أدناه للاستماع إلى أوامر وسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-commands.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-commands.md)
بمجرد كتابة هذا الرمز وتشغيله ، جرب تغيير مستويات الضوء. شاهد الإخراج من السيرفر والجهاز ، وشاهد مؤشر LED وأنت تغير مستويات الإضاءة.
### فقدان الاتصال
ما الذي يجب أن تفعله الخدمة السحابية إذا احتاجت إلى إرسال أمر إلى جهاز إنترنت الأشياء غير متصل؟ مرة أخرى ، الجواب يعتمد.
إذا تجاوز الأمر الأخير أمرًا سابقًا ، فمن المحتمل أن يتم تجاهل الأوامر السابقة. إذا أرسلت خدمة سحابية أمرًا لتشغيل التسخين ، ثم أرسلت أمرًا لإيقاف تشغيله ، فيمكن عندئذٍ تجاهل الأمر on وعدم الاستياء.
إذا كانت الأوامر بحاجة إلى المعالجة بالتسلسل ، مثل تحريك ذراع الروبوت لأعلى ، ثم أغلق أداة الإمساك ثم يلزم إرسالها بالترتيب بمجرد استعادة الاتصال.
✅ كيف يمكن للجهاز أو رمز السيرفر ضمان إرسال الأوامر دائمًا ومعالجتها بالترتيب عبر MQTT إذا لزم الأمر؟
---
## 🚀 التحدي
كان التحدي في الدروس الثلاثة الأخيرة هو سرد أكبر عدد ممكن من أجهزة إنترنت الأشياء الموجودة في منزلك أو مدرستك أو مكان عملك وتحديد ما إذا كانت مبنية على وحدات تحكم دقيقة أو أجهزة كمبيوتر أحادية اللوحة ، أو حتى مزيج من الاثنين ، وفكر في الأمر. ما هي أجهزة الاستشعار والمحركات التي يستخدمونها.
بالنسبة لهذه الأجهزة ، فكر في الرسائل التي قد يرسلونها أو يستقبلونها. ما هو القياس عن بعد الذي يرسلونه؟ ما هي الرسائل أو الأوامر التي قد يتلقونها؟ هل تعتقد أنهم آمنون؟
## مسابقة ما بعد المحاضرة
[مسابقة ما بعد المحاضرة](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
## مراجعة ودراسة ذاتية
اقرأ المزيد عن MQTT على <a href="https://www.mosquitto.org">MQTT Wikipedia page</a>.
حاول تشغيل وسيط MQTT بنفسك باستخدام <a href="https://wikipedia.org/wiki/MQTT">Mosquitto</a> والاتصال به من جهاز إنترنت الأشياء ورمز السيرفر.
> 💁 تلميح - لا يسمح Mosquitto افتراضيًا بالاتصالات المجهولة (التي تتصل بدون اسم مستخدم وكلمة مرور) ، ولا تسمح بالاتصالات من خارج الكمبيوتر الذي يعمل عليه.
> يمكنك إصلاح هذا باستخدام<a href="https://www.mosquitto.org/man/mosquitto-conf-5.html"> `mosquitto.conf` config file </a> بما يلي:
>
> ```sh
> listener 1883 0.0.0.0
> allow_anonymous true
>
## الواجب
[قارن بين MQTT وبروتوكولات الاتصال الأخرى](assignment.md)

@ -1,439 +0,0 @@
# আইওটি ডিভাইসকে ইন্টারনেটে সংযুক্তিকরণ
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-4.jpg)
> [Nitya Narasimhan](https://github.com/nitya) তৈরী করছেন এই স্কেচনোটটি। এটির বড় সংস্করণ দেখতে হলে ছবিটির উপর ক্লিক করতে হবে।
## লেকচার পূর্ববর্তী কুইজ
[লেকচার পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7)
## সূচনা
IoT শব্দে **I** হলো Internet - আইওটিতে "ইন্টারনেট" বলতে ক্লাউড এর মাধ্যমে সংযোগ এবং সেবা প্রদানের মাধ্যমে আইওটি যন্ত্রের বৈশিষ্ট্যসমূহ চালু করা, যন্ত্রের সাথে সংযুক্ত সেন্সর এর মাধ্যমে পরিমাপসমূহ সংগ্রহ করা এবং বার্তা প্রেরণের মাধ্যমে একচুয়েটরসমূহকে নিয়ন্ত্রণ করাকে বুঝায়। আইওটি যন্ত্রগুলি সাধারণত একটি স্ট্যান্ডার্ড কমিউনিকেশন প্রোটোকল ব্যবহার করে একটিমাত্র ক্লাউড আইওটি সেবাতে সংযুক্ত হয় এবং এই সেবাটি সব আইওটি এপ্লিকেশন এর সাথে সংযুক্ত থাকে যা কিনা যন্ত্রসমূহ থেকে প্রাপ্ত ডেটার মাধ্যমে এআই (কৃত্রিম বুদ্ধিমত্তা) সেবার সাহায্যে গুরুত্বপূর্ণ সিদ্ধান্ত নেওয়া থেকে শুরু করে ওয়েব এপস এর মাধ্যমে নিয়ন্ত্রণ করা বা প্রতিবেদনও তৈরি করে দিতে পারে।
> 🎓 সেন্সর এর মাধ্যমে তথ্য সংগ্রহ এবং সেই তথ্য ক্লাউডে প্রেরণ করাকে টেলিমেট্রি(Telemetry) বলে।
আইওটি যন্ত্রসমূহ ক্লাউড থেকে বার্তা গ্রহণ করতে সক্ষম। তবে এই বার্তাগুলোতে আদেশ থাকে - সেটি হল অভ্যন্তরীণভাবে কোনও কাজ সম্পন্ন করার নির্দেশনাবলী (যেমন রিবুট বা ফার্মওয়্যার আপডেট করা), অথবা একচুয়েটরকে ব্যবহার করা (যেমন একটি লাইট জ্বালানো)।
এই পাঠটিতে আইওটি যন্ত্রসমূহ কমিউনিকেশন প্রোটোকল ব্যবহার করে ক্লাউডে সংযুক্ত হওয়া এবং কি ধরনের তথ্য ক্লাউডে গ্রহণ বা প্রেরণ করে তা শিখবো। নিয়ন্ত্রিত ইন্টারনেট লাইটে সংযুক্ত করা এবং এলইডি নিয়ন্ত্রনের লজিক কোডটিকে চলমান 'সার্ভার'-এ নেওয়া, এই দুটি কাজ হাতে-কলমে শিখবো।
এ পাঠ হতে যা যা শিখবোঃ
* [কমিউনিকেশন প্রটোকলসমূহ](#কমিউনিকেশন-প্রটোকলসমূহ)
* [এমকিউটিটি (Message Queueing Telemetry Transport-MQTT)](#Message-Queueing-Telemetry-Transport-MQTT)
* [টেলিমেট্রি](#টেলিমেট্রি)
* [কমান্ডসমূহ](#কমান্ডসমূহ)
## কমিউনিকেশন প্রটোকলসমূহ
আইওটি যন্ত্রসমূহ কয়েকটি জনপ্রিয় কমিউনিকেশন প্রটোকল ব্যবহার করে ইন্টারনেটের সাথে সংযুক্ত হয়। সবচেয়ে জনপ্রিয় হচ্ছে কোন ধরনের সার্ভার বা Broker এর মাধ্যমে বার্তা প্রচার/সাবস্ক্রাইব করা। আইওটি যন্ত্রসমূহ এই ব্রোকারের সাথে সংযুক্ত হয়ে টেলিমেট্রি প্রচার করে এবং কমান্ডগুলোতে সাবস্ক্রাইব করে। ক্লাউড সেবাগুলোও এই ব্রোকারের সাথে সংযুক্ত হয়ে সকল টেলিমেট্রি বার্তাগুলোতে সাবস্ক্রাইব করে এবং কমান্ডগুলোকে হয় একটি নির্দিষ্ট ডিভাইসে না হয় অনেকগুলো ডিভাইসের একটি গ্রুপে প্রেরণ করে।
![আইওটি যন্ত্রসমূহ এই মধ্যস্থতাকারীর (Broker) সাথে সংযুক্ত হয়ে টেলিমেট্রি প্রচার করে এবং আদেশগুলোতে সাবস্ক্রাইব করে। ক্লাউড সেবাগুলোও এই মধ্যস্থতাকারীর সাথে সংযুক্ত হয়ে সকল টেলিমেট্রি বার্তাগুলোতে সাবস্ক্রাইব করে এবং কমান্ডগুলোকে একটি নির্দিষ্ট ডিভাইসে প্রচার করে।](../../../../images/pub-sub.png)
আইওটি ডিভাইসগুলোর জন্য MQTT হলো সবচেয়ে জনপ্রিয় কমিউনিকেশন প্রটোকল যা এই পাঠে অন্তর্ভুক্ত করা হয়েছে। অন্যান্য প্রটোকলের মধ্যে AMQP এবং HTTP/HTTPS অন্তর্ভুক্ত আছে।
## Message Queueing Telemetry Transport-MQTT
[MQTT](http://mqtt.org) হল লাইটওয়েট, ওপেন স্ট্যান্ডার্ড মেসেজিং প্রোটোকল যা ডিভাইসগুলোর মধ্যে বার্তা প্রেরণ করতে পারে। ১৫ বছর পরে ওপেন স্ট্যান্ডার্ড হিসাবে এটি আইবিএম দ্বারা প্রকাশিত হয় যা পূর্বে তেলের পাইপলাইনগুলি পর্যবেক্ষণ করার জন্য ১৯৯৯ সালে নকশা করা হয়েছিল ।
MQTT এর একটি ব্রোকার এবং একাধিক ক্লায়েন্ট রয়েছে। সমস্ত ক্লায়েন্ট ব্রোকারের সাথে সংযুক্ত হয় এবং ব্রোকার সংশ্লিষ্ট ক্লায়েন্টদের বার্তা প্রেরণ করে। বার্তাগুলো কোনো বিশেষ গ্রাহককে সরাসরি প্রেরণ না করে বরং নামকরণ করা টপিকগুলি ব্যবহার করে একটি নির্দিষ্ট পথে পাঠানো হয়। একটি ক্লায়েন্ট একটি টপিক প্রচার করতে পারে এবং যেকোনো ক্লায়েন্ট যে ঐ টপিকে সাবস্ক্রাইব করে তা সে সম্পর্কিত বার্তা গ্রহণ করে।
![IoT device publishing telemetry on the /telemetry topic, and the cloud service subscribing to that topic](../../../../images/mqtt.png)
✅ কিছু গবেষণা করি। যদি অনেকগুলো আইওটি ডিভাইস থাকে তাহলে কিভাবে নিশ্চিত হবো যে MQTT- ব্রোকার সবগুলো বার্তা নিয়ন্ত্রন করতে পারবে কিনা?
### আইওটি ডিভাইসটি MQTT-তে সংযুক্তিকরণ
ইন্টারনেটের মাধ্যমে নাইটলাইটকে নিয়ন্ত্রণ করার প্রথম ধাপ হচ্ছে সেটিকে MQTT- ব্রোকার এর সাথে সংযুক্ত করা।
#### কাজ
আইওটি ডিভাইসটি MQTT-ব্রোকার এ সংযুক্ত করা।
পাঠের এই অংশটিতে আইওটি নাইটলাইটিকে ইন্টারনেটে সংযুক্ত করি যাতে করে সেটিকে দূর থেকে নিয়ন্ত্রণ করা যায়। এই পরবর্তী পাঠে, আইওটি ডিভাইসটি MQTT-র মাধ্যমে একটি টেলিমেট্রি বার্তা লাইটের লেভেলসহ(সেন্সর এর ভ্যালু) পাবলিক MQTT ব্রোকারে পাঠাবে এবং সেটি কতিপয় সার্ভার দ্বারা নেওয়া হবে যেটাতে কোডটি লেখা হয়েছিলো। এই কোডটি লাইটের লেভেল/সেন্সর ভ্যালু যাচাই করবে এবং যাচাই করার পর একটি আদেশমূলক বার্তা আইওটি লাইটটিতে/ডিভাইসে পাঠাবে যাতে আদেশ হিসেবে বলা থাকবে যে এলইডিটি অন না অফ হবে।
বাস্তবিক ক্ষেত্রে এমন অবস্থা হতে পারে যেখানে অনেক লাইট সেন্সর রয়েছে (যেমন স্ট্যাডিয়াম) এবং সেই লাইটগুলো অন করার সিদ্ধান্ত নেওয়ার পূর্বে ওই একাধিক লাইট সেন্সর এর তথ্য সংগ্রহ করার প্রয়োজন হতে পারে। শুধুমাত্র একটি সেন্সর মেঘ বা পাখি দ্বারা আবৃত থাকে লাইটগুলি অন হওয়া থেকে বন্ধ রাখতে পারে, যদিও অন্য সেন্সরগুলি পর্যাপ্ত আলো শনাক্ত করেও।
✅ কমান্ড প্রেরণের আগে একাধিক সেন্সর এর তথ্য মূল্যায়নের জন্য অন্য কি পরিস্থিতিগুলো বিবেচিত হতে পারে?
এসাইনমেন্টের অংশ হিসেবে MQTT ব্রোকার সেটাপের এই জটিলতার সাথে মোকাবেলা করার চেয়ে বরং চাইলে সেটাপটি পাবলিক টেস্ট সার্ভার ব্যবহার করা যবে যেটি [Eclipse Mosquitto](https://www.mosquitto.org)(একটি ওপেন সোর্স MQTT ব্রোকার)-এ রান হবে। এই টেস্ট ব্রোকারটি [test.mosquitto.org](https://test.mosquitto.org)-এ পাওয়া যাবে যা জনসাধারনের জন্য উন্মুক্ত। MQTT ক্লায়েন্ট এবং সার্ভার এর জন্য এটি একটি অসাধারণ টুল কারণ এটিতে সেটাপ করতে কোনো একাউন্টের প্রয়োজন নেই।
> 💁 এই টেস্ট ব্রোকারটি উন্মুক্ত যা মোটেই সুরক্ষিত নয়। যে কেউ বুঝতে পারবে এতে কি পাবলিশ করা হয়েছে, তাই যে তথ্যগুলোতে গোপনীয় রাখা জরুরি সেগুলো এতে ব্যবহার না করার পরামর্শ রইল।
![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-internet-flow.png)
ডিভাইসটি MQTT ব্রোকারে সংযুক্ত করতে সংশ্লিষ্ট ধাপগুলো অনুসরণ করিঃ
* [আরডুইনো Wio টার্মিনাল](wio-terminal-mqtt.bn.md)
* [সিংগেল বোর্ড কম্পিউটার - রাস্পবেরি পাই/ভার্চুয়াল আইওটি ডিভাইস](single-board-computer-mqtt.bn.md)
### MQTT এর আরো গভীরে
টপিকগুলোতে শ্রেণিবিন্যাস থাকতে পারে যাতে ক্লায়েন্টরা ওয়াইল্ডকার্ড ব্যবহার করে এই শ্রেণিবিন্যাসের বিভিন্ন স্তরে সাবস্ক্রাইব করতে পারে। যেমন, তাপমাত্রার টেলিমেট্রি বার্তাগুলো `/telemetry/temperature` এই টপিকে এবং আর্দ্রতার বার্তাগুলো `/telemetry/humidity` এই টপিকে পাঠানো, তারপর ক্লাউড এপটি `/telemetry/*` এই টপিকে সাবস্ক্রাইব করে তাপমাত্রা এবং আর্দ্রতা উভয়ের টেলিমেট্রি বার্তাগুলো গ্রহণ করবে।
বার্তা গ্রহণের নিশ্চয়তা প্রদান করতে বার্তাগুলো কোয়ালিটি অফ সার্ভিস(QoS) এর সাথে পাঠানো হয়।
* সর্বাধিক একবার বার্তা শুধুমাত্র একবারই পাঠানো হয় এবং ক্লায়েন্ট আর ব্রোকার বার্তাটি ডেলিভারীর প্রাপ্তি স্বীকার করতে কোনো অতিরিক্ত পদক্ষেপ নেয় না (fire and forget)।
* অন্তত একবার স্বীকারোক্তি গৃহীত না হওয়া পর্যন্ত বার্তা প্রেরক একাধিকবার বার্তা প্রেরণের চেষ্টা করেছিল (acknowledged delivery)।
* ঠিক একবার শুধু একটি বার্তা গৃহীত হয়েছে তা নিশ্চিত করতে প্রাপক এবং প্রেরক একটি দ্বি-স্তরের যোগাযোগ করে যাকে হ্যান্ডশেক এর সাথে তুলনা করা যায় (assured delivery)।
✅ কোন পরিস্থিতিতে fire and forget বার্তার পরেও একটি assured delivery এর বার্তা প্রয়োজন হতে পারে?
যদিও নামটি মেসেজ কিউয়িং (ইংরেজি প্রথম অক্ষরগুলো নিয়ে MQTT), এটি আসলে বার্তার সারিকে বুঝায় না। এর অর্থ হল যদি কোন ক্লায়েন্ট সংযোগ বিচ্ছিন্ন করে পুনরায় সংযোগ স্থাপন করার সময় QoS প্রসেস ব্যবহার করে ইতোমধ্যে প্রসেসকৃত বার্তাগুলো বাদে বিচ্ছিন্ন অবস্থায় প্রেরিত বার্তাগুলো গৃহীত হবে না। ওই বার্তাগুলোকে মনে রাখাতে একটি ফ্ল্যাগ সেট করা হয়। যদি এই ফ্ল্যাগ সেট করা থাকে তবে MQTT-ব্রোকার একটি টপিকে প্রেরিত সর্বশেষ বার্তাটি ওই ফ্ল্যাগসহিত জমা রাখবে এবং পরবর্তীতে কোনো ক্লায়েন্ট যদি এই টপিকে সাবস্ক্রাইব করে তাকে প্রেরণ করা হয়। এই পদ্ধতিতে ক্লায়েন্টগুলো সবর্দা সর্বশেষ বার্তাগুলো পেয়ে থাকে।
MQTT একটি এলাইভ(alive) ফাংশনকে সমর্থন করে এবং এই ফাংশনটি বার্তাগুলোর মধ্যে দীর্ঘ বিরতির সময় সংযোগটি চালু আছে কিনা তা পরীক্ষা করে।
> 🦟 [Eclipse Foundation এর Mosquitto-তে](https://mosquitto.org) একটি ফ্রী MQTT ব্রোকার রয়েছে যাতে MQTT-সম্পর্কিত পরীক্ষা করা যাবে, MQTT-ব্রোকার এর সাথে কোড টেস্ট করা যাবে যা এই [test.mosquitto.org](https://test.mosquitto.org) হোস্ট করা থাকে।
MQTT- সংযোগসমূহ পাবলিক ও উন্মুক্ত থাকতে পারে অথবা ইউজারনেইম, পাসওয়ার্ড এবং সার্টিফিকেট ব্যবহারের মাধ্যমে এনক্রিপটেড ও সুরক্ষিত থাকতে পারে।
> 💁 MQTT TCP/IP এর মাধ্যমে যোগাযোগ করে, এটি HTTP এর মতোই একটি নেটওয়ার্ক প্রোটকল তবে একটি ভিন্ন পোর্টবেইজড। ব্রাউজারে চলমান ওয়েব অ্যাপ্লিকেশনগুলির সাথে যোগাযোগের জন্য ওয়েবসকেটের পরিবর্তে বা ফায়ারওয়ালগুলি বা অন্যান্য নেটওয়ার্কিং রুলস যা স্ট্যান্ডার্ড সংযোগগুলিতে MQTT ব্লক করে এমন পরিস্থিতিতে MQTT ব্যবহার করা যাবে।
## টেলিমেট্রি
টেলিমেট্রি শব্দটি গ্রীক থেকে উদ্ভূত হয়েছিলো যার অর্থ দূরবর্তী থেকে পরিমাপ করা। টেলিমেট্রি হল সেন্সর থেকে ডেটা সংগ্রহ এবং সেই ডেটা ক্লাউডে প্রেরণ করা ।
> 💁 প্রাচীনতম টেলিমেট্রি ডিভাইসগুলি ফ্রান্সে ১৮৭৪ সালে উদ্ভাবিত হয়েছিল এবং Mont Blanc থেকে প্যারিসে রিয়েল-টাইম আবহাওয়া এবং তুষারের গভীরতা প্রেরণ করেছিল। এটি বাস্তবিক তারগুলি ব্যবহার করত কারণ ওয়্যারলেস প্রযুক্তিগুলি তখন ছিল না।
পাঠ 1 থেকে স্মার্ট থার্মোস্টেটের উদাহরণটি দেখি।
![একাধিক রুম সেন্সর ব্যবহার করে ইন্টারনেটে সংযুক্ত একটি থার্মোস্ট্যাট](../../../../images/telemetry.png)
টেলিমেট্রি সংগ্রহের জন্য থার্মোস্ট্যাট এর তাপমাত্রাভিত্তিক সেন্সর রয়েছে। এটিতে একটি তাপমাত্রাভিত্তিক সেন্সর বিল্টইন থাকে এবং ওয়ারলেস প্রোটোকল যেমন [ব্লুটুথ লো এনার্জি](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE) এর মাধ্যমে একাধিক তাপমাত্রাভিত্তিক সেন্সর এর সাথে সংযুক্ত হতে পারে।
উদাহরণস্বরূপ একটি টেলিমেট্রি ডেটা যা প্রেরণ করা হবে, তা হলো
| নাম | মান | বর্ণনা |
| ---- | ----- | ----------- |
| `thermostat_temperature` | 18°C | থার্মোস্ট্যাট এর বিল্ট-ইন তাপামাত্রাভিত্তিক সেন্সর দ্বারা তাপমাত্রা পরিমাপ করা। |
| `livingroom_temperature` | 19°C | দূরবর্তী তাপমাত্রাভিত্তিক সেন্সর(remote temperature sensor) দ্বারা তাপমাত্রা পরিমাপ করা হয় যেটিকে `livingroom` নামকরণ করা হয়েছে যাতে এটি যেই রুমে আছে সেই রুমকে শনাক্ত করতে পারে। |
| `bedroom_temperature` | 21°C | দূরবর্তী তাপমাত্রাভিত্তিক সেন্সর(remote temperature sensor) দ্বারা তাপমাত্রা পরিমাপ করা হয় যেটিকে ` bedroom ` নামকরণ করা হয়েছে যাতে এটি যেই রুমে আছে সেই রুমকে শনাক্ত করতে পারে। |
ক্লাউড সেবা এই টেলিমেট্রি ডেটা ব্যবহার করে তাপকে নিয়ন্ত্রণ করতে কী আদেশ পাঠাবে তার সিদ্ধান্ত নিতে পারে।
### টেলিমেট্রি আইওটি ডিভাইসে প্রেরণ
নাইটলাইটটিকে ইন্টারনেটের মাধ্যমে নিয়ন্ত্রণ করার পরবর্তী অংশটি হলো লাইট লেভেল টেলিমেট্রি MQTT- ব্রোকারের টেলিমেট্রি টপিকে পাঠানো।
#### কাজ
লাইট লেভেল টেলিমেট্রি MQTT- ব্রোকারে পাঠানো।
ডেটা JSON হিসাবে এনকোড করে পাঠানো হয় JSON হলো JavaScript Object Notation এর সংক্ষিপ্ত রূপ, যা কী/ভ্যালু পেয়ার ব্যবহার করে ডেটাকে এনকোডেড টেক্সট এ রূপান্তরের জন্য একটি স্ট্যান্ডার্ড ।
✅ JSON সম্পর্কে জ়েনে না থাকলে তা এই [JSON.org documentation](https://www.json.org/) থেকে শিখতে পারবো।
ডিভাইস থেকে MQTT-ব্রোকারের কাছে টেলিমেট্রি প্রেরণের জন্য নীচের পদক্ষেপটি অনুসরণ করিঃ
* [আরডুইনো Wio টার্মিনাল](wio-terminal-telemetry.bn.md)
* [সিংগেল বোর্ড কম্পিউটার - রাস্পবেরি পাই/ভার্চুয়াল আইওটি ডিভাইস](single-board-computer-telemetry.bn.md)
### MQTT ব্রোকার হতে টেলিমেট্রি গ্রহণ
টেলিমেট্রি পাঠানোর কোন অর্থ নেই যদি অন্য প্রান্তে এটিকে গ্রহণ করার মতো কিছু না থাকে। লাইট লেভেল টেলিমেট্রিটির ডেটা প্রক্রিয়া করার জন্য এটিকে কিছু গ্রাহকের এর প্রয়োজ়নীয়তা আছে। এই 'সার্ভার' কোডটি সেই ধরণের কোড যা বৃহত্তর আইওটি অ্যাপ্লিকেশনের অংশ হিসাবে একটি ক্লাউড সেবাতে স্থাপন করবো, তবে এখানে স্থানীয়ভাবে এই কোডটি লোকাল কম্পিউটারে চালাতে পারবো (বা আমাদের Pi-তে সরাসরি কোডিং করতে পারবো)। সার্ভার কোডে একটি পাইথন অ্যাপ থাকে যা MQTT-র মাধ্যমে লাইটে লেভেলগুলোর টেলিমেট্রি বার্তা গ্রহণ করতে পারে। এই পাঠের পরবর্তীতে, এটিতে কমান্ডের মেসেজ রিপ্লেতে পাঠাবো যাতে নির্দেশনা থাকবে যে এলইডি অন না অফ হবে।
✅ কিছু গবেষনা করিঃ MQTT বার্তাগুলোর কী হবে যদি কোনো গ্রাহক না থাকে?
#### পাইথন এবং ভিএস কোড ইন্সটল করি
লোকালি Python এবং VS Code ইনস্টল করা না থাকলে সার্ভারে কোড দেওয়ার জন্য দুইটিকেই ইনস্টল করবো। যদি ভার্চুয়াল ডিভাইস ব্যবহার করি বা রাস্পবেরি পাইতে কাজ করি তবে এই পদক্ষেপটি এড়িয়ে যেতে পারি ।
##### কাজ
Python এবং VS Code ইন্সটল করি।
1. পাইথন ইন্সটল করি। [Python downloads page](https://www.python.org/downloads/) থেকে পাইথনে সর্বশেষ ভার্সনটি নির্দেশনা মোতাবেক ইনস্টল করি।
1. Visual Studio Code (VS Code) ইন্সটল করি। আমরা এই ইডিটরটি আমাদের ভার্চুয়াল ডিভাইসে পাইথনে কোড করার জন্য ব্যবহার করবো। [VS Code documentation](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) থেকে Visual Studio Code (VS Code) নির্দেশনাগুলো অনসুরণ করে Visual Studio Code (VS Code) ইন্সটল করি।
> 💁 এই পাঠের নির্দেশনাগুলো VS Code এর উপর ভিত্তি করে লেখা হলেও এই পাঠের জন্য আমরা আমাদের সুবিধামত টুল অর্থাৎ পাইথনবেইজ়ড যেকেনো আইডি বা ইডিটর ব্যবহার করতে পারি।
1. VS Code এর Pylance এক্সটেনশনটি ইন্সটল করি। পাইথন লেঙ্গুয়েজের সাপোর্টের জন্য এটি VS Code এর একটি এক্সটেনশন। এটি এক্সটেনশনটি VS Code-এ কিভাবে ইন্সটল করতে হয় [Pylance extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) থেকে দেখে নেই।
#### পাইথনের ভার্চুয়াল এনভায়রনমেন্ট কনফিগারেশন
পাইথনের অন্যতম শক্তিশালী ফিচারটি হল [পিপ প্যাকেজ](https://pypi.org) ইনস্টল করার ক্ষমতা এই কোডের প্যাকেজগুলি অন্যদের দ্বারা লেখা হয় যা পরবর্তীতে ইন্টারনেটে প্রকাশ করা হয়। কম্পিউটারে একটি কমান্ডের এর মাধ্যমে পিপ প্যাকেজ ইন্সটল করা যায়, তারপরে নির্দিষ্ট কোডটিতে সেই প্যাকেজটি ব্যবহার করতে পারবো। MQTT- এর মাধ্যমে যোগাযোগ করতে আমরা পিপ ব্যবহার করে প্যাকেজ ইন্সটল করব।
আমরা যখন কোনো প্যাকেজ ইন্সটল করি তখন তা পুরো কম্পিউটার জুড়ে থাকে এবং তা থেকে প্যাকেজ়ের ভার্সনজনিত সমস্যা দেখা দিতে পারে যেমন একটি অ্যাপ্লিকেশন যখন প্যাকেজ়ের একটি ভার্সনের উপর ভিত্তি করে চলে কিন্তু ভিন্ন এপ্লিকেশনের জন্য ওই একি প্যাকেজের নতুন ভার্সন ইন্সটল করলে আগের ভার্সনে ব্যাঘাত ঘটতে পারে। এই সমস্যা হতে উত্তরণের জন্য আমরা [Python virtual environment](https://docs.python.org/3/library/venv.html) ব্যবহার করবো এবং তাতে পাইথনের জন্য একটি ডেডিকেটেড ফোল্ডার থাকবে যাতে যখন আমরা আমাদের প্রয়োজনীয় পিপ প্যাকেজসমূহ ইন্সটল করলে তা এই ফোল্ডারে ইন্সটল হবে।
##### কাজ
পাইথনের ভার্চুয়াল এনভায়রনমেন্ট কনফিগারেশন এবং MQTT পিপ প্যাকেজ ইন্সটল।
1. টার্মিনাল বা কমান্ড লাইন হতে আমাদের পছন্দসই লোকেশনে ডিরেক্টরি তৈরি এবং নেবিগেইট করতে নিচের কমান্ডগুলো রান দিইঃ
```sh
mkdir nightlight-server
cd nightlight-server
```
1. ভার্চুয়াল এনভায়রনমেন্ট `.venv` ফোল্ডারে বানানোর জন্য নিম্নের কমান্ডটি রান করি।
```sh
python3 -m venv .venv
```
> 💁 যদি Python 2 এর সাথে Python 3(লেটেস্ট ভার্সন) ইন্সটল করা থাকে তবে ভার্চুয়াল এনভায়রনমেন্ট বানানোর জন্য সঠিকভাবে `python3`-কে কল করতে হবে। যদি Python 2 ইন্সটল করা থাকে তবে `python` কল করলে তা Python 3 এর পরিবর্তে Python 2-কে কল করবে।
1. ভার্চুয়াল এনভায়রনমেন্ট চালু করতে নিম্নের কমান্ড দিইঃ
* Windows-এ রান করতে নিম্নের কমান্ডটি দিইঃ
```cmd
.venv\Scripts\activate.bat
```
* macOS বা Linux এ রান করতে নিম্নের কমান্ডটি দিইঃ
```cmd
source ./.venv/bin/activate
```
1. ভার্চুয়াল এনভারনমেন্টটি একবার চালু হওয়ার পর ভার্চুয়াল এনভারনমেন্ট বানাতে পাইথনের যে ভার্সনটি ব্যবহৃত হয়েছিলো তা ডিফল্টভাবে `python` কমান্ডটি সেই ভার্সনটিকে রান করাবে। পাইথনে ভার্সন জানতে নিম্নের কমান্ডটি রান করবোঃ
```sh
python --version
```
আউটপুটটি নিম্নের মতো হবেঃ
```output
(.venv) ➜ nightlight-server python --version
Python 3.9.1
```
> 💁 পাইথনের ভার্সন ভিন্ন হতে পারে তবে ভার্সন ৩.৬ বা তারও বেশি হলে ভালো। যদি এই ভার্সন ইন্সটল না থাকে তবে এই ফোল্ডারটি ডিলিট করে পাইথনের নতুন ভার্সনটি ইন্সটল করে আবার চেষ্টা করি।
1. [Paho-MQTT](https://pypi.org/project/paho-mqtt/)(একটি জনপ্রিয় MQTT লাইব্রেরি) পিপ প্যাকেজটি ইন্সটল করতে নিম্নের কমান্ডটি রান করি।
```sh
pip install paho-mqtt
```
এই পিপ প্যাকেজটি শুধুমাত্র ভার্চুয়াল এনভায়রনমেন্টে ইন্সটল হবে।
#### সার্ভার কোডটি লিখি
এখন সার্ভার কোডটি পাইথনে লিখবো।
##### কাজ
সার্ভার কোডটি লিখি।
1. ভার্চুয়াল এনভায়রনমেন্টের ভিতরে `app.py` নামে একটি পাইথন ফাইল বানাতে টার্মিনাল বা কমান্ড লাইন হতে নিম্নের কমান্ডটি দিইঃ
* Windows-এ রান করতে নিম্নের কমান্ডটি দিইঃ
```cmd
type nul > app.py
```
* macOS বা Linux এ রান করতে নিম্নের কমান্ডটি দিইঃ
```cmd
touch app.py
```
1. কারেন্ট ফোল্ডারটি VS Code-এ ওপেন করিঃ
```sh
code .
```
1. যখন VS Code-টি ওপেন হবে তখন তা পাইথনের ভার্চুয়াল এনভায়রনমেন্টটিকে চালু করবে। এটি উপরে স্ট্যাটাস বারে দেখা যাবেঃ
![VS Code showing the selected virtual environment](../../../../images/vscode-virtual-env.png)
1. যদি VS Code স্টার্ট হওয়ার সময় VS Code টার্মিনালটি চালুরত অবস্থায় থাকে তবে ভার্চুয়াল এনভায়রনমেন্ট VS Code-এ একটিভেট হবে না। এর থেকে উত্তরণের সহজ উপায় হচ্ছে **Kill the active terminal instance** বাটনটিতে ক্লিক করে টার্মিনালটিকে বন্ধ করে দিবো।
![VS Code Kill the active terminal instance button](../../../../images/vscode-kill-terminal.png)
1. নতুন VS Code টার্মিনাল চালু করতে *Terminal -> New Terminal এ সিলেক্ট করবো বা `` CTRL+` `` প্রেস করবো। এই নতুন টার্মিনালটি একটি কল করে ভার্চুয়াল এনভায়রনমেন্টটি এক্টিভেট করবে যার ফলে এটি টার্মিনালে লোড হয়ে আসবে। ভার্চুয়াল এনভায়রনমেন্টের নামটি (`.venv`) প্রম্পটে দেখা যাবেঃ
```output
➜ nightlight source .venv/bin/activate
(.venv) ➜ nightlight
```
1. VS Code explorer থেকে `app.py` ফাইলটি ওপেন করি এবং নিম্নের কোডটি এড করিঃ
```python
import json
import time
import paho.mqtt.client as mqtt
id = '<ID>'
client_telemetry_topic = id + '/telemetry'
client_name = id + 'nightlight_server'
mqtt_client = mqtt.Client(client_name)
mqtt_client.connect('test.mosquitto.org')
mqtt_client.loop_start()
def handle_telemetry(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
mqtt_client.subscribe(client_telemetry_topic)
mqtt_client.on_message = handle_telemetry
while True:
time.sleep(2)
```
আমদের ডিভাইস বানানোর সময় যে ইউনিক আইডিটি ব্যবহার করেছিলাম তা ৬নং লাইনের `<ID>`-তে বসিয়ে দিই।
⚠️ এই আইডিটি **অব্যশই** আমাদের ডিভাইসে ব্যবহৃত একই আইডি হতে হবে নয়ত সার্ভার কোড সঠিক টপিক সাবস্ক্রাইব বা পাবলিশ কোনোটিই করবে না।
এই কোডটি একটি ইউনিক নামসহ একটি MQTT ক্লায়েন্ট তৈরি করে যা * test.mosquitto.org * ব্রোকারের সাথে সংযুক্ত হয়। পরবর্তীতে এটি একটি প্রসেসিং লুপ চালু করে যেকোনো সাবস্ক্রাইব টপিকের মেসেজ লিসেনিং এর জন্য ব্যাকগ্রাউন্ড থ্রেডে রান করে করে।
ক্লায়েন্ট পরবর্তীতে টেলিমেট্রি টপিকের মেসেজগুলিতে সাবস্ক্রাইব করে এবং একটি ফাংশন সংজ্ঞায়িত করে আর যখন মেসেজ গৃহীত হয় তখনই ফাংশনটিকে কল করা হয়। যখন একটি টেলেমেট্রি মেসেজ গৃহীত হয় তখনই `handle_telemetry` ফাংশনটি কল করা হয় এবং কনসোলে গৃহীত বার্তাটি প্রিন্ট হয়।
সবশেষে একটি ইনফিনিট লুপে অ্যাপ্লিকেশনটি রান হয়। ব্যাকগ্রাউন্ড থ্রেডে MQTT ক্লায়েন্ট বার্তাগুলোতে লিসেন করে এবং মেইন এপ্লিকেশনটি রান হওয়া অবস্থায় এটি সবসময় রান হয়।
1. পাইথন এপটি রান করতে VS Code টার্মিনাল হতে নিম্নের কোডটি রান করিঃ
```sh
python app.py
```
এপটি আইওটি ডিভাইসের মেসেজসমূহ লিসেন করতে শুরু করবে।
1. আমাদের অব্যশই নিশ্চিত হতে হবে যে ডিভাইসটি রান করছে কিনা এবং টেলিমেট্রি মেসেজ সেন্ড করছে কিনা। বাহ্যিক বা ভার্চুয়াল ডিভাইস হতে শনাক্তকৃত লাইট লেভেলটিকে এডজাস্ট করি। গৃহীত বার্তাসমূহ নিচের মতো টার্মিনালে প্রিন্ট হবে।
```output
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Message received: {'light': 400}
```
প্রেরিত মেসেজ গ্রহণের জন্য নাইটলাইট ভার্চুয়াল এনভায়রনমেন্টে app.py ফাইলটিকে অবশ্যই রান অবস্থায় থাকতে হবে।
> 💁 কোডটি [code-server/server](code-server/server) ফোল্ডারে পাওয়া যাবে।
### টেলিমেট্রি কতবার পাঠানো উচিত?
টেলিমেট্রিতে একটি গুরুত্বপূর্ণ বিষয় হল কতবার ডেটা পরিমাপ এবং প্রেরণ করা উচিত? উত্তরটি হল, এটি পরিস্থিতিভেদে নির্ভরশীল। যেমনঃ আমরা যদি প্রায়ই পরিমাপ করি তবে পরিমাপ পরিবর্তনের প্রতি দ্রুত সারা দিতে পারবো কিন্তু আমরা যদি আরও পাওয়ার, ব্যান্ডউইথ, ডেটা ব্যাবহার করি তাহলে এইগুলো প্রসেস করার জন্য আরও ক্লাউড রিসোর্সের প্রয়োজন হবে যার ফলে আমাদের প্রায়ই যথেষ্ট পরিমাণে পরিমাপ করা প্রয়োজন তবে তা খুব বেশি নয়।
একটি থার্মোস্ট্যাট যদি কয়েক মিনিট পর পর তাপমাত্রা পরিমাপ করে তবে তা প্রয়োজনের অতিরিক্ত কারণ তাপমাত্রা প্রতিনিয়ত পরিবর্তিত হয় না। যদি আমরা দৈনিক একবার তাপমাত্রা পরিমাপ করি তবে ভরদুপুরে নাইটটাইমের তাপমাত্রায় আমাদের ঘরটিকে উত্তপ্ত করে বসবো। অপরপক্ষে আমরা যদি প্রতি সেকেন্ডে পরিমাপ করি তবে অপ্রয়োজনীয় সহস্রাধিক তাপমাত্রার পরিমাপের ডেটা তৈরি হবে যাতে ইউজারের ইন্টারনেট এবং ব্যান্ডউইথ বেশি ব্যবহৃত হবে (যা লিমিটেড ব্যান্ডউইথ প্ল্যানে চলা ইউজারদের সমস্যা হতে পারে) এবং আরও পাওয়ার ব্যবহার করবে যা ব্যাটারি চালিত ডিভাইসের জন্য সমস্যা হতে পারে (যেমনঃ রিমোট সেন্সর) যার ফলে ক্লাউড প্রোভাইডারে কম্পিউটিং রিসোর্সের প্রসেসিং এবং স্টোরিং এর ব্যয় বেড়ে যাবে।
যদি কোন ফ্যাক্টরিতে কোন মেসিনারি ডেটা পর্যবেক্ষণ করা হয় এবং যদি এই মেসিনটি নষ্ট হয় তবে বিপজ্জনক ক্ষতি হতে পারে তার সাথে কয়েক মিলিয়ন ডলারের রাজস্বও নষ্ট হতে পারে। তাই এমন পরিস্থিতে প্রতি সেকেন্ডে একাধিকবার পরিমাপ করা অবশ্যই যুক্তিযুক্ত। টেলিমেট্রিযেকোন যন্ত্র নষ্ট হওয়ার আগে সেটিকে বন্ধ এবং ঠিক করা প্রয়োজন তা ইন্ডিকেট করে দেয়, তাই টেলিমেট্রি মিস হওয়ার চেয়ে ব্যান্ডউইথ নষ্ট হওয়া ভাল।
> 💁 এই পরিস্থিতিতে,ইন্টারনেটের উপর নির্ভরতা হ্রাস করতে প্রথম টেলিমেট্রি প্রসেস করার জন্য একটি এজ(edge) ডিভাইস রাখা যেতে পারে।
### লস অফ কানেক্টিভিটি
ইন্টারনেট সংযোগসমূহ হতে পারে অনির্ভরযোগ্য,বিভ্রাটপূর্ণ । এই অবস্থায় আইওটি ডিভাইসের কি করা উচিত এটি কি ডেটাকে হারাতে দিবে নাকি কানেক্টিভিটি পুনরায় না আসা পর্যন্ত ডেটাকে স্টোর করে রাখবে? আবারো উত্তরটি হচ্ছে এটি পরিস্থিতিভেদে নির্ভরশীল।
একটি থার্মোস্ট্যাট এর নতুন তাপমাত্রা পরিমাপ করা মাত্রই আগের পরিমাপ করা ডেটাটি হারিয়ে যেতে পারে। ২০ মিনিট পূর্বে তাপমাত্রা ২০.৫°C ছিল বা এখন তাপমাত্রা ১৯°C তা নিয়ে হিটিং সিস্টেম পরোয়া করে না, বর্তমান মুহূর্তের তাপমাত্রাই নির্ধারণ করবে যে হিটিং সিস্টেমটি অন হবে নাকি অফ থাকবে।
মেশিনারির জন্য ডেটা রাখা যেতে পারে বিশেষত যদি এটি ট্রেন্ডস(trends) সন্ধানে ব্যবহৃত হয়। এমন কিছু মেশিন লার্নিং মডেল রয়েছে যা নির্ধারিত সময়ের মধ্যে(যেমন শেষ ঘন্টায়) ডেটা সন্ধান করে ডেটার স্ট্রিমসমূহে এনোম্যালি চিহ্নিত করে এনোম্যালাস ডেটা শনাক্ত করতে পারে। এটি প্রায়ই predictive maintenance এর জন্য ব্যবহৃত হয়, এমন কিছু লক্ষণের সন্ধান করে যাতে দ্রুত কোনও কিছু ভেঙে যাওয়ার আগেই এটি মেরামত বা রিপ্লেস করা যায় । এনোমলি ডিটেকশনের জন্য একটি মেশিনের প্রেরিত টেলিমেট্রিটির প্রতিটি বিটকে প্রসেস করা হয় তাই যখন আইওটি ডিভাইসটি পুনরায় ইন্টারনেটের সাথে সংযোগ স্থাপন করে তখন ইন্টারনেট আউটেজের সময় তৈরি হওয়া সমস্ত টেলিমেট্রি প্রেরণ করতে পারে।
আইওটি ডিভাইস ডিজাইনারদের বিবেচনা করা উচিত যাতে ইন্টারনেট আউটেজের সময় বা অবস্থানজনিত কারণে সিগন্যাল লসের সময় আইওটি ডিভাইস ব্যবহার করা যাবে কিনা। একটি স্মার্ট থার্মোস্ট্যাট যদি আউটেজের কারনে ক্লাউডে টেলিমেট্রি প্রেরণ করতে না পারে তবে হিটিং সিস্টেমকে কন্ট্রোল করতে তাতে অবশ্যই সীমিত সংখ্যক সিদ্ধান্ত নেওয়ার সক্ষমতা থাকতে হবে।
[![এই ফেরারীটি আচ্ছাদিত হয়ে আছে কারণ কেউ একজন আন্ডারগ্রাউন্ডে এটিকে আপগ্রেড করতে চেয়েছিল যেখানে কোনো সেল অপারেশন নেই ](../../../../images/bricked-car.png)](https://twitter.com/internetofshit/status/1315736960082808832)
লস অফ কানেক্টিভিটি MQTT-কতৃক সামালানোর জন্য প্রয়োজনে ডিভাইস এবং সার্ভার কোডকে মেসেজ ডেলিভারি নিশ্চিত করার দায়ভার গ্রহণ করতে হবে। উদারণস্বরূপ, একটি রিপ্লাই টপিকে অতিরিক্ত মেসেজসমূহের মাধ্যমে প্রেরিত সমস্ত মেসেজসমূহ প্রয়োজনে চাওয়া এবং তা যদি না হয় তবে সেগুলো ম্যানুয়ালি একটি সারিতে থাকবে যাতে পরবর্তী রিপ্লেতে দিবে।
## কমান্ডসমূহ
কমান্ডস হচ্ছে মেসেজ যা ক্লাউড দ্বারা কোন ডিভাইসে প্রেরণ করা হয় যাতে কিছু করার নির্দেশনা দেওয়া থাকে। বেশিরভাগক্ষেত্রে একচুয়েটরের আউটপুট সম্বলিত কিছু থাকে কিন্তু এতে ডিভাইসের নিজের জন্য কিছু নির্দেশনাও থাকতে পারে (যেমনঃ রিব্যুট করা) বা এক্সট্রা টেলিমেট্রি জড়ো করা এবং রেসপন্স হিসেবে কমান্ডকে রিটার্ন করা।
![ইন্টারনেটে সংযুক্ত একটি থার্মোস্ট্যাট কমান্ড রিসিভের মাধ্যমে হিটিং সিস্টেমকে চালু করছে](../../../../images/commands.png)
হিটিং সিস্টেম চালু করার জন্য একটি থার্মোস্ট্যাট ক্লাউ থেকে কমান্ড গ্রহণ করতে পারে। যদি ক্লাউড সার্ভিস সমস্ত সেন্সর হতে প্রাপ্ত টেলিমেট্রি ডাটার উপর ভিত্তি করে সিদ্ধান্ত নেয় যে হিটিং সিস্টেমটি চালু করা জরুরি তবে তা সে অনুযায়ী কমান্ড প্রেরণ করবে।
### কমান্ডসমূহ MQTT ব্রোকারে প্রেরণ
ইন্টারনেটের মাধ্যমে নাইটলাইটকে নিয়ন্ত্রনের পরবর্তী ধাপটি হলো সার্ভার কোড কতৃক আইওটি ডিভাইসে কমান্ড প্রেরণ করা যাতে লাইটের লেভেল উপলদ্ধি মাধ্যমে লাইটকে কন্ট্রোল করা যায়।
1. সার্ভার কোডটি VS Code এ ওপেন করি।
1. নিচের লাইনটি `client_telemetry_topic` ডিক্লেয়ারের পর এড করি যা নির্ধারণ করবে কোন টপিকে কমান্ড সেন্ড করবেঃ
```python
server_command_topic = id + '/commands'
```
1. নিচের কোডটি `handle_telemetry` ফাংশেন শেষে এড করিঃ
```python
command = { 'led_on' : payload['light'] < 300 }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
```
এই কোডটি একটি JSON মেসেজ `led_on` এর ভ্যলুসহ কমান্ড টপিকে পাঠায় যা লাইটের ভ্যালু ৩০০ এর বেশি বা কমের উপর ভিত্তি করে তা ট্রু বা ফলস-এ সেট হয়। যদি লাইটের ভ্যালু (`led_on`<৩০০) ৩০০ এর কম হয় তবে ট্রু সেন্ড করা হয় যাতে এলইডি অন করার নির্দেশনা থাকে।
1. কোডটি পূর্বের মতো রান করি।
1. আমাদের বাহ্যিক বা ভার্চুয়াল ডিভাইসে কতৃক শনাক্তকৃত লাইটের লেভেল অনুসারে লেভেলটি এডজাস্ট করি। গ্রহীত মেসেজ এবং প্রেরিত কমান্ডগুলো টার্মিনালে আউটপুট হিসেবে বর্ণিত হবেঃ
```output
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Sending message: {'led_on': True}
Message received: {'light': 400}
Sending message: {'led_on': False}
```
> 💁 প্রতিটি সিংগেল টপিকে টেলিমেট্রি এবং কমান্ডসমূহ প্রেরণ করা হচ্ছে। যার অর্থ দাঁড়ায় একাধিক ডিভাইস থেকে টেলিমেট্রি একই টেলিমেট্রি টপিকের উপর প্রকাশিত হবে এবং একাধিক ডিভাইসের কমান্ডগুলিও একই কমান্ডের টপিকে প্রকাশিত হবে। যদি কোন নির্দিষ্ট ডিভাইসে কমান্ড প্রেরণ করতে চাই তবে একটি ইউনিক ডিভাইস আইডি নামকরণ (যেমনঃ `/commands/device1`, `/commands/device2`) করে একাধিক টপিক ব্যবহার করে পারবো। এইভাবে কোন ডিভাইস কেবল সেই এক ডিভাইসের জন্য বরাদ্দকৃত বার্তাগুলি লিসেন করতে পারে।
> 💁 আমরা [code-commands/server](code-commands/server) এই ফোল্ডারে কোডটি পাবো।
### আইওটি ডিভাইসে কমান্ডসমূহের পরিচালনা করা
এখনে যেহেতু সার্ভার হতে কমান্ডসমূহ প্রেরিত হচ্ছে সেহেতু আমরা আইওটি ডিভাইসকে পরিচালনা করার জন্য এবং এলইডিকে নিয়ন্ত্রণের জন্য তাতে কোড এড করতে পারবো।
MQTT ব্রোকার হতে কমান্ডসমূহ গ্রহণের জন্য নিচের পদক্ষেপগুলো অনুসরণ করিঃ
* [আরডুইনো Wio টার্মিনাল](wio-terminal-commands.bn.md)
* [সিংগেল বোর্ড কম্পিউটার - রাস্পবেরি পাই/ভার্চুয়াল আইওটি ডিভাইস](single-board-computer-commands.bn.md)
এই কোডটি লেখা এবং রান করা হয়ে গেলে আমরা লাইটের লেভেল চেঞ্জ করে এক্সপেরিমেন্ট করবো। লাইটের লেভেল চেঞ্জের মাধ্যমে এলইডিটিতে এবং সার্ভার আর ডিভাইসের আউটপুটটিতে লক্ষ্য রাখি।
### লস অফ কানেক্টিভিটি
যদি আইওটি ডিভাইসে কমান্ড প্রেরণের প্রয়োজন হয় কিন্তু ডিভাইসটি অফলাইনে থাকে তবে এমতাবস্থায় ক্লাউড সার্ভিসের কি করা উচিত? আবারও, উত্তরটি হলো তা নির্ভরশীল।
যদি লেটেস্ট কমান্ডটি তার পূর্বের কমান্ডটিকে ওভাররাইট করে তবে পূর্বের কমান্ডটি উপেক্ষিত হবে। যদি কোন ক্লাউড সার্ভিস প্রথমে হিটিং সিস্টেমটি চালু করার জন্য একটি কমান্ড পাঠায় তারপর হিটিং সিস্টেমটি বন্ধ করার জন্য দ্বিতীয় আরেকটি কমান্ড পাঠায় তবে অন কমান্ডটি অর্থাৎ ১ম কমান্ডটি উপেক্ষা করা হবে এবং তা রিসেন্ট হবে না।
যদি কমান্ডসমূহের ক্রমানুসারে প্রসেসের প্র্য়োজন হয় যেমন হতে পারে প্রথমে একটি রোবটের হাত উপরে উঠানো দ্বিতীয়ত সেটির গ্র্যাবার বন্ধ করা, তাই কানেক্টিভিটি পুনরায় চালু হলে কমান্ডসমূহকে নিয়মানুযায়ী প্রেরণ করা প্রয়োজন।
✅ কীভাবে ডিভাইস বা সার্ভার কোডটি নিশ্চিত হবে যে কমান্ডসমূহ সর্বদা প্রেরিত হবে এবং প্রয়োজন পরলে তা MQTT-র মাধ্যমে নিয়মানুযায়ী প্রকাশিত হবে?
---
## 🚀 চ্যালেঞ্জ
শেষ তিনটি পাঠ্যের মধ্যে চ্যালেঞ্জটি ছিল আমাদের বাড়ি, স্কুল বা কর্মক্ষেত্রে যতগুলো আইওটি ডিভাইস রয়েছে তার একটি তালিকা তৈরি করা এবং তারা মাইক্রোকন্ট্রোলার বা একক-বোর্ড কম্পিউটার বা উভয়ের মিশ্রণে নির্মিত কিনা তার সিদ্ধান্তে উপনিত হওয়া এবং তারা কী ধরনের সেন্সর ও একচুয়েটর ব্যবহার করছে তা নিয়ে চিন্তা করা।
চিন্তা করে দেখি যে এই ডিভাইসগুলো কী ধরনের মেসেজ প্রেরণ বা গ্রহণ করছে। কি ধরনের টেলিমেট্রি প্রেরণ করছে? কি মেসেজ বা কমান্ড রিসিভ করতে পারে? চিন্তা করে দেখি এগুলো কি সত্যিই সুরক্ষিত?
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
## রিভিউ এবং স্ব-অধ্যয়ন
[MQTT Wikipedia page](https://wikipedia.org/wiki/MQTT) টি পড়ে MQTT সম্পর্কে আরো জানতে পারবো।
[Mosquitto](https://www.mosquitto.org) ব্যবহার করে MQTT ব্রোকার রান করতে ট্রাই করি এবং এটিকে আইওটি ডিভাইস ও সার্ভার কোডের সাথে সংযুক্ত করি।
> 💁 টিপ বাই ডিফল্ট Mosquitto কখনো anonymous কানেকশন অনুমোদন করে না (anonymous কানেকশনের অর্থ হচ্ছে ইউজারনেম এবং পাসওয়ার্ড ব্যাতীত কানেক্ট হওয়া) এবং যেই কম্পিউটারে এটি রান হচ্ছে সেই কম্পিউটার ব্যাতীত অন্য কানেকশন অনুমোদন করে না।
> এটিকে [`mosquitto.conf` config file](https://www.mosquitto.org/man/mosquitto-conf-5.html) এর মাধ্যমে ফিক্স করতে নিম্নের কমান্ডটি দিইঃ
>
> ```sh
> listener 1883 0.0.0.0
> allow_anonymous true
> ```
## এসাইনমেন্ট
[MQTT-এর সাথে অন্যান্য কমিউনিকেশন প্রটোকলের তুলনা করে পার্থক্য দাঁড় করানো](assignment.bn.md)

@ -1,472 +0,0 @@
# 인터넷에 장치 연결하기
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-4.jpg)
> Nitya Narasimhan의 스케치 노트. 더 큰 버전을 보려면 이미지를 클릭하세요.
이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)의 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 의 일부로 진행되었습니다. 이 수업은 2개의 비디오 - 1 시간의 수업, 1시간의 강의에 대한 집중 탐구 및 질의 응답으로 구성되어 있습니다.
![https://img.youtube.com/vi/O4dd172mZhs/0.jpg](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)
![https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)
> 🎥 상단의 이미지를 클릭하여 비디오를 시청할 수 있습니다.
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7)
## 개요
IoT에서 **I****인터넷**을 의미합니다. - 장치에 연결된 센서에서 측정값 수집, 액추에이터 제어를 위한 메세지 전송과 같은 IoT의 많은 기능을 가능하게 하는 클라우드 연결 및 서비스를 의미합니다. IoT 장치는 일반적으로 표준 통신 프로토콜을 사용하여 단일 클라우드 IoT 서비스에 연결되며 해당 서비스는 데이터에 대한 현명한 결정을 내리는 AI 서비스에 제어 또는 보고를 위한 웹 앱에 이르기까지 나머지 IoT 어플리케이션에 연결됩니다.
> 🎓 센서에서 수집되어 클라우드로 전송되는 데이터를 telemetry라고 합니다.
IoT 장치는 클라우드에서 메시지를 수신할 수 있습니다. 종종 메시지에는 다음 명령들이 포함되어 있습니다. - 내부적으로 작업 수행하기(예: 재부팅 또는 펌웨어 업데이트) 또는 엑추에이터 사용하기(예: 조명 켜기).
이 강의에서는 IoT 장치가 클라우드에 연결하는데 사용할 수 있는 몇가지 통신 프로토콜과 송수신할 수 있는 데이터 유형을 소개합니다. 또한 야간 조명에 인터넷 제어를 추가하고, LED 제어 논리를 로컬에서 실행되는 ‘서버’ 코드로 이동하는 실습을 하게 됩니다.
이 강의에서 다룰 내용은 다음과 같습니다:
- [통신 프로토콜](#communication-protocols)
- [메시지 큐 원격 분석 전송(MQTT)](##message-queueing-telemetry-transport-mqtt)
- [텔레메트리(원격 측정)](#telemetry)
- [명령](#commands)
## 통신 프로토콜
IoT 장치가 인터넷과 통신하는 데 널리 사용하는 통신 프로토콜이 많이 있습니다. 가장 인기있는 것은 일종의 브로커 형태의 발행/구독 메시징을 기반으로 합니다. IoT 장치는 브로커에 연결하고 원격 측정을 게시하고 명령을 구독합니다. 또한 클라우드 서비스는 브로커에 연결하고 모든 원격 측정 메시지를 구독하고 특정 장치, 장치 그룹에 명령을 게시합니다.
![IoT devices connect to a broker and publish telemetry and subscribe to commands. Cloud services connect to the broker and subscribe to all telemetry and send commands to specific devices.](../../../../images/pub-sub.png)
MQTT는 IoT 장치에 가장 널리 사용되는 통신 프로토콜이며 이 강의에서 다룹니다. 다른 프로토콜에는 AMQP와 HTTP/HTTPS가 있습니다.
## 메시지 큐 원격 분석 전송 (MQTT)
[MQTT](http://mqtt.org/) 는 장치 간에 메시지를 보낼 수 있는 가벼운 개방형 표준 메시징 프로토콜 입니다. 1999년에 송유관을 모니터링하도록 설계되었으며 15년 후 IBM에서 공개 표준으로 발표했습니다.
MQTT 에는 단일 브로커와 여러 클라이언트가 있습니다. 모든 클라이언트는 브로커에 연결되고, 브로커는 메시지를 관련 클라이언트에게 라우팅합니다. 메시지는 개별 클라이언트에게 직접 전송되지 않고 명명된 주제를 사용하여 라우팅됩니다. 클라이언트는 주제를 게시할 수 있으며 해당 주제를 구독하는 모든 클라이언트는 메시지를 받습니다.
![IoT device publishing telemetry on the /telemetry topic, and the cloud service subscribing to that topic](../../../../images/mqtt.png)
✅ 조사를 해보십시오. IoT 장치가 많은 경우, MQTT 브로커가 모든 메시지를 처리하려면 어떻게 해야 합니까?
### IoT장치를 MQTT에 연결하기
야간 조명에 인터넷 제어를 추가하는 첫 번째 단계는 이를 MQTT 브로커에 연결하는 것입니다.
### 작업
장치를 MQTT 브로커에 연결합니다.
이 수업에서는 IoT 야간 조명을 인터넷에 연결하여 원격으로 제어할 수 있도록 합니다. 수업의 뒷부분에서, IoT 장치는 MQTT를 통해 가벼운 수준의 공용 MQTT 브로커로 원격 분석 메시지를 보내고, 당신이 작성할 서버 코드에 의해 선택될 것입니다.
이러한 설정의 실제 사용 사례는 경기장과 같이 조명이 많은 위치에서 조명 키는 것을 결정하기 전에 여러 광 센서에서 데이터를 수집하는 것이 있습니다. 이렇게 하면 구름이나 새가 한 센서를 가려도, 다른 센서에서 충분한 빛을 감지한 경우 조명이 켜지지 않을 수 있습니다.
✅ 명령을 보내기 전에 여러 센서의 데이터를 평가해야 하는 다른 상황은 무엇입니까?
이 과제의 일부로 MQTT 브로커를 설정하는 복잡성을 처리하는 대신 오픈 소스 MQTT 브로커인 [Eclipse Mosquitto](https://www.mosquitto.org/) 를 실행하는 공개 테스트 서버를 사용할 수 있습니다. 이 테스트 브로커는 [test.mosquitto.org](https://test.mosquitto.org/)에서 공개적으로 사용할 수 있으며, 계정을 설정할 필요가 없으므로 MQTT 클라이언트와 서버를 테스트에 훌륭한 도구 입니다.
> 💁 이 테스트 브로커는 공개되어 있으며 안전하지 않습니다. 누구나 귀하가 게시한 내용을 들을 수 있으므로, 비공개로 유지해야 하는 데이터와 함께 사용해서는 안됩니다.
![../../../images/assignment-1-internet-flow.png](../../../../images/assignment-1-internet-flow.png)
아래 단계에 따라 장치를 MQTT 브로커에 연결하십시오:
- [Arduino - Wio Terminal](notion://www.notion.so/wio-terminal-mqtt.md) 아두이노 - Wio 터미널
- [Single-board computer - Raspberry Pi/Virtual IoT device](notion://www.notion.so/single-board-computer-mqtt.md) 싱글-보드 컴퓨터 - Raspberry Pi/가상 IoT 장치
### MQTT 자세히 알아보기
주제에는 계층이 있을 수 있으며, 클라이언트는 와일드카드를 사용하여 다른 수준의 계층에 가입할 수 있습니다. 예를 들어, `/telemetry/temperature` 주제에 온도 원격 측정 메시지를 보내고 , `/telemetry/humidity` 주제에 습도 메시지를 보낸 뒤, 클라우드 앱에서 `/telemetry/*` 주제를 구독하여 온도 와 습도 원격 측정 메시지를 모두 수신할 수 있습니다.
메시지는 수신되는 메시지의 보장을 결정하는 서비스의 품질(QoS)과 함께 보낼 수 있습니다.
- 최대 한 번 - 메세지는 한 번만 전송되고 클라이언트와 브로커는 전송을 확인하기 위해 추가 단계를 수행하지 않습니다(실행 후 잊어버림).
- 최소 한 번 - 확인 메시지가 수신될 때까지 보낸 사람이 여러번 다시 시도합니다.(전송 보장).
- 정확히 한 번 - 보낸 사람과 받는 사람이 2 단계의 핸드셰이크에 참여하여 메시지 사본을 하나만 수신하도록 합니다(전달 보장).
✅ 어떤 상황에서 실행 후 잊어버림 메시지보다 전달 보장 메시지가 필요할 수 있습니까?
이름은 메시지 큐잉(MQTT의 이니셜)이지만, 실제로는 메시지 큐를 지원하지 않습니다. 클라이언트가 연결을 끊었다가, 다시 연결하면 QoS 프로세스를 사용하여 이미 처리를 시작한 메시지를 제외하고 연결이 끊긴 동안 보낸 메시지를 받지 않는다는 의미입니다. 메시지에는 보유 플래그가 설정되어 있을 수 있습니다. 이것이 설정되면 MQTT 브로커는 이 플래그를 사용하여 주제에 대해 보낸 마지막 메시지를 저장하고 나중에 주제를 구독하는 모든 클라이언트에게 이를 보냅니다. 이런 식으로 클라이언트는 항상 최신 메시지를 받습니다.
또한 MQTT는 메시지 간의 긴 간격 동안 연결이 여젼히 활성 상태인지 확인하는 연결 유지 기능을 지원합니다.
> 🦟 [Mosquitto from the Eclipse Foundation](https://mosquitto.org/) 에는 [test.mosquitto.org](https://test.mosquitto.org/)에서 호스팅되는 코드 테스트에 사용할 수 있는 공개 MQTT 브로커와 함께 MQTT를 실험하기 위해 직접 실행할 수 있는 무료 MQTT 브로커가 있습니다.
MQTT 연결은 공개되고 공개되거나 사용자의 이름과 암호 또는 인증서를 사용하여 암호화되고 보호될 수 있습니다.
> 💁 MQTT 는 HTTP와 동일한 기본 네트워크 프로토콜 이지만 다른 포트에서 TCP/IP를 통해 통신합니다. 또한 웹소켓을 통한 MQTT 를 사용하여 브라우저에서 실행되는 웹 앱과 통신하거나, 방화벽이나 기타 네트워크 규칙이 표준 MQTT 연결을 차단하는 상황에서도 사용할 수 있습니다.
## 텔레메트리(원격 측정)
텔레메트리(Telemetry)는 원격 측정이라는 그리스어에서 파생되었습니다. 원격 측정은 센서에서 데이터를 수집하여 클라우드로 보내는 행위입니다..
> 💁 최초의 원격 측정 장치 중 하나는 1874년 프랑스에서 발명되었으며 실시간으로 날씨와 눈 깊이를 몽블랑에서 파리로 보냈습니다. 당시에는 무선 기술을 사용할 수 없었기 때문에 물리적 와이어를 사용했습니다.
수업 1의 예시 스마트 온도 조절기를 다시 살펴보겠습니다.
![../../../images/telemetry.png](../../../../images/telemetry.png)
온도 조절 장치에는 원격 측정을 수집하는 온도 센서가 있습니다. 하나의 온도 센서가 내장되어 있을 가능성이 높으며 BLE([Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy))와 같은 무선 프로토콜을 통해 여러 외부 온도 센서에 연결할 수 있습니다.
전송할 원격 측정 데이터의 예는 다음과 같습니다:
| Name | Value | Description |
| ------------------------ | ----- | ---------------------------------------------------------------------- |
| `thermostat_temperature` | 18°C | 온도 조절 장치에 내장된 온도 센서로 측정된 온도 |
| `livingroom_temperature` | 19°C | `livingroom` 이라고 명명된 방에 있는 원격 온도 센서에 의해 측정된 온도 |
| `bedroom_temperature` | 21°C | `bedroom`이라고 명명된 방에 있는 원격 온도 센서에 의해 측정된 온도 |
클라우드 서비스는 이 원격 측정 데이터를 사용하여 난방을 제어하기 위해 보낼 명령을 결정할 수 있습니다.
### IoT 장치에서 원격 분석 보내기
야간 조명에 인터넷 제어를 추가하는 다음 과정은 조명 수준 원격 분석을 MQTT 브로커의 텔레메트리 주제를 보내는 것입니다.
### 작업 - IoT 장치에서 원격 분석 보내기
MQTT 브로커에게 가벼운 수준의 원격 분석을 보냅니다.
데이터는 키/값 쌍을 사용해 텍스트로 데이터를 인코딩하는 표준인 JSON(JavaScriopt Object Notation의 약자)으로 인코딩되어 전송됩니다.
✅ 이전에 JSON을 접한 적이 없다면, [JSON.org documentation](https://www.json.org/)에서 더 자세히 알아볼 수 있습니다.
장치에서 MQTT 브로커로 원격 분석을 보내려면 아래 단계를 따르십시오:
- [아두이노 - Wio 터미널](wio-terminal-telemetry.md)
- [싱글 보드 컴퓨터 - Raspberry Pi/가상 IoT 장치](single-board-computer-telemetry.md)
### MQTT 브로커로부터 텔레메트리 수신
다른 쪽 끝에 수신할 것이 없으면 원격 분석을 보낼 의미가 없습니다. 광도 원격 측정은 데이터를 처리하기 위해 이를 수신하는 무언가가 필요합니다. 이 '서버' 코드는 더 큰 IoT 애플리케이션의 일부로 클라우드 서비스에 배포할 코드 유형이지만, 여기에서는 이 코드를 컴퓨터에서 로컬로(또는 직접 코딩하는 경우 Pi에서 실행할 것입니다). 서버 코드는 가벼운 수준의 MQTT를 통해 원격 분석 메시지를 수신하는 Python 앱으로 구성됩니다. 이 수업의 뒷부분에서 LED를 켜거나 끄도록 지시하는 명령 메시지로 응답하게 할 것입니다.
✅ 조사해보기: 리스너가 없으면 MQTT 메시지는 어떻게 됩니까?
### Python 과 VS Code 설치
Python 및 VS Code를 로컬에 설치하지 않은 경우 서버를 코딩하려면 둘 다 설치해야 합니다. 가상 IoT 장치를 사용 중이거나 Raspberry Pi에서 작업하는 경우 이미 설치 및 구성되어 있어야 하므로 이 단계를 건너뛸 수 있습니다.
### 작업 - Python 과 VS Code 설치
Python 과 VS Code 를 설치합니다.
1. Python을 설치합니다. 최신 버전의 Python 설치에 대한 지침은 [Python downloads page](https://www.python.org/downloads/) 를 참조하십시오.
2. Visual Studio Code (VS Code)를 설치합니다. 이것은 Python으로 가상 장치 코드를 작성하는데 사용할 편집기입니다. VS Code 설치에 대한 지침은 [VS Code documentation](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) 를 참조하십시오.
> 💁 선호하는 편집기가 있는 경우 이 수업에 IDE 또는 편집기를 자유롭게 사용할 수 있지만, 수업에서는 VS Code 사용을 기반으로 지침을 제공합니다.
3. VS Code Pylance 확장을 설치합니다. 이것은 Python 언어 지원을 제공하는 VS Code 의 확장입니다. VS Code에서 이 확장을 설치하는 방법은 [Pylance extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) 를 참조하십시오.
### Python 가상 환경 구성
Python의 강력한 기능 중 하나는 [pip packages](https://pypi.org/)를 설치하는 것입니다. - 이는 다른 사람이 작성하여 인터넷에 게시한 코드 패키지입니다. 하나의 명령으로 컴퓨터에 pip 패키지를 설치한 다음, 코드에서 해당 패키지를 사용할 수 있습니다. pip를 사용하여 MQTT를 통해 통신하는 패키지를 설치합니다.
기본적으로 패키지를 설치하면 컴퓨터의 모든 곳에서 사용할 수 있으며, 이것은 패키지 버전에 문제를 발생시킬 수 있습니다 - 예를 들어, 패키지의 한 버전에 따라 하나의 응용 프로그램이 다른 응용 프로그램의 새 버전을 설치할 때 중단되는 경우. 이 문제를 해결하기 위해, [Python 가상 환경](https://docs.python.org/3/library/venv.html)을 사용할 수 있습니다, 기본적으로 전용 폴더에 있는 폴더에 있는 Python의 복사본이며 pip 패키지를 설치하면 해당 폴더에만 설치됩니다.
### 작업 - Python 가상 환경 구성
Python 가상 환경을 구성하고 MQTT pip 패키지를 설치합니다.
1. 터미널 또는 명령줄에서 원하는 위치에서 다음을 실행하여 새 디렉터리를 만들고 탐색합니다:
```
mkdir nightlight-server
cd nightlight-server
```
2. 이제 다음을 실행하여 `.venv` 폴더에 가상 환경을 만듭니다.
```
python3 -m venv .venv
```
> 💁 Python 3 (최신 버전) 외에 Python2가 설치된 경우에만 가상 환경을 생성하기 위해 명시적으로 호출해야 합니다. Python2 가 설치된 경우 python 호출 시 Python 3 대신 Python 2 가 사용됩니다.
3. 가상 환경 활성화:
- On Windows:
- 명령 프롬프트 또는 Windows 터미널을 통한 명령 프롬프트를 사용하는 경우 다음을 실행합니다:
```
.venv\\Scripts\\activate.bat
```
- PowerShell을 사용하는 경우 다음을 실행합니다:
```
.\\.venv\\Scripts\\Activate.ps1
```
- macOS 또는 Linux에서 다음을 실행합니다:
```
source ./.venv/bin/activate
```
> 💁 이러한 명령은 가상 환경을 만들기 위해 명령을 실행한 동일한 위치에서 실행해야 합니다. .venv 폴더를 탐색할 필요가 없으며, 항상 activate 명령과 아무 명령을 실행하여 패키지를 설치하거나 가상 환경을 만들 때 있떤 폴더에서 코드를 실행해야 합니다.
4. 가상 환경이 활성화 되면, 기본 `python` 명령은 가상 환경을 만드는 데 사용된 Python 버전을 실행합니다. 다음을 실행하여 버전을 가져옵니다:
```
python --version
```
출력은 다음과 유사합니다:
```
(.venv) ➜ nightlight-server python --version
Python 3.9.1
```
> 💁 Python 버전은 다를 수 있습니다 - 버전 3.6 이상이면 좋습니다. 그렇지 않은 경우, 이 폴더를 삭제하고, 최신 버전의 Python을 설치한 후 다시 시도하십시오.
5. 다음 영령을 실행하여 널리 사용되는 MQTT 라이브러리인 [Paho-MQTT](https://pypi.org/project/paho-mqtt/)용 pip 패키지를 설치하십시오.
```
pip install paho-mqtt
```
이 pip 패키지는 가상 환경에만 설치되며 외부에서는 사용할 수 없습니다.
### 서버 코드 작성
이제 서버 코드를 Python으로 작성할 수 있습니다.
### 작업 - 서버 코드 작성
서버 코드를 작성합니다.
1. 터미널 또는 명령줄에서, 가상 환경 내에서 다음을 실행하여 `app.py`라는 Python 파일을 만듭니다:
- Windows에서 다음을 실행합니다:
```
type nul > app.py
```
- macOS 또는 Linux에서 다음을 실행합니다:
```
touch app.py
```
2. VS Code에서 현재 폴더를 엽니다:
```
code .
```
3. VS Code가 시작되면 Python 가상 환경이 활성화됩니다. 이것은 하단 상태 표시줄에 보고됩니다.:
![../../../images/vscode-virtual-env.png](../../../../images/vscode-virtual-env.png)
4. VS Code가 시작될 때 VS Code 터미널이 이미 실행 중이면 가상 환경이 활성화되지 않습니다. 가장 쉬운 방법은 **활성 터미널 인스턴스 종료** 버튼을 사용하여 터미널을 종료하는 것입니다.:
![../../../images/vscode-kill-terminal.png](../../../../images/vscode-kill-terminal.png)
5. \*Terminal -> New Terminal을 선택하거나, `` CTRL+` ``를 눌러 새 VS Code 터미널을 시작합니다. 새 터미널은 가상 환경을 로드하고 이를 활성화하라는 호출이 터미널에 표시됩니다. 가상 환경의 이름(`.venv`)도 프롬프트에 표시됩니다:
```
➜ nightlight-server source .venv/bin/activate
(.venv) ➜ nightlight
```
6. VS Code 탐색기에서 `app.py`파일을 열고 다음 코드를 추가합니다:
```
import json
import time
import paho.mqtt.client as mqtt
id = '<ID>'
client_telemetry_topic = id + '/telemetry'
client_name = id + 'nightlight_server'
mqtt_client = mqtt.Client(client_name)
mqtt_client.connect('test.mosquitto.org')
mqtt_client.loop_start()
def handle_telemetry(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
mqtt_client.subscribe(client_telemetry_topic)
mqtt_client.on_message = handle_telemetry
while True:
time.sleep(2)
```
6행에서 `<ID>`를 기기 코드를 생성할 때 사용한 고유 ID로 바꿉니다.
⚠️ 이것은 **반드시** 장치에서 사용한 것과 동일한 ID 여야 합니다, 그렇지 않으면 서버 코드가 올바른 주제를 구독하거나 게시하지 않습니다.
이 코드는 고유한 이름으로 MQTT 클라이언트를 생성하고 _[test.mosquitto.org](http://test.mosquitto.org/)_ 브로커에 연결합니다. 그런 다음 구독된 주제에 대한 메시지를 수신하는 백그라운드 스레드에서 실행되는 처리 루프를 시작합니다.
그런 다음 클라이언트는 원격 분석 주제에 대한 메시지를 구독하고, 메시지가 수신될 때 호출되는 함수를 정의합니다. 원격 측정 메시지가 수신되면, `handle_telemetry` 함수가 호출되어, 수신된 메시지를 콘솔에 인쇄합니다.
마지막으로 무한 루프는 응용 프로그램이 계속 실행되도록 합니다. MQTT 클라이언트는 백그라운드 스레드에서 메시지를 수신하고 있으며 기본 애플리케이션이 실행 중인 동안 항상 실행됩니다.
7. VS Code 터미널에서, 다음을 실행하여 Python 앱을 실행합니다:
```
python app.py
```
앱이 IoT 장치의 메시지 수신을 시작합니다.
8. 장치가 실행 중이고 원격 분석 메시지를 보내고 있는지 확인하십시오. 물리적 또는 가상 장치에서 감지한 조명 수준을 조정합니다. 수신 중인 메시지가 터미널에 인쇄됩니다.
```
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Message received: {'light': 400}
```
nightlight-server 가상 환경의 app.py 파일이 전송되는 메시지를 수신하려면 nightlight 가상 환경의 app.py 파일이 실행 중이어야 합니다.
> 💁 이 코드는 [code-server/server](code-server/server) 폴더에서 찾을 수 있습니다.
### 얼마나 자주 원격 분석을 보내야 합니까?
원격 분석에서 중요한 고려 사항 중 하나는 얼마나 자주 데이터를 측정하고 보내는가? 입니다. 대답은 - 상황에 따라 다르다 입니다. 자주 측정하면 측정 변화에 더 빠르게 대응할 수 있지만, 더 많은 전력, 더 많은 대역폭을 사용하고 더 많은 데이터를 생성하고 처리할 더 많은 클라우드 리소스가 필요합니다. 충분히 자주 측정해야 하지만 너무 자주 측정해서는 안 됩니다.
온도 조절기의 경우, 온도가 자주 변하지 않기 때문에 몇 분마다 측정하는 것으로 충분합니다. If you only measure once a day then you could end up heating your house for nighttime temperatures in the middle of a sunny day, whereas if you measure every second you will have thousands of unnecessarily duplicated temperature measurements that will eat into the users' Internet speed and bandwidth (a problem for people with limited bandwidth plans), use more power which can be a problem for battery powered devices like remote sensors, and increase the cost of the providers cloud computing resources processing and storing them.
공장에서 기계가 고장나면 치명적인 피해를 입히고 수백만 달러의 수익 손실을 초래할 수 있는 기계 주변의 데이터를 모니터링하는 경우, 초당 여러 번 측정해야 할 수 있습니다. 기계가 고장나기 전에 중지하고 수정해야 함을 나타내는 원격 측정을 놓치는 것보다 대역폭을 낭비하는 것이 좋습니다.
> 💁 이 상황에서는, 인터넷에 대한 의존도를 줄이기 위해 원격 분석을 먼저 처리하는 에지 장치를 고려할 수 있습니다.
### 연결 끊김
인터넷 연결은 불안정할 수 있으며 일반적으로 중단됩니다. 이러한 상황에서 IoT 장치는 무엇을 해야 합니까 - 데이터가 손실되어야 합니까, 아니면 연결이 복원될 때까지 저장해야 합니까? 다시 말하지만, 대답은 상황에 따라 다릅니다.
온도 조절기의 경우 새 온도 측정이 수행되자마자 데이터가 손실될 수 있습니다. 난방 시스템은 20분 전에 온도가 19°C인 경우 20.5°C였던 것을 신경 쓰지 않습니다. 난방을 켜야 하는지 여부를 결정하는 것은 지금 온도입니다.
기계류의 경우 특히 추세를 찾는 데 사용되는 경우 데이터를 유지해야 할 수 있습니다. 정의된 기간(예들 들어, 지난 1시간)의 데이터를 살펴보고 비정상적인 데이터를 찾아냄으로써 데이터 스트림의 이상을 감지할 수 있는 기계 학습 모델이 있습니다. 이것은 종종 예측 유지보수에 사용되며, 곧 고장날 수 있다는 표시를 찾아 그 전에 수리하거나 교체할 수 있습니다. 시스템에 대한 모든 원격 분석을 전송하여 이상 감지를 위해 처리할 수 있기를 원할 수 있으므로, IoT 장치가 다시 연결되면 인터넷 중단 중에 생성된 모든 원격 분석이 전송됩니다.
IoT 장치 설계자는 인터넷 중단 또는 위치로 인한 신호 손실 중에 IoT 장치를 사용할 수 있는지도 고려해야 합니다. 스마트 온도 조절기는 정전으로 인해 클라우드에 원격 측정을 보낼 수 없는 경우 난방을 제어하기 위해 몇 가지 제한된 결정을 내릴 수 있어야 합니다.
![../../../images/bricked-car.png](../../../../images/bricked-car.png)
MQTT가 연결 손실을 처리하려면, 장치 및 서버 코드가 필요한 경우 메시지 전달을 보장해야 합니다. 예를 들어 전송된 모든 메시지가 응답 주제에 대한 추가 메시지로 응답되도록 요구하고, 그렇지 않은 경우 나중에 재생할 수 있도록 수동으로 대기열에 추가됩니다.
## 명령
명령은 클라우드에서 장치로 보내는 메시지로, 작업을 수행하도록 지시합니다. 대부분의 경우 이것은 액츄에이터를 통해 일종의 출력을 제공하는 것과 관련이 있지만, 재부팅하거나 추가 원격 측정을 수집하여 명령에 대한 응답으로 반환하는 것과 같은 장치 자체에 대한 명령일 수 있습니다.
![An Internet connected thermostat receiving a command to turn on the heating](../../../../images/commands.png)
온도 조절기는 클라우드에서 난방을 켜라는 명령을 받을 수 있습니다. 모든 센서의 원격 측정 데이터를 기반으로 클라우드 서비스가 난방을 켜야 한다고 결정한 경우 관련 명령을 보냅니다.
### MQTT 브로커에 명령 보내기
인터넷 제어 야간 조명의 다음 단계는 서버 코드가 감지하는 조명 수준에 따라 조명을 제어하기 위해 IoT 장치에 명령을 다시 보내는 것입니다
1. VS Code에서 서버 코드 열기
2. `client_telemetry_topic` 명령을 보낼 주제를 정의하는 선언 뒤에 다음 줄을 추가힙니다:
```
server_command_topic = id + '/commands'
```
3. `handle_telemetry` 함수 끝에 다음 코드를 추가합니다:
```
command = { 'led_on' : payload['light'] < 300 }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
```
이것은 명령 주제에 조명이 300 미만인지 여부에 따라 `led_on` 값이 ture나 false로 설정되도록 JSON 메시지를 보냅니다. 조명이 300보다 작으면, LED를 켜도록 장치에 지시하기 위해 true 가 전송됩니다.
4. 이전과 같이 코드를 실행
5. 물리적 또는 가상 장치에서 감지한 조명 수준을 조정합니다. 수신 중인 메시지와 전송 중인 명령이 터미널에 기록됩니다.:
```
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Sending message: {'led_on': True}
Message received: {'light': 400}
Sending message: {'led_on': False}
```
> 💁 원격 측정과 명령은 각각 단일 주제에 대해 전송됩니다. 여러 장치의 원격 분석은 동일한 원격 분석 항목에 표시되고 여러 장치에 대한 명령은 동일한 명령 항목에 나타남을 의미합니다. 특정 장치에 명령을 보내려면, `/commands/device1`, `/commands/device2`와 같은 고유한 장치 id같은 여러 주제를 사용할 수 있습니다. 그런 식으로 장치는 해당 장치에 대한 메시지를 수신할 수 있습니다.
> 💁 이 코드는 [code-commands/server](code-commands/server) 폴더에서 찾을 수 있습니다.
### IoT 장치에서 명령 처리
이제 서버에서 명령이 전송되므로, IoT 장치에 코드를 추가하여 명령을 처리하고 LED를 제어할 수 있습니다.
MQTT 브로커의 명령을 수신하려면 아래 단계를 따르십시오:
- [아두이노 - Wio 터미널](notion://www.notion.so/wio-terminal-commands.md)
- [싱글 보드 컴퓨터 - Raspberry Pi/가상 IoT 장치](notion://www.notion.so/single-board-computer-commands.md)
이 코드가 작성되고 실행되면 조명 수준을 변경하는 실험을 하십시오. 서버 및 장치의 출력을 관찰하고 조명 수준을 변경할 때 LED를 관찰합니다.
### 연결 끊김
오프라인인 IoT 장치에 명령을 보내야 하는 경우 클라우드 서비스는 어떻게 해야 합니까? 다시 말하지만, 대답은 상황에 따라 다릅니다.
최신 명령이 이전 명령보다 우선하면 이전 명령은 무시할 수 있습니다. 클라우드 서비스가 난방을 켜라는 명령을 보낸 다음, 난방을 끄라는 명령을 보내면, 온 명령을 무시하고 재전송하지 않을 수 있습니다.
만약 명령을 순서대로 처리해야 하는 경우, 예를 들어 로봇 팔을 위로 이동한 다음 그래버를 닫는 경우, 연결이 복원되면 순서대로 전송해야 합니다.
✅ 장치 또는 서버 코드가 필요한 경우 MQTT를 통해 명령이 항상 순서대로 전송되고 처리되도록 하려면 어떻게 해야 합니까?
---
## 🚀 도전
지난 세 수업의 과제는 집, 학교 또는 직장에 있는 IoT 장치를 최대한 많이 나열하고 마이크로컨트롤러 또는 단일 보드 컴퓨터 또는 이 둘을 혼합하여 구축되었는지 여부를 결정하고 어떤 센서와 액추에이터를 사용하고 있는지 생각해 보는 것이었습니다.
이러한 장치의 경우, 어떤 메시지를 보내거나 받을 수 있는지 생각해 보십시오. 어떤 원격 측정을 보내나요? 어떤 메시지나 명령을 받을 수 있습니까? 이것이 안전하다고 생각합니까?
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
## 복습 & 독학
[MQTT Wikipedia page](https://wikipedia.org/wiki/MQTT)에서 MQTT에 대해 자세히 알아보세요.
[Mosquitto](https://www.mosquitto.org/) 를 사용하여 MQTT 브로커를 직접 실행하고 IoT 장치와 서버 코드를 연결해보세요.
> 💁 팁 - 기본적으로 Mosquitto는 익명 연결(즉, 사용자 이름과 암호 없이 연결)을 허용하지 않으며, 실행중인 컴퓨터 외부에서 연결을 허용하지 않습니다.
> [`mosquitto.conf` 구성 파일](https://www.mosquitto.org/man/mosquitto-conf-5.html)로 이 문제를 해결할 수 있습니다:
>
> ```
> listener 1883 0.0.0.0
> allow_anonymous true
>
> ```
## 과제
[MQTT를 다른 통신 프로토콜과 비교 및 대조](assignment.ko.md)

@ -1,18 +0,0 @@
<div dir="rtl">
# قارن بين MQTT وبروتوكولات الاتصال الأخرى
## تعليمات
غطى هذا الدرس MQTT كبروتوكولات اتصال. هناك آخرون ، بما في ذلك AMQP و HTTP / HTTPS.
ابحث عن هذين الأمرين وقارنهما / تعاقد مع MQTT. فكر في استخدام الطاقة والأمان واستمرار الرسائل في حالة فقد الاتصالات.
## الموضوع
| المعايير | نموذجي | كافية | يحتاج إلى تحسين |
| -------- | --------- | -------- | ----------------- |
| قارن AMQP بـ MQTT | قادر على مقارنة وتباين AMQP مع MQTT ويغطي القوة والأمان ومثابرة الرسائل. | قادر جزئيًا على مقارنة وتباين AMQP مع MQTT ويغطي اثنين من القوة والأمان ومثابرة الرسائل. | قادر جزئيًا على مقارنة وتباين AMQP مع MQTT ويغطي واحدة من القوة والأمان واستمرارية الرسائل. |
| قارن HTTP / HTTPS بـ MQTT | قادر على مقارنة وتباين HTTP / HTTPS إلى MQTT ويغطي القوة والأمان واستمرارية الرسائل. | قادر جزئيًا على مقارنة وتباين HTTP / HTTPS مع MQTT ويغطي اثنتين من القوة والأمان واستمرارية الرسائل. | قادر جزئيًا على مقارنة وتباين HTTP / HTTPS مع MQTT ويغطي أحد القوة والأمان واستمرارية الرسائل. |
</div>

@ -1,14 +0,0 @@
# MQTT-এর সাথে অন্যান্য কমিউনিকেশন প্রটোকলের তুলনা করে পার্থক্য দাঁড় করানো
## নির্দেশনা
এই পাঠটিতে MQTT কমিউনিকেশন প্রোটোকল নিয়ে আলোচনা হয়েছে । অন্যান্য প্রোটোকলের মধ্যে AMQP এবং HTTP/HTTPS অন্তর্ভুক্ত রয়েছে।
AMQP এবং HTTP/HTTPS উভয়টি নিয়ে গবেষণা করতে হবে এবং MQTT এর সাথে তুলনা করে পার্থক্য দাঁড় করাতে হবে । যদি কানেকশনসমূহ চলে যায় তবে পাওয়ারের ব্যবহার, সিকউরিটি এবং মেসেজ পারসিসটেন্স নিয়ে চিন্তা করি ।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা (সর্বোত্তম) | পর্যাপ্ত ব্যখ্যা (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) |
| -------- | --------- | -------- | ----------------- |
| AMQP এর সাথে MQTT তুলনা করা। | AMQP এর সাথে MQTT তুলনা করে পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। | AMQP এর সাথে MQTT তুলনা করে আংশিক পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে দুটি প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। | AMQP এর সাথে MQTT তুলনা করে আংশিক পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে একটি প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। |
| HTTP/HTTPS এর সাথে MQTT তুলনা করা। | HTTP/HTTPS এর সাথে MQTT তুলনা করে পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। | HTTP/HTTPS এর সাথে MQTT তুলনা করে আংশিক পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে দুটি প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। | HTTP/HTTPS এর সাথে MQTT তুলনা করে আংশিক পার্থক্য দাঁড় করাতে এবং পাওয়ার, সিক্যুরিটি এবং মেসেজ পারসিসটেন্স নিয়ে একটি প্রতিবেদন তৈরি করতে সক্ষম হয়েছে। |

@ -1,14 +0,0 @@
# MQTT를 다른 통신 프로토콜과 비교, 대조하기
## 지침
이 강의에서는 MQTT 통신 프로토콜을 다루었습니다. 다른 프로토콜에는 AMQP 와 HTTP/HTTPS 가 있습니다.
이 두가지를 모두 조사하고 MQTT와 비교/대조하십시오. 연결이 끊긴 경우 전력 사용량, 보안, 메시지 지속성애 대해 생각해보세요.
## 평가 기준
| 기준 | 모범 답안 | 적절함 | 개선이 필요함 |
| ----------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| AMQP 와 MQTT 비교 | AMQP와 MQTT를 비교 및 ​​대조할 수 있으며 전원, 보안, 메시지 지속성을 다룹니다. | AMQP와 MQTT를 부분적으로 비교하고 대조할 수 있으며 전력, 보안, 메시지 지속성 중 두가지를 다룹니다. | AMQP와 MQTT를 부분적으로 비교 및 ​​대조할 수 있으며 전원, 보안, 메시지 지속성 중 하나를 다룹니다. |
| HTTP/HTTPS 와 MQTT 비교 | HTTP/HTTPS와 MQTT를 비교 및 ​​대조할 수 있으며 전원, 보안, 메시지 지속성을 다룹니다. | HTTP/HTTPS와 MQTT를 부분적으로 비교하고 대조할 수 있으며 기능, 보안, 메시지 지속성 중 두가지를 다룹니다. | HTTP/HTTPS를 MQTT와 부분적으로 비교 및 ​​대조할 수 있으며 전원, 보안, 메시지 지속성 중 하나를 다룹니다. |

@ -1,53 +0,0 @@
# 인터넷을 통해 야간 조명 제어하기 - 가상 IoT 하드웨어 및 Raspberry Pi
강의에서 MQTT 브로커에서 Raspberry Pi 또는 가상 IoT 장치로 전송된 명령을 실행하게 됩니다.
## 명령 실행하기
다음 단계는 MQTT 브로커에서 보낸 명령을 실행하고 이에 응답하는 것입니다.
### 작업
명령을 실행합니다.
1. VS Code에서 야간 조명 프로젝트를 엽니다.
2. 가상 IoT 장치를 사용하는 경우, 터미널이 가상 환경을 실행 중인지 확인하십시오. Raspberry Pi 를 사용하는 경우 가상 환경을 사용하지 않습니다.
3. `client_telemetry_topic`의 정위 뒤에 다음 코드를 추가합니다.:
```python
server_command_topic = id + '/commands'
```
`server_command_topic` 는 장치가 LED 명령을 수신하기 위해 실행될 MQTT 주제입니다.
4. main loop 바로 위의 `mqtt_client.loop_start()` 라인 뒤에 다음 코드를 추가합니다:
```python
def handle_command(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
if payload['led_on']:
led.on()
else:
led.off()
mqtt_client.subscribe(server_command_topic)
mqtt_client.on_message = handle_command
```
이 코드는 `handle_command` 함수를 정의합니다, 이는 메시지를 JSON 문서로 읽고 `led_on` 속성 값을 찾는 함수입니다. `True` 로 설정되면 LED가 켜지고, 그렇지 않다면 LED는 꺼집니다.
MQTT 클라이언트는 서버가 메시지를 보낼 주제를 실행하고 메시지가 수신될 때 `handle_command` 함수가 호출되도록 설정합니다.
> 💁 `on_message` 핸들러는 실행된 모든 주제에 대해 호출됩니다. 나중에 여러 주제를 수신하는 코드를 작성하면, 핸들러 함수를 거쳐 보내진 `message` 객체의 주제를 얻을 수 있습니다.
5. 과제의 이전 부분과 동일한 방식으로 코드를 실행합니다. 가상 IoT 장치를 사용하는 경우, CounterFit 앱이 실행중이고 LED가 올바른 핀에 생성되었는지 확인하십시오.
6. 물리적 또는 가상 장치에서 감지한 조명 수준을 조정합니다. 수신 중인 메시지와 전송 중인 명령이 터미널에 기록됩니다. LED도 조명 수준에 따라 켜지고 꺼질 것입니다.
> 💁 이 코드는 [code-commands/virtual-device](../code-commands/virtual-device) 폴더 또는 [code-commands/pi](../code-commands/pi) 폴더에서 찾을 수 있습니다.
😀 장치가 MQTT 브로커의 명령에 응답하도록 성공적으로 코딩했습니다.

@ -1,60 +0,0 @@
# 인터넷을 통해 야간 조명 제어하기 - 가상 IoT 하드웨어 및 Raspberry Pi
이 단원에서는 Rasberry Pi나 가상 IoT 장치로 부터 MQTT 브로커로 조명 레벨을 포함한 telemetry를 전송합니다.
## telemetry 게시
다음 단계는 telemetry를 포함한 JSON 문서를 생성하고 MQTT 브로커에게 전송하는 것입니다.
### 작업
MQTT 브로커에게 telemetry를 게시합니다.
1. VS Code에서 야간 조명 프로젝트를 엽니다.
1. 가상 IoT 기기를 사용한다면 터미널이 가상 환경에서 돌아가는지 확인합니다. Raspberry Pi를 사용한다면 가상 환경을 사용하지 않습니다.
1. `app.py` 파일의 상단에 다음을 추가합니다:
```python
import json
```
`json` 라이브러리는 telemetry를 JSON 문서로 인코딩 하는데 사용됩니다.
1. `client_name`의 선언 뒷부분에 다음을 추가합니다:
```python
client_telemetry_topic = id + '/telemetry'
```
`client_telemetry_topic`은 장치가 조명 레벨을 게시할 MQTT 항목입니다.
1. 파일 끝에 있는 `while True:` loop의 내용을 다음으로 바꿉니다:
```python
while True:
light = light_sensor.light
telemetry = json.dumps({'light' : light})
print("Sending telemetry ", telemetry)
mqtt_client.publish(client_telemetry_topic, telemetry)
time.sleep(5)
```
이 코드는 조명 레벨을 JSON 문서로 패키지하고 MQTT 브로커에 게시합니다. 그런 다음 메시지를 보내는 빈도를 줄이기 위해 sleep 합니다.
1. 과제의 이전 부분에서 돌렸던 것과 동일한 방법으로 코드를 실행합니다. 가상 IoT 장치를 사용한다면 CounterFit 앱이 실행 중이고 올바른 핀에 광 센서와 LED가 생성되었는지 확인하십시오.
```output
(.venv) ➜ nightlight python app.py
MQTT connected!
Sending telemetry {"light": 0}
Sending telemetry {"light": 0}
```
> 💁 해당 코드는 [code-telemetry/virtual-device](../code-telemetry/virtual-device) 폴더 또는 [code-telemetry/pi](../code-telemetry/pi) 폴더에서 찾으실 수 있습니다.
😀 장치에서 성공적으로 telemetry를 전송했습니다.

@ -1,265 +0,0 @@
# আইওটি দ্বারা উদ্ভিদ বৃদ্ধির পূর্বাভাস
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-5.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9)
## সূচনা
উদ্ভিদের বৃদ্ধির জন্য নির্দিষ্ট কিছু উপাদান প্রয়োজন - পানি, কার্বন-ডাইঅক্সাইড, পুষ্টি, হালকা এবং তাপ। এই পাঠে আমরা শিখবো কীভাবে বায়ুর তাপমাত্রা পরিমাপ করে উদ্ভিদের বৃদ্ধি এবং পরিপক্কতার হার হিসেব করা যায়।
এই লেসনে আমরা শিখবো:
* [ডিজিটাল কৃষিব্যবস্থা](#ডিজিটাল-কৃষিব্যবস্থা)
* [কৃষিকাজে তাপমাত্রা কেন গুরুত্বপূর্ণ?](#কৃষিকাজে-তাপমাত্রা-কেন-গুরুত্বপূর্ণ)
* [চারিপার্শ্বিক তাপমাত্রা পরিমাপ](#চারিপার্শ্বিক-তাপমাত্রা-পরিমাপ)
* [Growing degree days (GDD) হিসেব](#growing-degree-days)
* [তাপমাত্রা সেন্সরের তথ্য দিয়ে GDD নির্ণয়](#তাপমাত্রা-সেন্সরের-তথ্য-দিয়ে-GDD-নির্ণয়)
## ডিজিটাল কৃষিব্যবস্থা
ডিজিটাল বিপ্লব আমাদের কৃষিব্যবস্থায় আমূল পরিবর্তন আনছে। ডেটা সংগ্রহ, ডেটা স্টোর এবং সেই তথ্য বিশ্লেষণের মাধ্যমে আমাদের কৃষিকাজ নতুন রূপ লাভ করছে। ওয়ার্ল্ড ইকোনমিক ফোরামের ভাষ্যমতে আমরা বর্তমানে 'চতুর্থ শিল্প বিপ্লব' এর সময়ে আছি এবং ডিজিটাল কৃষির উত্থানকে 'চতুর্থ কৃষি বিপ্লব' বা 'কৃষি 4.0' হিসাবে চিহ্নিত করা হচ্ছে।
> 🎓 'ডিজিটাল এগ্রিকালচার' বলতে কৃষিব্যবস্থার সম্পূর্ণ value chain কে বোঝানো হয় যা একেবারে খামার থেকে খাওয়ার টেবিল পর্যন্ত সম্পূর্ণ যাত্রা । খাদ্য পরিবহণ এবং প্রক্রিয়াজাতকরণের সময় তার গুণগত মান ট্র্যাক করা, গুদাম এবং ই-কমার্স ব্যবস্থা পরিচালনা এমনকি ট্র্যাক্টর ভাড়া করা পর্যন্ত - সবকিছুই বর্তমানে ডিজিটাল মাধ্যমে করা সম্ভব হচ্ছে
এই বৈপ্লবিক পরিবর্তনের কারণে কম পরিমাণে সার ও কীটনাশক এবং দক্ষতার সাথে সেচ বা পানি ব্যবহার করে কৃষকেরা এখন অধিক ফলন পাচ্ছেন। যদিও প্রাথমিকভাবে কেবল উন্নত দেশগুলোতেই সেন্সর এবং অন্যান্য আধুনিক যন্ত্রের ব্যবহার শুরু হয়, বর্তমানে এগুলোর দাম কমে আসছে এবং উন্নয়নশীল দেশগুলোতেও অনেক বেশি সহজলভ্য হচ্ছে।
ডিজিটাল কৃষিব্যবস্থায় আমরা দেখতে পাচ্ছি -
* তাপমাত্রা পরিমাপ - তাপমাত্রা সঠিক পরিমাপ কৃষকদের গাছের বৃদ্ধি এবং পরিপক্কতা সম্পর্কে পূর্বাভাস দেয়।
* স্বয়ংক্রিয় সেচকার্য - নির্দিষ্ট সময় পরপর পানি দেয়ার পরিবর্তে, মাটির আর্দ্রতা পরিমাপ করে, তা খুব শুষ্ক হলে সেচ ব্যবস্থা চালু করা অধিক উপযোগী। সময়ভিত্তিক সেচের ফলে গরম, শুষ্ক সময়ে কম পানি পাওয়া বা বৃষ্টির সময় অতিরিক্ত পানির চাপ বেড়ে যাওয়ার মতো ঘটনা ঘটতে পারে। কেবল প্রয়োজনের সময়ে সেচ দিয়েই, কৃষকরা তাদের জলের ব্যবহার আরো বেশি কার্যকর করতে পারে।
* কীটপতঙ্গ নিয়ন্ত্রণ - কৃষকরা স্বয়ংক্রিয় রোবট বা ড্রোনগুলিতে ক্যামেরা ব্যবহার করে কীতপতঙ্গ গুলো পর্যবেক্ষণ করতে পারে এবং কেবল যেখানে প্রয়োজন সেখানেই কীটনাশক প্রয়োগ করতে পারেন। এতে করে কীটনাশকের পরিমাণ হ্রাস হবে এবং স্থানীয় জলের সরবরাহে কীটনাশকের মিশ্রণ কমে আসবে।
✅ একটু ভাবা যাক - কৃষকের ফলন উন্নত করতে আর কোন কোন কৌশল ব্যবহার করা হয়?
> 🎓 'Precision Agriculture' পরিভাষা ব্যবহৃত হয় ফসলের পর্যবেক্ষণ, পরিমাপ ও প্রতিক্রিয়া সংক্রান্ত কাজে। এর মধ্যে সেচ নিশ্চিতকরণ, পুষ্টিমাত্রা সঠিক রাখা এবং কীটপতঙ্গের মাত্রা পরিমাপ করা এবং নির্ভুলভাবে যথাযথ কাজটি করা যেমন ক্ষেতের কেবলমাত্র প্রয়োজনীয় ছোট অংশে সেচ দেয়া - এসব অন্তর্ভুক্ত।
## কৃষিকাজে তাপমাত্রা কেন গুরুত্বপূর্ণ ?
গাছপালা সম্পর্কে শেখার সময়, বেশিরভাগ শিক্ষার্থীদের পানি, আলো, কার্বন ডাইঅক্সাইড এবং পুষ্টির প্রয়োজনীয়তা সম্পর্কে শেখানো হয়। গাছপালা বৃদ্ধির জন্য উষ্ণতাও প্রয়োজন - এই কারণেই তাপমাত্রা বৃদ্ধির সাথে সাথে বসন্তে উদ্ভিদের ফুল ফোটে। উষ্ণতার কারণেই ড্যাফোডিল খুব শীঘ্রই ফুটতে পারে পারে এবং হটহাউস ও গ্রিনহাউসগুলি গাছ এর বৃদ্ধির জন্য কার্যকরী ভূমিকা রাখে।
> 🎓 হটহাউস এবং গ্রিনহাউসগুলি একই কাজ করে তবে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। হটহাউস কৃত্রিমভাবে উত্তপ্ত করা হয় এবং কৃষকদেরকে তাপমাত্রা আরও সঠিকভাবে নিয়ন্ত্রণ করার সুযোগ দেয়, কিন্তু গ্রিনহাউসগুলি উষ্ণতার জন্য সূর্যের উপর নির্ভর করে এবং সাধারণত তাপমাত্রা নিয়ন্ত্রণের জন্য জানালা বা কোন ছিদ্রের উপর নির্ভর করতে হয়।
গাছের একটি বেস বা সর্বনিম্ন তাপমাত্রা, সর্বোত্তম বা পরিমিত তাপমাত্রা এবং সর্বাধিক তাপমাত্রা থাকে, যা সবগুলিই প্রতিদিনের গড় তাপমাত্রার উপর নির্ভর করে।
* বেস (সর্বনিম্ন) তাপমাত্রা - এটি কোনও গাছের বৃদ্ধির জন্য প্রয়োজনীয় ন্যূনতম দৈনিক গড় তাপমাত্রা।
* পরিমিত তাপমাত্রা - সর্বাধিক বৃদ্ধি পেতে এটি সেরা দৈনিক গড় তাপমাত্রা।
* সর্বাধিক তাপমাত্রা - এটি একটি উদ্ভিদ সহ্য করতে পারে সর্বোচ্চ তাপমাত্রা। এর উপরে উদ্ভিদ পানি সংরক্ষণ এবং জীবিত থাকার চেষ্টায় এর বৃদ্ধি বন্ধ করে দেবে।
> 💁 এগুলি দিন এবং রাতের তুলনায় গড় তাপমাত্রা। গাছপালাগুলিকে আরও বেশি দক্ষতার সাথে আলোকসংশ্লেষণ করতে এবং রাতে শক্তি সঞ্চয় করতে সহায়তা করার জন্য দিন ও রাতে বিভিন্ন তাপমাত্রার প্রয়োজন হয়।
প্রতিটি প্রজাতির উদ্ভিদের তাদের সর্বনিম্ন, সর্বোত্তম এবং সর্বাধিক তাপমাত্রারর জন্য আলাদা আলাদা মান রয়েছে । এ কারণেই কিছু দেশে গাছপালা উষ্ণ এবং অপর কিছু দেশে শীতল অবস্থায় অধিক বৃদ্ধি পায়।
✅ ছোট একটি গবেষণা করা যাক। আমাদের বাগান, স্কুল বা স্থানীয় উদ্যানের যে কোনও গাছের জন্য কীভাবে বেস তাপমাত্রা খুঁজে পেতে পারেন কিনা তা দেখুন।
![A graph showing growth rate rising as temperature rises, then dropping as the temperature goes too high](../../../../images/plant-growth-temp-graph.png)
উপরের গ্রাফটি তাপমাত্রার গ্রাফের একটি বৃদ্ধির হার দেখায়। বেস তাপমাত্রা পর্যন্ত কোনও বৃদ্ধি নেই। বৃদ্ধির হার পরিমিত তাপমাত্রা পর্যন্ত বৃদ্ধি পায়, তারপরে এই শীর্ষে পৌঁছানোর পরে কমতে থাকে। সর্বোচ্চ তাপমাত্রায় বৃদ্ধি বন্ধ হয়।
এই গ্রাফের আকার গাছের প্রজাতি থেকে উদ্ভিদ প্রজাতির মধ্যে পরিবর্তিত হয়। কোন কোন ক্ষেত্রে অপটিমাম (পরিমিত) তাপমাত্রার পরে খুব খাড়াভাবে নেমে যায়, আবার কোন কোন উদ্ভিদে বেস তাপমাত্রা থেকে খুবই ধীরে ধীরে বৃদ্ধি পেয়ে পরিমিত তাপমাত্রায় পৌঁছায়।
> 💁 একজন কৃষকের সর্বোচ্চ ফলন নিশ্চিত করার জন্য, তিনটি তাপমাত্রার মানই জানতে হবে এবং তাদের গাছগুলি বৃদ্ধির গ্রাফের ধরণ বুঝতে হবে।
যদি কোন কৃষকের তাপমাত্রা নিয়ন্ত্রিত মাধ্যম থাকে, উদাহরণস্বরূপ বাণিজ্যিক হটহাউস, যেখানে তারা তাদের গাছগুলির জন্য অনুকূল তাপমাত্রা নিশ্চিত করতে পারে। যেমন বাণিজ্যিকভাবে এরকম হটহাউসে টমেটোগুলির দ্রুততম বৃদ্ধির জন্য দিনে তাপমাত্রা 25 ডিগ্রি সেন্টিগ্রেড এবং রাতে 20 ডিগ্রি সেলসিয়াস রাখতে হয়।
> 🍅 কৃত্রিম আলো, সার এর নিয়ন্ত্রণের সাথে তাপমাত্রার মেলবন্ধনের ফলে অর্থ বাণিজ্যিক উৎপাদকরা সারা বছর ধরে তাদের উৎপাদন বজায় রাখতে পারে।
## চারিপার্শ্বিক তাপমাত্রা পরিমাপ
আইওটি ডিভাইসের সাথে তাপমাত্রা সেন্সর ব্যবহার করে চারিপার্শ্বের তাপমাত্রা পরিমাপ করা যায়।
### কাজ - তাপমাত্রা পরিমাপ
আইওটি ডিভাইসটি ব্যবহার করে তাপমাত্রা পর্যবেক্ষণ করতে, পছন্দ অনুসারে নিচের যেকোন একটি গাইডের মাধ্যমে কাজ শুরু করতে হবে।
* [Arduino - Wio Terminal](wio-terminal-temp.md)
* [Single-board computer - Raspberry Pi](pi-temp.md)
* [Single-board computer - Virtual device](virtual-device-temp.md)
## Growing degree days
Growing degree days (যাকে growing degree units ও বলা হয়) হলো তাপমাত্রার ভিত্তিতে গাছের বৃদ্ধি পরিমাপ করার একটি উপায়। একটি উদ্ভিদে পর্যাপ্ত পরিমাণে জল, পুষ্টি এবং CO<sub>2</sub> রয়েছে - এমনটা ধরে নিয়েই, তাপমাত্রার ভিত্তিতে বৃদ্ধির হার নির্ধারণ করা হয়।
Growing degree days, সংক্ষেপে GDD কে উদিভের বেস তাপমাত্রার উপরে, প্রতিদিনের গড় তাপমাত্রা হিসেবে গণনা করা হয়। প্রতিটি উদ্ভিদে বৃদ্ধি, ফুল হওয়া বা উৎপাদন এবং পরিপক্ক হওয়ার জন্য নির্দিষ্ট সংখ্যক GDD প্রয়োজন। প্রতিদিন যত বেশি জিডিডি হবে, গাছটি তত দ্রুত বাড়বে।
GDD-এর সম্পূর্ণ সূত্রটি কিছুটা জটিল, তবে একটি সরলীকৃত সমীকরণ রয়েছে যা প্রায়শই একটি কাছাকাছি মান হিসাবে ব্যবহৃত হয়:
![GDD = T max + T min divided by 2, all minus T base](../../../../images/gdd-calculation.png)
* **GDD** - growing degree days এর সংখ্যা
* **T<sub>max</sub>** - এটি প্রতিদিনের সর্বোচ্চ তাপমাত্রা (ডিগ্রি সেলসিয়াসে)
* **T<sub>min</sub>** - এটি প্রতিদিনের সর্বনিম্ন তাপমাত্রা (ডিগ্রি সেলসিয়াসে)
* **T<sub>base</sub>** - এটি **উদ্ভিদের** বেইস তাপমাত্রা (ডিগ্রি সেলসিয়াসে)
> 💁 T<sub>max</sub> এর মান ৩০ ডিগ্রি এর বেশি হলে অথবা T<sub>min</sub> এর মান T<sub>base</sub> এর কম হলে এখানে কিছুটা পরিবর্তন আসে। তবে আমরা এখন আপাতত এই পরিবর্তনগুলো অগ্রাহ্য করবো।
### উদাহরণ - ভুট্টা 🌽
বিভিন্ন জাতের উপর নির্ভর করে, ভুট্টা পরিপক্ক হতে 800 এবং 2,700 জিডিডি প্রয়োজন (যখন বেস তাপমাত্রা 10 ডিগ্রি ্সেলসিয়াস)।
বেস তাপমাত্রার উপরে প্রথম দিন, নিম্নলিখিত তাপমাত্রা পরিমাপ করা হয়েছিল:
| পরিমাপ | তাপমাত্রা °C |
| :---------- | :-----: |
| সর্বোচ্চ | 16 |
| সর্বনিম্ন | 12 |
তাহলে,
* T<sub>max</sub> = 16
* T<sub>min</sub> = 12
* T<sub>base</sub> = 10
হিসেব করে পাই,
![GDD = 16 + 12 divided by 2, all minus 10, giving an answer of 4](../../../../images/gdd-calculation-corn.png)
ঐদিন ভুট্টা 4 জিডিডি পেয়েছিল। এটিকে 800 GDD চাহিদাসম্পন্ন জাত হিসেবে বিবেচনা করলে, উদ্ভিদটির পরিপক্ব হতে আরো 796 GDD প্রয়োজন।
✅ ছোট একটি গবেষণা করা যাক । বাগান, স্কুল বা স্থানীয় পার্কে যে কোনও উদ্ভিদের পরিপক্কতায় পৌঁছানোর জন্য বা ফসল উৎপাদনের জন্য প্রয়োজনীয় জিডিডি নম্বর নির্ণয় করা যায় কিনা দেখা যাক।
## তাপমাত্রা সেন্সরের তথ্য দিয়ে GDD নির্ণয়
গাছপালা নির্দিষ্ট তারিখ ধরে জন্মায় না - উদাহরণস্বরূপ আমরা কোনও বীজ রোপণ করতে রোপন করে এটা বলতে পারবোনা যে গাছটি ঠিক 100 দিন পরে ফলন দিবে। কৃষক হিসাবে আমরা বরং একটি উদ্ভিদ বাড়তে কত সময় নেয় তার ধরে সম্পর্কে মোটামুটি রাখতে পারি এবং সেই ধারণা অনুসারে প্রতিদিন ফসলগুলি প্রস্তুত হচ্ছে কিনা তা পরীক্ষা করে দেখতে পারি।
এভাবে গাছপালার প্রতি সার্বক্ষণিক নজর রাখাটা বড় খামারে অনেক সমস্যাপূর্ণ বিষয় কেননা এতে প্রচুর লোকবল দরকার এবং কোন ফলন অপ্রত্যাশিতভাবে তাড়াতাড়ি প্রস্তুত হয়ে গেলে, ঝুঁকি রয়েছে যে কৃষক হয়তো নজর এড়িয়ে যেতে পারে। তাপমাত্রা পরিমাপ করে, কৃষক একটি উদ্ভিদ এর জিডিডি গণনা করতে পারে এবং তখন কেবলমাত্র তাদের প্রত্যাশিত পরিপক্কতার সময়ের কাছাকাছি হলেই সার্বক্ষণিক নজরদারি করলেই হয়, এতে অতিরিক্ত শ্রম কমে আসে।
আইওটি ডিভাইস ব্যবহার করে তাপমাত্রার ডেটা সংগ্রহ করে, যখন গাছগুলি পরিপক্কতার কাছাকাছি থাকে তখন একজন কৃষককে স্বয়ংক্রিয়ভাবে অবহিত করা যায়। এর জন্য একটি সাধারণ একটি কার্যধারা হল আইওটি ডিভাইসগুলির দ্বারা তাপমাত্রা পরিমাপ করে, তারপরে MQTT-র মতো কিছু ব্যবহার করে এই টেলিমেট্রি ডেটা ইন্টারনেটে প্রকাশ করতে হবে। সার্ভার কোড তখন এই ডেটা গ্রহণ করে এবং এটি কোথাও সংরক্ষণ করে, যেমন কোনও ডাটাবেস এ। এতে করে এই ডেটাগুলি পরে বিশ্লেষণ করা যেতে পারে - যেমনঃ জিডিডি গণনা করা, নির্দিষ্ট পর্যন্ত প্রতিটি ফসলের জন্য মোট জিডিডি এর হিসেব রাখা এবং কোন উদ্ভিদ পরিপক্কতার কাছাকাছি গেলে, কৃষককে এই বিষয়ে সতর্ক করা।
![Telemetry data is sent to a server and then saved to a database](../../../../images/save-telemetry-database.png)
সার্ভার কোড অতিরিক্ত তথ্য যুক্ত করে ডেটা সমৃদ্ধ করতে পারে। উদাহরণস্বরূপ, আইওটি ডিভাইসটি নিজেকে চিহ্নিত করতে একটি সনাক্তকারী/আইডেন্টিফায়ার প্রকাশ করতে পারে এবং সার্ভার কোডটি ডিভাইসের অবস্থান এবং এটি কোন স্থানে কী ফসল পর্যবেক্ষণ করছে তা সন্ধান করতে এটি ব্যবহার করতে পারে। এটি চলমান সময়ের মতো বেসিক ডেটাও যুক্ত করতে পারে কারণ কিছু আইওটি ডিভাইসে সঠিক সময়ের উপর নজর রাখতে প্রয়োজনীয় হার্ডওয়্যার থাকেনা বা ইন্টারনেটের মাধ্যমে সময় এর হিসাব রাখতে অতিরিক্ত কোডের প্রয়োজন হয়।
✅ বিভিন্ন ফার্মের তাপমাত্রা ভিন্ন ভিন্ন হওয়ার কারণ কী হতে পারে?
### কাজ - তাপমাত্রা সংক্রান্ত তথ্য প্রকাশ করা
আইওটি ডিভাইস ব্যবহার করে MQTT এর মাধ্যমে তাপমাত্রার ডেটা প্রকাশের জন্য নীচের যেকোন একটি গাইডের মাধ্যমে কাজ শুরু করতে হবে:
* [Arduino - Wio Terminal](wio-terminal-temp-publish.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-temp-publish.md)
### কাজ - তাপমাত্রা সংক্রান্ত তথ্য গ্রহণ ও সংরক্ষণ
আইওটি ডিভাইসটি টেলিমেট্রি প্রকাশ করার পরে, এমনভাবে কোড লিখতে হবে সার্ভার কোডটি এই ডেটাতে সাবস্ক্রাইব এবং সংরক্ষণ করে। এটি একটি ডেটাবেজে সংরক্ষণের পরিবর্তে, সার্ভার কোড এটি একটি Comma Separated Values (CSV) ফাইলে সংরক্ষণ করবে। CSV ফাইল মানগুলির সারি হিসাবে ডেটা সংরক্ষণ করে; প্রতিটি মান একটি কমা দ্বারা পৃথক করা হয় এবং প্রতিটি রেকর্ড নতুন লাইনে থাকে। ফাইল হিসাবে ডেটা সংরক্ষণ করার জন্য এটি বেশ সুবিধাজনক, যা মানব-পঠনযোগ্য এবং অবশ্যই একটি ভাল উপায়।
এই CSV ফাইলে দুটি কলাম থাকবে - *তারিখ* এবং *তাপমাত্রা* । এখানে *তারিখ* কলামটিতে সার্ভার কর্তৃক ম্যাসেজ পাওয়ার সময় ও তারিখ থাকে এবং *তাপমাত্রা* সংক্রান্ত তথ্য আসে টেলিমেট্রি থেকে।
1. টেলিমেট্রিতে সাবস্ক্রাইব করার জন্য সার্ভার কোড তৈরি করতে লেসন 4 এ এই ধাপগুলি পুনরাবৃত্তি করতে হবে। কমান্ডগুলি প্রকাশ করার জন্য আলাদা কোড যুক্ত করার দরকার নেই।
ধাপগুলো হলোঃ
* পাইথন ভার্চুয়াল এনভায়রনমেন্ট কনফিগার এবং একটিভেট করা ।
* এরপর paho-mqtt pip package ইন্সটল করতে হবে।
* টেলিমেট্রিতে যেসকল MQTT messages প্রকাশিত হয়েছে তা একসেস করতে হলে কোড লিখতে হবে।
> ⚠️ এক্ষেত্রে [লেসন 4 এ প্রদেয়, টেলিমেট্রি ডেটা রিসিভ করার জন্য পাইথন কোড ](../../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker) আমরা অনুসরণ করতে পারি।
এই প্রজেক্টের জন্য ফোল্ডারের নাম দিই `temperature-sensor-server`.
1. নিশ্চিত করতে হবে যেন `client_name` এ এই প্রজেক্টের ইঙ্গিত থাকে:
```cpp
client_name = id + 'temperature_sensor_server'
```
1. আগে থেকে এসকম ইম্পোর্ট রয়েছে তার নীচে এগুলো যুক্ত করতে হবে:
```python
from os import path
import csv
from datetime import datetime
```
এটি ফাইলগুলি পড়ার জন্য একটি লাইব্রেরি ইম্পোর্ট করে । এছাড়াও সিএসভি ফাইলগুলির সাথে যোগাযোগের জন্য একটি লাইব্রেরি এবং তারিখ ও সময়গুলির সংরক্ষণের জন্যে একটি লাইব্রেরি অন্তর্ভুক্ত হয়।
1. তারপর`handle_telemetry` function এর পূর্বে এই কোড যুক্ত করতে হবে:
```python
temperature_file_name = 'temperature.csv'
fieldnames = ['date', 'temperature']
if not path.exists(temperature_file_name):
with open(temperature_file_name, mode='w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
```
এই কোডে কিছু কনস্ট্যান্ট ডিক্লেয়ার করা হয়েছে - যে CSV ফাইলে ডেটা রাখা হবে সেটির একং কলাম হেডারগুলোর নামকরণ এর জন্য। কোন সিএসভি ফাইলের প্রথম সারিতে সাধারণত কমা দ্বারা আলাদাকৃত ভাবে কলামের শিরোনাম বা হেডার থাকে।
কোডটি পরীক্ষা করে দেখ সিএসভি ফাইল ইতিমধ্যে বিদ্যমান কিনা । যদি এটি বিদ্যমান না থাকে তবে এটি প্রথম সারিতে কলাম শিরোনাম দিয়ে তৈরি করা হবে।
1. `handle_telemetry` function এর পর নিম্নোক্ত কোড যুক্ত করতে হবে:
```python
with open(temperature_file_name, mode='a') as temperature_file:
temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames)
temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']})
```
এই কোড CSV file টি খুলে এতে নতুন সারি যুক্ত করবে। সেই সারিতে আইওটি ডিভাইস থেকে প্রাপ্ত তাপমাত্রা এবং তখনকার সময় ও তারিখ আমাদের বোধগম্য ফরম্যাটে রাখা হয়। এই তথ্যসমূহ [ISO 8601 ফরম্যাট](https://wikipedia.org/wiki/ISO_8601) অনুসরণ করে, নির্দিষ্ট টাইমজোন সহ, তবে এখানে মাইক্রোসেকেন্ড আকারে সময় সংরক্ষিত হয়।
1. আগের মতই এই কোডটি রান করতে হবে - এদিকে এটাও নিশ্চিত করতে হবে যে আইওটি ডিভাইস থেকে ডেটা পাঠানো হচ্ছে। দেখা যাবে `temperature.csv`নামে একটি ফোল্ডার তৈরী হয়েছে একই ফোল্ডারে। এটি খুললে দেখা যাবে, তারিখ-সময় এবং তাপমাত্রা রয়েছে।
```output
date,temperature
2021-04-19T17:21:36-07:00,25
2021-04-19T17:31:36-07:00,24
2021-04-19T17:41:36-07:00,25
```
1. তথ্য সংগ্রহের জন্য এই কোডটিও রান করি। জিডিডি গণনার জন্য পর্যাপ্ত ডেটা সংগ্রহ করার জন্য আমাদের পুরো দিন ধরে এটি রান করানো উচিত।
> 💁 যদি আমরা Virtual IoT Device ব্যবহার করে থাকি, সেক্ষেত্রে র‍্যান্ডম চেকবাক্সটি নির্বাচন করতে হবে এবং প্রতিবার তাপমাত্রার মান একই আসার বিষয়টি এড়াতে একটি সীমা নির্ধারণ করতে হবে।
![Select the random checkbox and set a range](../../../../images/select-the-random-checkbox-and-set-a-range.png)
> 💁 যদি এটি একটি পুরো দিন চালনা করতে চাই, তবে আমাদেরকে অবশ্যই এটি নিশ্চিত করতে হবে, যে সার্ভারে কোডটি চলছে সেই কম্পিউটারটি সারাদিন কাজ করবে। এক্ষেত্রে হয় আমাদেরকে পাওয়ার সেটিং ঠিক করে নিতে হবে অথবা [সিস্টেমকে একটিভ রাখার পাইথন স্ক্রিপ্ট](https://github.com/jaqsparow/keep-system-active) এর মতো কিছু ব্যবহার করতে হবে।
> 💁 এই কোডগুলো [code-server/temperature-sensor-server](code-server/temperature-sensor-server) ফোল্ডারে পাওয়া যাবে।
### কাজ - সঞ্চিত ডেটা ব্যবহার করে জিডিডি গণনাকরণ
একবার সার্ভার তাপমাত্রার ডেটা ক্যাপচার করে নিলে, একটি গাছের জন্য জিডিডি গণনা করা যায়।
এটি ম্যানুয়ালি করার ধাপগুলি হল:
1. উদ্ভিদের জন্য আগে বেস তাপমাত্রা নির্ণয়. যেমন, সট্রবেরির জন্য এটি ১°C.
1. এরপর `temperature.csv`থেকে, দিনের সর্বোচ্চ এবং সর্বনিম্ন তাপমাত্রা বের করতে হবে।
1. পূর্বে প্রদত্ত সূত্র ব্যবহার করে জিডিডি গণনা করতে হবে।
উদাহরণস্বরূপ, যদি দিনের সর্বোচ্চ তাপমাত্রা ২৫°C হয় এবং সর্বনিম্ন ১২°C হয়:
![GDD = 25 + 12 divided by 2, then subtract 10 from the result giving 8.5](../../../../images/gdd-calculation-strawberries.png)
* 25 + 12 = 37
* 37 / 2 = 18.5
* 18.5 - 10 = 8.5
এখানে স্ট্রবেরির জন্য মান এসেছে **8.5** GDD । যেহেতু স্ট্রবেরির ফলনের জন্য ২৫০ জিডিডি প্রয়োজন, তাহলে আরো অনেকদিন হাতে রয়েছে।
---
## 🚀 চ্যালেঞ্জ
উদ্ভিদের বৃদ্ধির জন্য তাপ ছাড়াও আরো কিছু বিষয় প্রয়োজন। আর কি কি জিনিস দরকার এক্ষেত্রে?
এই অতিরিক্ত ফ্যাক্টরগুলোর জন্য কী সেন্সর রয়েছে যা সেগুলি পরিমাপ করতে পারে ? এই স্তরগুলি নিয়ন্ত্রণ করতে একচুয়েটর ব্যবহার করা যায়? উদ্ভিদের বৃদ্ধি অনুকূল করতে কীভাবে এক বা একাধিক আইওটি ডিভাইস যুক্ত করলে ভালো ফল আসবে ?
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10)
## রিভিউ এবং স্ব-অধ্যয়ন
ডিজিটাল কৃষিব্যবস্থা সম্পর্কে আরো জানতে [Digital Agriculture Wikipedia page](https://wikipedia.org/wiki/Digital_agriculture) পড়া যায়। এছাড়াও [Precision Agriculture](https://wikipedia.org/wiki/Precision_agriculture) এর ব্যাপারেও আরো জানার চেষ্টা করা উচিত।
জিডিডি গণনা এখানে দেওয়া সরলীকৃত সূত্রের চেয়ে কিছুটা জটিল। এই সংক্রান্ত বিষয়ে আরো জানতে এবং বেস তাপমাত্রার নিচে দৈনিক তাপমাত্রা হলে তা কিভাবে ম্যানেজ করা যায় সেই সংক্রান্ত তথ্য [Growing Degree Day Wikipedia page](https://wikipedia.org/wiki/Growing_degree-day) এ পাওয়া যাবে।
## এসাইনমেন্ট
[জুপিটার নোটবুক ব্যবহার করে জিডিডি ডেটা প্রদর্শন করা](assignment.md)

@ -1,270 +0,0 @@
# Anticiper la croissance de ses plantes avec l'IoT
![Un apperçu de cette leçon](../../../../sketchnotes/lesson-5.jpg)
> Illustré par [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
## Questionnaire de prélecture
[Questionnaire de prélecture](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9)
## Introduction
Les plantes ont besoin de certaines choses pour pousser : de l'eau, du dioxyde de carbone, des nutriments, de la lumière et de la chaleur. Dans cette leçon, vous apprendrez à calculer les taux de croissance et de maturité des plantes en mesurant la température de l'air.
Dans cette leçon, nous allons couvrir :
* [Agriculture digitale](#agriculture-digitale)
* [L'importance de la température dans l'agriculture](#l'importance-de-la-température-dans-l'agriculture)
* [La mesure de la température ambiante](#la-mesure-de-la-température-ambiante)
* [Degrés jours de croissance (DJC)](#degrés-jours-de-croissance)
* [Calcul du DJC à l'aide de données de senseurs](#calcul-du-DJC-à-l'aide-de-données-de-senseurs)
## Agriculture digitale
L'agriculture numérique transforme notre façon de cultiver, en utilisant des outils pour collecter, stocker et analyser les données issues de l'agriculture. Nous sommes actuellement dans une période décrite comme la "quatrième révolution industrielle" par le Forum économique mondial, et l'essor de l'agriculture numérique a été qualifié de "quatrième révolution agricole", ou "agriculture 4.0".
> 🎓 Le terme "agriculture numérique" englobe également l'ensemble de la "chaîne de valeur agricole", c'est-à-dire tout le parcours de la ferme à la table. Cela inclut le suivi de la qualité des produits lors de leur expédition et de leur transformation, les systèmes d'entreposage et de commerce électronique, et même les applications de location de tracteurs !
Ces changements permettent aux agriculteurs d'augmenter leurs rendements, d'utiliser moins d'engrais et de pesticides et d'arroser plus efficacement. Bien qu'ils soient principalement utilisés dans les pays riches, le prix des capteurs et autres dispositifs diminue lentement, ce qui les rend plus accessibles dans les pays en développement.
Certaines techniques rendues possibles par l'agriculture numérique sont :
* Mesure de la température - la mesure de la température permet aux agriculteurs de prévoir la croissance et la maturité des plantes.
* L'arrosage automatisé - il s'agit de mesurer l'humidité du sol et de mettre en marche les systèmes d'irrigation lorsque le sol est trop sec, plutôt que de procéder à un arrosage programmé. L'arrosage programmé peut conduire à un arrosage insuffisant des cultures pendant une période chaude et sèche, ou à un arrosage excessif en cas de pluie. En n'arrosant que lorsque le sol en a besoin, les agriculteurs peuvent optimiser leur utilisation de l'eau.
* Lutte contre les ravageurs - les agriculteurs peuvent utiliser des caméras sur des robots ou des drones automatisés pour vérifier la présence de ravageurs, puis appliquer des pesticides uniquement là où c'est nécessaire, ce qui réduit la quantité de pesticides utilisés et le ruissellement des pesticides dans les réserves d'eau locales.
✅ Faites des recherches. Quelles autres techniques sont utilisées pour améliorer les rendements agricoles ?
> 🎓 Le terme "agriculture de précision" est utilisé pour définir l'observation, la mesure et l'intervention sur les cultures par champ, ou même sur certaines parties d'un champ. Il s'agit notamment de mesurer les niveaux d'eau, de nutriments et de parasites et de réagir avec précision, par exemple en n'arrosant qu'une petite partie du champ.
## L'importance de la température dans l'agriculture
Lorsqu'ils étudient les plantes, la plupart des élèves apprennent qu'elles ont besoin d'eau, de lumière, de dioxyde de carbone (CO<sub>2</sub>) et de nutriments. Les plantes ont également besoin de chaleur pour se développer - c'est pourquoi les plantes fleurissent au printemps lorsque la température augmente, pourquoi les perce-neige ou les jonquilles peuvent germer tôt en raison d'une courte période de chaleur, et pourquoi les serres sont si efficaces pour faire pousser les plantes.
> 🎓 Les serres et les serres chaudes font un travail similaire, mais avec une différence importante. Les serres chaudes sont chauffées artificiellement et permettent aux agriculteurs de contrôler les températures avec plus de précision. Les serres dépendent du soleil pour la chaleur et le seul moyen de contrôle est généralement l'ouverture de fenêtres ou d'autres ouvertures pour laisser sortir la chaleur.
Les plantes ont une température de base ou minimale, une température optimale et une température maximale, toutes basées sur les températures moyennes quotidiennes.
* Température de base - il s'agit de la température moyenne quotidienne minimale nécessaire à la croissance d'une plante.
* Température optimale - il s'agit de la meilleure température moyenne quotidienne pour obtenir la meilleure croissance.
* Température maximale - Il s'agit de la température maximale qu'une plante peut supporter. Au-dessus de cette température, la plante interrompt sa croissance afin de conserver l'eau et de rester en vie.
> 💁 Il s'agit de températures moyennes, calculées sur la base des températures quotidiennes et nocturnes. Les plantes ont également besoin de températures différentes le jour et la nuit pour leur permettre de réaliser une photosynthèse plus efficace et d'économiser de l'énergie la nuit.
Chaque espèce de plante a des valeurs différentes pour sa base, son optimum et son maximum. C'est pourquoi certaines plantes prospèrent dans les pays chauds, et d'autres dans les pays plus froids.
✅ Faites des recherches. Pour toutes les plantes que vous avez dans votre jardin, à l'école ou dans un parc local, voyez si vous pouvez trouver la température de base.
![Un graphique montrant que le taux de croissance augmente lorsque la température augmente, puis diminue lorsque la température devient trop élevée.](../../../../images/plant-growth-temp-graph.png)
Le graphique ci-dessus montre un exemple de taux de croissance en fonction de la température. Jusqu'à la température de base, il n'y a pas de croissance. Le taux de croissance augmente jusqu'à la température optimale, puis chute après avoir atteint ce pic. À la température maximale, la croissance s'arrête.
La forme de ce graphique varie d'une espèce végétale à l'autre. Certaines ont des chutes plus marquées au-dessus de l'optimum, d'autres ont des augmentations plus lentes de la base à l'optimum.
> 💁 Pour qu'un agriculteur obtienne la meilleure croissance, il devra connaître les trois valeurs de température et comprendre la forme des graphiques pour les plantes qu'il cultive.
Si un agriculteur a le contrôle de la température, par exemple dans une serre commerciale, il peut optimiser la croissance de ses plantes. Dans une serre commerciale où l'on cultive des tomates, par exemple, la température sera réglée à environ 25°C le jour et 20°C la nuit pour obtenir la croissance la plus rapide.
> 🍅 En combinant ces températures avec des lumières artificielles, des engrais et des niveaux de CO<sub>2</sub> contrôlés, les producteurs commerciaux peuvent cultiver et récolter toute l'année.
## La-mesure-de-la-température-ambiante
Les capteurs de température peuvent être utilisés avec les appareils IoT pour mesurer la température ambiante.
### Tâche - Mesure de la température
Suivez le guide correspondant pour surveiller les températures à l'aide de votre dispositif IoT :
* [Arduino - Wio Terminal](wio-terminal-temp.fr.md)
* [Single-board computer - Raspberry Pi](pi-temp.fr.md)
* [Single-board computer - Virtual device](virtual-device-temp.fr.md)
## Degrés-jours de croissance
Les degrés-jours de croissance (également appelés unités de degrés de croissance) sont un moyen de mesurer la croissance des plantes en fonction de la température. En supposant qu'une plante dispose de suffisamment d'eau, de nutriments et de CO<sub>2</sub>, la température détermine le taux de croissance.
Les degrés-jours de croissance, ou DJC, sont calculés par jour comme la température moyenne en Celsius pour un jour au-dessus de la température de base des plantes. Chaque plante a besoin d'un certain nombre de DJC pour croître, fleurir ou produire et faire mûrir une récolte. Plus le nombre de DJC par jour est élevé, plus la croissance de la plante est rapide.
> 🇺🇸 Pour les Américains, les degrés-jours de croissance peuvent également être calculés en Fahrenheit. 5 DJC<sup>C</sup> (degrés-jours de croissance en Celsius) sont l'équivalent de 9 DJC<sup>F</sup> (degrés-jours de croissance en Fahrenheit).
La formule complète du DJC est un peu compliquée, mais il existe une équation simplifiée qui est souvent utilisée comme une bonne approximation :
![DJC = T max + T min divisé par 2, total - T base](../../../../images/gdd-calculation.png)
* **DJC** - c'est le nombre de degrés-jours de croissance
* **T<sub>max</sub>** - il s'agit de la température maximale quotidienne en degrés Celsius
* **T<sub>min</sub>** - il s'agit de la température minimale quotidienne en degrés Celsius
* **T<sub>base</sub>** - c'est la température de base des plantes en degrés Celsius
> 💁 Il existe certaines variations impliquant T<sub>max</sub> au delà de 30°C ou T<sub>min</sub> en deça T<sub>base</sub>, mais nous ignorerons ces cas dans le contexte de ce cours.
### Exemple - Maïs 🌽
Selon la variété, le maïs a besoin de 800 à 2 700 DJC pour arriver à maturité, avec une température de base de 10°C.
Le premier jour au-dessus de la température de base, les températures suivantes ont été mesurées :
| Mesures | Temp °C |
| :---------- | :-----: |
| Maximum | 16 |
| Minimum | 12 |
En ajoutant ces chiffres à notre calcul :
* T<sub>max</sub> = 16
* T<sub>min</sub> = 12
* T<sub>base</sub> = 10
Ce qui donne un résultat de:
![DJC = 16 + 12 divisé par 2, total moins 10, résultant à 4](../../../../images/gdd-calculation-corn.png)
Le maïs a reçu 4 DJC ce jour-là. Dans l'hypothèse d'une variété de maïs qui a besoin de 800 jours DJC pour arriver à maturité, il lui faudra encore 796 DJC pour atteindre la maturité.
✅ Faites des recherches. Pour toutes les plantes que vous avez dans votre jardin, à l'école ou dans un parc local, voyez si vous pouvez trouver le nombre de DJC requis pour atteindre la maturité ou produire des récoltes.
## Calcul du DJC à l'aide de données de senseurs
Les plantes ne poussent pas à dates fixes - par exemple, vous ne pouvez pas planter une graine et savoir que la plante portera des fruits exactement 100 jours plus tard. Au lieu de cela, en tant qu'agriculteur, vous pouvez avoir une idée approximative du temps que prend une plante pour pousser, puis vous vérifiez quotidiennement quand les cultures sont prêtes.
Cela a un impact considérable sur la main-d'œuvre d'une grande exploitation, et l'agriculteur risque de manquer des cultures qui sont prêtes plus tôt que prévu. En mesurant les températures, l'agriculteur peut calculer le DJC qu'une plante a reçu, ce qui lui permet de ne vérifier que les cultures proches de la maturité attendue.
En recueillant des données de température à l'aide d'un dispositif IoT, un agriculteur peut être automatiquement informé lorsque les plantes sont proches de la maturité. Une architecture typique pour cela consiste à faire en sorte que les dispositifs IoT mesurent la température, puis publient ces données de télémétrie sur Internet en utilisant quelque chose comme MQTT. Le code du serveur écoute ensuite ces données et les enregistre quelque part, par exemple dans une base de données. Cela signifie que les données peuvent être analysées ultérieurement, par exemple une tâche nocturne pour calculer le DJC de la journée, totaliser le DJC de chaque culture jusqu'à présent et alerter si une plante est proche de la maturité.
![Les données télémétriques sont envoyées à un serveur, puis enregistrées dans une base de données.](../../../../images/save-telemetry-database.png)
Le code serveur peut également augmenter les données en ajoutant des informations supplémentaires. Par exemple, le dispositif IoT peut publier un identifiant pour indiquer de quel dispositif il s'agit, et le code du serveur peut l'utiliser pour rechercher l'emplacement du dispositif et les cultures qu'il surveille. Il peut également ajouter des données de base comme l'heure actuelle, car certains dispositifs IoT ne disposent pas du matériel nécessaire pour suivre l'heure exacte, ou nécessitent un code supplémentaire pour lire l'heure actuelle sur Internet.
✅ Pourquoi pensez-vous que des champs différents peuvent avoir des températures différentes ?
### Tâche - publier des informations sur la température
Suivez le guide correspondant pour publier les données de température sur MQTT à l'aide de votre dispositif IoT afin de pouvoir les analyser ultérieurement :
* [Arduino - Terminal Wio](wio-terminal-temp-publish.fr.md)
* [Ordinateur monocarte - Raspberry Pi/Dispositif IoT virtuel](single-board-computer-temp-publish.fr.md)
### Tâche - capturer et stocker les informations sur la température
Une fois que le dispositif IoT publie la télémétrie, le code du serveur peut être écrit pour s'abonner à ces données et les stocker. Plutôt que de les enregistrer dans une base de données, le code serveur les enregistrera dans un fichier CSV (Comma Separated Values). Les fichiers CSV stockent les données sous forme de lignes de valeurs en texte, chaque valeur étant séparée par une virgule, et chaque enregistrement sur une nouvelle ligne. Ils constituent un moyen pratique, lisible par l'homme et bien supporté d'enregistrer des données dans un fichier.
Le fichier CSV aura deux colonnes - *date* et *température*. La colonne *date* est définie comme la date et l'heure actuelles de réception du message par le serveur, la colonne *température* provient du message de télémétrie.
1. Répétez les étapes de la leçon 4 pour créer un code serveur permettant de s'abonner à la télémétrie. Vous n'avez pas besoin d'ajouter du code pour publier des commandes.
Les étapes à suivre sont les suivantes :
* Configurer et activer un environnement virtuel Python
* Installer la librairie pip paho-mqtt
* Écrire le code pour écouter les messages MQTT publiés sur le sujet de télémétrie
> ⚠️ Vous pouvez vous référer [aux instructions de la leçon 4 pour créer une application Python pour recevoir la télémétrie si nécessaire](../../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker).
Nommez le dossier pour ce projet `temperature-sensor-server`.
1. Assurez vous que `client_name` corresponde à ce projet:
```cpp
client_name = id + 'temperature_sensor_server'
```
1. Ajoutez les importations suivantes en haut du fichier, en dessous des importations existantes :
```python
from os import path
import csv
from datetime import datetime
```
Ceci importe une bibliothèque pour lire les fichiers, une bibliothèque pour interagir avec les fichiers CSV, et une bibliothèque pour aider avec les dates et les heures.
1. Ajoutez le code suivant avant la fonction `handle_telemetry`:
```python
temperature_file_name = 'temperature.csv'
fieldnames = ['date', 'temperature']
if not path.exists(temperature_file_name):
with open(temperature_file_name, mode='w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
```
Ce code déclare quelques constantes pour le nom du fichier à écrire, et le nom des en-têtes de colonne pour le fichier CSV. La première ligne d'un fichier CSV contient traditionnellement des en-têtes de colonne séparés par des virgules.
Le code vérifie ensuite si le fichier CSV existe déjà. S'il n'existe pas, il est créé avec les en-têtes de colonne sur la première ligne.
1. Ajoutez le code suivant à la fin de la fonction `handle_telemetry`:
```python
with open(temperature_file_name, mode='a') as temperature_file:
temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames)
temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']})
```
Ce code ouvre le fichier CSV, puis ajoute une nouvelle ligne à la fin. La ligne comporte les données et l'heure actuelles formatées dans un format lisible par l'homme, suivies de la température reçue du dispositif IoT. Les données sont stockées au [format ISO 8601] (https://wikipedia.org/wiki/ISO_8601) avec le fuseau horaire, mais sans les microsecondes.
1. Exécutez ce code de la même manière que précédemment, en vous assurant que votre dispositif IoT envoie des données. Un fichier CSV appelé `temperature.csv` sera créé dans le même dossier. Si vous le visualisez, vous verrez les dates/heures et les mesures de température :
```output
date,temperature
2021-04-19T17:21:36-07:00,25
2021-04-19T17:31:36-07:00,24
2021-04-19T17:41:36-07:00,25
```
1. Exécutez ce code pendant un certain temps pour capturer les données. Idéalement, vous devriez l'exécuter pendant une journée entière afin de recueillir suffisamment de données pour les calculs de DJC.
> 💁 Si vous utilisez le "Virtual IoT Device", cochez la case aléatoire et définissez une plage pour éviter d'obtenir la même température à chaque fois que la valeur de température est renvoyée.
![Cochez la case aléatoire et définissez une plage](../../../../images/select-the-random-checkbox-and-set-a-range.png)
> 💁 Si vous souhaitez exécuter ce programme pendant toute une journée, vous devez vous assurer que l'ordinateur sur lequel votre code serveur est exécuté ne se mettra pas en veille, soit en modifiant vos paramètres d'alimentation, soit en exécutant un programme tel que [ceci maintient le système actif](https://github.com/jaqsparow/keep-system-active).
> 💁 Vous pouvez trouver ce code dans le dossier [code-server/temperature-sensor-server](../code-server/temperature-sensor-server).
### Tâche - calculer le DJC en utilisant les données stockées
Une fois que le serveur a saisi les données de température, le DJC d'une usine peut être calculé.
Les étapes à suivre pour effectuer cette opération manuellement sont les suivantes :
1. Trouvez la température de base de la plante. Par exemple, pour les fraises, la température de base est de 10°C.
1. A partir du fichier `temperature.csv`, trouvez les températures les plus hautes et les plus basses de la journée.
1. Utilisez le calcul du DJC donné précédemment pour calculer le DJC
Par exemple, si la température la plus élevée de la journée est de 25°C, et la plus basse de 12°C :
![DJC = 25 + 12 divisé par 2, enlever 10 du résultat, donnant 8.5](../../../../images/gdd-calculation-strawberries.png)
* 25 + 12 = 37
* 37 / 2 = 18.5
* 18.5 - 10 = 8.5
Les fraises ont donc reçu **8,5** DJC. Les fraises ont besoin d'environ 250 DJC pour porter des fruits, donc il y a encore du chemin à faire.
---
## 🚀 Défi
Les plantes ont besoin de plus que de la chaleur pour pousser. Quelles autres choses sont nécessaires ?
Pour ceux-ci, cherchez s'il existe des capteurs qui peuvent les mesurer. Et des actionneurs pour contrôler ces niveaux ? Comment assembleriez-vous un ou plusieurs dispositifs IoT pour optimiser la croissance des plantes ?
## Questionnaire Post-lecture
[Questionnaire Post-lecture](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10)
## Révision et apprentissage autodidacte
* Pour en savoir plus sur l'agriculture numérique, consultez la page [Digital Agriculture Wikipedia](https://wikipedia.org/wiki/Digital_agriculture). Pour en savoir plus sur l'agriculture de précision, consultez la page [Precision Agriculture Wikipedia](https://wikipedia.org/wiki/Precision_agriculture).
* Le calcul complet des degrés-jours de croissance est plus compliqué que le calcul simplifié présenté ici. Pour en savoir plus sur l'équation plus compliquée et sur la manière de traiter les températures inférieures à la ligne de base, consultez la page [Degrés-jours de croissance sur Wikipédia](https://wikipedia.org/wiki/Growing_degree-day).
* La nourriture pourrait se faire rare à l'avenir, même si nous utilisons toujours les mêmes méthodes agricoles. Pour en savoir plus sur les techniques agricoles de haute technologie, regardez cette vidéo [Hi-Tech Farms of Future sur YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8).
## Devoir
[Visualiser les données DJC à l'aide d'un Jupyter Notebook](assignment.fr.md)

@ -1,268 +0,0 @@
# IoT로 식물 성장 예측
![이 수업에 대한 스케치 노트 개요](../../../../sketchnotes/lesson-5.jpg)
> [Nitya Narasimhan](https://github.com/nitya)의 스케치 노트. 클릭하면 크게 보실 수 있습니다.
## 수업 전 퀴즈
[수업 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9)
## 개요
식물이 자라기 위해서는 물, 이산화탄소, 영양분, 빛, 열과 같은 특정 요소가 필요합니다. 이 수업에서는 기온을 측정하여 식물의 성장과 성숙도를 계산하는 방법을 배웁니다.
이 수업에서 다룰 내용은 다음과 같습니다:
- [디지털 농업](#디지털-농업)
- [농사에서 왜 온도가 중요할까요?](#농사에서-왜-온도가-중요할까요?)
- [주변 온도 측정](#주변-온도-측정)
- [유효 적산 온도(Growing Degree Days, GDD)](#유효-적산-온도)
- [온도 센서 데이터를 이용한 GDD 계산](#온도-센서-데이터를-이용한-GDD-계산)
## 디지털 농업
디지털 농업은 농업 데이터를 수집, 저장, 분석하는 도구를 사용하여 우리가 농사를 짓는 방식을 변화시키고 있습니다. 우리는 현재 세계 경제 포럼(WEF)이 '4차 산업 혁명'이라 설명하는 시기에 살고 있고, 디지털 농업의 증가는 `4차 농업 혁명` 또는 `농업 4.0`이라고 불리게 되었습니다.
> 🎓 디지털 농업이라는 용어는 또한 농장에서 식탁까지 가는 전체 여정인 '농업 가치사슬'도 포함합니다. 이는 식품 배송 및 가공, 창고 및 전자 상거래 시스템, 심지어 트랙터 대여 앱에 대한 제품 품질 추적을 포함합니다!
이러한 변화를 통해 농부들은 생산량을 증가시키고, 더 적은 비료와 농약을 사용하고, 더 효율적으로 급수할 수 있었습니다. 주로 부유한 나라에서 사용하지만, 센서와 다른 장치들은 천천히 가격을 내리고 있고 개발도상국에서도 더 접근이 용이하도록 만들고 있습니다.
디지털 농업에서 사용 가능한 몇 가지 기술:
- 온도 측정 - 온도를 측정하는 것은 농부들에게 식물의 성장과 성숙도를 예측할 수 있게 합니다.
- 자동 관수 - 토양의 수분을 측정하고 토양이 너무 건조할 때, 시간을 정해 물을 주는 대신 관개 시스템을 켭니다. 시간을 정해 물을 주면 농작물이 더운 기간이나 가뭄 동안 물이 부족하거나, 비가 오는 동안 물이 너무 많아질 수 있습니다. 토양이 필요로 할 때만 물을 줌으로써 농부들은 물 사용을 최적화할 수 있습니다.
- 해충 방제 - 농부들은 자동화된 로봇이나 드론에 해충을 확인하기 위해서 카메라를 장착하여 사용할 수 있고, 필요한 곳에만 살충제를 적용하여 사용되는 살충제의 양과 지역 상수로의 농약 유출을 줄일 수 있습니다.
✅ 조사를 해봅시다. 농산물의 생산량을 증가시키기 위한 다른 기술들에는 무엇이 있습니까?
> 🎓 '정밀 농업'이라는 용어는 밭 단위를 기준으로 또는 밭의 일부에서 농작물의 관찰, 측정, 대응을 정의하기 위해 사용됩니다. 물, 영양분과 해충의 정도를 측정하고, 밭의 일부분에 물을 주는 것과 같이 정확하게 대응하는 것을 포함합니다.
## 농사에서 왜 온도가 중요할까요?
식물에 대해 배울 때, 대부분의 학생들은 물, 빛, 이산화탄소(CO<sub>2</sub>)와 영양분의 필요성에 대해 배웁니다. 식물은 또한 자라기 위해서 따뜻함을 필요로 합니다. 기온이 오르면서 봄에 식물들이 피어나는 이유, 짧은 온난 기간으로 설강화나 수선화가 일찍 싹을 틔울 수 있는 이유, 온실(hothouse)과 온실(greenhouse)이 식물을 잘 자라게 하는 이유가 여기에 있습니다.
> 🎓 온실(Hothouse)과 온실(Greenhouse)은 비슷한 일을 하지만, 중요한 차이점이 있습니다. 온실(Hothouse)은 인위적으로 열을 공급하고 농부가 온도를 조금 더 정밀하게 조절할 수 있게 합니다. 온실(Greenhouse)은 따뜻함을 위해 태양에 의존하고 유일한 제어는 일반적으로 열을 내보내는 창이나 기타 개구부입니다.
식물은 일 평균 기온을 기준으로 기준 혹은 최저 온도와 적정 온도, 최고 온도를 가지고 있습니다.
- 기준 온도 - 식물이 자라는 데에 필요한 최소한의 일 평균 온도입니다.
- 적정 온도 - 식물이 가장 많이 자라게 하는 최적의 일 평균 온도입니다.
- 최고 온도 - 식물이 견딜 수 있는 최고 일 평균 온도입니다. 이 온도 이상에서 식물은 물을 아끼고 살아 남기 위해 스스로의 성장을 멈춥니다.
> 💁 이것들은 일간 및 야간 온도에 대한 평균을 낸 평균 온도입니다. 식물은 또한 더 효율적으로 광합성을 하고 밤에 에너지를 절약하기 위해 밤낮으로 다른 온도가 필요합니다.
각각의 식물 종들은 기준, 적정, 최고 온도의 값이 서로 다릅니다. 이것이 일부 식물이 더운 나라에서 번성하고, 다른 식물이 추운 나라에서 번성하는 이유입니다.
✅ 간단한 조사를 해봅시다. 정원, 학교, 지역 공원에서 기르는 식물들에 대해 기준 온도를 찾아보십시오.
![온도가 상승함에 따라 증가하는 성장률을 나타내는 그래프, 온도가 너무 높아지면 감소하는 그래프](../../../../images/plant-growth-temp-graph.png)
상단의 그래프는 기온이 성장에 끼치는 영향에 대한 예시를 보여주는 그래프입니다. 기준 온도까지는 성장을 하지 않습니다. 성장률은 적정 온도까지 계속해서 증가하고, 최고점에 도달한 후에는 점점 떨어집니다. 최고 온도에서는 성장을 멈추게 됩니다.
이 그래프의 형태는 식물의 종에 따라 달라집니다. 어떤 것은 적정 온도 이상에서 더 급격하게 떨어지고, 어떤 것은 기준 온도부터 적정 온도까지 느리게 증가합니다.
> 💁 최고의 성장을 얻기 위해서 농부는 자신이 기르는 식물들에 대해 이 세 가지 온도의 값과 이 그래프의 형태에 대해 이해해야 합니다.
만약 농부가 상업용 온실에서와 온도를 조절한다면, 식물에 최적화 할 수 있습니다. 예를 들어, 토마토를 재배하는 상업용 온실은 가장 빠른 성장을 위해 낮에는 약 25°C, 밤에는 약 20°C로 온도를 설정합니다.
> 🍅 이러한 온도를 인공 조명, 비료 및 통제된 CO<sub>2</sub> 레벨과 결합하면 상업적 재배자들이 일년 내내 재배하고 수확할 수 있습니다.
## 주변 온도 측정
온도 센서는 주변 온도를 측정하기 위해 IoT 장치와 함께 사용될 수 있습니다.
### 작업 - 온도 측정
IoT 장치를 사용하여 온도를 모니터링하려면 관련 가이드를 참조하십시오.
- [Arduino - Wio Terminal](../wio-terminal-temp.md)
- [싱글 보드 컴퓨터 - Raspberry Pi](./pi-temp.ko.md)
- [싱글 보드 컴퓨터- 가상 장치](./virtual-device-temp.md)
## 유효 적산 온도
유효 적산 온도(Growing degree days, growing degree units)은 온도를 기준으로 식물의 성장을 측정하는 방법입니다. 식물에 물과 영양분, CO<sub>2</sub>가 충분하다고 가정하면, 기온이 성장 속도를 결정합니다.
유효 적산 온도(GDD)는 식물 기준 온도보다 높은 하루의 평균 섭씨 온도로 계산됩니다. 각 식물은 성장, 개화, 또는 생산과 성장을 위해 특정한 수의 GDD가 필요합니다. 매일 GDD가 더 많을수록, 식물은 더 빨리 자랄 것입니다.
> 🇺🇸 미국인의 경우 성장도 일수는 화씨로 계산할 수도 있습니다. 5 GDD<sup>C</sup>(섭씨 기준의 GDD)는 9 GDD<sup>F</sup>(화씨 기준의 GDD)와 동알합니다.
GDD를 계산하는 전체 공식은 약간 복잡합니다. 하지만 좋은 근사치로 종종 사용되는 단순화된 방정식이 있습니다:
![GDD = (최고 온도 + 최소 온도) 을 2로 나누고, 전체에서 기준 온도를 뺀 값](../../../../images/gdd-calculation.png)
- **GDD** - 유효 적산 온도
- **T<sub>max</sub>** - 섭씨 단위의 일간 최고 기온
- **T<sub>min</sub>** - 섭씨 단위의 일간 최저 기온
- **T<sub>base</sub>** - 섭씨 단위의 식물의 기준 온도
> 💁 30°C가 넘는 T<sub>max</sub>나 T<sub>base</sub> 보다 낮은 T<sub>min</sub>에 대해 다루는 변형식이 있지만, 지금은 넘어가도록 하겠습니다.
### 예시 - 옥수수 🌽
품종에 따라 옥수수는 성숙하는 데에 기준 온도 10°C에서 800부터 2,700 사이의 GDD를 필요로 합니다.
기준 온도보다 높은 첫 날, 다음과 같은 온도가 측정되었습니다:
| 측정 | 온도 °C |
| :---------- | :-----: |
| 최고 온도 | 16 |
| 최저 온도 | 12 |
계산식에 이 숫자들을 대입합시다:
- T<sub>max</sub> = 16
- T<sub>min</sub> = 12
- T<sub>base</sub> = 10
계산 결과는 다음과 같습니다:
![GDD = 16 + 12 에서 2로 나누고, 전체에서 10을 빼면, 정답은 4](../../../../images/gdd-calculation-corn.png)
옥수수는 그날 4 GDD를 받았습니다. 옥수수 품종이 성숙하는 데 800 GDD가 필요하다고 가정하면, 성숙에 도달하기 위해서는 추가적으로 796 GDD가 더 필요합니다.
✅ 조사를 해봅시다. 정원, 학교, 지역 공원에서 기르는 식물들에 대해 식물이 다 자라거나 작물을 생산하는 데 필요한 GDD 수를 조사해보십시오.
## 온도 센서 데이터를 이용한 GDD 계산
식물은 정해진 날짜에 자라지 않습니다. 예를 들어 씨앗을 심고 정확히 100일 후에 열매를 맺는다는 것을 알 수는 없습니다. 대신 농부는 식물이 자라는 데 걸리는 시간을 대략적으로 알 수 있으며 매일 작물이 준비되는 시간을 확인합니다.
이는 대규모 농장의 노동력에 막대한 영향을 끼칩니다. 그리고 농부들이 예상치 못하게 일찍 준비된 작물을 놓치는 위험을 줍니다. 농부는 기온을 측정하여 식물이 받은 GDD를 계산할 수 있고, 그들이 예상 성숙도와 가까워졌는지 확인 하도록 합니다.
IoT 장치를 이용하여 온도 데이터를 수집하면, 농부는 자동적으로 식물이 성숙에 가까워졌는지 알 수 있습니다. 이러한 일일반적인 아키텍처는 IoT 장치가 온도를 측정한 다음 MQTT와 같은 것을 사용하여 인터넷을 통해 이 원격 측정 데이터를 게시하도록 하는 것입니다. 서버 코드는 이 데이터를 수신하고 이것을 데이터베이스와 같은 어딘가에 저장합니다. 이것은 데이터가 나중에 분석될 수 있다는 것을 의미합니다. 예를 들어, 야간 작업을 통해 하루의 GDD를 계산하고, 지금까지 각 작물에 대한 GDD를 합산하고, 식물이 성숙에 가까워지면 알림을 보낼 수 있습니다.
![원격 측정 데이터는 서버로 보내져 데이터베이스에 저장됩니다.](../../../../images/save-telemetry-database.png)
서버 코드는 또한 부가 정보를 추가함으로써 데이터를 보강할 수 있습니다. 예를 들어, IoT 장치는 어떤 장치인지 나타내기 위해 식별자를 게시할 수 있으며, 서버 코드는 이를 사용하여 장치의 위치와 모니터링 중인 작물을 조회할 수 있습니다.또한 일부 IoT 장치에는 정확한 시간을 추적하는 데 필요한 하드웨어가 없거나 인터넷을 통해 현재 시간을 읽는 데 추가 코드가 필요하므로 현재 시간과 같은 기본 데이터를 추가할 수 있습니다.
✅ 당신이 생각하기에 밭마다 다른 기온이 필요한 이유는 무엇입니까?
### 작업 - 온도 정보 게시
IoT 장치를 사용하여 MQTT를 통해 온도 데이터를 게시하여 나중에 분석할 수 있도록 관련 가이드를 참조하십시오:
- [Arduino - Wio Terminal](../wio-terminal-temp-publish.md)
- [싱글 보드 컴퓨터 - Raspberry Pi/가상 IoT 장치](single-board-computer-temp-publish.ko.md)
### 작업 - 온도 정보를 캡처하고 저장하십시오.
IoT 장치가 원격 분석을 게시하면, 서버 코드를 작성하여 이 데이터를 구독하고 저장할 수 있습니다. 이것을 데이터베이스에 저장하는 대신 서버 코드가 Comma Seperated Values(CSV)로 저장합니다. CSV 파일은 데이터를 텍스트로 된 값의 행으로 저장합니다. 각 값은 쉼표(,)로 분리되고 각각이 새로운 줄에 기록됩니다. 이것은 편리하고, 사람이 읽을 수 있고 잘 지원되는 데이터를 파일로 저장하는 방법입니다.
CSV 파일은 _날짜__온도_ 2개의 열을 가집니다. _날짜_ 열 은 서버가 메시지를 수신한 현재 날짜와 시간으로 설정되며 _온도_ 는 원격 측정 메시지에서 가져옵니다.
1. 원격 분석을 구독하기 위한 서버 코드를 생성하기 위해 레슨 4에 있는 단계를 반복하십시오. 명령을 게시하기 위해서 코드를 추가할 필요는 없습니다.
이를 위한 단계는 다음과 같습니다:
- Python 가상 환경 구성 및 활성화
- paho-mqtt pip package를 설치
- 원격 분석 주제에 게시된 MQTT 메시지를 수신 대기하는 코드 작성
> ⚠️ 필요한 경우 원격 분석을 수신할 Python 앱을 만드는 방법은 [Lesson4의 지침](../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker)을 참고할 수 있습니다.
이 프로젝트의 폴더명을 입력하십시오.
`temperature-sensor-server`.
1. `client_name`이 이 프로젝트를 반영하는 지 확인하십시오.
```cpp
client_name = id + 'temperature_sensor_server'
```
1. 아래의 import 목록을 보고 파일의 상단에 import 하는 부분을 추가하십시오:
```python
from os import path
import csv
from datetime import datetime
```
이것은 파일을 읽기 위한 라이브러리, CSV 파일과 상호작용하는 라이브러리, 날짜와 시간을 지원하는 라이브러리를 가져옵니다.
1. `handle_telemetry` 함수 앞에 다음 코드를 추가합니다:
```python
temperature_file_name = 'temperature.csv'
fieldnames = ['date', 'temperature']
if not path.exists(temperature_file_name):
with open(temperature_file_name, mode='w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
```
이 코드는 작성할 파일의 이름과 CSV 파일의 열 헤더의 이름을 위한 몇 가지 상수를 선언합니다. CSV 파일의 첫 번째 행은 관습적으로 콤마로 분리된 열 헤더를 포함합니다.
그런 다음 CSV 파일이 이미 존재하는 지 확인합니다. 만약 존재하지 않는다면, 첫 번째 행에 열 헤더를 포함하여 생성합니다.
1. 다음 코드를 `handle_telemetry` 함수 뒷 부분에 추가하십시오:
```python
with open(temperature_file_name, mode='a') as temperature_file:
temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames)
temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']})
```
이 코드는 CSV 파일을 열고 끝 부분에 새로운 행을 추가합니다. 행에는 사람이 읽을 수 있는 형식으로 현재 데이터와 시간이 있으며 그 뒤에 IoT 장치에서 받은 온도가 표시됩니다. 데이터는 [ISO 8601 형식](https://wikipedia.org/wiki/ISO_8601)으로 마이크로초 없이 시간대와 함께 저장됩니다.
1. 이전과 동일한 방법으로 이 코드를 실행하고, IoT 장치가 데이터를 전송하는 지 확인하십시오. `temperature.csv` 이라 불리는 CSV 파일이 같은 폴더 내에 생성됩니다. 이것을 확인하면 날짜/시간과 기온 측정을 볼 수 있습니다.
```output
date,temperature
2021-04-19T17:21:36-07:00,25
2021-04-19T17:31:36-07:00,24
2021-04-19T17:41:36-07:00,25
```
1. 데이터를 캡쳐하기 위해 이 코드를 잠시동안 실행하십시오. 이상적으로는 GDD 계산을 위한 충분한 데이터를 수집하기 위해 하루 종일 실행해야 합니다.
> 💁 만약 당신이 가상 IoT 장치를 사용한다면, 랜덤 체크 박스를 선택하고 온도 값이 반환될 때마다 동일한 온도가 나오지 않도록 범위를 설정합니다.
> ![랜덤 체크 박스를 선택하고 범위를 설정함](../../../../images/select-the-random-checkbox-and-set-a-range.png)
> 💁 만약 이것을 하루 종일 실행하고 싶다면 전원 세팅을 바꾸거나 [시스템 활성 유지 Python 스크립트](https://github.com/jaqsparow/keep-system-active)와 같은 것을 실행하여 절전 상태에 빠지지 않도록 확인해야 합니다.
> 💁 이 코드는 [code-server/temperature-sensor-server](code-server/temperature-sensor-server) 폴더에서 찾을 수 있습니다.
### 작업 - 저장된 데이터를 이용한 GDD 계산
서버가 온도 데이터를 캡쳐하고 나면, 식물의 GDD를 계산할 수 있습니다.
수동으로 하는 방법은 다음과 같습니다:
1. 식물의 기준 온도를 찾습니다. 예를 들어, 딸기의 기준 온도는 10°C 입니다.
1. `temperature.csv`에 가장 일간 최고 온도 최저 온도를 찾습니다.
1. 이전에 제공된 GDD 계산식을 이용하여 GDD를 계산합니다.
예를 들어, 만약 일간 최고 온도가 25°C이고, 최저 온도가 12°C라면:
![GDD = 25 + 12 를 2로 나누고 , 10을 빼면 결과는 8.5입니다.](../../../../images/gdd-calculation-strawberries.png)
- 25 + 12 = 37
- 37 / 2 = 18.5
- 18.5 - 10 = 8.5
따라서 딸기는 지금까지 8.5의 GDD를 받았습니다. 딸기는 열매를 맺기 위해 약 250 GDD를 필요로 합니다. 따라서 아직 시간이 필요합니다.
---
## 🚀 도전
식물이 자라기 위해선 열 말고도 많은 것들을 필요로 합니다. 다른 필요한 것에는 무엇이 있을까요?
이를 측정할 수 있는 센서가 있는지 찾아보십시오. 이러한 레벨을 제어하는 액추에이터는 어떻습니까? 식물의 성장을 최적화하기 위해 하나 이상의 IoT 장치를 어떻게 조합해야 할까요?
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10)
## 복습 및 독학
- 디지털 농업에 대해 [디지털 농업에 대한 Wikipedia 페이지](https://wikipedia.org/wiki/Digital_agriculture)에서 더 읽어보십시오. 정밀 농업에 대해서는 [정밀 농업에 대한 Wikipedia 페이지](https://wikipedia.org/wiki/Precision_agriculture)에서 읽어보십시오.
- 유효 적산 온도(GDD) 계산식의 원본은 이 수업에서의 간략한 식보다 훨씬 복잡합니다. [Growing Degree Day Wikipedia 페이지](https://wikipedia.org/wiki/Growing_degree-day)에서 더 복잡한 방정식과 기준 이하의 온도를 처리하는 방법에 대해 자세히 알아보십시오.
- 우리가 여전히 농사에 동일한 방법을 사용하더라도 미래에는 식량이 부족할 수 있습니다. 하이테크 농업에 대해서 [YouTube의 미래의 하이테크 농장 비디오](https://www.youtube.com/watch?v=KIEOuKD9KX8)에서 더 자세히 배워봅시다.
## 과제
[Jupyter Notebook을 이용한 GDD 데이터 시각화](assignment.ko.md)

@ -1,271 +0,0 @@
# 应用物联网预测植物生长
![这个课程概述的涂鸦笔记sketchnote](../../../../sketchnotes/lesson-5.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 如果你想看比较大的图片,请点击它。
## 课前测验
[课前测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9)
## 介绍
植物需要一些东西才能生长 - 水,二氧化碳,养分,光照,还有热。在这节课程中,你将会学习怎样通过测量空气温度来计算植物的生长和成熟率。
这节课程将包含:
* [数字农业](#数字农业)
* [为什么温度在耕作中很重要?](#为什么温度在耕作中很重要?)
* [测量环境温度](#测量环境温度)
* [生长度日 (GDD)](#生长度日)
* [用温度传感器数据计算 GDD](#用温度传感器数据计算 GDD)
## 数字农业
通过使用工具来收集、存储和分析耕作数据,数字农业 (Digital Agriculture) 正在改变我们的耕作方式。我们目前正处于被世界经济论坛描述为“第四次工业革命”的时期而数字农业的崛起也被称为“第四次农业革命”或“农业4.0”。
> 🎓 数字农业一词也包括整个“农业价值链”,即从农场到餐桌的整个过程。它包括在食品运输和加工过程中跟踪农产品质量,仓库和电子商务系统,甚至拖拉机租赁应用程序!
这些改变使得农民们能够提高产量,减少肥料和农药的使用,并更有效率地浇水。尽管主要在富裕国家中使用,传感器和其它设备的价格在慢慢降低,使得它们在发展中国家也更容易被使用了。
数字农业所促成的技术包括:
* 温度测量——测量温度使农民能够预测植物的生长和成熟度。
* 自动浇水——测量土壤湿度,在土壤过于干燥时开启灌溉系统,而不是定时浇水。定时浇水可能导致作物在高温干旱时浇水不足,或在下雨时浇水过多。通过只有在土壤需要时才浇水的方式,农民可以优化水资源的使用。
* 虫害控制——农民可以使用自动机器人或无人机上的摄像头来检查虫害,然后只在需要的地方施用农药。这样不仅能减少农药的使用量,也能减少流入当地水源中的农药量。
✅ 做些研究。还有哪些技术是用来提高农业产量的?
> 🎓 “精准农业”一词被用来定义在某块田地,甚至在某块田地的部分区域的尺度上,对作物进行的观察、测量和反应。这包括测量水、养分和虫害程度,并作出准确的反应,例如只对一小部分田地进行浇灌。
>
## 为什么温度在耕作中很重要?
在学习植物时,大多数学生都了解了水、光、二氧化碳 (CO<sub>2</sub>) 和养分的必要性。其实植物的生长也需要温暖——这就是为什么植物在春天随着温度的升高而开花,为什么雪钟花或水仙花会因为短暂的暖流而提前发芽,以及为什么暖房和温室能里的植物生长得很好。
> 🎓 暖房和温室挺类似的,但它们有一个重要区别。暖房是人工加热的,农民能够更准确地控制温度,而温室依靠太阳取暖,通常唯一的控制是利用窗户或其他开口来让热量散发出去。
植物有基础温度或者说最低温度、最佳温度和最高温度,所有这些都基于日平均温度。
* 基础温度 (Base temperature) - 这是植物生长所需的最低日平均温度。
* 最佳温度 (Optimum temperature) - 这是能够使植物获得最多生长的最佳日平均温度。
* 最高温度 (Maximum temperature) - 这是植物可以承受的最高温度。超过这个温度,植物就会停止生长,以节省水分和保持存活。
> 💁 这些都是平均温度,是每日和每夜温度的平均值。植物也需要昼夜不同的温度以帮助它们更有效地进行光合作用并在夜间节省能量。
每种植物都有不同的基础、最佳、最高温度值。这就是为什么一些植物能够在炎热的地区茁壮成长,而另一些则更适应寒冷地区。
✅ 做些研究。对于那些花园、学校或当地公园里的植物,你是否可以找到其基础温度。
![本图展示了生长率随着温度的升高而增长,然后在温度过高时下跌的过程](../../../../images/plant-growth-temp-graph.png)
上图显示了一个生长率与温度关系图的例子。在最低温度之前植物不会生长。随着温度升高生长率增加,并在最佳温度处达到这个峰值,然后下降。在最高温度处,生长停止。
该图的形状因植物种类的不同而不同。有些植物在最佳温度之后有较明显的下降,有些植物从最低温度到最佳温度的增长更加缓慢。
> 💁 对于农民来说,要想让作物长得更好,他们需要知道这三个温度值,并了解他们所种植的作物的图形形状。
如果农民能够控制温度比如在商业暖房中那么他们可以为其作物进行温度的优化。例如一个种植西红柿的商业暖房可以在白天将温度设置为25°C而在晚上设置为20°C这样能够获得最快的生长。
> 🍅 将温控与人工照明、肥料和 CO<sub>2</sub> 水平控制相结合能够能够实现全年的种植和收获。
## 测量环境温度
温度传感器可与物联网设备一起使用来测量环境温度。
### 任务 - 测量温度
通过以下这些相关指南,应用你的物联网设备监测温度:
* [Arduino - Wio Terminal](../wio-terminal-temp.md)
* [单板机 - Raspberry Pi](../pi-temp.md)
* [单板机 - 虚拟设备](../virtual-device-temp.md)
## 生长度日
生长度日 (Growing degree days),也称为生长度单位 (growing degree units),是根据温度衡量植物生长的一种方式。假设一株植物具有足够的水分、养分和二氧化碳,温度将会决定植物的生长率。
生长度日,或称 GDD是以每日中高于植物基础温度的的平均温度摄氏度来计算的。每个植物需要一定数量的生长度日来生长、开花、成熟。每天的 GDD 越多,植物的生长就越快。
> 🇺🇸 For Americans, growing degree days can also be calculated using Fahrenheit. 5 GDD<sup>C</sup> (growing degree days in Celsius) is the equivalent of 9 GDD<sup>F</sup> (growing degree days in Fahrenheit). <= 华氏度计算
GDD 的完整公式有点复杂,大多是情况下使用一个简化方程就能得到一个很好的近似值:
![GDD = T max + T min 除以 2再减去 T base](../../../../images/gdd-calculation.png)
* **GDD** - 生长度日的数量
* **T<sub>max</sub>** - 每日最高温度,单位是摄氏度
* **T<sub>min</sub>** - 每日最低温度,单位是摄氏度
* **T<sub>base</sub>** - 植物的基础温度,单位是摄氏度。
> 💁 T<sub>max</sub> 高于 30°C 或者 T<sub>min</sub> 低于 T<sub>base</sub> 的情况下有所不同,但是我们暂且忽略。
### 例子 - 玉米 🌽
根据品种的不同,玉米大概需要 800 到 2,700 的 GDD 来成熟,基础温度是 10°C。
在高于基础温度的第一天,测量的温度值如下:
| 测量 | 温度 °C |
| :--- | :-----: |
| 最高 | 16 |
| 最低 | 12 |
把这些数字代入公式中:
* T<sub>max</sub> = 16
* T<sub>min</sub> = 12
* T<sub>base</sub> = 10
可得:
![GDD = 16 + 12 除以 2再减去 10得到答案为 4](../../../../images/gdd-calculation-corn.png)
玉米在这一天获得了4 GDD。假设这个品种的玉米需要800 GDD那么它还需要796 GDD 才能成熟。
✅ 做些研究。对于那些花园、学校或当地公园里的植物,你是否能找它们成熟所需的 GDD 数量。
## 用温度传感器数据计算 GDD
植物的生长时间不是固定的——例如你不可能种下一粒种子并知道它会刚好在100天后开花结果。然而作为一个农民你也许有一个生长所需时间的粗略概念然后你每天检查作物是否成熟。
对于一些大型农场来说这是一个巨大的劳动力影响,而且农民有可能错过意外提前成熟的作物。通过测量温度,农民可以计算出植物所累积的 GDD这样可以就能只在接近预期成熟度时进行检查。
通过使用物联网设备收集温度数据,农民可以在植物接近成熟时自动收到通知。这方面的典型架构是让物联网设备测量温度,然后使用类似 MQTT 的协议在互联网上发布这些遥测数据。接着服务器代码监听这些数据并将其保存在某个地方,比如数据库。这意味着之后能够对这些数据进行分析,比如在每晚计算当天的 GDD对每种作物的 GDD 进行累计,如果植物接近成熟就发出警报。
![遥测数据被发送到一个服务器上然后被保存至数据库中](../../../../images/save-telemetry-database.png)
服务器代码也可以通过添加额外的信息来增强数据。例如,物联网设备可通过一个标识符以表明它是哪个设备,而服务器代码可以使用这个标识符来查找设备的位置以及它正在监测哪些作物。还可以添加一些基本数据,如当前时间,因为一些物联网设备没有追踪时间的必要的硬件或者是需要额外的代码来通过互联网读取当前时间。
✅ 你觉得为什么不同地方的温度可能会不同?
### 任务 - 发布温度信息
通过以下这些相关指南,应用你的物联网设备通过 MQTT 发布温度数据,以便之后的分析:
* [Arduino - Wio Terminal](../wio-terminal-temp-publish.md)
* [单板机 - Raspberry Pi/虚拟物联网设备](../single-board-computer-temp-publish.md)
### 任务 - 捕获并存储温度信息
如果物联网设备成功发布遥测数据,就可以开始编写服务器代码来订阅这些数据并将其存储起来。服务器代码将其保存到 CSV 文件中而非使用数据库来存储。CSV文件以文本形式存储数据每个值用逗号隔开每个记录占一行。它是一种方便的、人类可读的、受到良好支持的保存数据为文件的方式。
CSV 文件将有两列 - *时间 (date)*和*温度 (temperature)*。*时间*列将存储服务器收到消息时的日期和时间,*温度*列存储遥测信息。
1. 重复第4课的步骤创建服务器代码以订阅遥测数据。你不需要添加代码来发布命令。
具体步骤:
* 配置并激活一个 Python 虚拟环境
* 安装 paho-mqtt pip 包
* 编写代码来监听发布在遥测主题上的 MQTT 消息
> ⚠️ 如果需要的话你可以参考 [课程 4 中关于创建 Python 应用来接受遥测数据的说明](../../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker)。
这个项目的文件夹名是 `temperature-sensor-server`
1. 确保 `client_name` 反映该项目:
```cpp
client_name = id + 'temperature_sensor_server'
```
1. 在文件开头,已有导入的下方,添加下列导入:
```python
from os import path
import csv
from datetime import datetime
```
这将会导入一个用于读取文件的库,一个与 CSV 文件交互的库,和一个关于日期和时间的库。
1. 添加下面的代码至 `handle_telemetry` 函数前:
```python
temperature_file_name = 'temperature.csv'
fieldnames = ['date', 'temperature']
if not path.exists(temperature_file_name):
with open(temperature_file_name, mode='w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
```
这段代码声明了一些用于写入文件的文件名和 CSV 文件列标题名的常量。传统上CSV 文件的第一行包含由逗号分隔的列标题。
然后代码会检查 CSV 文件是否已经存在。如果不存在,则在第一行创建列标题。
1. 添加下面的代码至 `handle_telemetry` 函数末尾:
```python
with open(temperature_file_name, mode='a') as temperature_file:
temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames)
temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']})
```
这段代码会打开 CSV 文件,然后在末尾添加一个新行。这一行会包含当前的日期和时间(可阅读格式),紧跟着从物联网设备中接收到的温度。时间数据将以 [ISO 8601 format](https://wikipedia.org/wiki/ISO_8601) 进行保存,包含时区,但是不包含毫秒。
1. 以与之前相同的方式运行此代码,确保你的物联网设备正在发送数据。一个名为 `temperature.csv` 的 CSV 文件将在同一文件夹中创建。如果你查看它,你应该能看到日期/时间和温度数据:
```output
date,temperature
2021-04-19T17:21:36-07:00,25
2021-04-19T17:31:36-07:00,24
2021-04-19T17:41:36-07:00,25
```
1. 运行这段代码一段时间以获取数据。理想情况下,你应该运行它一整天来收集足够的数据用于 GDD 的计算。
> 💁 如果你正在使用虚拟物联网设备,选择随机复选框并设置一个范围来避免每次返回温度时都得到同样的值。
> ![Select the random checkbox and set a range](../../../../images/select-the-random-checkbox-and-set-a-range.png)
> 💁 如果你想运行一整天,那么你需要确保用于服务器代码运行的电脑不会进入休眠,你可以改变电源设置,或者运行 [这个保持系统活跃的 Python 脚本](https://github.com/jaqsparow/keep-system-active)。
> 💁 你可以在 [code-server/temperature-sensor-server](../code-server/temperature-sensor-server) 文件夹内找到需要的代码。
### 任务 - 使用存储的数据计算出 GDD
一旦服务器采集了温度数据,就可以计算出植物的 GDD。
手动操作的步骤是:
1. 找到该植物的基础温度。例如对于草莓来说基础温度是10℃
1. 根据 `temperature.csv`,找到一天中的最低温度和最高温度
1. 使用之前给出的公式来计算 GDD
例如,如果这一天最高温度是 25°C最低温度是 12°C
![GDD = 25 + 12 除以 2然后减去 10 得到 8.5](../../../../images/gdd-calculation-strawberries.png)
* 25 + 12 = 37
* 37 / 2 = 18.5
* 18.5 - 10 = 8.5
所以草莓获得了 **8.5** GDD。草莓需要大概 250 GDD 来结果,看来还得等一会儿呢。
---
## 🚀 挑战
植物的生长,除了热量以外,还需要些什么?
对于这些(其它因素),寻找是否有可以测量它们的传感器。那么控制它们水平的执行器呢?你会如何把一个或多个物联网设备放在一起,以优化植物的生长?
## 课后测验
[课后测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10)
## 复习 & 自学
* 在 [Digital Agriculture Wikipedia page](https://wikipedia.org/wiki/Digital_agriculture) 上阅读更多关于数字农业的知识。在 [Precision Agriculture Wikipedia page](https://wikipedia.org/wiki/Precision_agriculture) 上阅读更多关于精准农业的知识。
* 完整的生长度日计算比这里给出的简化计算更复杂。在 [Growing Degree Day Wikipedia page](https://wikipedia.org/wiki/Growing_degree-day) 上查看更复杂的方程以及处理低温条件的方法。
* 即使我们仍然使用相同的耕作方法,未来的食物也可能是稀缺的。在 [Hi-Tech Farms of Future video on YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8) 上了解更多高科技种植手段。
## 作业
[使用 Jupyter Notebook 进行 GDD 数据的可视化](../assignment.md)

@ -1,43 +0,0 @@
# জুপিটার নোটবুক ব্যবহার করে জিডিডি ডেটা প্রদর্শন করা
## নির্দেশাবলী
এই পাঠে আমরা আইওটি সেন্সর ব্যবহার করে জিডিডি ডেটা সংগ্রহ করেছি। ভাল জিডিডি ডেটা পেতে, আমাদেরকে একাধিক দিনের জন্য ডেটা সংগ্রহ করতে হবে। তাপমাত্রার ডেটা ভিজ্যুয়ালাইজ করতে এবং জিডিডি গণনা করা বা ডেটা বিশ্লেষণ করতে [জুপিটার নোটবুকস](https://jupyter.org) এর মতো ট্যুল ব্যবহার করা যেতে পারে।
কিছুদিন ডেটা সংগ্রহের মাধ্যমে কাজ শুরু করতে হবে। আইওটি ডিভাইসটি চলমান সময়ে আমাদের সার্ভার কোড যে চলমান রয়েছে তা নিশ্চিত করতে হবে, হয় পাওয়ার ম্যানেজমেন্ট সেটিংস ঠিক করে বা কোন [ সিস্টেমকে অ্যাক্টিভ রাখার পাইথন স্ক্রিপ্ট](https://github.com/jaqsparow/keep-system-active) এর মতো কিছু চালিয়ে।
একবার তাপমাত্রার ডেটা পেয়ে গেলে আমরা এটি দেখতে এবং জিডিডি গণনা করতে এই রেপোতে জুপিটার নোটবুকটি ব্যবহার করতে পার্রি। জুপিটার নোটবুক এ ব্লক হিসেবে *সেল* এ কোড এবং নির্দেশাবলী মিশ্রিত থাকে, এবং সাধারণত পাইথনেই কোড করা হয়। নির্দেশাবলী পড়ে, তারপরে কোডের প্রতিটি ব্লক বাই ব্লক রান করতে হবে। এখানে প্রদত্ত কোডটি এডিট করা যেতে পারে। উদাহরণস্বরূপ, এই নোটবুকটিতে, য়ামরা আমাদের গাছের জন্য জিডিডি গণনা করতে ব্যবহৃত বেস তাপমাত্রা, উদ্ভিদভেদে ভিন্ন ভিন্ন হবে।
1. `gdd-calculation` নামে একটি ফোল্ডার খুলতে হবে।
1. [gdd.ipynb](./code-notebook/gdd.ipynb) ডাউনলোড করে তার একটি কপি `gdd-calculation` ফোল্ডারে রাখতে হবে।
1. MQTT সার্ভার দ্বারা তৈরী `temperature.csv` ফাইলটি কপি করতে হবে।
1. `gdd-calculation` ফোল্ডারে নতুন পাইথন এনভায়রনমেন্ট তৈরী করতে হবে।
1. জুপিটার নোটবুকে কিছু পিপ প্যাকেজ ইন্সটল করতে হবে।
```sh
pip install --upgrade pip
pip install pandas
pip install matplotlib
pip install jupyter
```
1. নোটবুকটি জুপিটারে রান করতে হবে
```sh
jupyter notebook gdd.ipynb
```
জুপিটারটি শুরু হয়ে ব্রাউজারে নোটবুকটি খুলবে। তাপমাত্রা পরিমাপ করা এবং জিডিডি গণনা করতে নোটবুকের নির্দেশাবলীর মাধ্যমে কাজ করতে হবে।
![The jupyter notebook](../../../images/gdd-jupyter-notebook.png)
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা (সর্বোত্তম) | পর্যাপ্ত ব্যখ্যা (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) |
| -------- | --------- | -------- | ----------------- |
| ডেটা সংগ্রহ করা | কমপক্ষে ২টি সম্পূর্ণ দিনের ডেটা সংগ্রহ করা | কমপক্ষে ১টি সম্পূর্ণ দিনের ডেটা সংগ্রহ করা | কিছু ডেটা সংগ্রহ করা |
| জিডিডি গণনা করা | সফলতার সাথে নোটবুক রান করে জিডিডি গণনা | সফলতার সাথে নোটবুক রান করা | নোটবুক রান করতে ব্যার্থ |

@ -1,43 +0,0 @@
# Visualiser les données DJC à l'aide d'un Jupyter Notebook
## Instructions
Dans cette leçon, vous avez recueilli des données DJC à l'aide d'un capteur IoT. Pour obtenir de bonnes données DJC, vous devez recueillir des données pendant plusieurs jours. Pour vous aider à visualiser les données de température et à calculer le DJC, vous pouvez utiliser des outils tels que [Jupyter Notebooks](https://jupyter.org) pour analyser les données.
Commencez par recueillir des données pendant quelques jours. Vous devez vous assurer que le code de votre serveur fonctionne tout le temps que votre dispositif IoT est en marche, soit en ajustant vos paramètres de gestion de l'énergie, soit en exécutant quelque chose comme [ce script Python maintenant le système actif].(https://github.com/jaqsparow/keep-system-active).
Une fois que vous avez les données de température, vous pouvez utiliser le Jupyter Notebook dans ce repo pour les visualiser et calculer le JDC. Les notebooks Jupyter mélangent du code et des instructions dans des blocs appelés *cellules*, souvent du code en Python. Vous pouvez lire les instructions, puis exécuter chaque bloc de code, bloc par bloc. Vous pouvez également modifier le code. Dans ce notebook par exemple, vous pouvez modifier la température de base utilisée pour calculer le JDC de votre installation.
1. Créez un dossier `gdd-calcul` (GDD correspond à DJC en français)
1. Téléchargez le fichier [gdd.ipynb](../code-notebook/gdd.ipynb) et copiez le dans le dossier`gdd-calcul`.
1. Copiez le fichier `temperature.csv` créé par le serveur MQTT.
1. Créez un nouvel environnement virtuel Python dans le dossier `gdd-calcul`.
1. Installez quelques paquets pip pour les carnets Jupyter, ainsi que les bibliothèques nécessaires à la gestion et au tracé des données :
```sh
pip install --upgrade pip
pip install pandas
pip install matplotlib
pip install jupyter
```
1. Exécutez le notebook dans Jupyter :
```sh
jupyter notebook gdd.ipynb
```
Jupyter démarre et ouvre le notebook dans votre navigateur. Suivez les instructions du carnet de notes pour visualiser les températures mesurées et calculer les degrés-jours de croissance.
![Le jupyter notebook](../../../../images/gdd-jupyter-notebook.png)
## Rubrique
| Critère | Exemplaire | Adequat | À améliorer |
| -------- | --------- | -------- | ----------------- |
| Capture de données | Capture au moins deux journées de données | Capture au moins une journée de données | Capture des données |
| Calcul du DJC | Exécute le notebook et calcul le DJC | Exécute le notebook | Incapable d'exécuter le notebook |

@ -1,43 +0,0 @@
# Jupyter Notebook을 이용한 GDD 데이터 시각화
## 개요
이번 수업에서 IoT 센서를 사용해 GDD 데이터를 수집했습니다. 좋은 GDD 데이터를 얻기 위해서는 수 일간 데이터를 수집해야 합니다. 온도 데이터를 시각화 하고 GDD를 계산하는 것을 돕기 위해선 [Jupyter Notebooks](https://jupyter.org)과 같은 도구를 사용하여 데이터를 분석할 수 있습니다.
며칠 간 데이터를 수집하는 것으로 시작하십시오. 전원 관리 설정을 조정하거나 [시스템 활성 유지 Python 스크립트](https://github.com/jaqsparow/keep-system-active) 와 같은 것을 실행하여 IoT 장치가 실행되는 동안 서버 코드가 항상 실행되고 있는지 확인해야 합니다.
온도 데이터를 얻은 후에는 이 레포지토리에 있는 Jupyter Notebook을 이용하여 데이터를 시각화하고 GDD를 계산할 수 있습니다. Jupyter Notebook은 _셀_ 이라 불리는 블럭 안에 코드와 지침들이 섞여있습니다. 이는 주로 파이썬으로 작성됩니다. 지침을 읽고, 각각의 코드 블럭을 하나씩 실행할 수 있습니다. 또한 코드를 수정할 수도 있습니다. 예를 들자면 당신의 식물을 위해 GDD를 계산할 때 사용되는 기준 온도를 이 notebook에서 수정할 수 있습니다.
1. `gdd-calculation` 이름을 가진 폴더를 생성합니다.
1. [gdd.ipynb](../code-notebook/gdd.ipynb) 파일을 다운받고 `gdd-calculation`로 복사합니다.
1. MQTT 서버가 생성한 `temperature.csv` 파일을 복사합니다.
1. `gdd-calculation`폴더에 새로운 Python 환경을 생성합니다.
1. 데이터를 관리하고 표시하는 데 필요한 라이브러리와 함께 Jupyter Notebook을 위한 몇가지 pip 패키지들을 설치합니다:
```sh
pip install --upgrade pip
pip install pandas
pip install matplotlib
pip install jupyter
```
1. 이 notebook을 Jupyter에서 실행합니다:
```sh
jupyter notebook gdd.ipynb
```
Jupyter가 시작되고 브라우저에서 notebook을 열게 됩니다. notebook의 지시에 따라 측정된 온도를 시각화하고 유효 적산 온도(GDD)를 계산합니다.
![The jupyter notebook](../../../../images/gdd-jupyter-notebook.png)
## 평가 기준
| 기준 | 모범 답안 | 적절함 | 개선이 필요함 |
| ----------- | ------------------------------------------- | ------------------------------------- | ------------------------- |
| 데이터 캡쳐 | 최소 완전한 이틀 이상의 데이터를 캡처함 | 최소 완전한 하루 이상의 데이터 캡처함 | 몇개의 데이터를 캡처함 |
| GDD 계산 | 성공적으로 notebook을 실행하고 GDD를 계산함 | 성공적으로 notebook을 실행함 | notebook을 실행할 수 없음 |

@ -1,111 +0,0 @@
# Mesure de temperature - Raspberry Pi
Dans cette partie de la leçon, vous allez ajouter un capteur de température à votre Raspberry Pi.
## Matériel
La sonde que vous utiliserez est une [sonde d'humidité et de température DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), combinant deux capteurs dans un même boîtier. Cette méthode est assez populaire, avec un certain nombre de capteurs disponibles dans le commerce combinant température, humidité et parfois pression atmosphérique. Le composant du capteur de température est une thermistance à coefficient de température négatif (CTN), une thermistance dont la résistance diminue lorsque la température augmente.
Il s'agit d'un capteur numérique, qui dispose donc d'un ADC intégré pour créer un signal numérique contenant les données de température et d'humidité que le microcontrôleur peut lire.
### Connecter le capteur de température
Le capteur de température Grove peut être connecté au Raspberry Pi.
#### Tâche
Connecter le capteur de température
![La sonde de température Grove](../../../../images/grove-dht11.png)
1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité et de température. Il ne peut être inséré que dans un seul sens.
1. Lorsque le Raspberry Pi est hors tension, connectez l'autre extrémité du câble Grove à la prise numérique marquée **D5** sur le chapeau de la base Grove fixé au Pi. Cette prise est la deuxième en partant de la gauche, sur la rangée de prises à côté des broches GPIO.
![Le capteur de température de la rainure connecté à la broche A0](../../../../images/pi-temperature-sensor.png)
## Programmez le capteur de température
L'appareil peut maintenant être programmé pour utiliser la sonde de température jointe.
### Tâche
Programmer le Raspberry Pi.
1. Brancher le Pi à l'alimentation et attendre la séquence de démarrage.
1. Lancez VS Code, soit directement sur le Pi, soit en vous connectant via l'extension SSH à distance.
> ⚠️ Vous pouvez vous référer [aux instructions de configuration et de lancement de VS Code dans la leçon 1 si nécessaire].(../../../../1-getting-started/lessons/1-introduction-to-iot/pi.md).
1. Depuis le terminal, créez un nouveau dossier dans le répertoire personnel de l'utilisateur `pi` appelé `temperature-sensor`. Créez un fichier dans ce dossier appelé `app.py` :
```sh
mkdir temperature-sensor
cd temperature-sensor
touch app.py
```
1. Ouvrez ce dossier dans VS Code
1. Pour utiliser le capteur de température et d'humidité, une librairie pip supplémentaire doit être installée. Depuis le Terminal dans VS Code, exécutez la commande suivante pour installer ce paquet Pip sur le Pi :
```sh
pip3 install seeed-python-dht
```
1. Ajoutez le code suivant au fichier `app.py` pour importer les bibliothèques requises :
```python
import time
from seeed_dht import DHT
```
L'instruction `from seeed_dht import DHT` importe la classe de capteur `DHT` pour interagir avec un capteur de température Grove du module `seeed_dht`.
1. Ajoutez le code suivant après le code ci-dessus pour créer une instance de la classe qui gère le capteur de température :
```python
sensor = DHT("11", 5)
```
Ceci déclare une instance de la classe `DHT` qui gère le capteur **D**igital **H**umidité et **T**température. Le premier paramètre indique au code que le capteur utilisé est le capteur *DHT11* - la bibliothèque que vous utilisez supporte d'autres variantes de ce capteur. Le deuxième paramètre indique au code que le capteur est connecté au port numérique `D5` du connecteur Grove de base.
> ✅ N'oubliez pas que toutes les prises ont un numéro de broche unique. Les broches 0, 2, 4 et 6 sont des broches analogiques, les broches 5, 16, 18, 22, 24 et 26 sont des broches numériques.
1. Ajoutez une boucle infinie après le code ci-dessus pour interroger la valeur du capteur de température et l'imprimer sur la console :
```python
while True:
_, temp = sensor.read()
print(f'Temperature {temp}°C')
```
L'appel à `sensor.read()` renvoie un tuple d'humidité et de température. Vous n'avez besoin que de la valeur de la température, l'humidité est donc ignorée. La valeur de la température est ensuite imprimée sur la console.
1. Ajoutez une petite mise en veille de dix secondes à la fin de la "boucle", car les niveaux de température n'ont pas besoin d'être vérifiés en permanence. Une mise en veille réduit la consommation d'énergie de l'appareil.
```python
time.sleep(10)
```
1. Depuis le terminal VS Code, exécutez ce qui suit pour lancer votre application Python :
```sh
python3 app.py
```
Vous devriez voir des valeurs de température en sortie sur la console. Utilisez quelque chose pour réchauffer le capteur, par exemple en appuyant votre pouce dessus, ou en utilisant un ventilateur pour voir les valeurs changer :
```output
pi@raspberrypi:~/temperature-sensor $ python3 app.py
Temperature 26°C
Temperature 26°C
Temperature 28°C
Temperature 30°C
Temperature 32°C
```
> 💁 Vous pouvez trouver ce code dans le dossier [code-temperature/pi](../code-temperature/pi).
😀 La réalisation de votre programme de capteur de température a été un succès !

@ -1,111 +0,0 @@
# 온도 측정 - 라즈베리 파이
이 단원에서는 라즈베리 파이에 온도 센서를 추가합니다.
## 하드웨어
당신이 사용할 센서는 두 센서를 하나의 패키지로 결합한 [DHT11 습도 및 온도 센서](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html)입니다. 이것은 온도, 습도와 때로는 대기압을 결합한 다수의 상업적으로 이용 가능한 센서로 상당히 인기가 있습니다. 온도 센서 구성 요소는 음의 온도 계수(NTC) 서미스터로, 온도가 증가함에 따라 저항이 감소하는 서미스터입니다.
이것은 디지털 센서이므로 마이크로컨트롤러가 읽을 수 있는 온도와 습도 데이터가 포함된 디지털 신호를 생성하는 온보드 ADC를 가지고 있습니다.
### 온도 센서 연결
Grove 온도 센서는 라즈베리 파이에 연결할 수 있습니다.
#### 임무
온도 센서를 연결하십시오.
![Grove 온도 센서](../../../../images/grove-dht11.png)
1. 온도와 습도 센서의 소켓에 Grove 케이블의 한 쪽 끝을 삽입합니다. 한쪽 방향으로만 진행됩니다.
1. 라즈베리 파이의 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base hat의 **D5**가 적힌 디지털 소켓에 연결합니다. 이 소켓은 GPIO 핀 옆의 소켓 행에서 왼쪽 두 번째입니다.
![소켓 A0에 연결된 Grove 온도 센서](../../../../images/pi-temperature-sensor.png)
## 온도 센서 프로그래밍
이제 부착된 온도 센서를 사용하도록 장치를 프로그래밍할 수 있습니다.
### 임무
장치를 프로그래밍합니다.
1. Pi의 전원을 켜고 부팅될 때까지 기다립니다.
1. Pi에서 직접 VS Code를 실행하거나 원격 SSH 확장을 통해 연결합니다.
> ⚠️ 필요한 경우 [레슨 1의 VS Code를 설정 및 실행 설명](../../../../1-getting-started/lessons/1-introduction-to-iot/pi.md)을 참고할 수 있습니다.
1. 터미널에서 `pi` 사용자 홈 디렉토리에 `temperature-sensor`라는 새 폴더를 만듭니다. 이 폴더 안에 `app.py` 파일을 생성합니다.
```sh
mkdir temperature-sensor
cd temperature-sensor
touch app.py
```
1. 이 폴더를 VS Code에서 엽니다.
1. 온습도 센서를 사용하기 위해서는 추가적인 pip 패키지 설치가 필요합니다. VS Code의 터미널에서 Pi에 이 pip 패키지를 설치하기 위한 다음의 명령어를 실행합니다:
```sh
pip3 install seeed-python-dht
```
1. 필요한 라이브러리를 import하기 위해 다음의 코드를 `app.py` 파일에 추가합니다:
```python
import time
from seeed_dht import DHT
```
`from seeed_dht import DHT``seeed_dht` 모듈에서 Grove 온도 센서와 상호 작용할 `DHT` 클래스를 import 합니다.
1. 위의 코드 뒤에 다음의 코드를 추가하여 온도 센서를 관리하는 클래스의 인스턴스를 생성합니다:
```python
sensor = DHT("11", 5)
```
이것은 디지털 온습도 센서(**D**igital **H**umidity and **T**emperature)를 제어하는 `DHT` 클래스의 인스턴스를 선언입니다. 첫 번째 파라미터는 사용되는 센서가 _DHT11_ 센서임을 나타내는 코드입니다. 사용 중인 라이브러리는 이 센서의 다른 버전들을 지원합니다. 두 번째 파라미터는 센서가 Grove base hat에서 디지털 포트 `D5`에 연결되었다는 것을 나타내는 코드입니다.
> ✅ 모든 소켓은 고유한 핀 번호를 가졌다는 것을 기억하세요.핀 번호 0, 2, 4, 6번은 아날로그 핀이고, 핀 번호 5, 16, 18, 22, 24, 26 번은 디지털 핀입니다.
1. 위의 코드 뒤에 무한 루프를 추가하여 온도 센서 값을 폴링하고 콘솔에 출력합니다:
```python
while True:
_, temp = sensor.read()
print(f'Temperature {temp}°C')
```
`sensor.read()`의 호출은 습도와 온도의 튜플을 반환합니다. 온도 값만 필요하므로 습도 값은 무시됩니다. 온도 값은 콘솔에 출력됩니다.
1. 온도를 지속적으로 확인할 필요는 없으므로 10초의 짧은 sleep을 `loop`의 끝에 추가합니다. sleep은 장치가 소비하는 전력을 줄여줍니다.
```python
time.sleep(10)
```
1. VS Code의 터미널에서 다음을 실행하여 Python 앱을 실행합니다:
```sh
python3 app.py
```
콘솔에 온도 값이 출력되는 것을 볼 수 있습니다. 엄지 손가락으로 누르는 것처럼 센서에 따뜻한 것을 데거나 팬을 사용하여 값이 변하는 것을 확인하십시오:
```output
pi@raspberrypi:~/temperature-sensor $ python3 app.py
Temperature 26°C
Temperature 26°C
Temperature 28°C
Temperature 30°C
Temperature 32°C
```
> 💁 이 코드는 [code-temperature/pi](../code-temperature/pi) 폴더에 있습니다.
😀 온도 센서 프로그램이 성공적이었습니다!

@ -1,57 +0,0 @@
# Publier la température - Matériel virtuel IoT et Raspberry Pi
Dans cette partie de la leçon, vous allez publier les valeurs de température détectées par le Raspberry Pi ou le dispositif IoT virtuel sur MQTT afin qu'elles puissent être utilisées ultérieurement pour calculer le DJC.
## Publier la temperature
Une fois la température lue, elle peut être publiée via MQTT vers un code "serveur" qui lira les valeurs et les stockera, prêtes à être utilisées pour un calcul de DJC.
### Tâche - Publier la température
Programmez l'appareil pour qu'il publie les données de température.
1. Ouvrez le projet d'application `temperature-sensor` s'il ne l'est pas déjà.
1. Répétez les étapes de la leçon 4 pour vous connecter à MQTT et envoyer la télémétrie. Vous utiliserez le même "broker" publique Mosquitto.
Les étapes sont:
- Ajout de la librairie pip de MQTT paho
- Ajouter le code afin de se conecter au broker MQTT
- Ajouter le code permettant de publier la télémètrie
> ⚠️ Consultez les [instructions pour la connexion à MQTT](../../../../1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md) ainsi que les [instructions pour l'envoi de la télémétrie](../../../../1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md) de la leçon 4 si nécessaire.
1. Assurez-vous que le `client_name` reflète le nom de ce projet :
```python
client_name = id + 'temperature_sensor_client'
```
1. Pour la télémétrie, au lieu d'envoyer une valeur de lumière, envoyez la valeur de température lue par le capteur DHT dans une propriété du document JSON appelée `temperature` :
```python
_, temp = sensor.read()
telemetry = json.dumps({'temperature' : temp})
```
1. La valeur de la température n'a pas besoin d'être lue très souvent - elle ne changera pas beaucoup dans un court laps de temps, donc réglez le `time.sleep` à 10 minutes :
```cpp
time.sleep(10 * 60);
```
> 💁 La fonction `sleep` prend le temps en secondes, donc pour faciliter la lecture, la valeur est passée comme le résultat d'un calcul. 60s en une minute, donc 10 x (60s en une minute) donne un délai de 10 minutes.
1. Exécutez le code de la même manière que vous avez exécuté le code de la partie précédente du devoir. Si vous utilisez un appareil IoT virtuel, assurez-vous que l'application CounterFit est en cours d'exécution et que les capteurs d'humidité et de température ont été créés sur les bonnes broches IO.
```output
pi@raspberrypi:~/temperature-sensor $ python3 app.py
MQTT connected!
Sending telemetry {"temperature": 25}
Sending telemetry {"temperature": 25}
```
> 💁 Vous pouvez trouver ce code dans le dossier [code-publish-temperature/virtual-device].(../code-publish-temperature/virtual-device) ou encore [code-publish-temperature/pi](../code-publish-temperature/pi).
😀 Vous avez publié avec succès la température en tant que télémétrie de votre appareil.

@ -1,57 +0,0 @@
# 온도 게시 - 가상 IoT 하드웨어와 라즈베리 파이
이 단원에서는 나중에 GDD를 계산하는 데 사용될 수 있도록 MQTT를 이용해 라즈베리 파이나 가상 IoT 장치에서 감지한 온도 값을 게시합니다.
## 온도 게시
온도를 읽은 후에는 MQTT를 통해 값을 읽고 GDD 계산에 사용할 수 있도록 저장하는 '서버' 코드에 게시할 수 있습니다.
### 임무 - 온도 게시하기
온도를 게시하기 위해 장치를 프로그래밍하십시오.
1. `temperature-sensor` 앱 프로젝트가 열려있지 않다면 해당 프로젝트를 엽니다.
1. 레슨 4에서 했던 MQTT를 연결하고 원격 분석을 전송하는 다음 단계들을 반복합니다. 동일한 공개 Mosquitto 브로커를 사용하게 됩니다.
이를 위한 단계는 다음과 같습니다:
- MQTT pip 패키지를 추가합니다.
- MQTT 브로커와 연결하는 코드를 추가합니다.
- 원격 분석을 게시하는 코드르 추가합니다.
> ⚠️ 필요하다면 레슨 4의 [MQTT 연결을 위한 지침](../../../../1-getting-started/lessons/4-connect-internet/translations/single-board-computer-mqtt.md)과 [원격 분석 전송 지침](../../../../1-getting-started/lessons/4-connect-internet/translations/single-board-computer-telemetry.ko.md)를 참고하십시오.
1. `client_name`이 이 프로젝트의 이름을 반영 하는지 확인하십시오.
```python
client_name = id + 'temperature_sensor_client'
```
1. 원격 분석 전송의 경우 빛의 값을 전송하는 대신 DHT 센서에서 읽은 온도 값을 전송하기 위해 JSON 문서의 속성 `temperature`에서 다음과 같이 보냅니다.
```python
_, temp = sensor.read()
telemetry = json.dumps({'temperature' : temp})
```
1. 온도 값은 자주 읽어올 필요가 없습니다. 짧은 시간에 크게 변하지 않기 때문에 `time.sleep`을 10분으로 설정합니다.
```cpp
time.sleep(10 * 60);
```
> 💁 `sleep`함수는 몇 초간 시간이 가지는 함수입니다. 따라서 계산식의 결과로 전달되는 값을 읽어 오는 것을 더 쉽게 만들어줍니다. 60초는 1분이므로, 10 x (1분에 60초)는 10분의 지연을 제공합니다.
1. 과제의 이전 부분에서 코드를 실행한 것과 동일한 방식으로 코드를 실행합니다. 가상 IoT 장치를 사용한다면 CounterFit 앱이 실행 중인지, 습도 및 온도 센서가 올바른 핀에 생성되었는지 확인하십시오.
```output
pi@raspberrypi:~/temperature-sensor $ python3 app.py
MQTT connected!
Sending telemetry {"temperature": 25}
Sending telemetry {"temperature": 25}
```
> 💁 이 코드는 [code-publish-temperature/virtual-device](../code-publish-temperature/virtual-device) 폴더 또는 [code-publish-temperature/pi](../code-publish-temperature/pi) 폴더에서 찾을 수 있습니다.
😀장치에서 원격 분석 전송으로 온도를 성공적으로 게시했습니다.

@ -1,140 +0,0 @@
# Mesurer la température - Matériel virtuel IoT
Dans cette partie de la leçon, vous allez ajouter un capteur de température à votre dispositif IoT virtuel.
## Matériel virtuel
Le dispositif IoT virtuel utilisera un capteur numérique d'humidité et de température Grove simulé. Ce laboratoire est donc identique à celui qui utilise un Raspberry Pi avec un capteur Grove DHT11 physique.
Le capteur combine un **capteur de température** et un **capteur d'humidité**, mais dans ce laboratoire, vous n'êtes intéressé que par le composant capteur de température. Dans un dispositif IoT physique, le capteur de température serait une [thermistance] (https://wikipedia.org/wiki/Thermistor) qui mesure la température en détectant un changement de résistance lorsque la température change. Les capteurs de température sont généralement des capteurs numériques qui convertissent en interne la résistance mesurée en une température en degrés Celsius (ou Kelvin, ou Fahrenheit).
### Ajouter les capteurs à CounterFit
Pour utiliser un capteur d'humidité et de température virtuel, vous devez ajouter les deux capteurs à l'application CounterFit
#### Tâche - ajouter les capteurs à CounterFit
Ajoutez les capteurs d'humidité et de température à l'application CounterFit.
1. Créez une nouvelle application Python sur votre ordinateur dans un dossier appelé `temperature-sensor` avec un seul fichier appelé `app.py` et un environnement virtuel Python, et ajoutez les librairies pip de CounterFit.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer et configurer un projet Python CounterFit dans la leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md).
1. Installez une librairie pip supplémentaire afin d'installer une cale CounterFit pour le capteur DHT11. Assurez-vous que vous l'installez depuis un terminal avec l'environnement virtuel activé.
```sh
pip install counterfit-shims-seeed-python-dht
```
1. Assurez-vous que l'application web CounterFit est en cours d'exécution.
1. Créez un capteur d'humidité :
1. Dans la case *Create sensor* du volet *Sensors*, déroulez la case *Sensor type* et sélectionnez *Humidity*.
1. Laissez le paramètre *Units* à *Percentage*
1. Assurez vous que la variable *Pin* est à *5*
1. Sélectionnez le bouton **Add** pour créer le capteur d'humidité sur la broche 5
![Paramètres du capteur d'humidité](../../../../images/counterfit-create-humidity-sensor.png)
Le capteur d'humidité sera créé et apparaîtra dans la liste des capteurs.
![Le capteur d'humidité créé](../../../../images/counterfit-humidity-sensor.png)
1. Créez un capteur de température :
1. Dans la case *Create sensor* du volet *Sensors*, déroulez la case *Sensor type* et sélectionnez *Temperature*
1. Laissez la variable *Units* à *Celsius*
1. Assurez vous que la variable *Pin* est à *6*
1. Sélectionnez le bouton **Add** pour créer le capteur de température sur la broche 6
![Paramètres du capteur de température](../../../../images/counterfit-create-temperature-sensor.png)
Le capteur de température sera créé et apparaîtra dans la liste des capteurs
![Création du capteur de température](../../../../images/counterfit-temperature-sensor.png)
## Programmez l'application de la sonde de température
L'application du capteur de température peut maintenant être programmée en utilisant les capteurs CounterFit.
### Tâche - programmer l'application du capteur de température
Programmez l'application du capteur de température.
1. Assurez-vous que l'application `temperature-sensor` est ouverte dans VS Code.
1. Ouvrez le fichier `app.py`.
1. Ajoutez le code suivant au début de `app.py` pour connecter l'application à CounterFit :
```python
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
```
1. Ajoutez le code suivant au fichier `app.py` pour importer les bibliothèques requises :
```python
import time
from counterfit_shims_seeed_python_dht import DHT
```
L'instruction `from seeed_dht import DHT` importe la classe de capteur `DHT` pour interagir avec un capteur de température Grove virtuel utilisant une shim du module `counterfit_shims_seeed_python_dht`.
1. Ajoutez le code suivant après le code ci-dessus pour créer une instance de la classe qui gère le capteur virtuel d'humidité et de température :
```python
sensor = DHT("11", 5)
```
Ceci déclare une instance de la classe `DHT` qui gère le capteur virtuel **D**numérique **H**umidité et **T**température. Le premier paramètre indique au code que le capteur utilisé est un capteur virtuel *DHT11*. Le deuxième paramètre indique au code que le capteur est connecté au port `5`.
> 💁 CounterFit simule ce capteur combiné d'humidité et de température en se connectant à 2 capteurs, un capteur d'humidité sur la broche donnée lors de la création de la classe `DHT`, et un capteur de température qui se trouve sur la broche suivante. Si le capteur d'humidité est sur la broche 5, la cale s'attend à ce que le capteur de température soit sur la broche 6.
1. Ajoutez une boucle infinie après le code ci-dessus pour interroger la valeur du capteur de température et l'imprimer sur la console :
```python
while True:
_, temp = sensor.read()
print(f'Temperature {temp}°C')
```
L'appel à `sensor.read()` renvoie un tuple d'humidité et de température. Vous n'avez besoin que de la valeur de la température, l'humidité est donc ignorée. La valeur de la température est ensuite imprimée sur la console.
1. Ajoutez une petite mise en veille de dix secondes à la fin de la "boucle", car les niveaux de température n'ont pas besoin d'être vérifiés en permanence. Une mise en veille réduit la consommation d'énergie de l'appareil.
```python
time.sleep(10)
```
1. À partir du terminal VS Code avec un environnement virtuel activé, exécutez ce qui suit pour lancer votre application Python :
```sh
python app.py
```
1. Depuis l'application CounterFit, modifiez la valeur de la sonde de température qui sera lue par l'application. Vous pouvez le faire de deux façons :
* Entrez un nombre dans la case *Value* pour le capteur de température, puis sélectionnez le bouton **Set**. Le nombre que vous saisissez sera la valeur renvoyée par le capteur.
* Cochez la case *Random* et saisissez une valeur *Min* et *Max*, puis sélectionnez le bouton **Set**. Chaque fois que le capteur lit une valeur, il lit un nombre aléatoire entre *Min* et *Max*.
Vous devriez voir les valeurs que vous avez définies apparaître dans la console. Changez les paramètres *Value* ou *Random* pour voir la valeur changer.
```output
(.venv) ➜ temperature-sensor python app.py
Temperature 28.25°C
Temperature 30.71°C
Temperature 25.17°C
```
> 💁 Vous pouvez trouver ce code dans le fichier [code-temperature/virtual-device](../code-temperature/virtual-device).
😀 Votre programme de capteur de température a été un succès !

@ -1,68 +0,0 @@
# Publier la température - Terminal Wio
Dans cette partie de la leçon, vous allez publier les valeurs de température détectées par le terminal Wio sur MQTT afin qu'elles puissent être utilisées ultérieurement pour calculer le DJC.
## Publier la température
Une fois la température lue, elle peut être publiée via MQTT vers un code "serveur" qui lira les valeurs et les stockera, prêtes à être utilisées pour un calcul de DJC. Les microcontrôleurs ne lisent pas l'heure sur Internet et ne suivent pas l'heure avec une horloge en temps réel. Le dispositif doit être programmé pour le faire, en supposant qu'il dispose du matériel nécessaire.
Afin de simplifier les choses pour cette leçon, l'heure ne sera pas envoyée avec les données du capteur, mais pourra être ajoutée par le code du serveur plus tard, lorsqu'il recevra les messages.
### Tâche
Programmez l'appareil pour qu'il publie les données de température.
1. Ouvrez le projet Wio Terminal `temperature-sensor`.
1. Répétez les étapes de la leçon 4 pour vous connecter à MQTT et envoyer la télémétrie. Vous utiliserez le même courtier public Mosquitto.
Les étapes à suivre sont les suivantes :
- Ajouter les bibliothèques Seeed WiFi et MQTT au fichier `.ini`.
- Ajouter le fichier de configuration et le code pour se connecter au WiFi
- Ajouter le code pour se connecter au broker MQTT
- Ajouter le code pour publier la télémétrie
> ⚠️ Consultez les [instructions pour la connexion à MQTT].(../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md) ainsi que les [instructions pour l'envoi de la télémétrie](../../../../1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md) de la leçon 4 si nécessaire.
1. Assurez-vous que le `CLIENT_NAME` dans le fichier d'en-tête `config.h` reflète ce projet :
```cpp
const string CLIENT_NAME = ID + "temperature_sensor_client";
```
1. Pour la télémétrie, au lieu d'envoyer une valeur de lumière, envoyez la valeur de température lue par le capteur DHT dans une propriété du document JSON appelée `temperature` en modifiant la fonction `loop` dans `main.cpp` :
```cpp
float temp_hum_val[2] = {0};
dht.readTempAndHumidity(temp_hum_val);
DynamicJsonDocument doc(1024);
doc["temperature"] = temp_hum_val[1];
```
1. La valeur de la température n'a pas besoin d'être lue très souvent - elle ne changera pas beaucoup dans un court laps de temps, donc réglez le "retard" de la fonction "boucle" à 10 minutes :
```cpp
delay(10 * 60 * 1000);
```
> 💁 La fonction `delay` prend le temps en millisecondes, donc pour faciliter la lecture, la valeur est passée comme le résultat d'un calcul. 1 000 ms en une seconde, 60s en une minute, donc 10 x (60s en une minute) x (1000 ms en une seconde) donne un délai de 10 minutes.
1. Téléchargez-le sur votre terminal Wio, et utilisez le moniteur série pour voir la température envoyée au courtier MQTT.
```output
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Connecting to WiFi..
Connected!
Attempting MQTT connection...connected
Sending telemetry {"temperature":25}
Sending telemetry {"temperature":25}
```
> 💁 Vous pouvez trouver ce code dans le fichier [code-publish-temperature/wio-terminal].(../code-publish-temperature/wio-terminal).
😀 Vous avez publié avec succès la température en tant que télémétrie de votre appareil!

@ -1,129 +0,0 @@
# Mesure de la température - Terminal Wio
Dans cette partie de la leçon, vous allez ajouter un capteur de température à votre terminal Wio, et lire les valeurs de température à partir de celui-ci.
## Matériel
Le terminal Wio a besoin d'un capteur de température.
La sonde que vous utiliserez est une [sonde d'humidité et de température DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), combinant deux capteurs dans un même boîtier. Cette méthode est assez populaire, avec un certain nombre de capteurs disponibles dans le commerce combinant température, humidité et parfois pression atmosphérique. Le composant du capteur de température est une thermistance à coefficient de température négatif (CTN), une thermistance dont la résistance diminue lorsque la température augmente.
Il s'agit d'un capteur numérique, qui dispose donc d'un ADC intégré pour créer un signal numérique contenant les données de température et d'humidité que le microcontrôleur peut lire.
### Connecter le capteur de température
Le capteur de température Grove peut être connecté au port numérique des terminaux Wio.
#### Tâche - connecter le capteur de température
Connectez le capteur de température.
![Capteur de température Grove](../../../../images/grove-dht11.png)
1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité et de température. Il ne peut être inséré que dans un seul sens.
1. Le terminal Wio étant déconnecté de votre ordinateur ou de toute autre source d'alimentation, connectez l'autre extrémité du câble Grove à la prise Grove de droite du terminal Wio lorsque vous regardez l'écran. Il s'agit de la prise la plus éloignée du bouton d'alimentation.
![La sonde de température Grove connectée à la prise de droite](../../../../images/wio-temperature-sensor.png)
## Programmer le capteur de température
Le terminal Wio peut maintenant être programmé pour utiliser le capteur de température joint.
### Tâche - programmer le capteur de température
Programmez l'appareil.
1. Créez un tout nouveau projet Wio Terminal en utilisant PlatformIO. Appelez ce projet `temperature-sensor`. Ajoutez du code dans la fonction `setup` pour configurer le port série.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project).
1. Ajoutez une dépendance de la bibliothèque de capteurs d'humidité et de température Seeed Grove au fichier `platformio.ini` du projet :
```ini
lib_deps =
seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1
```
> ⚠️ Vous pouvez vous référer [aux instructions pour ajouter des bibliothèques à un projet PlatformIO dans le projet 1, leçon 4 si nécessaire](../../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md#install-the-wifi-and-mqtt-arduino-libraries).
1. Ajoutez les directives `#include` suivantes en haut du fichier, sous la directive existante `#include <Arduino.h>` :
```cpp
#include <DHT.h>
#include <SPI.h>
```
Ceci importe les fichiers nécessaires pour interagir avec le capteur. Le fichier d'en-tête `DHT.h` contient le code du capteur lui-même, et l'ajout de l'en-tête `SPI.h` garantit que le code nécessaire pour parler au capteur est lié lors de la compilation de l'application.
1. Avant la fonction "setup", déclarez le capteur DHT :
```cpp
DHT dht(D0, DHT11);
```
Ceci déclare une instance de la classe `DHT` qui gère le capteur **D**numérique **H** d'humidité et **T** de température. Celle-ci est connectée au port `D0`, le connecteur Grove de droite sur le terminal Wio. Le second paramètre indique au code que le capteur utilisé est le capteur *DHT11* - la bibliothèque que vous utilisez supporte d'autres variantes de ce capteur.
1. Dans la fonction `setup`, ajoutez du code pour configurer la connexion série :
```cpp
void setup()
{
Serial.begin(9600);
while (!Serial)
; // Wait for Serial to be ready
delay(1000);
}
```
1. A la fin de la fonction `setup`, après le dernier `delay`, ajoutez un appel pour démarrer le capteur DHT :
```cpp
dht.begin();
```
1. Dans la fonction `loop`, ajoutez du code pour appeler le capteur et imprimer la température sur le port série :
```cpp
void loop()
{
float temp_hum_val[2] = {0};
dht.readTempAndHumidity(temp_hum_val);
Serial.print("Temperature: ");
Serial.print(temp_hum_val[1]);
Serial.println ("°C");
delay(10000);
}
```
Ce code déclare un tableau vide de 2 flottants, et le passe à l'appel à `readTempAndHumidity` sur l'instance `DHT`. Cet appel remplit le tableau avec 2 valeurs - l'humidité va dans l'élément 0 du tableau (rappelez-vous qu'en C++ les tableaux sont basés sur 0, donc le 0ème élément est le 'premier' élément du tableau), et la température va dans le 1er élément.
La température est lue à partir du premier élément du tableau, et imprimée sur le port série.
> 🇺🇸 La température est lue en Celsius. Pour les Américains, pour la convertir en Fahrenheit, il faut diviser la valeur Celsius lue par 5, puis multiplier par 9, puis ajouter 32. Par exemple, une température de 20°C devient ((20/5)*9) + 32 = 68°F.
1. Construisez et téléchargez le code sur le terminal Wio.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app).
1. Une fois téléchargé, vous pouvez surveiller la température en utilisant le moniteur série :
```output
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Temperature: 25.00°C
Temperature: 25.00°C
Temperature: 25.00°C
Temperature: 24.00°C
```
> 💁 Vous pouvez trouver ce code dans le fichier [code-température/wio-terminal](../code-temperature/wio-terminal).
😀 Votre programme de capteur de température a été un succès !

@ -1,261 +0,0 @@
# মাটির আর্দ্রতা নির্ণয়
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-6.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
>
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/11)
## সূচনা
গত পাঠে আমরা একটি পারিপার্শ্বিক বৈশিষ্ট্য পরিমাপ করেছি এবং উদ্ভিদ বৃদ্ধির পূর্বাভাস দেওয়ার জন্য এটি ব্যবহার করে দেখেছি। তাপমাত্রা নিয়ন্ত্রণ করা যায়, তবে এটি করা ব্যয়বহুল,এইজন্য নিয়ন্ত্রিত পরিবেশ প্রয়োজন। উদ্ভিদের বৃদ্ধির জন্য যে পারিপার্শ্বিক বৈশিষ্ট্য সহজে নিয়ন্ত্রণ করা যায়, হল পানি - এটি এমন কিছু যা বিশাল আকারের খামারে সেচকার্য থেকে শুরু করে, প্রতিদিন ছোট বাচ্চারা তাদের বাগানে পানি দেয়ার পাত্র দিয়ে নিয়ন্ত্রণ করে।
![A child watering a garden](../../../../images/child-watering-garden.jpg)
এই পাঠে আমরা শিখবো মাটির আর্দ্রতা পরিমাপ করা এবং পরবর্তী পাঠে কীভাবে একটি স্বয়ংক্রিয় জল সরবরাহ ব্যবস্থা নিয়ন্ত্রণ করা যায় তা জানবো। এই পাঠটি তৃতীয় আরেকটি সেন্সরের সাথে আমাদের পরিচয় করিয়ে দিবে। আমরা ইতিমধ্যে একটি আলোক সেন্সর, একটি তাপমাত্রা সেন্সর ব্যবহার করেছি। সুতরাং এই পাঠে আমরা জানবো কীভাবে একটি মাটির আর্দ্রতা সংবেদক ডেটা প্রেরণ করা যাবে - এছাড়াও আইওটি ডিভাইসগুলির সাথে কীভাবে সেন্সর এবং অ্যাকচুয়েটর যোগাযোগ করে সে সম্পর্কে আরও জানতে পারবো।
এই পাঠে অন্তর্ভুক্ত রয়েছেঃ
* [মাটির আদ্রতা](#মাটির-আদ্রতা)
* [আইওটি ডিভাইসের সাথে সেন্সরগুলি কীভাবে যোগাযোগ করে](#সেন্সর-কীভাবে-আইওটি-ডিভাইসের-সাথে-যোগাযোগ-করে)
* [মাটিতে আর্দ্রতার মাত্রা পরিমাপ](#মাটিতে-আর্দ্রতার-মাত্রা-পরিমাপ)
* [সেন্সর ক্যালিব্রেশন](#সেন্সর-ক্যালিব্রেশন)
## মাটির আদ্রতা
গাছপালা জন্মাতে পানি প্রয়োজন। তারা পুরো দেহ জুড়ে পানি শোষণ করে, বেশিরভাগই মূল দ্বারা শোষিত হয়। উদ্ভিদ পানি তিনটি জিনিসের জন্য ব্যবহার করে:
* [সালোকসংশ্লেষণ](https://wikipedia.org/wiki/Photosynthesis) - উদ্ভিদ পানি, কার্বন ডাইঅক্সাইড এবং আলো দিয়ে কার্বোহাইড্রেট এবং অক্সিজেন তৈরির জন্য রাসায়নিক বিক্রিয়া তৈরি করে।
* [প্রস্বেদন](https://wikipedia.org/wiki/Transpiration) - গাছপালা বাতাসে পানি অপসারণ করে বাষ্পাকারে। এই প্রক্রিয়াটি উদ্ভিদের চারপাশে পুষ্টি বহন করে এবং উদ্ভিদকে শীতল করে, যেমন মানুষের ঘাম হয়।
* গঠন - গাছের কাঠামো বজায় রাখতে পানি প্রয়োজন - এদের 90% পানি (মানুষের যেখানে 60%) এবং এই পানি তাদের দেহের কোষগুলিকে শক্ত রাখে। যদি একটি উদ্ভিদের পর্যাপ্ত পানি না থাকে, তবে এটি মারা যাবে ।
![Water is absorbed through plant roots then carried around the plant, being used for photosynthesis and plant structure](../../../../images/transpiration.png)
✅ ছোট একটি গবেষণা করা যাক: প্রস্বেদনের মাধ্যমে কতটা পানি নির্গমণ হয়?
মূল উদ্ভিদের বৃদ্ধির জন্য মাটির আর্দ্রতা থেকে পানি সরবরাহ করে। মাটিতে খুব কম পানি থাকলে , উদ্ভিদ বৃদ্ধি পেতে পর্যাপ্ত পরিমাণে শোষণ করতে পারে না। আবার প্রচুর পরিমাণে পানি থাকলে শিকড় প্রয়োজনীয় অক্সিজেন গ্রহণ করতে পারে না। এর ফলে তা মারা যায় এবং গাছটি বেঁচে থাকার জন্য পর্যাপ্ত পুষ্টি পেতে পারে না।
একজন কৃষকের সর্বোত্তম গাছের বৃদ্ধি পাওয়ার জন্য মাটি খুব বেশি ভেজা বা খুব বেশি শুকনো - কোনটিই হওয়া যাবেনা। আইওটি ডিভাইসগুলি এক্ষেত্রে সাহায্য করতে পারে - মাটির আর্দ্রতা পরিমাপ করে , কেবল যখন প্রয়োজন হয় তখনই কৃষককে সেচ দেয়ার বার্তা দিবে।
### মাটির আর্দ্রতা মাপার উপায়সমূহ
মাটির আর্দ্রতা পরিমাপ করতে বিভিন্ন ধরণের সেন্সর ব্যবহার করা যায়ঃ
* রোধক-ভিত্তিক সেন্সর - একটি রেজিস্টিভ সেন্সরের দুটি প্রোব রয়েছে যা মাটিতে সংযুক্ত থাকে। একটির মাধ্যমে তড়িৎ প্রবাহ প্রেরণ করা হয়, এবং অন্যটি দ্বারা গৃহীত হয়। ১মটি থেকে ২য়টির মাঝে তড়িতের পার্থক্যের মাধ্যমে সেন্সর মাটির রোধের পরিমাপ করে । পানি বিদ্যুতের একটি ভাল কন্ডাক্টর, তাই মাটির পানির পরিমাণ যত বেশি থাকে তত প্রতিরোধ ক্ষমতা কম হয়।
![A resistive soil moisture sensor](../../../../images/resistive-soil-moisture-sensor.png)
> 💁 কয়েক সেন্টিমিটার দূরত্বে দুটি পৃথক ধাতুর দুটি টুকরো ব্যবহার করে এবং একটি মাল্টিমিটার ব্যবহার করে তাদের মধ্যে প্রতিরোধের পরিমাপ করে আমরা একটি মাটির আর্দ্রতা সেন্সর তৈরি করতে পারি।
* ক্যাপাসিটর-ভিত্তিক সেন্সর - একটি ক্যাপাসিটিভ আর্দ্রতা সেন্সর ২টি পজিটিভ এবং নেগেটিভ বৈদ্যুতিক প্লেট এর মাঝে বৈদ্যুতিক চার্জের পরিমাণকে পরিমাপ করে যাকে [ক্যাপাসিট্যান্স](https://wikipedia.org/wiki/Capacitance) বলা হয়। আর্দ্রতার মাত্রা পরিবর্তনের সাথে সাথে মাটির ক্যাপাসিট্যান্স পরিবর্তিত হয় এবং এটির প্রভাবে ভোল্টেজ পরিবর্তন হয় এবং তা আইওটি ডিভাইস দ্বারা পরিমাপ করা যায়। মাটি যত বেশি ভেজা, ততই কম ভোল্টেজ আসে।
![A capacitive soil moisture sensor](../../../../images/grove-capacitive-soil-moisture-sensor.png)
এগুলি অ্যানালগ সেন্সর, মাটির আর্দ্রতা নির্দেশ করতে ভোল্টেজ পরিমাপ করে। তাহলে এই ভোল্টেজটি আমাদের কোডে কিভাবে আসে? সেন্সর আরো আলাপের আগে আমরা দেখে নিবো আইওটি ডিভাইসগুলির সাথে সেন্সর এবং অ্যাকচুয়েটর কীভাবে যোগাযোগ করে ।
## সেন্সর কীভাবে আইওটি ডিভাইসের সাথে যোগাযোগ করে
এখন পর্যন্ত এই পাঠগুলিতে আমরা বেশ কয়েকটি সেন্সর এবং অ্যাকচুয়েটর সম্পর্কে শিখেছি এবং যদি কেউ হার্ডওয়্যার ল্যাবগুলি করে থাকে, তবে এগুলি তার আইওটি ডেভ কিটের সাথে যোগাযোগ করে চলেছে। কিন্তু এই যোগাযোগ কীভাবে কাজ করে? মাটির আর্দ্রতা সেন্সর থেকে রোধের পরিমাপ এর মত একটি সাধারণ সংখ্যা কোডে কীভাবে ব্যবহার করা হচ্ছে?
বেশিরভাগ ক্ষেত্রেই সেন্সর এবং অ্যাকচুয়েটরের সাথে যোগাযোগের জন্য হার্ডওয়্যার এবং একটি যোগাযোগ প্রোটোকল প্রয়োজন - এটি ডেটা প্রেরণ এবং গ্রহণের সর্বজনস্বীকৃত উপায়। উদাহরণস্বরূপ একটি ক্যাপাসিটিভ আর্দ্রতা সেন্সর এর কথা ভাবা যাক:
* এই সেন্সরটি আইওটি ডিভাইসের সাথে কীভাবে সংযুক্ত রয়েছে?
* যদি এটি ভোল্টেজ পরিমাপ করে(যা কিনা একটি অ্যানালগ সংকেত), তবে এটির ডিজিটাল উপস্থাপনা তৈরি করতে এডিসি (AC to DC) এর প্রয়োজন হবে যা এনালগ ডেটাকে 0 এবং 1 হিসেবে পাঠাবে। তবে প্রতিটি বিট কতক্ষণ সময়ের জন্য পাঠানো হবে?
* আবার কোন সেন্সর যদি কোন ডিজিটাল মান দেয়, তবে এটি 0 এবং 1 এর সিরিজ পাঠাবে। এক্ষেত্রেও প্রশ্ন হলো প্রতিটি বিট কতক্ষণ সময়ের জন্য প্রেরণ করা হয়?
* যদি .১ সেকেন্ডের জন্য ভোল্টেজ হাই (High) থাকে, তবে এটি কী একক ১বিট নাকি ২টি একটানা বিটের মান নাকি ১০টির ?
* ঠিক কোন সময়ে এই সংখ্যা গুলো গণনা শুরু হয়? `00001101` কী 25, বা প্রথম 5 টি বিট কী পূর্ববর্তী মানের শেষাংশ?
হার্ডওয়্যার একটি বস্তুগত সংযোগ তৈরী করে যার মাধ্যমে ডেটা প্রেরণ করা হয়। এখানে বিভিন্ন যোগাযোগ প্রোটোকল এটি নিশ্চিত করে যে, ডেটা প্রেরণ বা গ্রহণ সঠিক উপায়ে হচ্ছে যাতে প্রতিটি স্তরে ডেটা ব্যবহার উপযোগী থাকে।
### General Purpose Input Output (GPIO) pins
জিপিআইও হল পিনের এমন একটি সেট যা আইওটি ডিভাইসের সাথে হার্ডওয়্যার সংযোগ করতে ব্যবহার করা যাবে। প্রায়শই আইওটি ডেভলাপার কিটগুলিতে যেমন রাস্পবেরি পাই বা উইও টার্মিনালে এই পিন পাওয়া যায়। আমরা এই পাঠে আলোচনা হতে যাওয়া বিভিন্ন প্রোটোকল আমরা GPIO পিনের সাথে ব্যবহার করতে পারবো। কিছু জিপিআইও পিন ভোল্টেজও সরবরাহ করে, সাধারণত 3.3V বা 5V, কিছু পিন গ্রাউন্ড করা থাকে এবং অন্যগুলো প্রোগ্রামিং এর মাধ্যমে নিয়ন্ত্রণ করা হয় এরা হয় ভোল্টেজ (আউটপুট) প্রেরণ করতে পারে, বা একটি ভোল্টেজ (ইনপুট) গ্রহণ করতে পারে।
> 💁 বৈদ্যুতিক সার্কিট সম্পূর্ণ করার জন্য মূলত গ্রাউন্ডের সাথে কোন একটি ভোল্টেজ সংযোগ করতে হবে। কোন ব্যাটারির পজিটিভ (+ ve) টার্মিনাল হিসাবে ভোল্টেজ এবং নেগেটিভ (-ve) টার্মিনাল হিসাবে গ্রাউন্ডকে চিন্তা করা যায়।
শুধুমাত্র অন/অফ (High/Low) ভ্যালুর প্রয়োজন হলে GPIO পিনকে সরাসরি ডিজিটাল সেন্সর বা একচুয়েটরের সাথে সংযোগ করা যায়। উদাহরণস্বরূপঃ
* বাটন - You can connect a button between a 5V pin and a pin set to input. When you press the button it completes a circuit between the 5V pin, through the button to the input pin. From code you can read the voltage at the input pin, and if it is high (5V) then the button is pressed, if it is low (0v) then the button is not pressed. Remember the actual voltage itself is not read, instead you get a digital signal of 1 or 0 depending on if the voltage is above a threshold or not.
একটি 5 ভোল্টের পিন এবং ইনপুট পিনের মধ্যে একটি বাটন সংযোগ করা যায়। বাটন প্রেস করলে, 5V পিন থেকে বাটনের ভেতর দিয়ে এটি একটি ইনপুট সার্কিট সম্পূর্ণ করে। কোড থেকে ইনপুট পিনের ভোল্টেজ এর মান জানা যায়। যদি মান High (5V) হয়, তবে তার মানে বাটনে প্রেস করা হয়েছে কিন্তু যদি এটি Low(0V) হয়, সেটি বোঝায় যে বাটনে প্রেস করা হয়নি। এক্ষেত্রে এটি অবশ্যই মনে রাখতে হবে যে এখানে প্রকৃত ভোল্টেজ আসেনি, বরং এর ডিজিটাল সিগন্যাল হিসেবে 1 বা 0 এসেছে।
![A button is sent 5 volts. When not pressed it returns 0 volts, or 0, when pressed it returns 5 volts, or 1](../../../../images/button-with-digital.png)
* এলইডি - একটি আউটপুট পিন এবং গ্রাউন্ড পিনের মধ্যে একটি এলইডি সংযোগ করা যাবে ( এখানে একটি রেজিস্টর বা রোধ ব্যবহার করতে হবে, অন্যথায় এলইডি পুড়ে যাবে)। কোড থেকে আপনি আউটপুট পিনটি High সেট করলে এটি 3.3V প্রেরণ করবে। এখানে 3.3V পিন থেকে এলইডি এর মাধ্যমে গ্রাউন্ড পিনে একটি সার্কিট তৈরি হয়েছে। এতে LED জ্বলে উঠবে।
![An LED is sent a signal of 0 (3.3V), which lights the LED. If it is sent 0 (0v), the LED is not lit.](../../../../images/led-digital-control.png)
আরও উন্নত সেন্সরগুলির জন্য, সেন্সর এবং অ্যাকচুয়েটরের সাথে জিপিআইও পিনগুলি সরাসরি ডিজিটাল ডেটা প্রেরণ এবং গ্রহণের জন্য সরাসরি ব্যবহার করা যায়। ADC এবং DAC সহ কন্ট্রোলার বোর্ডের মাধ্যমেও অ্যানালগ সেন্সর এবং অ্যাকচুয়েটরের সাথে যোগাযোগ স্থাপন করা যাবে।
> 💁 এই ল্যাবগুলির জন্য একটি রাস্পবেরি পাই ব্যবহার করলে, সেটিতে গ্রোভ বেস হ্যাট এর জিপিআইওর মাধ্যমে এনালগ সেন্সর সংকেতগুলিকে ডিজিটাল রূপান্তর করতে হার্ডওয়্যার রয়েছে।
✅ জিপিআইও পিন সহ আইওটি ডিভাইস আমাদের কাছে থাকলে, এই পিনগুলি সন্ধান করে কোনগুলো গ্রাউন্ড আবার কোনগুলা ভোল্টেজের জন্য বা প্রোগ্রামেবল - তা সনাক্ত করি।
### অ্যানালগ পিন
কিছু ডিভাইস, যেমন আরডুইনো ডিভাইসগুলিতে অ্যানালগ পিন থাকেে। এগুলি জিপিআইও পিনের মতই, তবে ডিজিটাল সিগন্যাল সমর্থন করার পরিবর্তে, তাদের কাছে ভোল্টেজ রেঞ্জকে সংখ্যাসূচক মানগুলিতে রূপান্তর করতে একটি এডিসি রয়েছে। সাধারণত এডিসির একটি 10-বিট রেজোলিউশন থাকে যার অর্থ এটি ভোল্টেজকে 0 থেকে 1,023 এর একটি মানে রূপান্তর করে।
উদাহরণস্বরূপ, একটি 3.3V বোর্ডে, সেন্সরটি যদি 3.3V প্রদান করে, তবে প্রত্যাবর্তিত মানটি হবে 1,023। যদি প্রাপ্ত ভোল্টেজটি 1.65v হয়, তবে তার মান 511 হবে।
![A soil moisture sensor sent 3.3V and returning 1.65v, or a reading of 511](../../../../images/analog-sensor-voltage.png)
> 💁 নাইটলাইট এ ফিরে যাই - লেসন-৩ : আলোক সেন্সর 0-1,023 এর একটি মান দেয়। যদি আমরা উইও টার্মিনাল ব্যবহার করি, তবে সেন্সরটি একটি এনালগ পিনের সাথে সংযুক্ত ছিল। যদি আমরা রাস্পবেরি পাই ব্যবহার করি, তবে তা জিপিআইও পিনের সাথে যোগাযোগের জন্য ইন্টিগ্রেটেড এডিসিযুক্ত বেস হ্যাটে একটি এনালগ পিনের সাথে সংযুক্ত ছিল। ভার্চুয়াল ডিভাইসটি একটি অ্যানালগ পিনের অনুকরণ করতে 0-1,023 থেকে একটি মান প্রেরণের জন্য সেট করা হয়েছিল।
মাটির আর্দ্রতা সেন্সরগুলি ভোল্টেজের উপর নির্ভর করে, সুতরাং এনালগ পিনগুলি ব্যবহার করে 0-1,023 এর মান দেবে।
### Inter Integrated Circuit (I<sup>2</sup>C)
I<sup>2</sup>C, যেটিকে পড়া হয় *I-স্কয়ার-C*, একটি মাল্টি কন্ট্রোলার, মাল্টি পেরিফেরাল ব্যবস্থা যা কোন সংযুক্ত ডিভাইস একটি মাল্টি-কন্ট্রোলার, মাল্টি পেরিফেরিয়াল প্রোটোকল হিসেবে কাজ করতে পারে I<sup>2</sup>C বাস (ডেটা স্থানান্তরকারী যোগাযোগ ব্যবস্থা) এর সাথে। সংযুক্ত ডিভাইসের এড্রেসযুক্ত প্রতিটি প্যাকেট সহ সকল ডেটাই এড্রেস প্যাকেট হিসাবে প্রেরণ করা হয়।
> 💁 এই মডেলটিকে প্রভু(Master)/ক্রীতদাস(Slave) হিসাবে উল্লেখ করা হত, তবে Slave বা দাসত্বের সাথে জড়িত থাকার কারণে এই পরিভাষা বাদ দেওয়া হচ্ছে। [Open Source Hardware Association থেকে বর্তমানে **controller/peripheral** এই পরিভাষা গৃহিত হয়েছে](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), তবে কিছু কিছু স্থানে এখনও পুরানো পরিভাষার উল্লেখ দেখতে পাওয়া যায়।
প্রটি ডিভাইসের একটি এড্রেস থাকে যা I<sup>2</sup>C বাসের সাথে সংযোগে দরকার হয় এবং এগুলো সাধারণত আগে থেকেই ডিভাইসে কোড করা থাকে। উদাহরণস্বরূপ, সীডের প্রতি ধরণের গ্রোভ সেন্সরের একই এড্রেস রয়েছে, সুতরাং সমস্ত আলোক সেন্সরের একই ঠিকানা রয়েছে, সমস্ত বাটনের একই ঠিকানা রয়েছে যা লাইট সেন্সর ঠিকানা থেকে পৃথক। কিছু ডিভাইসের সাথে জাম্পার সেটিংস বা সোল্ডারিং পিনগুলি একসাথে পরিবর্তন করে ঠিকানা পরিবর্তন করার উপায় রয়েছে।
I<sup>2</sup>C এর একটি বাস রয়েছে যাতে ২টি মেইন তার(Wire) এবং ২টি পাওয়ার সরবরাহের তার(Wire) রয়েছেঃ
| তার (Wire) | নাম | বর্ণনা |
| ---- | --------- | ----------- |
| SDA | Serial Data | এই তারটি ডিভাইসগুলির মধ্যে ডেটা প্রেরণের জন্য ব্যবহৃত হয় |
| SCL | Serial Clock | এই তারটি নিয়ামক দ্বারা নির্ধারিত হারে একটি ঘড়ি সংকেত প্রেরণ করে |
| VCC | Voltage common collector | ডিভাইসগুলির জন্য পাওয়ার সাপ্লাইয়ে ব্যবহৃত হয়। এটি এসডিএ এবং এসসিএল তারগুলির সাথে সংযুক্ত হয়ে একটি পুল-আপ রেজিস্টারের মাধ্যমে তাদের পাওয়ার সরবরাহ করে যা সিগন্যালকে অফ করে দিতে পারে, যখন কোন ডিভাইস নিয়ন্ত্রক থাকে না |
| GND | Ground | এটি বৈদ্যুতিক সার্কিটের জন্য একটি সাধারণ গ্রাউন্ড সরবরাহ করে |
![I2C bus with 3 devices connected to the SDA and SCL wires, sharing a common ground wire](../../../../images/i2c.png)
ডেটা প্রেরণের জন্য, একটি ডিভাইস প্রেরণ শুরুর শর্ত প্রকাশ করবে যা দ্বারা বোঝা যাবে যে এটি ডেটা প্রেরণের জন্য প্রস্তুত। এটি তখন নিয়ন্ত্রক বা কন্ট্রোলার ডিভাইস হিসেবে কাজ করবে। এরপরে নিয়ন্ত্রকটি সেই ডিভাইসের ঠিকানা প্রেরণ করে যার সাথে এটি যোগাযোগ করতে চায়, সেই সাথে এটিও জানানো হয় ডেটা Read নাকি Write কোনটি করতে চায়। ডেটা পাঠানোর পরে, কন্ট্রোলার এটি শেষ হয়ে গেছে তা বোঝাতে একটি স্টপ শর্ত প্রেরণ করে। এর পরে অন্য ডিভাইসটি নিয়ন্ত্রক হয়ে উঠতে পারে এবং ডেটা প্রেরণ বা গ্রহণ সে নিজেই শুরু করতে পারে।
I<sup>2</sup>C এর গতিসীমার লিমিট রয়েছে, যেখানে ৩টি ভিন্ন মোড রয়েছে বিভিন্ন স্পীডের। সবথেকে বেশি গতিশীল হলো High Speed mode যার সর্বোচ্চ স্পীড 3.4Mbps (megabits per second),যদিও খুব অল্পসংখ্যক ডিভাইসই এত স্পীড সরবরাহ করে। উদাহরণস্বরূপ রাস্পবেরি পাইয়ের কথা ধরা যাক, এটির গতি fast mode পর্যন্তই, যার মান 400Kbps (kilobits per second)। Standard mode টি এক্ষেত্রে 100Kbps সরবরাহ করে।
> 💁 আমরা যদি রাস্পবেরি পাইয়ের সাথে গ্রোভ বেস হ্যাট ব্যবহার করি আমাদের আইওটি হার্ডওয়্যার হিসেবে, সেখানে অনেকগুলো I<sup>2</sup>C সকেট দেখা যাবে, I<sup>2</sup>C সেন্সরের সাথে সংযোগ স্থাপনের জন্য। অ্যানালগ গ্রোভ সেন্সরগুলিও ডিজিটাল ডেটা হিসাবে অ্যানালগ মানগুলি প্রেরণ করতে একটি এডিসি সহ I<sup>2</sup>C ব্যবহার করে। তাহলে, আমাদের ব্যবহৃত আলোক সেন্সর যা একটি এনালগ পিনকে সিমুলেট করে, সেখানে শুধুমাত্র ডিজিটাল ডেটা সাপোর্ট করা পাই তে বার্তা পাঠানো হয়েছে I<sup>2</sup>C এর মাধ্যমে।
### Universal asynchronous receiver-transmitter (UART)
UART তে সার্কিটরি থাকে, যা দুটি ডিভাইসকে যোগাযোগ করার সুযোগ দেয়। প্রতিটি ডিভাইসে 2টি যোগাযোগ পিন থাকে - transmit (Tx) এবং receive (Rx), যেখানে দ্বিতীয় ডিভাইসের আরএক্স পিনের সাথে সংযুক্ত হয় প্রথম ডিভাইসের টিএক্স পিন এবং দ্বিতীয় ডিভাইসের টিএক্স পিনের সাথে ১মটির আরএক্স পিন সংযুক্ত হয়ে, উভয় দিক দিয়ে ডেটা প্রেরণের সুযোগ তৈরী করে।
* ডিভাইস-১ থেকে ডেটা পাঠানো হয়, এটির Tx পিনের মাধ্যমে, যা ২য় ডিভাইসের Rx পিন গ্রহণ করে।
* আবার, ডিভাইস-২ থেকে এটির Tx পিনের মাধ্যমে ডেটা পাঠানো হলে, তা ১ম ডিভাইসের Rx পিন গ্রহণ করে।
![UART with the Tx pin on one chip connected to the Rx pin on another, and vice versa](../../../../images/uart.png)
> 🎓 ডেটাকে বিট আকারে প্রেরণ করা হয় এবং এটি *সিরিয়াল* কম্যুনিকেশন হিসাবে পরিচিত। বেশিরভাগ অপারেটিং সিস্টেম এবং মাইক্রোকন্ট্রোলারগুলিতে * সিরিয়াল পোর্ট * থাকে, এটি এমন সংযোগ যা আমাদের কোডে থাকা সিরিয়াল ডেটা প্রেরণ ও গ্রহণ করতে পারে।
UART ডিভাইসে [baud rate](https://wikipedia.org/wiki/Symbol_rate) (অপর নাম 'সিম্বল রেট') নামক একটি বিষয় রয়েছে যেটি দ্বারা প্রতি সেকেন্ডে বিট আকারে ডেটা প্রেরণ ও গ্রহণের স্পীড বোঝায়। একটি সাধারণ baud rate হলো 9,600,যার মানে 9,600 bits (0 এবং 1) ডেটা প্রতি সেকেন্ডে প্রেরণ করা হচ্ছে।
UART তে স্টার্ট এবং স্টপ বিট রয়েছে - এটি স্টার্ট এবং স্টপ বিট প্রেরণ করে এই বিষয়টি জানায় যে এটি এখন ১ বাইট (৮ বিট) ডেটা পাঠাবে, তারপর সেই ৮বিটের পর একটি স্টপ বাইট যাবে।
UART স্পীড নির্ভর করে হার্ডওয়্যার গতির উপর, তবে সর্বোচ্চ গতিও 6.5 Mbpsএর বেশি হয়না।
আমরা UART কে ব্যবহার করে পারি GPIO পিনের মাধ্যমে - যেখানে ১টি পিনকে Tx এবং অন্যটিকে Rx হিসেবে সেট করে তারপর আরেকটি ডিভাইসের সাথে যুক্ত করতে হবে।
> 💁 যদি নিজের আইওটি হার্ডওয়্যার হিসাবে আমরা গ্রোভ বেস হ্যাট সহ রাস্পবেরি পাই ব্যবহার করি, তবে বোর্ডটিতে একটি ইউআরটি সকেট দেখা যাবে যা আমরা ইউআরটি প্রোটোকল ব্যবহার করে সেন্সরগুলির সাথে যোগাযোগ করতে ব্যবহার করতে পারবো।
### Serial Peripheral Interface (SPI)
এসপিআই হলো স্বল্প দূরত্বে যোগাযোগের জন্য ডিজাইন করা পদ্ধতি যেমনঃ মাইক্রোকন্ট্রোলারের মাধ্যমে ফ্ল্যাশ মেমরির মতো স্টোরেজ ডিভাইসে যোগাযোগ করা। এটি একক নিয়ন্ত্রক (সাধারণত আইওটি ডিভাইসের প্রসেসর) যা একাধিক পেরিফেরালের সাথে যোগাযোগ করতে সক্ষম এমন একটি controller/peripheral মডেলের উপর ভিত্তি করে নির্মিত। নিয়ন্ত্রক একটি পেরিফেরাল নির্বাচন করে এবং ডেটা প্রেরণ বা অনুরোধ করে সবকিছু নিয়ন্ত্রণ করে।
SPI কন্ট্রোলারে ৩টি তার ব্যবহৃত হয়, আর প্রতি পেরিফেরালে ১টি করে অতিরিক্ত তার। এগুলো হলোঃ
| তার | নাম | বর্ণনা |
| ---- | --------- | ----------- |
| COPI | Controller Output, Peripheral Input | এই তারটি নিয়ন্ত্রক থেকে পেরিফেরালে ডেটা প্রেরণের জন্য। |
| CIPO | Controller Input, peripheral Output | এই তারটি পেরিফেরাল থেকে নিয়ন্ত্রকে ডেটা প্রেরণের জন্য। |
| SCLK | Serial Clock | এই তারটি নিয়ামক দ্বারা নির্ধারিত হারে একটি ক্লক সিগন্যাল প্রেরণ করে। |
| CS | Chip Select | কন্ট্রোলারের একাধিক তার রয়েছে। প্রতি পেরিফেরালে একটি এবং প্রতিটি তারের পেরিফেরাল সিএস তারের সাথে সংযোগ স্থাপন করে। |
![SPI with on controller and two peripherals](../../../../images/spi.png)
CS তারটি একবারে একটি পেরিফেরাল সক্রিয় করতে ব্যবহৃত হয়। COPI এবং CIPO তারগুলিতে যোগাযোগ করে। যখন কন্ট্রোলারকে পেরিফেরাল পরিবর্তন করার দরকার হয়, এটি বর্তমানে সক্রিয় পেরিফেরিয়ালের সাথে সংযুক্ত সিএস তারগুলি নিষ্ক্রিয় করে। তারপরে যে পেরিফেরালে সাথে সংযুক্ত হতে চায়, তার সাথে কানেকশনকে সক্রিয় করে।
SPI হলো *ফুল-ডুপ্লেক্স* পদ্ধতি, অর্থাৎ COPI and CIPO ব্যবহার করে কন্ট্রোলার ও পেরিফেরাল একইসাথে ডেটা প্রেরণ ও গ্রহণ করতে পারবে। SPI মূলত SCLK wire এর মাধ্যমে যুক্ত হয়, যাতে সবগুলো ডিভাইসের মাঝে সুসংগতি(sync) বজায় রাখা যায়, যা UART এর স্টপ এবং স্টার্ট বিটের থেকে সম্পূর্ণ ভিন্ন কনসেপ্ট।
SPI এর কোন সুনির্দিষ্ট স্পীড লিমিট নেই, তাই প্রায়শোই সেকেন্ডে কয়েক মেগাবাইট স্পীডেও ডেটা পাঠানো যায়।
IoT developer kits গুলো সাধারণত GPIO পিনের মাধ্যমে SPI সাপোর্ট করে। উদাহরণস্বরূপ, রাস্পবেরি পাইয়ে GPIO পিন 19, 21, 23, 24 এবং 26 ব্যবহৃত হয় SPI এর জন্য।
### Wireless (তারবিহীন যোগাযোগ)
কিছু সেন্সর সাধারণ Wireless প্রোটোকলে যোগাযোগ স্থাপন করতে পারে যেমনঃ ব্লুটুথ (মূলত ব্লুটুথ লো এনার্জি বা BLE), LoRaWAN (a **Lo**ng **Ra**nge low power networking protocol) কিংবা ওয়াইফাই ব্যবহার করে। এতে সরাসরি হার্ডওয়্যারে যুক্ত না থেকেও সংযোগ স্থাপন করা যায়।
যেমন, বাণিজ্যিকভাবে ব্যবহৃত মাটির আর্দ্রতা সেন্সর । এগুলি কোনও জমিতে মাটির আর্দ্রতা পরিমাপ করে, তারপরে LoRaWan এর মাধ্যমে ডেটা কোনও হাব ডিভাইসে প্রেরণ করবে, যা ডেটা প্রক্রিয়া করবে বা ইন্টারনেটে প্রেরণ করবে। এটি সেন্সরটিকে আইওটি ডিভাইস থেকে দূরে থাকার সুযোগ দেয় যা ডেটা পরিচালনা সহজ করে, বিদ্যুতের খরচ এবং বড় ওয়াইফাই নেটওয়ার্ক বা দীর্ঘ তারের প্রয়োজনীয়তা হ্রাস করে।
ফিটনেস ট্র্যাকার এর মত উন্নত সেন্সর সম্বলিত যন্ত্রগুলোর জন্য বিএলই জনপ্রিয়। এগুলি একাধিক সেন্সর একত্রিত করে BLE এর মাধ্যমে ফোনে আইওটি ডিভাইসের সেন্সর ডেটা প্রেরণ করে।
✅ আমাদের নিজেদের বাড়িতে বা শিক্ষা প্রতিষ্ঠানে কোনও ব্লুটুথ সেন্সর রয়েছে কী? এর মধ্যে তাপমাত্রা সেন্সর, ডিভাইস ট্র্যাকার এবং ফিটনেস ডিভাইস অন্তর্ভুক্ত থাকতে পারে।
বাণিজ্যিক ডিভাইসগুলির সংযোগের জন্য একটি জনপ্রিয় উপায় হল জিগবি (Zigbee)। জিগবি ডিভাইসের মধ্যে মেশ নেটওয়ার্ক তৈরি করতে ওয়াইফাই ব্যবহার করে, যেখানে প্রতিটি ডিভাইস যতটা সম্ভব কাছাকাছি ডিভাইসের সাথে সংযোগ স্থাপন করে মাকড়সার ওয়েবের মতো সংযোগ তৈরি করে। যখন কোন ডিভাইস ইন্টারনেটে কোনও বার্তা প্রেরণ করতে চায় তখন এটি এটি নিকটতম ডিভাইসে প্রেরণ করতে পারে, যা এটি অন্য নিকটবর্তী ডিভাইসগুলিতে প্রেরণ করতে পারে এবং ততক্ষণ এটি চলে যতক্ষণ তা কোন সমন্বয়কের কাছে পৌঁছানোর মাধ্যমে এবং ইন্টারনেটে প্রেরণ হচ্ছেনা।
> 🐝 Zigbee শব্দটি এসেছে মূলত মৌচাকে মৌমাছির দোলনাচ (Waggle) থেকে ।
## মাটিতে আর্দ্রতার মাত্রা পরিমাপ
আমরা মাটির আর্দ্রতা সেন্সর, একটি আইওটি ডিভাইস এবং একটি ঘরের উদ্ভিদ ব্যবহার করে মাটিতে আর্দ্রতা স্তরটি পরিমাপ করতে পারবো।
### কাজ - মাটিতে আর্দ্রতার পরিমাপ
আইওটি ডিভাইস ব্যবহার করে মাটিতে আর্দ্রতার পরিমাপ করার জন্য নিম্নের যেকোন একটি প্রাসঙ্গিক গাইড অনুসরণ করা যেতে পারে।
* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md)
* [Single-board computer - Raspberry Pi](pi-soil-moisture.md)
* [Single-board computer - Virtual device](virtual-device-soil-moisture.md)
## সেন্সর ক্যালিব্রেশন
সেন্সরগুলি রোধ বা ক্যাপাসিট্যান্সের মতো বৈদ্যুতিক বৈশিষ্ট্যগুলির পরিমাপের উপর নির্ভর করে।
> 🎓 রোধ পরিমাপ করা হয় ওহম (Ω) এককে যার দ্বারা বোঝায় কোনও কিছুর মধ্য দিয়ে যাতায়াত করা বৈদ্যুতিক কারেন্টের কত প্রতিবন্ধকতা রয়েছে । যখন কোনও উপাদানের উপর ভোল্টেজ প্রয়োগ করা হয় তখন এর মধ্য দিয়ে প্রবাহিত কারেন্টের পরিমাণ উপাদানটির রোধের উপর নির্ভর করে। [উইকিপিডিয়া থেকে বৈদ্যুতিক রোধ](https://wikipedia.org/wiki/Electrical_resistance_and_conductance) পড়লে এ সংক্রান্ত আরো জানা যাবে।
> 🎓 ক্যাপাসিট্যান্স পরিমাপ করা হয় ফ্যারাড (F)এককে যার দ্বারা বোঝায় কোন উপাদান বা সার্কিটের বৈদ্যুতিক শক্তি সংগ্রহ এবং সঞ্চয় করার ক্ষমতা। [উইকিপিডিয়া থেকে ক্যাপাসিট্যান্স](https://wikipedia.org/wiki/Capacitance) পড়লে এ সংক্রান্ত আরো জানা যাবে।
এই পরিমাপগুলি সবসময়ই যে খুব বেশি ব্যবহারযোগ্য বা সরাসরি উপকারী - তা কিন্তু নয়। একটি তাপমাত্রা সেন্সর কল্পনা করা যাক যা 22.5KΩ পরিমাপ দিয়েছে! কিন্তু এর পরিবর্তে পরিমাপকৃত মানটি ক্যালিব্রেটেড হয়ে একটি দরকারী ইউনিটে রূপান্তরিত হওয়া দরকার - যা পরিমাপ করা মানের সাথে এর পরিমাণের তুলনা করে আমাদের কাজের জন্য ব্যবহারযোগ্য সঠিক এককে রূপান্তর করবে।
কিছু সেন্সর ব্যবহারের পূর্বেই ক্যালিব্রেটেড করা থাকে। উদাহরণস্বরূপ, গত পাঠটিতে যে তাপমাত্রা সেন্সরটি আমরা ব্যবহার করেছি সেটি ইতিমধ্যে ক্যালিব্রেট করা হয়েছিল যাতে এটি তাপমাত্রা পরিমাপ করে °C এককে। কারখানায় তৈরি প্রথম সেন্সরটি পরিচিত তাপমাত্রার এবং রোধের পরিমাপের একটি রেঞ্জ পাবে। এরপরে এটিতে কিছু গাণিতিক হিসেবের মাধ্যমে এমনভাবে তৈরী করা হবে যেন তা Ω (রোধের একক) এ মাপা মানকে °C এ রূপান্তর করতে পারে।
> 💁 রোধ থেকে তাপমাত্রার হিসেবের সমীকরণকে বলা হয় [SteinhartHart equation](https://wikipedia.org/wiki/SteinhartHart_equation)।
### মাটি আর্দ্রতা সেন্সর ক্যালিব্রেট করা
গ্রাভিমেট্রিক বা ভলিউমেট্রিক ভাবে পানির পরিমাণ ব্যবহার করে, মাটির আর্দ্রতা পরিমাপ করা হয়।
* গ্রাভিমেট্রিক হল প্রতি ইউনিট ভরের মাটির জন্য, পানির ভর যেমন, প্রতি কেজি শুষ্ক মাটির জন্য এতে পানির কেজি পরিমাণ।
* ভলিউমেট্রিক হলো প্রতি ইউনিট আয়তনের মাটির জন্য, পানির আয়তন যেমন, প্রতি কিউবমিটার শুষ্ক মাটির জন্য এতে পানির কিউবিক মিটার পরিমাণ।
মাটির আর্দ্রতা সেন্সরগুলি বৈদ্যুতিক রোধ বা ক্যাপাসিট্যান্স পরিমাপ করে - এটি কেবল মাটির আর্দ্রতার দ্বারা পরিবর্তিত হয় না, তবে মাটির উপাদানগুলিও তার বৈদ্যুতিক বৈশিষ্ট্যগুলিকে পরিবর্তন করতে পারে মাটির প্রকারভেদে। আদর্শভাবে সেন্সরগুলি ক্যালিব্রেট করা উচিত - এটি সেন্সর থেকে পাঠ গ্রহণ করছে এবং আরও বৈজ্ঞানিক পদ্ধতির সাহায্যে প্রাপ্ত পরিমাপগুলির সাথে তাদের তুলনা করছে। উদাহরণস্বরূপ, একটি ল্যাব বছরে কয়েকবার নেওয়া নির্দিষ্ট ক্ষেত্রের নমুনাগুলি ব্যবহার করে গ্র্যাভিমেট্রিক মাটির আর্দ্রতা গণনা করতে পারে, এবং এই সংখ্যাগুলি সেন্সরটি ক্যালিব্রেট করতে ব্যবহৃত হয়েছিল, যা সেন্সর পাঠকে গ্র্যাভিমেট্রিক মাটির আর্দ্রতার সাথে মিলিয়েছে।
![A graph of voltage vs soil moisture content](../../../../images/soil-moisture-to-voltage.png)
উপরের গ্রাফটি দেখায় যে কীভাবে সেন্সরটি ক্যালিব্রেট করতে হয়। ভোল্টেজ একটি মাটির নমুনার জন্য ক্যাপচার করা হয় যা পরে কোনও ল্যাবটিতে শুকনো ওজনের সাথে আর্দ্র ওজনের তুলনা করে (ওজন ভেজা পরিমাপ করে, তারপরে একটি চুলায় শুকিয়ে শুকনো পরিমাপ করে) পরিমাপ করা হয়। কয়েকটি রিডিং নেওয়া হয়ে গেলে, এটি কোনও গ্রাফ এবং পয়েন্টের সাথে লাগানো একটি লাইনে প্লট করা যেতে পারে। এই লাইনটি তখন আইওটি ডিভাইস দ্বারা গৃহীত মাটির আর্দ্রতা সংবেদক পাঠকে প্রকৃত মাটির আর্দ্রতা পরিমাপে রূপান্তর করতে ব্যবহার করা যেতে পারে।
💁 রোধভিত্তিক মাটির আর্দ্রতা সেন্সরগুলির জন্য, মাটির আর্দ্রতা বাড়ার সাথে সাথে ভোল্টেজ বৃদ্ধি পায়। ক্যাপাসিটিভ মাটি আর্দ্রতা সেন্সরগুলির জন্য, মাটির আর্দ্রতা বাড়ার সাথে সাথে ভোল্টেজ হ্রাস পায়, সুতরাং এর জন্য গ্রাফগুলি উপরের দিকে নয়, নীচের দিকে ঢালু হবে।
![A soil moisture value interpolated from the graph](../../../../images/soil-moisture-to-voltage-with-reading.png)
উপরের গ্রাফটি মাটির আর্দ্রতা সেন্সর থেকে পাওয়া একটি ভোল্টেজ রিডিং দেখায় এবং গ্রাফের রেখার সাথে এটি অনুসরণ করে প্রকৃত মাটির আর্দ্রতা গণনা করা যায়।
এই পদ্ধতির অর্থ কৃষকের একটি জমির জন্য কেবল অল্প কয়েকটি ল্যাব পরিমাপ দরকার, তারপরে তারা মাটির আর্দ্রতা পরিমাপ করতে আইওটি ডিভাইসগুলি ব্যবহার করা যাবে - যা পরিমাপের সময়কে দ্রুততর করবে।
---
## 🚀 চ্যালেঞ্জ
রোধভিত্তিক এবং ক্যাপাসিটিভ মাটির আর্দ্রতা সেন্সরের বিভিন্ন পার্থক্য রয়েছে। এই পার্থক্যগুলি কী কী এবং কোন ধরণটি কোন কৃষকের ব্যবহারের জন্য সবচেয়ে ভাল? এই পরামর্শ কী উন্নয়নশীল এবং উন্নত দেশগুলির মধ্যে পরিবর্তিত হয়?
## লেকচার-পরবর্তী কুইজ
[লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12)
## রিভিউ এবং স্ব-অধ্যয়ন
সেন্সর এবং অ্যাকচুয়েটরের জন্য ব্যবহৃত হার্ডওয়্যার এবং প্রোটোকল সম্পর্কে জানতে নিম্নোক্ত বিষয়গুলি পড়া উচিতঃ
* [GPIO Wikipedia page](https://wikipedia.org/wiki/General-purpose_input/output)
* [UART Wikipedia page](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter)
* [SPI Wikipedia page](https://wikipedia.org/wiki/Serial_Peripheral_Interface)
* [I<sup>2</sup>C Wikipedia page](https://wikipedia.org/wiki/I²C)
* [Zigbee Wikipedia page](https://wikipedia.org/wiki/Zigbee)
## Assignment
[সেন্সর ক্যালিব্রেশন](assignment.bn.md)

@ -1,262 +0,0 @@
# Détecter l'humidité du sol
![Un aperçu de cette leçon sous forme d'illustré](../../../../sketchnotes/lesson-6.jpg)
> Illustré par [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
## Quiz Pré-lecture
[Quiz Pré-lecture](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/11)
## Introduction
Dans la dernière leçon, nous avons étudié la mesure d'une propriété ambiante ainsi que son utilisation afin de prédire la croissance des plantes. La température peut être contrôlée, mais cette opération est coûteuse et nécessite des environnements contrôlés. La propriété ambiante la plus facile à contrôler pour les plantes est l'eau - un élément qui est contrôlé tous les jours, depuis les systèmes d'irrigation à grande échelle jusqu'aux jeunes enfants qui arrosent leur jardin avec un arrosoir.
![Un enfant arrosant un jardin](../../../../images/child-watering-garden.jpg)
Dans cette leçon, vous apprendrez à mesurer l'humidité du sol, et dans la leçon suivante, vous apprendrez à contrôler un système d'arrosage automatisé. Cette leçon introduit un troisième capteur, vous avez déjà utilisé un capteur de lumière, un capteur de température, donc dans cette leçon vous allez également en apprendre plus sur la façon dont les capteurs et les actionneurs communiquent avec les dispositifs IoT pour comprendre davantage comment un capteur d'humidité du sol peut envoyer des données à un dispositif IoT.
Dans cette leçon, nous aborderons:
* [Humidité du sol](#humidité-du-sol)
* [Comment les senseurs communiquent avec les composants IoT](#comment-les-senseurs-communiquent-avec-les-composants-IoT)
* [Mesurer les niveaux d'humidité dans le sol](#mesurer-les-niveaux-d-humidité-dans-le-sol)
* [Étalonnage du capteur](#étalonnage-du-capteur)
## Humidité du sol
Les plantes ont besoin d'eau pour se développer. Elles absorbent l'eau dans toute la plante, la majorité étant absorbée par le système racinaire. L'eau est utilisée par la plante pour trois choses :
* [Photosynthèse](https://wikipedia.org/wiki/Photosynthesis) - Les plantes créent une réaction chimique avec l'eau, le dioxyde de carbone et la lumière pour produire des hydrates de carbone et de l'oxygène.
* [Transpiration](https://wikipedia.org/wiki/Transpiration) - Les plantes utilisent l'eau pour diffuser le dioxyde de carbone de l'air dans la plante via les pores des feuilles. Ce processus permet également de transporter les nutriments autour de la plante et de la refroidir, comme la transpiration humaine.
* Structure - les plantes ont également besoin d'eau pour maintenir leur structure - elles sont composées à 90 % d'eau (contrairement aux humains qui n'en ont que 60 %), et cette eau maintient les cellules rigides. Si une plante n'a pas assez d'eau, elle se flétrit et finit par mourir.
![L'eau est absorbée par les racines des plantes, puis transportée dans la plante, utilisée pour la photosynthèse et la structure de la plante.](../../../../images/transpiration.png)
✅ Faites des recherches : quelle quantité d'eau est perdue par transpiration ?
Le système racinaire fournit de l'eau à partir de l'humidité du sol où pousse la plante. Trop peu d'eau dans le sol et la plante ne peut pas en absorber suffisamment pour se développer, trop d'eau et les racines ne peuvent pas absorber suffisamment d'oxygène nécessaire à leur fonctionnement. Les racines meurent alors et la plante ne peut pas obtenir suffisamment de nutriments pour survivre.
Pour qu'un agriculteur obtienne la meilleure croissance des plantes, le sol doit être ni trop humide ni trop sec. Les dispositifs IoT peuvent y contribuer en mesurant l'humidité du sol, ce qui permet à l'agriculteur de n'arroser que lorsque cela est nécessaire.
### Comment les senseurs communiquent avec les composants IoT
Il existe différents types de capteurs que vous pouvez utiliser pour mesurer l'humidité du sol :
* Résistif - un capteur résistif possède deux sondes qui pénètrent dans le sol. Un courant électrique est envoyé à une sonde et reçu par l'autre. Le capteur mesure alors la résistance du sol - en mesurant de combien le courant chute au niveau de la deuxième sonde. L'eau est un bon conducteur d'électricité, donc plus la teneur en eau du sol est élevée, plus la résistance est faible.
![Un capteur d'humidité du sol résistif](../../../../images/resistive-soil-moisture-sensor.png)
> 💁 Vous pouvez construire un capteur d'humidité du sol résistif en utilisant deux morceaux de métal, comme des clous, séparés de quelques centimètres, et en mesurant la résistance entre eux à l'aide d'un multimètre.
* Capacitif - un capteur d'humidité capacitif mesure la quantité de charge électrique qui peut être stockée entre une plaque électrique positive et une plaque négative, ou [capacitance](https://wikipedia.org/wiki/Capacitance). La capacitance du sol change en fonction du niveau d'humidité, et cela peut être converti en une tension qui peut être mesurée par un appareil IoT. Plus le sol est humide, plus la tension qui en ressort est faible.
![Un capteur capacitif d'humidité du sol](../../../../images/grove-capacitive-soil-moisture-sensor.png)
Ce sont tous deux des capteurs analogiques, qui renvoient une tension pour indiquer l'humidité du sol. Comment cette tension arrive-t-elle dans votre code ? Avant d'aller plus loin avec ces capteurs, voyons comment les capteurs et les actionneurs communiquent avec les appareils IoT.
## Comment les senseurs communiquent avec les composants IoT
Jusqu'à présent, dans ces leçons, vous avez appris à connaître un certain nombre de capteurs et d'actionneurs, et ceux-ci ont communiqué avec votre kit de développement IoT si vous avez fait les laboratoires de matériel physique. Mais comment cette communication fonctionne-t-elle ? Comment une mesure de résistance d'un capteur d'humidité du sol devient-elle un nombre utilisable dans le code ?
Pour communiquer avec la plupart des capteurs et des actionneurs, il faut du matériel et un protocole de communication, c'est-à-dire une méthode bien définie d'envoi et de réception des données. Prenons l'exemple d'un capteur capacitif d'humidité du sol :
* Comment ce capteur est-il connecté à l'appareil IoT ?
* S'il mesure une tension qui est un signal analogique, il aura besoin d'un "ADC" pour créer une représentation numérique de la valeur, et cette valeur est envoyée sous forme de tension alternative pour envoyer des 0 et des 1 - mais pendant combien de temps chaque bit est-il envoyé ?
* Si le capteur renvoie une valeur numérique, il s'agira d'un flux de 0 et de 1. Là encore, pendant combien de temps chaque bit est-il envoyé ?
* Si la tension est élevée pendant 0,1 s, s'agit-il d'un seul bit, de deux bits consécutifs ou de dix bits ?
* A quel moment le nombre commence-t-il ? Est-ce que `00001101` 25, ou est-ce que les 5 premiers bits sont la fin de la valeur précédente ?
Le matériel fournit la connectivité physique sur laquelle les données sont envoyées, les différents protocoles de communication garantissent que les données sont envoyées ou reçues de manière correcte pour pouvoir être interprétées.
### Broches d'entrée-sortie à usage général (GPIO)
GPIO est un ensemble de broches que vous pouvez utiliser pour connecter du matériel à votre dispositif IoT, et qui sont souvent disponibles sur les kits de développement IoT tels que le Raspberry Pi ou le Terminal Wio. Vous pouvez utiliser les différents protocoles de communication abordés dans cette section sur les broches GPIO. Certaines broches GPIO fournissent une tension, généralement 3,3 V ou 5 V, certaines broches sont des masses, et d'autres peuvent être configurées par programmation pour envoyer une tension (sortie) ou recevoir une tension (entrée).
> 💁 Un circuit électrique doit relier une tension à la terre via le circuit que vous utilisez. Vous pouvez considérer la tension comme la borne positive (+ve) d'une batterie et la terre comme la borne négative (-ve).
Vous pouvez utiliser les broches GPIO directement avec certains capteurs et actionneurs numériques lorsque vous ne vous préoccupez que des valeurs de marche ou d'arrêt - marche étant désignée comme haute, arrêt comme basse. Voici quelques exemples :
* Bouton. Vous pouvez connecter un bouton entre une broche 5V et une broche définie comme entrée. Lorsque vous appuyez sur le bouton, un circuit est créé entre la broche 5V, le bouton et la broche d'entrée. A partir du code, vous pouvez lire la tension sur la broche d'entrée, et si elle est élevée (5V), le bouton est enfoncé, si elle est basse (0V), le bouton n'est pas enfoncé. Rappelez-vous que la tension réelle elle-même n'est pas lue, mais que vous obtenez un signal numérique de 1 ou 0 selon que la tension est supérieure ou non à un seuil.
![On envoie 5 volts à un bouton. Lorsqu'il n'est pas enfoncé, il renvoie 0 volt, ou 0, lorsqu'il est enfoncé, il renvoie 5 volts, ou 1](../../../../images/button-with-digital.png)
* LED. Vous pouvez connecter une LED entre une broche de sortie et une broche de masse (en utilisant une résistance, sinon vous allez brûler la LED). À partir du code, vous pouvez mettre la broche de sortie à un niveau élevé et elle enverra 3,3 V, créant un circuit de la broche 3,3 V à la broche de terre en passant par la DEL. Ceci allumera la LED.
![On envoie à une LED un signal de 0 (3,3V), qui allume la LED. Si on lui envoie 0 (0v), la LED ne s'allume pas.](../../../../images/led-digital-control.png)
Pour les capteurs plus avancés, vous pouvez utiliser les broches GPIO pour envoyer et recevoir des données numériques directement avec des capteurs et des actionneurs numériques, ou via des cartes de contrôle avec des ADC et des DAC pour parler aux capteurs et actionneurs analogiques.
> 💁 Si vous utilisez un Raspberry Pi pour ces travaux pratiques, le Grove Base Hat dispose d'un matériel permettant de convertir les signaux analogiques des capteurs en signaux numériques à envoyer via GPIO.
✅ Si vous avez un dispositif IoT avec des broches GPIO, localisez ces broches et trouvez un diagramme indiquant quelles broches sont sous tension, reliées à la masse (ground) ou programmables.
### Broches analogiques
Certains appareils, tels que les appareils Arduino, fournissent des broches analogiques. Elles sont identiques aux broches GPIO, mais au lieu de supporter uniquement un signal numérique, elles disposent d'un ADC pour convertir les plages de tension en valeurs numériques. En général, l'ADC a une résolution de 10 bits, ce qui signifie qu'il convertit les tensions en une valeur de 0-1,023.
Par exemple, sur une carte 3.3V, si le capteur renvoie 3.3V, la valeur renvoyée sera de 1,023. Si la tension renvoyée est de 1,65 V, la valeur renvoyée sera de 511.
![Un capteur d'humidité du sol envoie 3.3V et retourne 1.65v, soit une lecture de 511](../../../../images/analog-sensor-voltage.png)
> 💁 Dans la leçon 3 de la veilleuse, le capteur de lumière renvoyait une valeur comprise entre 0 et 1,023. Si vous utilisez un terminal Wio, le capteur était connecté à une broche analogique. Si vous utilisez un Raspberry Pi, le capteur a été connecté à une broche analogique sur le chapeau de base qui a un ADC intégré pour communiquer sur les broches GPIO. Le dispositif virtuel a été configuré pour envoyer une valeur de 0-1,023 pour simuler une broche analogique.
Les capteurs d'humidité du sol reposent sur des tensions, ils utilisent donc des broches analogiques et donnent des valeurs comprises entre 0 et 1 023.
### Protocol "Inter Integrated Circuit" (I<sup>2</sup>C)
I<sup>2</sup>C, prononcé *I-squared-C*, est un protocole multi-contrôleur, multi-périphérique, avec tout dispositif connecté capable d'agir comme un contrôleur ou un périphérique communiquant sur le bus I<sup>2</sup>C (le nom d'un système de communication qui transfère des données). Les données sont envoyées sous forme de paquets adressés, chaque paquet contenant l'adresse du périphérique connecté auquel il est destiné.
> 💁 Ce modèle était autrefois appelé "maître/esclave", mais cette terminologie est abandonnée en raison de son association avec l'esclavage. L'association [Open Source Hardware Association a adopté un contrôleur/périphérique](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), mais vous pouvez encore voir des références à l'ancienne terminologie.
Les dispositifs ont une adresse qui est utilisée lorsqu'ils se connectent au bus I<sup>2</sup>C, et qui est généralement écrite mot pour mot (hardcoded) sur le dispositif. Par exemple, chaque type de capteur Grove de Seeed a la même adresse, donc tous les capteurs de lumière ont la même adresse, tous les boutons ont la même adresse qui est différente de celle du capteur de lumière. Certains appareils permettent de modifier l'adresse, en changeant le réglage des cavaliers ou en soudant les broches ensemble.
I<sup>2</sup>C a un bus composé de 2 fils principaux, ainsi que de 2 fils d'alimentation :
| Fil | Nom | Description |
| ---- | --------- | ----------- |
| SDA | Serial Data | Ce fil sert à envoyer des données entre les appareils. |
| SCL | Serial Clock | Ce fil envoie un signal d'horloge à un rythme défini par le contrôleur. |
| VCC | Voltage common collector | L'alimentation des périphériques. Elle est connectée aux fils SDA et SCL pour fournir leur alimentation via une résistance pull-up qui coupe le signal lorsqu'aucun dispositif n'est le contrôleur. |
| GND | Ground | Cela fournit une masse commune pour le circuit électrique. |
![Bus I2C avec 3 dispositifs connectés aux fils SDA et SCL, partageant un fil de terre commun.](../../../../images/i2c.png)
Pour envoyer des données, un dispositif émet une condition de démarrage pour montrer qu'il est prêt à envoyer des données. Il devient alors le contrôleur. Le contrôleur envoie alors l'adresse du dispositif avec lequel il veut communiquer, et indique s'il veut lire ou écrire des données. Une fois que les données ont été transmises, le contrôleur envoie une condition d'arrêt pour indiquer qu'il a terminé. Après cela, un autre dispositif peut devenir le contrôleur et envoyer ou recevoir des données.
I<sup>2</sup>C a des limites de vitesse, avec 3 modes différents fonctionnant à des vitesses fixes. Le plus rapide est le mode High Speed avec une vitesse maximale de 3,4Mbps (mégabits par seconde), bien que très peu d'appareils supportent cette vitesse. Le Raspberry Pi, par exemple, est limité au mode rapide à 400Kbps (kilobits par seconde). Le mode standard fonctionne à 100Kbps.
> 💁 Si vous utilisez un Raspberry Pi avec un chapeau Grove Base comme matériel IoT, vous pourrez voir un certain nombre de prises I<sup>2</sup>C sur la carte que vous pouvez utiliser pour communiquer avec des capteurs I<sup>2</sup>C. Les capteurs Analog Grove utilisent également l'I<sup>2</sup>C avec un ADC pour envoyer des valeurs analogiques sous forme de données numériques, de sorte que le capteur de lumière que vous avez utilisé a simulé une broche analogique, avec la valeur envoyée sur I<sup>2</sup>C car le Raspberry Pi ne prend en charge que les broches numériques.
### Récepteur-émetteur asynchrone universel (UART)
UART est un circuit physique qui permet à deux appareils de communiquer. Chaque périphérique dispose de 2 broches de communication - transmission (Tx) et réception (Rx), la broche Tx du premier périphérique étant connectée à la broche Rx du second, et la broche Tx du second périphérique étant connectée à la broche Rx du premier. Cela permet d'envoyer des données dans les deux sens.
* Le dispositif 1 transmet des données depuis sa broche Tx, qui sont reçues par le dispositif 2 sur sa broche Rx.
* Le dispositif 1 reçoit des données sur sa broche Rx qui sont transmises par le dispositif 2 depuis sa broche Tx.
![UART avec la broche Tx d'une puce connectée à la broche Rx d'une autre, et vice versa.](../../../../images/uart.png)
> 🎓 Les données sont envoyées un bit à la fois, c'est ce qu'on appelle la communication *série*. La plupart des systèmes d'exploitation et des microcontrôleurs ont des *ports série*, c'est-à-dire des connexions permettant d'envoyer et de recevoir des données série qui sont à la disposition de votre code.
Les dispositifs UART ont un [débit en bauds](https://wikipedia.org/wiki/Symbol_rate) (également connu sous le nom de taux de symbole), qui est la vitesse à laquelle les données sont envoyées et reçues en bits par seconde. Une vitesse de transmission courante est de 9 600 bauds, ce qui signifie que 9 600 bits (0 et 1) de données sont envoyés chaque seconde.
UART utilise des bits de départ et d'arrêt, c'est-à-dire qu'il envoie un bit de départ pour indiquer qu'il est sur le point d'envoyer un octet (8 bits) de données, puis un bit d'arrêt après avoir envoyé les 8 bits.
La vitesse de l'UART dépend du matériel, mais même les implémentations les plus rapides ne dépassent pas 6,5 Mbps (mégabits par seconde, ou millions de bits, 0 ou 1, envoyés par seconde).
Vous pouvez utiliser UART sur les broches GPIO - vous pouvez définir une broche comme Tx et une autre comme Rx, puis les connecter à un autre appareil.
> 💁 Si vous utilisez un Raspberry Pi avec un "hat" de base Grove comme matériel IoT, vous pourrez voir une prise UART sur la carte que vous pouvez utiliser pour communiquer avec des capteurs qui utilisent le protocole UART.
### Serial Peripheral Interface (SPI)
SPI est conçu pour communiquer sur de courtes distances, comme sur un microcontrôleur pour parler à un périphérique de stockage tel que la mémoire flash. Il est basé sur un modèle contrôleur/périphérique avec un seul contrôleur (généralement le processeur du dispositif IoT) interagissant avec plusieurs périphériques. Le contrôleur contrôle tout en sélectionnant un périphérique et en envoyant ou en demandant des données.
> 💁 Comme pour l'I<sup>2</sup>C, les termes contrôleur et périphérique sont des changements récents, vous verrez donc peut-être les anciens termes encore utilisés.
Les contrôleurs SPI utilisent 3 fils, ainsi qu'un fil supplémentaire par périphérique. Les périphériques utilisent 4 fils. Ces fils sont :
| Fil | Nom | Description |
| ---- | --------- | ----------- |
| COPI | Controller Output, Peripheral Input | Ce fil sert à envoyer des données du contrôleur au périphérique. |
| CIPO | Controller Input, peripheral Output | Ce fil sert à envoyer des données du périphérique au contrôleur. |
| SCLK | Serial Clock | Ce fil envoie un signal d'horloge à un rythme défini par le contrôleur. |
| CS | Chip Select | Le contrôleur comporte plusieurs fils, un par périphérique, et chaque fil se connecte au fil CS du périphérique correspondant. |
![SPI avec un contrôleur et deux périphériques](../../../../images/spi.png)
Le fil CS est utilisé pour activer un périphérique à la fois, en communiquant par les fils COPI et CIPO. Lorsque le contrôleur doit changer de périphérique, il désactive le fil CS connecté au périphérique actuellement actif, puis active le fil connecté au périphérique suivant avec lequel il veut communiquer.
SPI est *full-duplex*, ce qui signifie que le contrôleur peut envoyer et recevoir des données en même temps depuis le même périphérique en utilisant les fils COPI et CIPO. SPI utilise un signal d'horloge sur le fil SCLK pour garder les périphériques synchronisés, donc contrairement à l'envoi direct sur UART, il n'a pas besoin de bits de départ et d'arrêt.
Il n'y a pas de limites de vitesse définies pour SPI, les implémentations étant souvent capables de transmettre plusieurs mégaoctets de données par seconde.
Les kits de développement IoT prennent souvent en charge SPI sur certaines des broches GPIO. Par exemple, sur un Raspberry Pi, vous pouvez utiliser les broches GPIO 19, 21, 23, 24 et 26 pour SPI.
### Sans fil
Certains capteurs peuvent communiquer via des protocoles sans fil standard, tels que Bluetooth (principalement Bluetooth Low Energy, ou BLE), LoRaWAN (un protocole de réseau **Lo**ng **Ra**nge à faible consommation) ou WiFi. Ceux-ci permettent d'utiliser des capteurs distants qui ne sont pas physiquement connectés à un dispositif IoT.
Les capteurs commerciaux d'humidité du sol en sont un exemple. Ceux-ci vont mesurer l'humidité du sol dans un champ, puis envoyer les données sur LoRaWan à un dispositif hub, qui va traiter les données ou les envoyer sur Internet. Cela permet au capteur d'être éloigné du dispositif IoT qui gère les données, ce qui réduit la consommation d'énergie et la nécessité de grands réseaux WiFi ou de longs câbles.
BLE est populaire pour les capteurs avancés tels que les trackers de fitness fonctionnent au poignet. Ceux-ci combinent plusieurs capteurs et envoient les données du capteur à un dispositif IoT sous la forme de votre téléphone via BLE.
✅ Avez-vous des capteurs Bluetooth sur vous, dans votre maison ou dans votre école ? Il peut s'agir de capteurs de température, de capteurs d'occupation, de traqueurs d'appareils et d'appareils de fitness.
Zigbee est un moyen populaire de connecter les appareils commerciaux. Zigbee utilise le WiFi pour former des réseaux maillés entre les appareils, où chaque appareil se connecte à autant d'appareils proches que possible, formant un grand nombre de connexions comme une toile d'araignée. Lorsqu'un appareil veut envoyer un message à l'internet, il peut l'envoyer aux appareils les plus proches, qui le transmettent ensuite à d'autres appareils proches et ainsi de suite, jusqu'à ce qu'il atteigne un coordinateur et puisse être envoyé à l'internet.
> 🐝 Le nom Zigbee fait référence à la danse de l'agitation des abeilles à miel après leur retour à la ruche.
## Mesurer les niveaux d'humidité dans le sol
Vous pouvez mesurer le niveau d'humidité du sol à l'aide d'un capteur d'humidité du sol, d'un dispositif IoT et d'une plante d'intérieur ou d'une parcelle de terre à proximité.
### Tâche - mesurer l'humidité du sol
Suivez le guide correspondant pour mesurer l'humidité du sol à l'aide de votre appareil IoT :
* [Arduino - Terminal Wio](wio-terminal-soil-moisture.fr.md)
* [Ordinateur monocarte - Raspberry Pi](pi-soil-moisture.fr.md)
* [Ordinateur monocarte - Virtuel](virtual-device-soil-moisture.fr.md)
## Étalonnage du capteur
Les capteurs reposent sur la mesure de propriétés électriques telles que la résistance ou la capacité.
> 🎓 La résistance, mesurée en ohms (Ω), est la quantité d'opposition au courant électrique qui traverse quelque chose. Lorsqu'une tension est appliquée à un matériau, la quantité de courant qui le traverse dépend de la résistance du matériau. Vous pouvez en savoir plus sur la page [résistance électrique sur Wikipédia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance).
> 🎓 La capacité, mesurée en farads (F), est la capacité d'un composant ou d'un circuit à collecter et à stocker l'énergie électrique. Pour en savoir plus sur la capacité, consultez la [page sur la capacité dans Wikipédia](https://wikipedia.org/wiki/Capacitance).
Ces mesures ne sont pas toujours utiles - imaginez un capteur de température qui vous donne une mesure de 22.5KΩ ! Au lieu de cela, la valeur mesurée doit être convertie en une unité utile en étant étalonnée - c'est-à-dire en faisant correspondre les valeurs mesurées à la quantité mesurée pour permettre aux nouvelles mesures d'être converties dans la bonne unité.
Certains capteurs sont livrés pré-calibrés. Par exemple, le capteur de température que vous avez utilisé dans la dernière leçon a déjà été calibré de façon à pouvoir fournir une mesure de température en °C. En usine, le premier capteur créé est exposé à une gamme de températures connues et la résistance est mesurée. Cette mesure est ensuite utilisée pour élaborer un calcul permettant de convertir la valeur mesurée en Ω (l'unité de résistance) en °C.
> 💁 La formule permettant de calculer la résistance à partir de la température est appelée [équation de Steinhart-Hart](https://wikipedia.org/wiki/SteinhartHart_equation).
### Étalonnage du capteur d'humidité du sol
L'humidité du sol est mesurée par la teneur en eau gravimétrique ou volumétrique.
* Gravimétrique : le poids de l'eau dans une unité de poids de sol mesurée, comme le nombre de kilogrammes d'eau par kilogramme de sol sec.
* Volumétrique : le volume d'eau dans une unité de volume de sol mesuré en nombre de mètres cubes d'eau par mètre cube de sol sec.
> 🇺🇸 Pour les Américains, en raison de la cohérence des unités, on peut les mesurer en livres au lieu de kilogrammes ou en pieds cubes au lieu de mètres cubes.
Les capteurs d'humidité du sol mesurent la résistance électrique ou la capacité - celle-ci varie non seulement en fonction de l'humidité du sol, mais aussi du type de sol, car les composants du sol peuvent modifier ses caractéristiques électriques. Idéalement, les capteurs doivent être étalonnés, c'est-à-dire qu'il faut prendre les lectures du capteur et les comparer aux mesures obtenues par une approche plus scientifique. Par exemple, un laboratoire peut calculer l'humidité gravimétrique du sol en utilisant des échantillons d'un champ spécifique prélevés plusieurs fois par an, et ces chiffres sont utilisés pour calibrer le capteur, en faisant correspondre la lecture du capteur à l'humidité gravimétrique du sol.
![Un graphique de la tension en fonction de la teneur en humidité du sol](../../../../images/soil-moisture-to-voltage.png)
Le graphique ci-dessus montre comment calibrer un capteur. La tension est capturée pour un échantillon de sol qui est ensuite mesuré dans un laboratoire en comparant le poids humide au poids sec (en mesurant le poids humide, puis en le séchant dans un four et en le mesurant sec). Une fois que quelques mesures ont été effectuées, elles peuvent être reportées sur un graphique et une ligne peut être ajustée aux points. Cette ligne peut ensuite être utilisée pour convertir les lectures du capteur d'humidité du sol prises par un dispositif IoT en mesures réelles de l'humidité du sol.
💁 Pour les capteurs d'humidité du sol résistifs, la tension augmente avec l'humidité du sol. Dans le cas des capteurs d'humidité du sol capacitifs, la tension diminue lorsque l'humidité du sol augmente, de sorte que les graphiques de ces capteurs sont orientés vers le bas et non vers le haut.
![Une valeur d'humidité du sol interpolée à partir du graphique](../../../../images/soil-moisture-to-voltage-with-reading.png)
Le graphique ci-dessus montre une lecture de tension d'un capteur d'humidité du sol, et en suivant cette lecture jusqu'à la ligne du graphique, l'humidité réelle du sol peut être calculée.
Cette approche signifie que l'agriculteur n'a besoin que d'obtenir quelques mesures de laboratoire pour un champ, puis il peut utiliser des dispositifs IoT pour mesurer l'humidité du sol - ce qui accélère considérablement le temps de prise de mesures.
---
## 🚀 Défi
Les capteurs d'humidité du sol résistifs et capacitifs présentent un certain nombre de différences. Quelles sont ces différences, et quel type (le cas échéant) est le meilleur pour un agriculteur ? Cette réponse change-t-elle entre les pays en développement et les pays développés ?
## Quiz post-lecture
[Quiz post-lecture](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12)
## Révision et étude personnelle
Renseignez-vous sur le matériel et les protocoles utilisés par les capteurs et les actionneurs :
* [GPIO - Wikipedia](https://wikipedia.org/wiki/General-purpose_input/output)
* [UART - Wikipedia](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter)
* [SPI - Wikipedia](https://wikipedia.org/wiki/Serial_Peripheral_Interface)
* [I<sup>2</sup>C - Wikipedia](https://wikipedia.org/wiki/I²C)
* [Zigbee - Wikipedia](https://wikipedia.org/wiki/Zigbee)
## Devoir
[Calibrez votre capteur](assignment.fr.md)

@ -1,47 +0,0 @@
# সেন্সর ক্যালিব্রেশন
## নির্দেশাবলী
এই পাঠে আমরা মাটির আর্দ্রতা সেন্সর রিডিং সংগ্রহ করেছি যা 0-1023 এর মধ্যে মান হিসাবে পরিমাপ করে। এগুলিকে প্রকৃত মাটির আর্দ্রতা হিসেবে রূপান্তর করতে, আমাদেরকে সেন্সরটি ক্যালিব্রেট করতে হবে। মাটির নমুনাগুলি থেকে রিডিং নিয়ে এটি করা যাবে, তারপরে এই নমুনাগুলি থেকে গ্র্যাভিমেট্রিক মাটির আর্দ্রতার পরিমাণ গণনা করতে হবে।
প্রতিটি সময় মাটির বিভিন্ন আর্দ্রতা সহ প্রয়োজনীয় রিডিং পেতে আমাদেরকে একাধিকবার এই পদক্ষেপগুলি পুনরাবৃত্তি করতে হবে।
1. মাটির আর্দ্রতা সেন্সর ব্যবহার করে একটি আর্দ্রতার মান নিতে হবে। এই মান লিখে রাখতে হবে।.
1. মাটির নমুনা নিয়ে এটি ওজন করতে হবে। এই মান লিখে রাখতে হবে।
1. কোন ওভেন বা উষ্ণ কিছুতে 110°C (230°F) তাপমাত্রায় কয়েক ঘন্টা রেখে মাটিকে শুকিয়ে নিতে হবে । সূর্যের আলো বা কোন উষ্ণ জায়গায় রেখেও এটা করা যাবে। শুষ্ক হয়েছে কিনা তা বোঝা যাবে যদি এটি পাউডার ধরণের হয়ে যায় এবং বেশ আলগা থাকে।
> 💁 সর্বাধিক নির্ভুল ফলাফলের জন্য একটি ল্যাবে সাধারণত 48-72 ঘন্টা শুকানো হয়। যদি এরকম বিশেষ ওভেন থাকে, তবে আমরা আরও দীর্ঘক্ষণ শুকানোর জন্য এগুলি ব্যবহার করতে পারি। যত বেশি সময় এখানে দেয়া হবে, ততবেশি শুষ্কতা আসবে এবং ফলস্বরূপ নির্ভুল মান পাওয়া যাবে।
1. আবার মাটি ওজন পরিমাপ করতে হবে
> 🔥 যদি চুলায় শুকানো হয়, তবে আগে নিশ্চিত করে নিতে হবে যে এটি ঠান্ড হয়েছে!
গ্র্যাভিমেট্রিক পদ্ধতিতে মাটির আর্দ্রতা গণনা :
![soil moisture % is weight wet minus weight dry, divided by weight dry, times 100](../../../../images/gsm-calculation.png)
* W<sub>wet</sub> = ভেজা মাটির ভর
* W<sub>dry</sub> = শুষ্ক মাটির ভর
উদাহরণস্বরূপ, ধরি আমাদের কাছে একটি মাটির নমুনা রয়েছে যা ভেজা অবস্থায় ২১২ গ্রাম ও শুকনো অবস্থায় ১৯৭ গ্রাম।
![The calculation filled in](../../../../images/gsm-calculation-example.png)
* W<sub>wet</sub> = 212g
* W<sub>dry</sub> = 197g
* 212 - 197 = 15
* 15 / 197 = 0.076
* 0.076 * 100 = 7.6%
এই উদাহরণে, মাটির নমুনাটির গ্র্যাভিমেট্রিক মাটির আর্দ্রতার মান 7.6%.
একবার আমাদের কাছে কমপক্ষে 3 টি নমুনা ফলাফল আসার পরে, মাটির আর্দ্রতা সেন্সর রিডিং এর জন্য মাটির আর্দ্রতা % এর একটি গ্রাফ প্লট করতে হবে এবং পয়েন্টগুলি সর্বোত্তমভাবে ফিট (Best Fit) করার জন্য লাইন টেনে যুক্ত করতে হবে। তারপরে রেখাটি ব্যবহার করে, যেকোন সেন্সর রিডিং এর জন্য জন্য গ্র্যাভিমেট্রিক মাটির আর্দ্রতার মান গণনা করা যাবে।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) |
| -------- | ------------------------ | ------------------ | ------------------------ |
| ক্যালিব্রেশন ডেটা সংগ্রহ | কমপক্ষে ৩টি ক্যালিব্রেশন স্যাম্পল গ্রহণ করেছে | কমপক্ষে ২টি ক্যালিব্রেশন স্যাম্পল গ্রহণ করেছে |কমপক্ষে ১টি ক্যালিব্রেশন স্যাম্পল গ্রহণ করেছে |
| ক্যালিব্রেট করা রিডিং এ রুপান্তর | সফলভাবে ক্যালিব্রেট গ্রাফ প্লট করে এবং সেন্সর থেকে রিডিং তৈরি করে এটিকে গ্র্যাভিমেট্রিক মাটির আর্দ্রতার পরিমাণে রূপান্তর করেছে | সফলভাবে ক্যালিব্রেট গ্রাফ প্লট করেছে | গ্রাফ প্লট করতে পারেনি |

@ -1,47 +0,0 @@
# Calibrez votre capteur
## Instructions
Dans cette leçon, vous avez recueilli les lectures de la sonde d'humidité du sol mesurées sous forme de valeurs comprises entre 0 et 1023. Pour les convertir en valeurs réelles d'humidité du sol, vous devez étalonner votre capteur. Pour ce faire, vous pouvez effectuer des relevés sur des échantillons de sol, puis calculer la teneur en eau gravimétrique du sol à partir de ces échantillons.
Vous devrez répéter ces étapes plusieurs fois pour obtenir les lectures nécessaires, avec une humidité différente du sol à chaque fois.
1. Relevez l'humidité du sol à l'aide du capteur d'humidité du sol. Notez cette mesure.
1. Prenez un échantillon du sol et pesez-le. Notez ce poids.
1. Séchez la terre - un four chaud à 110°C (230°F) pendant quelques heures est le meilleur moyen, vous pouvez le faire à la lumière du soleil, ou le placer dans un endroit chaud et sec jusqu'à ce que la terre soit complètement sèche. Elle doit être poudreuse et meuble.
> 💁 Dans un laboratoire, pour obtenir les résultats les plus précis, vous devez sécher dans un four pendant 48 à 72 heures. Si vous avez des étuves à votre école, voyez si vous pouvez les utiliser pour sécher plus longtemps. Plus le temps est long, plus l'échantillon est sec et plus les résultats sont précis.
1. Pesez à nouveau la terre.
> 🔥 Si vous l'avez séché dans un four, assurez-vous qu'il a d'abord refroidi !
L'humidité gravimétrique du sol est calculée comme suit :
![Le pourcentage d'humidité du sol est le poids humide moins le poids sec, divisé par le poids sec, multiplié par 100](../../../../images/gsm-calculation.png)
* W<sub>humide</sub> - le poids de la terre humide
* W<sub>sec</sub> - le poids du sol sec
Par exemple, disons que vous avez un échantillon de sol qui pèse 212 g humide et 197 g sec.
![Calcul rempli](../../../../images/gsm-calculation-example.png)
* W<sub>humide</sub> = 212g
* W<sub>sec</sub> = 197g
* 212 - 197 = 15
* 15 / 197 = 0.076
* 0.076 * 100 = 7.6%
Dans cet exemple, le sol a une humidité gravimétrique de 7,6 %.
Une fois que vous avez les lectures d'au moins 3 échantillons, tracez un graphique du pourcentage d'humidité du sol par rapport à la lecture du capteur d'humidité du sol et ajoutez la ligne qui correspond le mieux aux points. Vous pouvez ensuite utiliser ce graphique pour calculer la teneur en eau gravimétrique du sol pour une lecture de capteur donnée en lisant la valeur de la ligne.
## Grille d'évaluation
| Critère | Exemple | Adéquat | Nécessite amélioration |
| -------- | --------- | -------- | ----------------- |
| Recueillir les données d'étalonnage | Capturez au moins 3 échantillons d'étalonnage | Capturez au moins 2 échantillons d'étalonnage | Capturez au moins un échantillon d'étalonnage |
| Effectuer une lecture calibrée | Tracez avec succès le graphique d'étalonnage, effectuez une lecture du capteur et convertissez-la en teneur en eau gravimétrique du sol | Tracer avec succès le graphique d'étalonnage | Impossible de tracer le graphique |

@ -1,94 +0,0 @@
# Mesurer l'humidité du sol - Raspberry Pi
Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre Raspberry Pi, et lire des valeurs à partir de celui-ci.
## Matériel
Le Raspberry Pi a besoin d'un capteur capacitif d'humidité du sol.
Le capteur que vous utiliserez est un [Capteur d'humidité du sol capacitif](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html). Ce dernier mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Plus l'humidité du sol augmente, plus la tension diminue.
Il s'agit d'un capteur analogique, qui utilise donc une broche analogique et le ADC 10 bits du "Grove Base Hat" sur le Pi pour convertir la tension en un signal numérique de 1 à 1023. Celui-ci est ensuite envoyé sur I<sup>2</sup>C via les broches GPIO du Pi.
### Connecter le capteur d'humidité du sol
Le capteur d'humidité du sol Grove peut être connecté au Raspberry Pi.
#### Tâche - connecter le capteur d'humidité du sol
Connectez le capteur d'humidité du sol.
![Capteur d'humidité du sol d'un bosquet](../../../../images/grove-capacitive-soil-moisture-sensor.png)
1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité du sol. Il ne peut être inséré que dans un seul sens.
1. Lorsque le Raspberry Pi est hors tension, connectez l'autre extrémité du câble Grove à la prise analogique marquée **A0** sur le "Grove Base Hat" fixé au Pi. Cette prise est la deuxième en partant de la droite, sur la rangée de prises à côté des broches GPIO.
![Le capteur d'humidité du sol du bosquet connecté à la prise A0](../../../../images/pi-soil-moisture-sensor.png)
1. Insérez le capteur d'humidité du sol dans le sol. Il est doté d'une " ligne de position la plus élevée ", une ligne blanche qui traverse le capteur. Insérez le capteur jusqu'à cette ligne mais sans la dépasser.
![Le capteur d'humidité du sol The Grove dans le sol](../../../../images/soil-moisture-sensor-in-soil.png)
## Programmer le capteur d'humidité du sol
Le Raspberry Pi peut maintenant être programmé pour utiliser la sonde d'humidité du sol jointe.
### Tâche - programmer le capteur d'humidité du sol
Programmez l'appareil.
1. Allumez le Pi et attendez qu'il démarre.
1. Lancez VS Code, soit directement sur le Pi, soit en vous connectant via l'extension SSH à distance.
> ⚠️ Vous pouvez vous référer [aux instructions pour configurer et lancer VS Code dans la veilleuse - leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/pi.fr.md).
1. Depuis le terminal, créez un nouveau dossier dans le répertoire personnel de l'utilisateur `pi` appelé `soil-moisture-sensor`. Créez un fichier dans ce dossier appelé `app.py`.
1. Ouvrez ce dossier dans VS Code
1. Ajoutez le code suivant au fichier `app.py` pour importer certaines bibliothèques requises :
```python
import time
from grove.adc import ADC
```
L'instruction `import time` importe le module `time` qui sera utilisé plus tard dans ce devoir.
L'instruction `from grove.adc import ADC` importe le `ADC` des bibliothèques Python de Grove. Cette bibliothèque contient du code pour interagir avec le convertisseur analogique-numérique du chapeau de base Pi et lire les tensions des capteurs analogiques.
1. Ajoutez le code suivant en dessous pour créer une instance de la classe `ADC` :
```python
adc = ADC()
```
1. Ajoutez une boucle infinie qui lit depuis cet ADC sur la broche A0, et écrit le résultat sur la console. Cette boucle peut ensuite dormir pendant 10 secondes entre les lectures.
```python
while True:
soil_moisture = adc.read(0)
print("Soil moisture:", soil_moisture)
time.sleep(10)
```
1. Exécutez l'application Python. Vous verrez les mesures d'humidité du sol écrites dans la console. Ajoutez de l'eau au sol ou retirez le capteur du sol et observez le changement de valeur.
```output
pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py
Soil moisture: 615
Soil moisture: 612
Soil moisture: 498
Soil moisture: 493
Soil moisture: 490
Soil Moisture: 388
```
Dans l'exemple de sortie ci-dessus, vous pouvez voir la chute de tension lorsque de l'eau est ajoutée.
> 💁 Vous pouvez trouver ce code dans le dossier [code/pi](../code/pi).
😀 Votre programme de capteurs d'humidité du sol a été un succès !

@ -1,109 +0,0 @@
# Mesurer l'humidité du sol - Matériel IoT Virtuel
Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre dispositif IoT virtuel, et lire des valeurs à partir de celui-ci.
## Matériel virtuel
Le dispositif IoT virtuel utilisera un capteur d'humidité du sol capacitif Grove simulé. Ainsi, ce laboratoire est identique à l'utilisation d'un Raspberry Pi avec un capteur d'humidité du sol capacitif Grove physique.
Dans un dispositif IoT physique, le capteur d'humidité du sol serait un capteur capacitif qui mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Lorsque l'humidité du sol augmente, la tension diminue.
Il s'agit d'un capteur analogique, qui utilise donc un ADC 10 bits simulé pour rapporter une valeur de 1 à 1023.
### Ajouter le capteur d'humidité du sol à CounterFit
Pour utiliser un capteur d'humidité du sol virtuel, vous devez l'ajouter à l'application CounterFit.
#### Tâche - Ajout du capteur d'humidité du sol à CounterFit
Ajoutez le capteur d'humidité du sol à l'application CounterFit.
1. Créez une nouvelle application Python sur votre ordinateur dans un dossier appelé `soil-moisture-sensor` avec un seul fichier appelé `app.py` et un environnement virtuel Python, et ajoutez les paquets pip de CounterFit.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer et configurer un projet Python CounterFit dans la leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.fr.md).
1. Assurez-vous que l'application web CounterFit est en cours d'exécution.
1. Créez un capteur d'humidité du sol :
1. Dans la case *Create sensor* du volet *Sensors*, déroulez la case *Sensor type* et sélectionnez *Soil Moisture*.
1. Laissez le paramètre *Units* sur *NoUnits*.
1. Assurez-vous que le paramètre *Pin* est réglée sur *0*.
1. Sélectionnez le bouton **Add** pour créer le capteur d'humidité sur la broche 0.
![The soil moisture sensor settings](../../../../images/counterfit-create-soil-moisture-sensor.png)
Le capteur d'humidité du sol sera créé et apparaîtra dans la liste des capteurs.
![Le capteur d'humidité du sol a créé](../../../../images/counterfit-soil-moisture-sensor.png)
## Programmez l'application du capteur d'humidité du sol
L'application du capteur d'humidité du sol peut maintenant être programmée en utilisant les capteurs CounterFit.
### Tâche - programmer l'application du capteur d'humidité du sol
Programmez l'application du capteur d'humidité du sol.
1. Assurez-vous que l'application "Soil-Moisture-Sensor" est ouverte dans VS Code.
1. Ouvrez le fichier `app.py`.
1. Ajoutez le code suivant au début de `app.py` pour connecter l'application à CounterFit :
```python
from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)
```
1. Ajoutez le code suivant au fichier `app.py` pour importer certaines bibliothèques requises :
```python
import time
from counterfit_shims_grove.adc import ADC
```
L'instruction `import time` importe le module `time` qui sera utilisé plus tard dans ce devoir.
L'instruction `from counterfit_shims_grove.adc import ADC` importe la classe `ADC` pour interagir avec un convertisseur analogique-numérique virtuel qui peut se connecter à un capteur CounterFit.
1. Ajoutez le code suivant en dessous pour créer une instance de la classe `ADC` :
```python
adc = ADC()
```
1. Ajoutez une boucle infinie qui lit à partir de cet ADC sur la broche 0 et écrit le résultat sur la console. Cette boucle peut ensuite dormir pendant 10 secondes entre les lectures.
```python
while True:
soil_moisture = adc.read(0)
print("Soil moisture:", soil_moisture)
time.sleep(10)
```
1. Depuis l'application CounterFit, modifiez la valeur de la sonde d'humidité du sol qui sera lue par l'application. Vous pouvez le faire de deux façons :
* Saisissez un nombre dans la case *Value* pour le capteur d'humidité du sol, puis sélectionnez le bouton **Set**. Le nombre que vous saisissez sera la valeur renvoyée par le capteur.
* Cochez la case *Random* et saisissez une valeur *Min* et *Max*, puis sélectionnez le bouton **Set**. Chaque fois que le capteur lit une valeur, il lit un nombre aléatoire entre *Min* et *Max*.
1. Exécutez l'application Python. Vous verrez les mesures d'humidité du sol écrites dans la console. Changez les paramètres *Value* ou *Random* pour voir la valeur changer.
```output
(.venv) ➜ soil-moisture-sensor $ python app.py
Soil moisture: 615
Soil moisture: 612
Soil moisture: 498
Soil moisture: 493
Soil moisture: 490
Soil Moisture: 388
```
> 💁 Vous pouvez trouver ce code dans le [code/virtual-device](../code/virtual-device) folder.
😀 Votre programme de capteurs d'humidité du sol a été un succès !

@ -1,103 +0,0 @@
# Mesurer l'humidité du sol - Terminal Wio
Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre terminal Wio, et lire des valeurs à partir de celui-ci.
## Matériel
Le terminal Wio a besoin d'un capteur capacitif d'humidité du sol.
Le capteur que vous utiliserez est un [Capteur d'humidité du sol capacitif](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), qui mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Plus l'humidité du sol augmente, plus la tension diminue.
Il s'agit d'un capteur analogique, qui se connecte donc aux broches analogiques de la borne Wio, en utilisant un ADC intégré pour créer une valeur de 0-1,023.
### Connecter le capteur d'humidité du sol
Le capteur d'humidité du sol Grove peut être connecté au port analogique/numérique configurable des terminaux Wio.
#### Tâche - connecter le capteur d'humidité du sol
Connectez le capteur d'humidité du sol.
![Capteur d'humidité du sol de type Groove](../../../../images/grove-capacitive-soil-moisture-sensor.png)
1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité du sol. Il ne peut être inséré que dans un seul sens.
1. Le terminal Wio étant déconnecté de votre ordinateur ou de toute autre source d'alimentation, connectez l'autre extrémité du câble Grove à la prise Grove de droite du terminal Wio lorsque vous regardez l'écran. Il s'agit de la prise la plus éloignée du bouton d'alimentation.
![Le capteur d'humidité du sol du bosquet est connecté à la prise de droite](../../../../images/wio-soil-moisture-sensor.png)
1. Insérez le capteur d'humidité du sol dans le sol. Il est doté d'une " ligne de position la plus élevée ", une ligne blanche qui traverse le capteur. Insérez le capteur jusqu'à cette ligne mais sans la dépasser.
![Le capteur d'humidité du sol The Grove dans le sol](../../../../images/soil-moisture-sensor-in-soil.png)
1. Vous pouvez maintenant connecter le terminal Wio à votre ordinateur.
## Programmer le capteur d'humidité du sol
Le terminal Wio peut maintenant être programmé pour utiliser la sonde d'humidité du sol jointe.
### Tâche - programmer le capteur d'humidité du sol
Programmez l'appareil.
1. Créez un tout nouveau projet Wio Terminal en utilisant PlatformIO. Appelez ce projet `soil-moisture-sensor`. Ajoutez du code dans la fonction `setup` pour configurer le port série.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.fr.md).
1. Il n'y a pas de bibliothèque pour ce capteur, à la place vous pouvez lire la broche analogique en utilisant la fonction Arduino intégré [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/). Commencez par configurer la broche analogique pour l'entrée afin que les valeurs puissent être lues en ajoutant ce qui suit à la fonction `setup`.
```cpp
pinMode(A0, INPUT);
```
Ceci définit la broche `A0`, la broche combinée analogique/numérique, comme une broche d'entrée sur laquelle la tension peut être lue.
1. Ajoutez ce qui suit à la fonction `loop` pour lire la tension de cette broche :
```cpp
int soil_moisture = analogRead(A0);
```
1. Sous ce code, ajoutez le code suivant pour imprimer la valeur sur le port série :
```cpp
Serial.print("Soil Moisture: ");
Serial.println(soil_moisture);
```
1. Enfin, ajoutez un délai à la fin de 10 secondes :
```cpp
delay(10000);
```
1. Construisez et téléchargez le code sur le terminal Wio.
> ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.fr.md).
1. Une fois téléchargé, vous pouvez surveiller l'humidité du sol à l'aide du moniteur série. Ajoutez un peu d'eau au sol, ou retirez le capteur du sol, et observez le changement de valeur.
```output
> Executing task: platformio device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Soil Moisture: 526
Soil Moisture: 529
Soil Moisture: 521
Soil Moisture: 494
Soil Moisture: 454
Soil Moisture: 456
Soil Moisture: 395
Soil Moisture: 388
Soil Moisture: 394
Soil Moisture: 391
```
Dans l'exemple de sortie ci-dessus, vous pouvez voir la chute de tension lorsque de l'eau est ajoutée.
> 💁 Vous pouvez trouver ce code dans le fichier [code/wio-terminal](../code/wio-terminal).
😀 Votre programme de capteurs d'humidité du sol a été un succès !

@ -1,299 +0,0 @@
# স্বয়ংক্রিয় সেচকার্য
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-7.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13)
## সূচনা
গত পাঠে আমরা কীভাবে মাটির আর্দ্রতা নিরীক্ষণ করব তা শিখেছি। এই পাঠে জানবো কীভাবে একটি স্বয়ংক্রিয় পানি সরবরাহ ব্যবস্থার মূল উপাদানগুলি তৈরি করতে হবে যা মাটির আর্দ্রতার উপর ভিত্তি করে কাজ করবে। এছাড়াও সময় সংক্রান্ত বিষয়য়াদিও জানবো - সেন্সরগুলি তাদের অবস্থার পরিবর্তনের প্রতিক্রিয়া জানাতে কীভাবে সময় নিতে পারে এবং সেন্সরগুলির দ্বারা পরিমাপ করা বৈশিষ্ট্যগুলি পরিবর্তনে একচুয়েটরের কাজের জন্য কতটা সময় নেয়, তা জানতে পারবো।
এই পাঠে আমরা যেসকল বিষয় শিখবো:
* [লো পাওয়ার আইওটি ডিভাইস থেকে হাই পাওয়ার ডিভাইস নিয়ন্ত্রণ](#লো-পাওয়ার-আইওটি-ডিভাইস-থেকে-হাই-পাওয়ার-ডিভাইস-নিয়ন্ত্রণ)
* [রিলে নিয়ন্ত্রণ](#রিলে-নিয়ন্ত্রণ)
* [MQTT দ্বারা উদ্ভিদ নিয়ন্ত্রণ](#MQTT-দ্বারা-উদ্ভিদ-নিয়ন্ত্রণ)
* [সেন্সর এবং অ্যাকচুয়েটরের টাইমিং](#সেন্সর-এবং-অ্যাকচুয়েটরের-টাইমিং)
* [উদ্ভিদ নিয়ন্ত্রণে টাইমিং যুক্ত করা](#উদ্ভিদ-নিয়ন্ত্রণ-সার্ভারে-টাইমিং-যুক্ত-করা)
## লো পাওয়ার আইওটি ডিভাইস থেকে হাই পাওয়ার ডিভাইস নিয়ন্ত্রণ
আইওটি ডিভাইসগুলি কম ভোল্টেজ ব্যবহার করে। যদিও এটি সেন্সর এবং এলইডি এর মতো লো-পাওয়ার যন্ত্রের পক্ষে যথেষ্ট, কিন্তু বড় হার্ডওয়্যার যেমন সেচের জন্য ব্যবহৃত পানির পাম্প নিয়ন্ত্রণ করতে এটি খুব কম ভোল্টেজ। এমনকি আমাদের বাসাবাড়ির ছোট চারাগাছের জন্য যে ছোট পাম্পগুলি ব্যবহার করা হয়, সেগুলিও আইওটি ডেভ কিটের সহ্যসীমার তুলনামূলক খুব বেশি কারেন্ট নিয়ে নেয় এবং বোর্ডটি পুড়ে যেতে পারে।
> 🎓 তড়িৎ প্রবাহ বা কারেন্ট, পরিমাপ করা হয় অ্যাম্পিয়ার (A) এককে, একটি সার্কিট মাধ্যমে প্রবাহিত বিদ্যুতের পরিমাণ। ভোল্টেজ এখানে ধাক্কা তৈরী করে আর কারেন্ট হলো সেই ধাক্কার পরিমাণ। [তড়িৎ প্রবাহ এর Wikipedia পেইজ](https://wikipedia.org/wiki/Electric_current) পড়লে এ সম্পর্কে আরো বিস্তারিত জানা যাবে।
এই সমস্যার সমাধানটি হল পাম্পকে একটি বাহ্যিক বিদ্যুৎ সরবরাহের সাথে সংযুক্ত করা এবং পাম্পটি চালু করার জন্য একটি অ্যাকচুয়েটর ব্যবহার করা যা অনেকটা বাতির স্যুইচ জ্বালানোর মতো। আমাদের আঙুল একটি স্যুইচ ফ্লিপ করতে খুব সামান্য পরিমাণ শক্তি (দেহের শক্তির আকারে) লাগে এবং এটি 110v বা 240v এ চলমান বিদ্যুতের সাথে বাতিকে সংযুক্ত করে।
![A light switch turns power on to a light](../../../../images/light-switch.png)
> 🎓 [Mains electricity](https://wikipedia.org/wiki/Mains_electricity) বলতে বোঝানো হয়, জাতীয় অবকাঠামো থেকে বাসাবাড়িতে সরবরাহকৃত কারেন্ট।
✅ আইওটি ডিভাইসগুলি সাধারণত 3.3V বা 5V সরবরাহ করতে পারে ১ এম্পিয়ার কারেন্টে। যদি আমরা মেইন কারেন্টের সাথে এর তুলনা করি, সেক্ষেত্রে আমরা দেখি মেইনে প্রায় ২৩০ভোল্ট সরবরাহ করা হয় ((উত্তর আমেরিকাতে 120V এবং জাপানে 100 V), যার দ্বারা ৩০ এম্পিয়ারের মেশিনও চালানো যায়।
এমন অনেকগুলি অ্যাকচুয়েটর রয়েছে যা এই স্যুইচিং করতে পারে - যান্ত্রিক ডিভাইস সহ বিদ্যমান স্বাভাবিক সুইচগুলিতেও এটি সংযুক্ত করা যাবে যা কোন আঙুল এর মতই স্যুইচ নিয়ন্ত্রণ করে। এই কাজের প্রচলিত উপায়গুলোর মধ্যে সর্বাধিক জনপ্রিয় হলো রিলে।
### রিলে
রিলে একটি ইলেক্ট্রোমেকানিকাল সুইচ যা বৈদ্যুতিক সংকেতকে যান্ত্রিক সংকেতে রূপান্তর করে এবং একটি স্যুইচ চালু করে। রিলে মূলত একটি বৈদ্যুতিক চৌম্বক।
> 🎓 [ইলেক্ট্রোম্যাগনেট](https://wikipedia.org/wiki/Electromagnet) হলো এমন চৌম্বক যেগুলো তার প্যাঁচানো কয়েল দিয়ে বিদ্যুৎ পরিবহন করানোর মাধ্যমে তৈরী করা হয়। এখানে বিদ্যুৎ চালু করা হলে, কুণ্ডলী চৌম্বকিত হয়ে যায়। বিদ্যুৎ বন্ধ হয়ে গেলে, তা চুম্বকত্ব হারিয়ে ফেলে।
![When on, the electromagnet creates a magnetic field, turning on the switch for the output circuit](../../../../images/relay-on.png)
রিলেতে একটি কন্ট্রোল সার্কিট বৈদ্যুতিক চৌম্বককে পাওয়ার সরবরাহ করে । যখন বৈদ্যুতিক চৌম্বকটি চালু থাকে, তখন এটি লিভার টেনে একটি স্যুইচকে নিয়ন্ত্রণ করে এবং এত্র একটি আউটপুট সার্কিট সম্পূর্ণ হয়।
![When off, the electromagnet doesn't create a magnetic field, turning off the switch for the output circuit](../../../../images/relay-off.png)
কন্ট্রোল সার্কিট অফ হয়ে গেলে, তড়িৎ চৌম্বকটি বন্ধ হয়ে যায়। এতে করে তা লিভারটি ছেড়ে দেয় এবং আউটপুট সার্কিটটি বন্ধ হয়ে যায়। রিলেগুলি হল ডিজিটাল অ্যাকচুয়েটর - রিলেতে একটি উচ্চতর সংকেত High সিগন্যাল এটি চালু করে, আবার Low সিগন্যাল এটি বন্ধ করে দেয়।
আউটপুট সার্কিটটি সেচকার্যের মতো অতিরিক্ত হার্ডওয়্যারকে পাওয়ার সরবরাহ করতে ব্যবহৃত হতে পারে। আইওটি ডিভাইস রিলে এর স্যুইচ অন করতে পারে যার ফলে সেচকার্য চালু করা যায় এবং গাছপালার পানির ব্যবস্থা হবে। আইওটি ডিভাইসটি তারপরে রিলেটি বন্ধ করে, এতে করে সেচ ব্যবস্থাতে পাওয়ার সরবরাহ বন্ধ হয়ে যায় এবং পানি দেয়ার কাজটি শেষ হয়।
![A relay turning on, turning on a pump sending water to a plant](../../../../images/strawberry-pump.gif)
উপরের ভিডিওতে, একটি রিলে চালু আছে। রিলে এর উপরে একটি এলইডি রয়েছে যা আমাদেরকে জানান দেয় এটি চালু রয়েছে কিনা (কিছু রিলে বোর্ডগুলি রিলে চালু বা বন্ধ আছে কিনা তা বোঝানোর জন্য এলইডি রয়েছে), এবং পাম্পে এনার্জি সরবরাহ করা হয়। ফলে এটি চালু হয়ে উদ্ভিদের জন্য পানি পাম্প করে।
> 💁 রিলেগুলি চালু এবং বন্ধ না করে বরং দুটি আউটপুট সার্কিটের মধ্যে এনার্জি সরবরাহ পরিবর্তন করতেও ব্যবহার করা যেতে পারে। যেমন, লিভারটি হয়তো প্রথমে একটি আউটপুট সার্কিট সম্পূর্ণ করলো, পরে স্যুইচ করে অন্য আউটপুট সার্কিটটি সম্পূর্ণ করলো। এতে একটি সাধারণ পাওয়ার সংযোগ বা কমন গ্রাউন্ড থাকে।
✅ কিছু গবেষণা করা যাক: বিভিন্ন ধরণের রিলে রয়েছে। এদের পার্থক্য করলে দেখা যায়, কন্ট্রোল সার্কিটে পাওয়ার প্রয়োগ করা হলে রিলেটি চালু বা বন্ধ হয়ে যায়, বা একাধিক আউটপুট সার্কিটে সুইচ করে। এরকম বিভিন্ন ধরণের পার্থক্য নিয়ে আরো অনুসন্ধান করি।
যখন লিভারটি স্থান পরিবর্তন করে, তখন সাধারণত একটি শব্দ শুনতে পাওয়া যায়। এটি একটি ক্লিকের শব্দ, যা দিয়ে বৈদ্যুতিক চৌম্বকটির সাথে যোগাযোগ করা হয়।
> 💁 একটি রিলেকে তারের দ্বারা যুক্ত করা যেতে পারে যাতে বৈদ্যুতিক সংযোগ তৈরি করা হলে, রিলেতে এনার্জি সাপ্লাই বন্ধ হয়ে গিয়ে তা অফ হয়ে যায়। পাওয়ার সরবরাহ করলে, আবার একইভাবে রিলে অন হয়ে কাজ করতে পারবে। এর অর্থ রিলে ক্লিক করলে অবিশ্বাস্যভাবে দ্রুত একটি শব্দ তৈরী করে। এইভাবেই প্রথমদিকে আমাদের দরজার বৈদ্যুতি্ক কলিংবেল তৈরীতে buzzer ব্যবহৃত হতো ।
### রিলে পাওয়ার
ইলেক্ট্রোম্যাগনেট দ্বারা লিভারটি সক্রিয় করতে এবং তার কাজ করতে খুব বেশি পাওয়ারের প্রয়োজন হয় না। এটি আইওটি ডেভ কিট থেকে 3.3V বা 5V আউটপুট ব্যবহার করে নিয়ন্ত্রণ করা যায়। ইন্ডাস্ট্রিয়াল ব্যবহারের জন্য মেইন ভোল্টেজ বা এমনকি উচ্চতর পাওয়ার লেভেলসহ রিলের উপর নির্ভর করে, আউটপুট সার্কিট আরও অনেক বেশি পাওয়ার বহন করতে পারে। এইভাবেই মূলত একটি আইওটি ডেভ কিট কোন একটি গাছের জন্য একটি ছোট পাম্প থেকে শুরু করে পুরো বাণিজ্যিক খামারের বিশাল শিল্প ব্যবস্থার সেচকার্য সমগ্রভাবে নিয়ন্ত্রণ করতে পারে।
![A grove relay with the control circuit, output circuit and relay labelled](../../../../images/grove-relay-labelled.png)
উপরের চিত্রটিতে একটি গ্রোভ রিলে দেখা যাচ্ছে। কন্ট্রোল সার্কিটটি একটি আইওটি ডিভাইসের সাথে সংযোগ স্থাপন করে এবং 3.3V বা 5V ব্যবহার করে রিলেটি চালু বা বন্ধ করে দেয়। আউটপুট সার্কিটের দুটি টার্মিনাল রয়েছে, যেকোন ১টি পাওয়ার বা গ্রাউন্ড হতে পারে। আউটপুট সার্কিট 10A এ 250V পর্যন্ত হ্যান্ডেল করতে পারে, যা বেশ কয়েকটি মেইন-কারেন্ট চালিত ডিভাইসের জন্য যথেষ্ট। চাইলে উচ্চ শক্তি সহ্যক্ষমতা সম্পন্ন রিলে পাওয়া যায় ।
![A pump wired through a relay](../../../../images/pump-wired-to-relay.png)
উপরের চিত্রটিতে, একটি রিলে এর মাধ্যমে পাম্পে পাওয়ার সরবরাহ করা হয়। রিলে এর আউটপুট সার্কিটের এক টার্মিনালে ইউএসবি পাওয়ার সাপ্লাইয়ের +5V টার্মিনাল সংযোগকারী একটি লাল তার রয়েছে এবং আউটপুট সার্কিটের অন্য টার্মিনালটিকে পাম্পের সাথে সংযুক্ত করে অন্য একটি লাল তারের সংযুক্ত করে। একটি কালো তার ইউএসবি পাওয়ার সাপ্লাইয়ের সাথে যুক্ত পাম্পটিকে গ্রাউন্ডে সংযুক্ত করে। রিলে চালু হয়ে গেলে, এটি সার্কিটটি সম্পূর্ণ করে, পাম্পে 5V প্রেরণ করে, পাম্পটি চালু করে।
## রিলে নিয়ন্ত্রণ
আমাদের আইওটি ডেভ কিট থেকে রিলে নিয়ন্ত্রণ করা যাবে।
### কাজ - রিলে নিয়ন্ত্রণ
সঠিক হার্ডওয়্যার পছন্দ অনুসারে নিচের যেকোন একটি গাইডের মাধ্যমে কাজ শুরু করতে হবে।
* [Arduino - Wio Terminal](wio-terminal-relay.md)
* [Single-board computer - Raspberry Pi](pi-relay.md)
* [Single-board computer - Virtual device](virtual-device-relay.md)
## MQTT দ্বারা উদ্ভিদ নিয়ন্ত্রণ
এখনো অবধি আমাদের রিলেটি আইওটি ডিভাইস দ্বারা নিয়ন্ত্রিত হয়েছে, মাটির আর্দ্রতার পরিমাপের উপর ভিত্তি করে। একটি বাণিজ্যিক সেচ ব্যবস্থায়, এই নিয়ন্ত্রণের যুক্তিটিকে আরো বাস্তবধর্মী করা হবে যা একাধিক সেন্সর থেকে প্রাপ্ত ডেটা ব্যবহার করে পানি সরবরাহ করার সিদ্ধান্ত গ্রহণ করবে এবং এতগুলো মানদন্ডের কোনটি কনফিগারেশন বা পরিবর্তন করতে হলে, এক জায়গা থেকেই তা পরিবর্তন করার সুযোগ রাখতে হবে। এটির জন্য, MQTT দ্বারা রিলে নিয়ন্ত্রণ করতে হবে।
### কাজ - MQTT দ্বারা রিলে নিয়ন্ত্রণ
1. MQTT তে সংযোগের জন্য `soil-moisture-sensor` প্রজেক্টে প্রাসঙ্গিক MQTT লাইব্রেরি / pip প্যাকেজ এবং কোড যুক্ত করতে হবে। ক্লায়েন্ট আইডির নাম হবে `soilmoisturesensor_client` যেখানে শুরুতে আমাদের আইডি লিখতে হবে।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-১, লেসন- এ MQTT এর সাথে সংযোগ অংশটিতে বিস্তারিত নির্দেশাবলী রয়েছে](../../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt) যা প্রয়োজনে দেখা যেতে পারে।
1. মাটির আর্দ্রতা সহ টেলিমেট্রি ডেটা পাঠানোর জন্য প্রয়োজনীয় কোড সংযোজন করতে হবে। টেলিমেট্রি ম্যাসেজের জন্য, প্রপার্টি এর নাম হবে `soil_moisture`
> ⚠️ এক্ষেত্রে [প্রজেক্ট-১, লেসন- এ টেলিমেট্রি ডেটা পাঠানো অংশটিতে বিস্তারিত নির্দেশাবলী রয়েছে](../../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device) ।
1. টেলিমেট্রিতে সাবস্ক্রাইব করার জন্য লোকাল সার্ভার কোড লিখতে হবে এবং `soil-moisture-sensor-server` নামক ফোল্ডারে রিলে নিয়ন্ত্রণ করার জন্য একটি কমান্ড প্রেরণ করতে হবে। কমান্ড ম্যাসেজে এই প্রপারটির নাম হবে `relay_on` এবং ক্লায়েন্ট আইডি `soilmoisturesensor_server` যেখানে শুরুতে আমাদের আইডি লিখতে হবে। প্রজেক্ট-১, লেসন- এর জন্য যে সার্ভার কোডটি লিখেছিলাম, সেই একই কাঠামো রাখতে হবে এবং পরে এই কোডটিতে আরো কিছু যুক্ত হবে।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-১, লেসন- এর সার্ভার কোড লেখার অংশটি](../../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) এবং সেই একই পাঠের [MQTT এর মাধ্যমে কমান্ড পাঠানো সংক্রান্ত নির্দেশনা](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) প্রয়োজনে দেখা যেতে পারে।
1. প্রাপ্ত কমান্ড থেকে রিলে নিয়ন্ত্রণের জন্য রিলে লিখতে হবে, ম্যাসেজ থেকে `relay_on` প্রপার্টি ব্যবহার করতে হবে। `soil_moisture` যদি ৪৫০ এর বেশি হয়, তবে `relay_on` এর জন্য TRUE হবে অন্যথায় FALSE ।
> ⚠️ [প্রজেক্ট-১, লেসন- এ MQTT এর কমান্ডগুলোর প্রতিক্রিয়া জানানোর অংশে বিস্তারিত নির্দেশাবলী রয়েছে](../../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device)।
> 💁 এই কাজের সকল কোড [code-mqtt](./code-mqtt) ফোল্ডারে রয়েছে।
ডিভাইস এবং লোকাল সার্ভারে কোডটি চলছে কিনা তা আমাদেরকে নিশ্চিত করতে হবে। এজন্য ভার্চুয়াল সেন্সর দ্বারা প্রেরিত মানগুলি পরিবর্তন করে বা মাটির আর্দ্রতা স্তর পরিবর্তন করে এটি আমাদেরকে পরীক্ষা করতে হবে।
## সেন্সর এবং অ্যাকচুয়েটরের টাইমিং
লেসন-৩ এ আমরা একটি নাইটলাইট তৈরি করেছিলাম - একটি এলইডি যা আলোক সেন্সর দ্বারা নিম্ন স্তরের আলো সনাক্ত হওয়ার সাথে সাথেই জ্বলে উঠে। আলোক সেন্সরটি তাত্ক্ষণিকভাবে আলোর স্তরের পরিবর্তন সনাক্ত করে এবং ডিভাইসটি দ্রুত প্রতিক্রিয়া জানায় যা অবশ্য `loop` বা `while True:` ফাংশনে প্রদত্ত Delay এর সময় এর দ্বারা প্রভাবিত হয়। আইওটি ডেভলাপার হিসাবে আমরা সর্বদা এই জাতীয় দ্রুত প্রতিক্রিয়া লুপের উপর নির্ভর করতে পারব না।
### মাটির আর্দ্রতার জন্য টাইমিং
যদি আমরা কোন হার্ডওয়্যার সেন্সর ব্যবহার করে মাটির আর্দ্রতা বিষয়ক গত লেসনের কাজগুলো করি, তবে এটি তো নিশ্চয়ই আমরা খেয়াল করেছি যে, গাছটিতে জল দেওয়ার পরে মাটির আর্দ্রতা রিডিং আসতে কয়েক সেকেন্ড সময় নিয়েছিল। এটি সেন্সরটি ধীর হওয়ার কারণে নয়, বরং পানি দ্বারা মাটি ভিজতে সময় লাগে বলে।
> 💁 আমরা যদি সেন্সরটির খুব কাছাকাছি পানি সরবরাহ করি, তবে আমরা দেখবো আর্দ্রতার মান খুব বেড়ে যাওয়ার পর দ্রুতই কমছে, আবার আস্তে আস্তে বাড়ছে- এটি সেন্সরটির নিকটবর্তী পানি পুরো মাটি জুড়ে ছড়িয়ে পড়ার প্রক্রিয়ার কারণেই হচ্ছে ।
![A soil moisture measurement of 658 doesn't change during watering, it only drops to 320 after watering when water has soaked through the soil](../../../../images/soil-moisture-travel.png)
উপরের ডায়াগ্রামে মাটির আর্দ্রতা পাঠ 655 দেখায় । উদ্ভিদটিতে জল সরবরাহ করা হয়েছে, তবে এই রিডিং তৎক্ষণাৎ পরিবর্তন হয় না, কারণ পানি তখনও সেন্সরে পৌঁছেনি। সেন্সরে পৌঁছানোর আগেই পানি শেষ হয়ে যেতে পারে এবং এতে নতুন আর্দ্রতার মান কমে যায়।
আমরা যদি মাটির আর্দ্রতার মাত্রা ভিত্তিতে, রিলে এর মাধ্যমে কোন সেচ ব্যবস্থা নিয়ন্ত্রণের কোড লিখি, তবে এই বিলম্বকে বিবেচনায় নেওয়া উচিত এবং আইওটি ডিভাইসে স্মার্টভাবে সময় নির্ধারণ করতে হবে।
✅ কীভাবে এটি করা যাবে, তা কিছুক্ষণ সময় নিয়ে চিন্তা করি।
### সেন্সর এবং অ্যাকচুয়েটরের টাইমিং নিয়ন্ত্রণ
কল্পনা করি যে, আমাদেরকে একটি খামারের জন্য সেচ ব্যবস্থা তৈরি করার দায়িত্ব দেওয়া হয়েছে। মাটির ধরণের উপর ভিত্তি করে, উদ্ভিদের আদর্শ মাটির আর্দ্রতার মান 400-450 এর অ্যানালগ ভোল্টেজের সমান।
আমরা ডিভাইসটি নাইটলাইটের মতো একইভাবে প্রোগ্রাম করতে পারি - সেন্সর মান 450 এর জন্য, পাম্প চালু করতে রিলে চালু করতে হবে। সমস্যাটি হল পাম্প থেকে মাটির ভেতর দিয়ে সেন্সরে পানি যেতে কিছুটা সময় নেয়। সেন্সরটি 450 এর একটি আর্দ্রতা স্তর সনাক্ত করে যখন পানি থামিয়ে দেবে, তখনও কিন্তু পাম্পযুক্ত জল মাটিতে শোষিত হতে থাকায় পানির স্তর কমতে থাকবে। ফলস্বরূপ, এই পুরো প্রক্রিয়ায় পানি নষ্ট হয় এবং শিকড়ের ক্ষতির ঝুঁকি থাকে।
✅ মনে রাখতে হবে - অত্যধিক পানি গাছের পক্ষে ক্ষতিকর এবং এটি একটি মূল্যবান প্রাকৃতিক সম্পদ নষ্ট করে।
এক্ষেত্রে আগে এটি বুঝতে হবে যে একচুয়েটরের কাজ শুরু করা এবং সেন্সর এর কাছ থেকে ডেটা আসা, এর মধ্যে একটু পারষ্পরিক বিলম্ব বা delay হচ্ছে। এর অর্থ সেন্সরটির মান পরিমাপ করার আগে কিছুক্ষণ অপেক্ষা করা উচিত এবং পরবর্তী পরিমাপ নেয়ার আগে একচুয়েটর কিছু সময়ের জন্য বন্ধ রাখতে হবে।
প্রতিবার রিলে কতক্ষণ হওয়া উচিত? এক্ষেত্রে সতর্ক থাকা উচিত এবং কেবল অল্প সময়ের জন্য রিলে চালু করা ভাল। তারপরে মাটি ভালমতো ভিজতে অপেক্ষা করতে হবে এবং তখন আর্দ্রতার স্তরটি আবার যাচাই করতে হবে। সবথেকে গুরুত্বপূর্ণ বিষয়টি হলো, আমরা চাইলেই আরও পানি যুক্ত করতে সর্বদা এটি চালু করতে পারি, কিন্তু মাটি থেকে আমরা পানি সরাতে পারবো না।
> 💁 এই ধরণের টাইমিং কন্ট্রোল সংক্রান্ত বৈশিষ্ট্যগুলো সুনির্দিষ্টভাবে নির্ভর করে - আমরা যে আইওটি ডিভাইসটি তৈরি করছি তার উপর, যে বৈশিষ্ট্য পরিমাপ করছি এবং যেধরণের সেন্সর ও অ্যাকচুয়েটর ব্যবহার করছি তার উপর।
>
![A strawberry plant connected to water via a pump, with the pump connected to a relay. The relay and a soil moisture sensor in the plant are both connected to a Raspberry Pi](../../../../images/strawberry-with-pump.png)
মনে করি, আমাদের কাছে মাটির আর্দ্রতা সেন্সর এবং একটি রিলে দ্বারা নিয়ন্ত্রিত একটি পাম্প সহ একটি স্ট্রবেরি গাছ রয়েছে। আমরা পর্যবেক্ষণ করেছি যে যখনই পানি দেয়া হয়, মাটির আর্দ্রতা রিডিং স্থির হতে প্রায় 20 সেকেন্ড সময় লাগে। এর অর্থ হল রিলেটি বন্ধ করতে হবে এবং আর্দ্রতার মাত্রা পরীক্ষা করার আগে 20 সেকেন্ড অপেক্ষা করতে হবে। অত্যধিক পানির তুলনায় বরং পানি একটু একটু করে দেয়াই ভালো -আমরা চাইলেই আরও পানি যুক্ত করতে সর্বদা পাম্প চালু করতে পারি, কিন্তু মাটি থেকে আমরা পানি সরাতে পারবো না।
![Step 1, take measurement. Step 2, add water. Step 3, wait for water to soak through the soil. Step 4, retake measurement](../../../../images/soil-moisture-delay.png)
অর্থাৎ সেচ দেয়ার জন্য সর্বোত্তম ধাপগুলি হবে
* 5 সেকেন্ডের জন্য পাম্পটি চালু করা
* 20 সেকেন্ড অপেক্ষা
* মাটির আর্দ্রতা পরীক্ষা করা
* যদি আর্দ্রতা স্তর প্রয়োজনের তুলনায় এখনও বেশি থাকে, তবে উপরের পদক্ষেপগুলি পুনরাবৃত্তি করুন
পাম্পের জন্য 5 সেকেন্ড খুব দীর্ঘ হতে পারে, বিশেষত যদি আর্দ্রতার মাত্রা প্রয়োজনীয় স্তরের থেকে কিছুটা উপরে থাকে। কতটা সময় এখানে ব্যবহার করতে হবে, তা জানার সর্বোত্তম উপায় হল বারবার কাজটি করে প্রতিক্রিয়া দেখা এবং সে অনুযায়ী সময় নির্দিষ্ট করা। এটি আরও বেশি সুনির্দিষ্ট করা যেতে পারে যেমন, স্থির 5 সেকেন্ডের পরিবর্তে প্রয়োজনীয় মাটির আর্দ্রতার মান প্রতি 100 অতিরিক্ত এর জন্য 1 সেকেন্ড সময় পাম্পটি চালু রাখা।
✅ ছোট একটি গবেষণাঃ এখানে অন্য কোনভাবে কী সময়কে পর্যালোচনা করা যাবে? আর্দ্রতা কমে গেলেই কী গাছে পানি দেয়া উচিত নাকি এখানে গাছে পানি দেয়ার জন্য ভাল এবং খারাপ সময় থাকে - এরকম কিছুও বিবেচনা করতে হবে?
> 💁 ঘরের বহিরাঙ্গনে উদ্ভিদের বৃদ্ধির জন্য স্বয়ংক্রিয় সেচব্যবস্থা নিয়ন্ত্রণ করার সময় আবহাওয়ার পূর্বাভাসগুলিও বিবেচনায় নেওয়া উচিত। যদি বৃষ্টিপাত হওয়ার সম্ভাবনা থাকে, তবে বৃষ্টি শেষ হওয়ার পর্যন্ত পেক্ষা করা যেতে পারে। তখন হয়তো মাটি পর্যাপ্ত পরিমাণে আর্দ্র হতে পারে যেকারণে এটির আর পানির প্রয়োজন হয় না।
## উদ্ভিদ নিয়ন্ত্রণ সার্ভারে টাইমিং যুক্ত করা
সেচকার্যের সময়কালের নিয়ন্ত্রণ যুক্ত করতে এবং মাটির আর্দ্রতার মাত্রা পরিবর্তনের জন্য অপেক্ষা করতে সার্ভার কোডটি সংশোধন করা যেতে পারে। রিলে সময় নিয়ন্ত্রণের জন্য এলগরিদম হবে -
1. টেলিমেট্রি বার্তা গৃহীত
1. মাটির আর্দ্রতার স্তরটি পরীক্ষা করা
1. যদি ঠিক থাকে তবে কিছুই করতে হবেনা। তবে রিডিং যদি খুব বেশি হয় (যার অর্থ মাটির আর্দ্রতা খুব কম) তবে:
1. রিলে চালু করার নির্দেশ প্রেরণ
1. 5 সেকেন্ড অপেক্ষা করতে হবে
1. রিলে বন্ধ করার নির্দেশ প্রেরণ
1. মাটির আর্দ্রতা স্তর স্থিতিশীল হওয়ার জন্য 20 সেকেন্ড অপেক্ষা করতে হবে
সেচকার্যের পুরো প্রক্রিয়ায়, টেলিমেট্রি বার্তা গ্রহণ থেকে শুরু করে মাটির আর্দ্রতা স্তরকে আবার প্রক্রিয়া করার জন্য প্রস্তুত হওয়া প্রক্রিয়াটি প্রায় 25 সেকেন্ড সময় নেয়। কিন্তু এদিকে আমরা প্রতি 10 সেকেন্ডে মাটির আর্দ্রতা স্তর সংক্রান্ত বার্তা প্রেরণ করছি, যা এখানে ওভারল্যাপ করছে । এক্ষেত্রে সমস্যা তৈরী হতে পারে।
.২ভাবে এটির সমাধান করা যায়ঃ
* আইওটি ডিভাইস কোডটি পরিবর্তন করতে হবে যেন প্রতি মিনিটে কেবল ১টি টেলিমেট্রি প্রেরণ হয়, এভাবে এখানে সামঞ্জস্য বজায় রাখা যাবে।
* সেচকার্য চলার সময়ে টেলিমেট্রি ম্যাসেজে আন-সাবস্ক্রাইব করা।
প্রথম অপশনটি সর্বদা বড় খামারগুলির জন্য ভাল সমাধান নয়। কৃষকের কাছে সেচ চলমান সময়ে মাটির আর্দ্রতার মান দরকার হতে পারে, তা পরে বিশ্লেষণের জন্য, উদাহরণস্বরূপ খামারের বিভিন্ন অঞ্চলে পানির প্রবাহ সম্পর্কে জানতে হলে এই তথ্য দরকার। দ্বিতীয় বিকল্পটি এক্ষেত্রে ভাল - কোডটি টেলিমেট্রিটিকে যখন ব্যবহার করতে পারে না কেবল তখনই তা উপেক্ষা করছে, তবে টেলিমেট্রি এখনও অন্যান্য সার্ভিসের জন্য থাকবে এবং পরে ব্যবহার করা যাবে।
> 💁 আইওটি ডেটা কেবলমাত্র একটি ডিভাইস থেকে কেবল একটি সার্ভিসে প্রেরণ করা হয় না, বরং অনেক ডিভাইস কোন ব্রোকারের কাছে ডেটা প্রেরণ করতে পারে এবং অনেক সার্ভিস তখন সেই ব্রোকারের কাছ থেকে ডেটা নিতে পারে। উদাহরণস্বরূপ, একটি সার্ভিস মাটির আর্দ্রতার ডেটা নিতে পারে এবং এটি পরবর্তী তারিখে বিশ্লেষণের জন্য একটি ডাটাবেসে সংরক্ষণ করতে পারে। একটি সেচ ব্যবস্থা নিয়ন্ত্রণ করতে অন্য সার্ভিসও একই টেলিমেট্রি ডেটা ব্যবহার করতে পারে।
### কাজ - উদ্ভিদ নিয়ন্ত্রণ সার্ভারে সময় যুক্ত করা
5 সেকেন্ডের জন্য রিলে চালিয়ে, 20 সেকেন্ড অপেক্ষা করার জন্য সার্ভার কোড আপডেট করতে হবে।
1. ভিএস কোডে `soil-moisture-sensor-server` ফোল্ডার খুলতে হবে (যদি আগে থেকে খোলা না থাকে)। ভার্চুয়াল এনভায়রনমেন্ট একটিভ কিনা তা নিশ্চিত করতে হবে।
1. `app.py` ফাইল ওপেন করি।
1. `app.py` ফাইলে নিচের কোড সংযুক্ত করি।
```python
import threading
```
এই স্টেটমেন্টটি পাইথন লাইব্রেরি থেকে `threading` ইম্পোর্ট করে, যা অপেক্ষমান সময়েও পাইথনকে কোড এক্সেকিউট করার সুযোগ দেয়।
1. `handle_telemetry` ফাংশনের উপরে নিম্নের কোড যুক্ত করি যাতে সার্ভার কোড থেকে আসা টেলিমেট্রি ম্যাসেজ রিসিভ করা যায়ঃ
```python
water_time = 5
wait_time = 20
```
এটি নির্দিষ্ট করে যে কতক্ষণ রিলে চলবে (`water_time`) এবং তারপর মাটির আর্দ্রতার জন্য কতক্ষণ অপেক্ষা করতে হবে (`wait_time`) সেই বিষয়।
1. তারপর কোডে নিচের অংশ যুক্ত করি
```python
def send_relay_command(client, state):
command = { 'relay_on' : state }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
```
এটি `send_relay_command` ফাংশনকে ডিফাইন করে যা MQTT এর মাধ্যমে রিলেতে নির্দেশ পাঠায়। এই টেলিমেট্রি ডিকশনারি হিসেবে তৈরী করা হলেও পরে এটিকে JSON এ রূপান্তর করা হয়। `state` এ যে ভ্যালু পাঠানো হয় তা নির্ধারণ করে যে, রিলে অন নাকি অফ থাকবে।
1. `send_relay_code` ফাংশনের পর, কোডে নিচের অংশ যুক্ত করি।
```python
def control_relay(client):
print("Unsubscribing from telemetry")
mqtt_client.unsubscribe(client_telemetry_topic)
send_relay_command(client, True)
time.sleep(water_time)
send_relay_command(client, False)
time.sleep(wait_time)
print("Subscribing to telemetry")
mqtt_client.subscribe(client_telemetry_topic)
```
এটি প্রয়োজনীয় সময় এর পরিমাণের ভিত্তিতে রিলে নিয়ন্ত্রণ করতে একটি ফাংশনকে সংজ্ঞায়িত করে। এটি টেলিমেট্রি থেকে আন-সাবস্ক্রাইব করে শুরু হয় যাতে মাটির আর্দ্রতা বার্তাগুলি প্রক্রিয়াজাত না হয় যখন সেচ দেয়া হচ্ছে। এরপরে এটি রিলে চালু করার জন্য একটি নির্দেশ পাঠায়। এরপরে এটি `water_time` এর জন্য অপেক্ষা করে এবং তারপর রিলে বন্ধ করার জন্য নির্দেশ দেয় । অবশেষে এটি মাটির আর্দ্রতার মাত্রা `wait_time` সময় স্থিতিশীল হওয়ার জন্য অপেক্ষা করে। এরপরে এটি টেলিমেট্রিতে পুনরায় সাবস্ক্রাইব করে।
1. `handle_telemetry`ফাংশনটি এভাবে পরিবর্তন করিঃ
```python
def handle_telemetry(client, userdata, message):
payload = json.loads(message.payload.decode())
print("Message received:", payload)
if payload['soil_moisture'] > 450:
threading.Thread(target=control_relay, args=(client,)).start()
```
এই কোডটি মাটির আর্দ্রতার স্তর পরীক্ষা করে। যদি এটি 450 এর বেশি হয় তবে মাটিতে জল দেওয়া দরকার, তাই এটি `control_relay` ফাংশন কল করে। এই ফাংশনটি পৃথক থ্রেডে চালানো হয়, যা ব্যাকগ্রাউন্ডে কাজ করে।
1. আমাদের আইওটি ডিভাইসটি চলছে কিনা তা নিশ্চিত করে তারপরে এই কোডটি চালাতে হবে। মাটির আর্দ্রতার স্তর পরিবর্তন করি এবং রিলতে কী ঘটে তা পর্যবেক্ষণ করি - এটি 5 সেকেন্ডের জন্য চালু হওয়া উচিত এবং কমপক্ষে 20 সেকেন্ডের জন্য বন্ধ থাকা উচিত। কেবলমাত্র মাটির আর্দ্রতার মাত্রা পর্যাপ্ত না হলেই বরং আবার চালু হবে।
```output
(.venv) ➜ soil-moisture-sensor-server ✗ python app.py
Message received: {'soil_moisture': 457}
Unsubscribing from telemetry
Sending message: {'relay_on': True}
Sending message: {'relay_on': False}
Subscribing to telemetry
Message received: {'soil_moisture': 302}
```
সিমুলেটেড সেচ ব্যবস্থায় এটি পরীক্ষা করার একটি ভাল উপায় হল শুকনো মাটি ব্যবহার করা। তারপরে রিলে চালু থাকা অবস্থায় ম্যানুয়ালি পানি ঢালা, রিলে বন্ধ হয়ে গেলে তা বন্ধ করে দিতে হবে।
> 💁 এসকল কোড [code-timing](./code-timing) ফোল্ডারে পাওয়া যাবে।
> 💁 পাম্প দিয়ে সত্যিকারের সেচ ব্যবস্থা নির্মাণের জন্য, [6V পাম্প](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) ব্যবহার করা এতে পারে যার থেকে একটি [USB টার্মিনাল পাওয়ার সাপ্লাই](https://www.adafruit.com/product/3628) থাকবে। পাম্পে আসা বা এটি থেকে নির্গত পাওয়ার যেন রিলে দিয়ে সংযুক্ত থাকে - তা নিশ্চিত করতে হবে।
---
## 🚀 চ্যালেঞ্জ
এমন কি আরো কোন আইওটি বা অন্যান্য বৈদ্যুতিক ডিভাইস রয়েছে যেখানে একইরকম সমস্যা আছে - যেখানে অ্যাক্চুয়েটরের ফলাফল সেন্সরে পৌঁছাতে একটু সময় লাগে ? আমাদের বাড়িতে বা প্রতিষ্ঠানে এমন অনেক যন্ত্রই হয়তো আছে - একটু চিন্তা করি
* তারা কোন বৈশিষ্ট্য পরিমাপ করে?
* অ্যাকচুয়েটর ব্যবহারের পরে বৈশিষ্ট্যটি পরিবর্তন হতে কত সময় লাগবে?
* বৈশিষ্ট্যটির প্রয়োজনীয় মান বা Required Value পরিবর্তন ঠিক আছে কি?
* এটি কীভাবে প্রয়োজনীয় মান এ ফিরে আসবে?
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14)
## রিভিউ ও স্ব-অধ্যয়ন
টেলিফোন এক্সচেঞ্জসহ আরো বিভিন্ন ক্ষেত্রে রিলে এর ব্যবহার সম্পর্কে জানতে [উইকিপিডিয়া থেকে রিলে সংক্রান্ত আর্টিকেল](https://wikipedia.org/wiki/Relay) পড়া যায়।
## এসাইনমেন্ট
[অধিক কার্যকর সেচব্যবস্থা নির্মাণ](assignment.bn.md)

@ -1,40 +0,0 @@
# অধিক কার্যকর সেচব্যবস্থা নির্মাণ
## নির্দেশাবলী
এই পাঠটিতে সেন্সর ডেটার মাধ্যমে কীভাবে রিলে নিয়ন্ত্রণ করা যায় এবং সেই রিলে পরবর্তীতে কীভাবে কোন সেচ ব্যবস্থার জন্য একটি পাম্প নিয়ন্ত্রণ করতে পারে সে বিষয়ে বর্ণনা ছিল । নির্দিষ্ট মাটির জন্য, নির্দিষ্ট সময়ে একটি পাম্প চালানো হলে তা সর্বদা মাটির আর্দ্রতার উপরে একই প্রভাব ফেলতে সক্ষম হবে। এর অর্থ কত সেকেন্ড পানি দিলে, আর্দ্রতার কতটুকু পরিবর্তন হবে সে সম্পর্কে পরিষ্কার ধারণা দাঁড়া করান যাবে। এই ডেটা ব্যবহার করে আমরা আরও নিয়ন্ত্রিত সেচ ব্যবস্থা তৈরি করতে পারি।
এই অ্যাসাইনমেন্টের জন্য আমরা গণনা করব যে মাটির আর্দ্রতার মানের একটি নির্দিষ্ট বৃদ্ধির জন্য পাম্পটি কতক্ষণ চালানো উচিত।
> ⚠️ ভার্চুয়াল আইওটি ব্যবহার করলেও, এই প্রক্রিয়াটির মাধ্যমে কাজ করা যাবে। তবে ম্যানুয়ালি প্রতি সেকেন্ডে একটি নির্দিষ্ট পরিমাণে মাটির আর্দ্রতা বৃদ্ধি করে - সেই ফলাফল ব্যবহার করতে হবে।
>
1.শুকনো মাটি নিয়ে, তার আর্দ্রতা পরিমাপ করি।
1. 1 সেকেন্ডের জন্য পাম্প চালিয়ে বা একটি নির্দিষ্ট পরিমাণ পানি ঢেলে - এতে আর্দ্রতা বাড়াই।
> পাম্পটি সর্বদা একটি স্থির হারে চালানো উচিত, সুতরাং প্রতি সেকেন্ডে পাম্পটি একই পরিমাণে পানি সরবরাহ করবে।
1. মাটির আর্দ্রতা স্তর স্থিতিশীল না হওয়া পর্যন্ত অপেক্ষা করতে হবে এবং তারপরে রিডীং নিতে হবে।
1. এটি একাধিকবার পুনরাবৃত্তি করে ফলাফলগুলির একটি সারণী তৈরি করতে হবে। এই টেবিলের একটি উদাহরণ নীচে দেওয়া হল।
| পাম্পকৃত সময় | আর্দ্রতা | হ্রাস |
| --- | --: | -: |
| শুকনো | 643 | 0 |
| 1s | 621 | 22 |
| 2s | 601 | 20 |
| 3s | 579 | 22 |
| 4s | 560 | 19 |
| 5s | 539 | 21 |
| 6s | 521 | 18 |
1. পানির প্রতি সেকেন্ডে মাটির আর্দ্রতা বৃদ্ধির গড় মান নির্ণয় করতে হবে। উপরের উদাহরণে, পানির প্রতিটি সেকেন্ডে 20.3 গড়ে কমে।
1. আমাদের সার্ভার কোডটির দক্ষতা উন্নত করতে এই ডেটাটি ব্যবহার করতে হবে। সঠিক পরিমাণ মাটির আর্দ্রতা পেতে প্রয়োজনীয় সময়ের জন্য পাম্প চালাচ্ছি কিনা তা দেখতে হবে।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতির প্রয়োজন (নিম্নমান) |
| -------- | --------- | -------- | ----------------- |
| মাটির আর্দ্রতার তথ্য সংগ্রহ | নির্দিষ্ট পরিমাণে পানি দেয়ার পরে অনেকগুলো রিডিং নিতে সক্ষম হয়েছে | নির্দিষ্ট পরিমাণে পানি দেয়ার পরে অল্পকিছু রিডিং নিতে সক্ষম হয়েছে | ১-২টি রিডিং নিয়েছে বা কোন রি্ডিং নিতে পারেনি |
| সার্ভার কোড ঠিক করা | মাটির আর্দ্রতার গড় হ্রাস গণনা করতে এবং সার্ভার কোডটি আপডেট করতে সক্ষম হয়েছে | মাটির আর্দ্রতার গড় হ্রাস গণনা করতে পারলেও , সার্ভার কোডটি আপডেট করতে সক্ষম নয় বা গণনা ভুল করলেও সঠিকভাবে সার্ভার কোড আপডেট করেছে |গড় গণনা করতে বা সার্ভার কোড আপডেট করতে পারেনি |

@ -1,432 +0,0 @@
# উদ্ভিদকে ক্লাউডে সংযুক্ত করা
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-8.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15)
## সূচনা
গত পাঠে, আমরা দেখেছি কীভাবে উদ্ভিদটি একটি এমকিউটিটি ব্রোকারের সাথে সংযুক্ত করা যায় এবং লোকালি চলমান কিছু সার্ভার কোড থেকে রিলে নিয়ন্ত্রণ করেছিলাম। এটি এমন একধরণের ইন্টারনেট-সংযুক্ত স্বয়ংক্রিয় পানি সরবরাহ ব্যবস্থা যা বাসাবাড়ির দুয়েকটা উদ্ভিদ থেকে শুরু করে বাণিজ্যিক খামা্রে পর্যন্ত ব্যবহৃত হয়।
আইওটি ডিভাইসের কার্যনীতি দেখানোর জন্যই মূলত আমরা সর্বজনীন এমকিউটিটি ব্রোকারের মাধ্যমে সংযোগ করেছিলাম, তবে এটি সবচেয়ে নির্ভরযোগ্য বা সুরক্ষিত উপায় নয়। এই পাঠে আমরা ক্লাউড সম্পর্কে এবং পাবলিক ক্লাউড পরিষেবাগুলির দ্বারা সরবরাহকৃত আইওটি সুবিধাগুলো সম্পর্কে শিখব। কীভাবে আমাদের চারাগাছকে পাবলিক এমকিউটিটি ব্রোকারের পরিবর্তে ক্লাউডে স্থানান্তরিত করা যায়, তা শিখবো।
এই লেসনে আমরা দেখবোঃ
* [ক্লাউড কী ?](#ক্লাউড-কী)
* [ক্লাউড-সাবস্ক্রিপশন-গ্রহণ](#ক্লাউড-সাবস্ক্রিপশন-গ্রহণ)
* [ক্লাউড IoT সার্ভিস](#ক্লাউড-IoT-সার্ভিস)
* [ক্লাউডে IoT সার্ভিস তৈরী করা](#ক্লাউডে-IoT-সার্ভিস-তৈরী-করা)
* [IoT Hub এর সাথে সংযোগ](#IoT-Hub-এর-সাথে-সংযোগ)
* [IoT সার্ভিসগুলোর সাথে ডিভাইসের সংযোগ](#IoT-সার্ভিসগুলোর-সাথে-ডিভাইসের-সংযোগ)
## ক্লাউড কী ?
ক্লাউড আবির্ভাবের পূর্বে যখন কোন কোম্পানি তাদের কর্মীদের কাছে কোন সার্ভিস (যেমন ডেটাবেস বা ফাইল স্টোরেজ), বা জনসাধারণের ব্যবহারের কোন ফীচার (যেমন ওয়েবসাইট) সরবরাহ করতে চায়, তখন তারা ডেটা সেন্টার তৈরি এবং পরিচালনা করে। এটি কয়েকটি কম্পিউটার সম্বলিত একটি ঘর থেকে শুরু করে অনেকগুলি কম্পিউটার নিয়ে একটি বিল্ডিং সমান বড়ও হতে পারে। ঐ কোম্পানি সবকিছুই নিজেরা পরিচালনা করে, যেমন -
* কম্পিউটার কেনা
* হার্ডওয়্যার রক্ষণাবেক্ষণ
* পাওয়ার এবং কুলিং
* নেটওয়ার্কিং
* সুরক্ষা (বিল্ডিং এবং কম্পিউটারগুলিতে থাকা সফ্টওয়্যার)
* সফ্টওয়্যার ইনস্টলেশন ও আপডেট
এটি খুব ব্যয়বহুল হতে পারে, বিশাল সংখ্যক দক্ষ কর্মী প্রয়োজন এবং কিছু পরিবর্তন করতে গেলে, তা খুব ধীর হবে। উদাহরণস্বরূপ, যদি কোন অনলাইন স্টোরকে ব্যস্ত ছুটির মৌসুমের জন্য পরিকল্পনা করার প্রয়োজন হয়, তাদের অধিক বিক্রয় এর পরিচালনার জন্য আরও হার্ডওয়ার কেনা, তা কনফিগার করা, ইনস্টল করা প্রয়োজন এবং এসব করার জন্য তাদের কয়েক মাস আগে থেকেই পরিকল্পনা করতে হবে। ছুটির মৌসুম শেষ হয়ে যাওয়ার পরে বিক্রয় কমে যায় -কিন্তু তখনও তারা পরবর্তী ব্যস্ত মৌসুম আসা পর্যন্ত অলস বসে থাকবে , তাদের সব ব্য্যবহুল যন্ত্রও বেকার পড়ে থাকবে।
✅ এভাবে কাজ করলে, কোম্পানি গুলো কী পরিস্থিতিভেদে দ্রুত তাদের কাজের ধারা বদলাতে পারবে? যদি কোন অনলাইন পোশাক খুচরা বিক্রেতা হঠাৎ করে (কোন সেলিব্রিটি তাদের পোশাকগুলিতে দেখা যাওয়ার কারণে) জনপ্রিয় হয়ে ওঠে, তবে তারা কি হঠাৎ অর্ডারের প্রবাহকে সাপোর্ট করার জন্য তাদের কম্পিউটিং ক্ষমতা পর্যাপ্ত পরিমাণে বাড়িয়ে তুলতে সক্ষম হবে?
### আরেকজনের কম্পিউটার
ক্লাউডকে প্রায়শই হাস্যকরভাবে 'অন্য কারো কম্পিউটার' হিসাবে বলা হয়। প্রাথমিক ধারণাটি বেশ সহজ - কম্পিউটার কেনার পরিবর্তে অন্য কারও কম্পিউটার ভাড়া নেয়া। ক্লাউড কম্পিউটিং প্রদানকারী সেই "অন্য কেউ" এই বিশাল ডেটা সেন্টার পরিচালনা করে, তারা হার্ডওয়্যার ক্রয় এবং ইনস্টল করার জন্য, পাওয়ার পরিচালনা এবং কুলিং পরিচালনা, নেটওয়ার্কিং, সুরক্ষা, হার্ডওয়্যার এবং সফ্টওয়্যার আপডেটগুলি, সমস্ত কিছুর জন্য দায়বদ্ধ থাকে। গ্রাহক হিসাবে, আমরা প্রয়োজনীয় কম্পিউটারগুলি ভাড়া নেব; কাজের চাহিদা বাড়লে বেশি ক্ষমতার কম্পিউটার ভাড়া নেব এবং তারপরে চাহিদা কমে গেলে তা ছেড়ে দেব - এভাবেই আমাদের সুবিধামত কাজ করা যাবে। এই ক্লাউড ডেটা সেন্টারগুলি সারা বিশ্ব জুড়ে ছড়িয়ে রয়েছে।
![A Microsoft cloud data center](../../../../images/azure-region-existing.png)
![A Microsoft cloud data center planned expansion](../../../../images/azure-region-planned-expansion.png)
এই ডেটা সেন্টারগুলি আকারে একাধিক বর্গকিলোমিটার হতে পারে। উপরের চিত্রগুলি কয়েক বছর আগে একটি মাইক্রোসফ্ট ক্লাউড ডেটা সেন্টারে তোলা হয়েছিল, এবং পরিকল্পিত সম্প্রসারণের পাশাপাশি প্রাথমিক আকারটি দেখায়। সম্প্রসারণের জন্য ক্লিয়ার করা অঞ্চলটি 5 বর্গকিলোমিটারেরও বেশি জায়গাজুড়ে অবস্থিত!
> 💁 এই ডেটা সেন্টারগুলিতে এত বেশি পরিমাণে বিদ্যুতের প্রয়োজন হয় যে কোন কোন ক্লাউড সার্ভিস প্রোভাইডার এর নিজস্ব বিদ্যুৎ কেন্দ্র রয়েছে। তাদের আকার এবং ক্লাউড সরবরাহকারীদের বিনিয়োগের স্তরের কারণে এগুলি সাধারণত খুব পরিবেশ বান্ধব হয়। এগুলি অনেকগুলো ক্ষুদ্র ক্ষুদ্র ডেটা সেন্টার ব্যবহার করার তুলনায় অনেক বেশি কার্যকরী; বেশিরভাগ সময়ই নবায়নযোগ্য শক্তির উপর চালিত হয় এবং ক্লাউড সরবরাহকারীরা ডেটা সেন্টারগুলি তৈরির জায়গায় বর্জ্য হ্রাস করতে, জলের ব্যবহার কমানোর জন্য এবং বনগুলি পুনর্বাসনের জন্য চেষ্টা করে। ক্লাউড প্রোভাইডাররা পরিবেশগত বিষয়ে কীভাবে সুরক্ষা নিশ্চিতে কাজ করছে তা জানতে [Azure sustainability](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn) পড়ে দেখা যেতে পারে।
✅ ছোট একটি গবেষণা করা যাকঃ বড় ক্লাউডসমূহ যেমন [মাইক্রোসফটের Azure](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) বা [গুগলের GCP](https://cloud.google.com) সম্পর্কে পড়ে নিই এবং জানার চেষ্টা করি তাদের কয়টি ডেটা সেন্টার রয়েছে এবং তারা পৃথিবীতে কোথায় এগুলোকে রেখেছে?
ক্লাউড সার্ভিসের ব্যবহার - কোম্পানিগুলোর ব্যয়কে কমিয়ে দেয় এবং তাদের সরবরাহকারীর হাতে ক্লাউড কম্পিউটিং সংক্রান্ত বিষয়ের ভার দিয়ে রেখে তারা নিজেদের গুরুত্বপূর্ণ কাজগুলিতে মনোনিবেশ করতে পারে। ব্যবসায়ী কোম্পানিগুলোকে ডেটা সেন্টার স্পেস ভাড়া বা কেনার প্রয়োজন হয় না, সংযোগ এবং বিদ্যুতের জন্য বিভিন্ন সরবরাহকারীর অর্থ প্রদান বা বিশেষজ্ঞ নিয়োগের প্রয়োজন হয় না। এর পরিবর্তে তারা ক্লাউড সরবরাহকারীর কাছে সবকিছু বাবদ শুধুমাত্র একটি মাসিক বিল প্রদান করে।
ক্লাউড সরবরাহকারী এক্ষেত্রে নিজেদের ব্যয় কমিয়ে আনার জন্য বড় বড় পর্যায়ে কাজ করে যেমন - কম ব্যয়ে প্রচুর কম্পিউটার কিনে, রক্ষণাবেক্ষণের ক্ষেত্রে তাদের কাজের চাপ হ্রাস করার জন্য সরঞ্জামে বিনিয়োগ করতে পারে, এমনকি তাদের ক্লাউডের সেবা উন্নত করার জন্য তাদের নিজস্ব হার্ডওয়্যার ডিজাইনও তৈরি করতে পারে।
### Microsoft Azure
Azure হলো মাইক্রোসফটের ডেভলাপার ক্লাউড এবং এই লেসনে আমরা এটিই ব্যবহার করব। নীচের ভিডিওটিতে Azure সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেওয়া হয়েছে:
[![Overview of Azure video](../../../../images/what-is-azure-video-thumbnail.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn)
## ক্লাউড সাবস্ক্রিপশন গ্রহণ
ক্লাউডে পরিষেবাগুলি ব্যবহার করতে হলে ক্লাউড সরবরাহকারীর সাথে সাবস্ক্রিপশনের জন্য সাইন আপ করতে হয়। এই পাঠের জন্য, আমরা মাইক্রোসফ্ট অ্যাজুরে সাবস্ক্রিপশনের জন্য সাইন আপ করব। যদি ইতিমধ্যে অ্যাজুরে একটি সাবস্ক্রিপশন থাকে তবে এই অংশটি এড়িয়ে, পরবর্তী অংশে চলে যাওয়া যাবে। এখানে বর্ণিত সাবস্ক্রিপশন বিষয়াদি বর্তমানে লেখার সময় সঠিক আছে, তবে সময়ের সাথে তা পরিবর্তিত হতে পারে।
> 💁 কেউ যদি শিক্ষাপ্রতিষ্ঠানের মাধ্যমে এই লেসনগুলি ব্যবহার করে থাকে, তবে ইতিমধ্যে হয়তো তার কাছে একটি অ্যাজুর সাবস্ক্রিপশন আছে। শিক্ষকের সাথে যোগাযোগ করে বিষয়টি নিশ্চিত করতে হবে।
এখানে দুটি ভিন্ন ধরণের বিনামূল্যে Azure সাবস্ক্রিপশন ব্যবহার করে আমরা সাইন আপ করতে পারবঃ
* **Azure for Students** - এটি প্রাপ্তবয়ষ্ক শিক্ষার্থীদের জন্য ডিজাইন করা একটি সাবস্ক্রিপশন। সাইন আপ করার জন্য কোনও ক্রেডিট কার্ডের দরকার নেই এবং আবেদনকারী যে শিক্ষার্থী তা যাচাই করার জন্য প্রাতিষ্ঠানিক ইমেল ঠিকানা ব্যবহার করলেই হবে। সাইন আপ করলেই, ক্লাউডে সার্ভিসে ব্যয় করার জন্য ১০০ মার্কিন ডলার দেয়া হবে, সাথে থাকবে আইওটি পরিষেবা সহ বিনামূল্যে বেশ কিছু ফ্রি পরিষেবা। এটির মেয়াদ 12 মাস স্থায়ী হয় এবং প্রতি বছর রিনিউ করা যাবে।
* **Azure free subscription** - যারা শিক্ষার্থী নয়, তাদের জন্যই এই সাবস্ক্রিপশন। সাবস্ক্রিপশনে সাইন আপ করার আপনার ক্রেডিট কার্ডের প্রয়োজন হবে, তবে আপনার কার্ডটির কোন বিল/খরচ আসবেনা, এটি কেবল একারণেই যে - আবেদনকারী একজন সত্যিকারের মানুষ, বট নয় - তা যাচাই করা। যে কোন পরিষেবাতে প্রথম 30 দিনের মধ্যে Azure পরিষেবাদির free tier সহ $200 ক্রেডিট দেয়া হয়। ক্রেডিট একবার ব্যবহার হয়ে গেলেও, সরাসরি কার্ড থেকে কোন অর্থ গ্রহণ করা হবেনা, যতক্ষণ পর্যন্ত নাহ সেই ব্যবহারকারী pay-as-you-go সাবস্ক্রিপশন নিচ্ছে।
> 💁 মাইক্রোসফ্ট অপ্রাপ্তবয়ষ্ক অর্থাৎ 18 বছরের কম বয়সী শিক্ষার্থীদের জন্য "স্টুডেন্ট স্টার্টার" সাবস্ক্রিপশন সরবরাহ করে, তবে এই লেসন লেখার সময় পর্যন্তও এটি আইওটি পরিষেবা সমর্থন করে না।
### কাজ - ফ্রী ক্লাউড সাবস্ক্রিপশনের জন্য সাইন আপ
18+ বয়সের শিক্ষার্থীদের সাবস্ক্রিপশনের জন্য অ্যাজুরে সাইন আপ করতে হবে। একটি স্কুল ইমেল ঠিকানাে যাচাই করে নিতে হবে। নিম্নের দুটি উপায়ের যেকোন একটিতে এটি করা যাবে:
* GitHub student developer pack এর জন্য [education.github.com/pack](https://education.github.com/pack) থেকে সাইন আপ করতে হবে। এটি গিটহাব এবং মাইক্রোসফ্ট অ্যাজুর সহ বিভিন্ন ট্যুল এবং অফারগুলিতে অ্যাক্সেস দেয়। একবার developer pack এর জন্য সাইন আপ করে নিলে, তারপরে শিক্ষার্থীদের জন্য অফারগুলো অফারটি সক্রিয় করা যাবে।
* Azure for Students একাউন্টের জন্য সরাসরি [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn) থেকে সাইন আপ করা।
> ⚠️প্রাতিষ্ঠানিক ইমেইল এড্রেস যদি কাজ না করে, তবে [এই রেপোসিটরিতে ইস্যু রেইজ](https://github.com/Microsoft/IoT-For-Beginners/issues) করার অনুরোধ করা হচ্ছে। তখন আমরা দেখবো এই প্রতিষ্ঠানের শিক্ষার্থীদের অনুমতি তালিকায় যুক্ত করা যায় কিনা।
কেউ যদি ছাত্র না হয় বা বৈধ স্কুল ইমেইল ঠিকানা না থাকে তবে একটি অ্যাজুর ফ্রি সাবস্ক্রিপশনের জন্য সাইন আপ করতে পারবে।
* অ্যাজুর ফ্রি সাবস্ক্রিপশনের জন্য [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) থেকে সাইন-আপ করা যাবে।
## ক্লাউড IoT সার্ভিস
আমরা যে পাবলিক টেস্ট এমকিউটিটি ব্রোকারটি ব্যবহার করেছি, তা শেখার ক্ষেত্রে অনেক ভালো একটি অপশন। তবে বাণিজ্যিক সেটিংয়ে ব্যবহার করার সরঞ্জাম হিসাবে তার অনেকগুলি ত্রুটি রয়েছে:
* নির্ভরযোগ্যতা - এটি কোন গ্যারান্টিবিহীন একটি ফ্রী সার্ভিস এবং যে কোনও সময় বন্ধ হতে পারে।
* সুরক্ষা - এটি সর্বজনীন, সুতরাং যে কেউ আমাদের টেলিমেট্রি জানতে বা আমাদের হার্ডওয়্যার নিয়ন্ত্রণের জন্য আদেশগুলি পাঠাতে পারে
* পারফরম্যান্স - এটি কেবল কয়েকটি পরীক্ষামূলক বার্তাগুলির জন্য ডিজাইন করা হয়েছে, সুতরাং বিপুল পরিমাণ বার্তা প্রেরণের জন্য যথোপযুক্ত নয়
* সনাক্তকরণ - এতে কোন ডিভাইসগুলি সংযুক্ত রয়েছে তা জানার কোন উপায় নেই
ক্লাউডে আইওটি পরিষেবাগুলি এই সমস্যাগুলি সমাধান করে। এগুলি বড় ক্লাউড সরবরাহকারীদের দ্বারা পরিচালিত হয় যারা নির্ভরযোগ্যতার জন্য প্রচুর পরিমাণে বিনিয়োগ করে এবং আকস্মিকভাবে উদ্ভূত সমস্যা সমাধানের জন্য সক্ষমতা রয়েছে । হ্যাকারদের দ্বারা আমাদের ডেটা পড়া বা কমান্ড প্রেরণ বন্ধ করার জন্য, সুরক্ষার ব্যবস্থা রয়েছে। ক্লাউডের প্রয়োজন অনুযায়ী সক্ষমতা বাড়ানো কমানোর সুযোগ সহ প্রতিদিন তারা কয়েক মিলিয়ন বার্তা হ্যান্ডেল করতে সক্ষম ।
> 💁 যদিও এই সুবিধাগুলোর জন্য একটি মাসিক ফি প্রদান করতে হয়, তবুও বেশিরভাগ ক্লাউড সরবরাহকারীরা তাদের আইওটি পরিষেবার একটি ফ্রী ভার্সন রাখে যা প্রতিদিন সীমিত পরিমাণে বার্তা সরবরাহ করে। এই ফ্রী সংস্করণটি সাধারণত কোন ডেভলাপার এর জন্য, ক্লাউড প্রোভাইডারের পরিষেবা সম্পর্কে জানার জন্য যথেষ্ট। এই পাঠে আমরা একটি বিনামূল্যে সংস্করণ ব্যবহার করব।
আইওটি ডিভাইসগুলি হয় কোন ডিভাইস SDK (একটি লাইব্রেরি যা সার্ভিসটির বৈশিষ্ট্যগুলির সাথে কাজ করার জন্য কোড সরবরাহ করে) ব্যবহার করে অথবা এমকিউটিটি বা এইচটিটিপি এর মতো কোন যোগাযোগ প্রোটোকলের মাধ্যমে সরাসরি ক্লাউড পরিষেবায় সংযুক্ত হয়। ডিভাইস এসডিকে সাধারণত সবচেয়ে সহজতম উপায় কারণ এটি নিজেই সমস্ত কিছু পরিচালনা করে যেমন কোন বিষয়গুলি প্রকাশ বা সাবস্ক্রাইব করতে হয় তা জেনে রাখা এবং কীভাবে সুরক্ষা নিশ্চিত করতে হয় তা পরিচালনা করা।
![Devices connect to a service using a device SDK. Server code also connects to the service via an SDK](../../../../images/iot-service-connectivity.png)
আমাদের ডিভাইসটি তারপরে এই অ্যাপ্লিকেশনের অন্যান্য অংশগুলির সাথে এই সার্ভিসের মাধ্যমে যোগাযোগ করে - যেভাবে আমরা এমকিউটিটি-এর মাধ্যমে নির্দেশ গ্রহণ এবং টেলমেট্রি পাঠিয়েছিলাম। বার্তাগুলি সাধারণত আমাদের ডিভাইস থেকে সার্ভিসে আসে যেখানে আমাদের অ্যাপ্লিকেশনের অন্যান্য উপাদানগুলি সেগুলি পড়তে পারে এবং বার্তাগুলি ডিভাইসে আবারও পাঠানো যেতে পারে।
![Devices without a valid secret key cannot connect to the IoT service](../../../../images/iot-service-allowed-denied-connection.png)
এই সার্ভিসগুলোতে সংযোগ স্থাপন এবং ডেটা প্রেরণ করতে পারে এমন সমস্ত ডিভাইস সম্পর্কে তথ্য নিয়ে, তারপর তাদের সুরক্ষা বাস্তবায়িত করে। এটি করার জন্য হয় সার্ভিসের সাথে ডিভাইসগুলিকে প্রাক-নিবন্ধভুক্ত করে অথবা ডিভাইসগুলিকে গোপনীয় চাবি বা সার্টিফিকেট দিয়ে তারা প্রথমবার সার্ভিসে নিবন্ধিত করে। এক্ষেত্রে অজানা(Unknown) ডিভাইসগুলি সংযোগ করতে অক্ষম, যদি তারা তা করার চেষ্টা করে, তবে সার্ভিস সেসকল সংযোগ প্রত্যাখ্যান করে এবং তাদের দ্বারা প্রেরিত বার্তাগুলি উপেক্ষা করে।
✅ কিছু গবেষণা করা যাক: যেকোন ডিভাইস বা কোড সংযোগ করতে পারে- এমন উন্মুক্ত আইওটি পরিষেবা নেওয়ার নেতিবাচক দিক কী? হ্যাকাররা এগুলো ব্যবহার করেছে - এমন নির্দিষ্ট উদাহরণ কী আছে?
আমাদের অ্যাপ্লিকেশনটির অন্যান্য উপাদানগুলি আইওটি সার্ভিসে সংযুক্ত হতে পারে এবং সংযুক্ত বা নিবন্ধিত সমস্ত ডিভাইসগুলি সম্পর্কে জানতে এবং তাদের সাথে সরাসরি একত্রে বা স্বতন্ত্রভাবে যোগাযোগ করতে পারে
> 💁 আইওটি সার্ভিসগুলি অতিরিক্ত সক্ষমতা ব্যবহার করে এবং ক্লাউড সরবরাহকারীদের কাছে অতিরিক্ত পরিষেবা এবং অ্যাপ্লিকেশন রয়েছে যা সার্ভিসের সাথে সংযুক্ত হতে পারে। উদাহরণস্বরূপ, আমরা যদি আমাদের ডিভাইসগুলো দ্বারা প্রেরিত সকল টেলিমেট্রি বার্তাগুলি সংরক্ষণ করতে চাই নির্দিষ্ট কোন ডাটাবেসে, তবে ক্লাউড সরবরাহকারীর কনফিগারেশন ট্যুল থেকে গোটা সার্ভিসটিকে একটি ডাটাবেসে সংযুক্ত করতে এবং ডেটা স্ট্রিম করার জন্য - কেবলমাত্র কয়েকটি ক্লিকই যথেষ্ট।
## ক্লাউডে IoT সার্ভিস তৈরী করা
এখন আমাদের কাছে অ্যাজুর সাবস্ক্রিপশন রয়েছে, আমরা একটি আইওটি সার্ভিসে সাইন আপ করতে পা্রি। মাইক্রোসফ্ট থেকে আইওটি পরিষেবাটিকে বলা হয় Auzre IoT Hub ।
![The Azure IoT Hub logo](../../../../images/azure-iot-hub-logo.png)
নীচের ভিডিওটিতে অ্যাজুরে আইওটি হাবের একটি সংক্ষিপ্ত বিবরণ দেওয়া হয়েছে:
[![Overview of Azure IoT Hub video](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU)
> 🎥 ভিডিও দেখতে উপরের চিত্রটি ক্লিক করতে হবে।
✅ কিছু অতিরিক্ত বিষয় শিখতে এবং আইওটি হাব সম্পর্কে জানতে [Microsoft IoT Hub documentation](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn) পড়া বেশ ভালো একটি উপায়।
Azure ক্লাউড সার্ভিসগুলো ওয়েব-ভিত্তিক পোর্টাল বা কমান্ড-লাইন ইন্টারফেসের (সিএলআই) মাধ্যমে কনফিগার করা যেতে পারে। এই কাজের জন্য, আমরা সিএলআই(CLI) ব্যবহার করব।
### কাজ - Azure CLI ইন্সটল করা
Azure CLI ব্যবহার করার জন্য প্রথমে এটি আমাদের পিসি বা ম্যাকে ইনস্টল করা আবশ্যক।
1. Azure CLI ইনস্টল করার জন্য [Azure CLI documentation](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn) পেইজ অনুসরণ করতে হবে।
1. অ্যাজুর সিএলআই কয়েকটি এক্সটেনশন সাপোর্ট করে যা বিস্তৃত অ্যাজুর পরিষেবাদি পরিচালনা করার সক্ষমতা বাড়ায়। আমাদের কমান্ড লাইন বা টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালিয়ে আইওটি এক্সটেনশন ইনস্টল করতে হবে:
```sh
az extension add --name azure-iot
```
1. কমান্ড লাইন বা টার্মিনাল থেকে, আজুর সিএলআই এর মাধ্যমে অ্যাজুর সাবস্ক্রিপশনে লগ ইন করতে নিম্নলিখিত কমান্ডটি চালাতে হবে।
```sh
az login
```
ডিফল্ট ব্রাউজারে একটি ওয়েবপেইজ চালু হবে। আমরা আজুর সাবস্ক্রিপশনের জন্য সাইন আপ করতে যে অ্যাকাউন্টটি ব্যবহার করেছি, তা ব্যবহার করেই লগ ইন করতে হবে। একবার লগ ইন হয়ে গেলে, ব্রাউজার ট্যাবটি বন্ধ করে দেয়া যাবে।
1. কারো যদি একাধিক Azure সাবস্ক্রিপশন থাকে, যেমন শিক্ষাপ্রতিষ্ঠানের সরবরাহ করা সাবস্ক্রিপশন, আবার একটি নিজস্ব Student subscription - যেটিই ব্যবহার করতে চাইবো, সেটি সিলেক্ট করতে হবে।আমাদের যে সমস্ত সাবস্ক্রিপশনে অ্যাক্সেস রয়েছে তা তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালালেই হবে:
```sh
az account list --output table
```
আউটপুটে সাবস্ক্রিপশনের নাম এবং `SubscriptionId` দেখা যাবে।
```output
➜ ~ az account list --output table
Name CloudName SubscriptionId State IsDefault
---------------------- ----------- ------------------------------------ ------- -----------
School-subscription AzureCloud cb30cde9-814a-42f0-a111-754cb788e4e1 Enabled True
Azure for Students AzureCloud fa51c31b-162c-4599-add6-781def2e1fbf Enabled False
```
যে সাবস্ক্রিপশনটি ব্যবহার করতে চাই, তা নির্বাচন করতে নিম্নলিখিত কমান্ডটি ব্যবহার করতে হবে:
```sh
az account set --subscription <SubscriptionId>
```
`<SubscriptionId>` এর জায়গায় আমরা যে সাবস্ক্রিপশন ব্যবহার করতে চাই, সেটির আইডি দিতে হবে। এই কমান্ডটি চালানোর পরে, আমাদের অ্যাকাউন্টগুলি তালিকাভুক্ত করতে কমান্ডটি আবার চালাতে হবে। তখন `IsDefault` কলামটি `True` হিসেবে মার্ক করা থাকবে আমাদের ব্যবহৃত সাবস্ক্রিপশন এর জন্য ।
### কাজ - রিসোর্স গ্রুপ তৈরী
আইওটি হাবের ভার্চুয়াল মেশিন, ডাটাবেস, বা এআই পরিষেবাগুলির মতো অ্যাজুর পরিষেবাগুলিকে **রিসোর্স** হিসাবে উল্লেখ করা হয়। প্রতিটি রিসোর্স একটি **রিসোর্স গ্রুপ** এর মধ্যে থাকতে হয়, যা এক বা একাধিক রিসোর্সের যৌক্তিক গ্রুপিং।
> 💁 রিসোর্স গ্রুপগুলি ব্যবহার করার অর্থ আমরা একবারে একাধিক সার্ভিস পরিচালনা করতে পারব। উদাহরণস্বরূপ, একবার আমরা এই প্রজেক্টের সমস্ত পাঠ শেষ করে নেওয়ার পরে, রিসোর্স গ্রুপ ডিলিট করে দেয়া যাবে এবং এতে থাকা সমস্ত রিসোর্স স্বয়ংক্রিয়ভাবে ডিলিট হবে।
1. বিশ্বজুড়ে বিভিন্ন অঞ্চলে একাধিক Azure ডেটা সেন্টার রয়েছে। আমরা যখন একটি অ্যাজুর রিসোর্স বা রিসোর্স গ্রুপ তৈরি কর্রি, তখন আমাদেরকে মাথায় রাখতে হবে যে এটি আমরা কোথায় তৈরি করতে চাই। বিভিন্ন অবস্থানের তালিকা পেতে নিম্নলিখিত কমান্ডটি চালানো যাবে:
```sh
az account list-locations --output table
```
অবস্থানের একটি দীর্ঘ তালিকা দেখা যাবে।
> 💁 এই লেসন লেখার সময়, 65 টি অবস্থান রয়েছে যেখানে আমরা আমাদের রিসোর্স রাখতে পারি।
```output
➜ ~ az account list-locations --output table
DisplayName Name RegionalDisplayName
------------------------ ------------------- -------------------------------------
East US eastus (US) East US
East US 2 eastus2 (US) East US 2
South Central US southcentralus (US) South Central US
...
```
`Name` কলামের ভ্যালুগুলো নোট রাখতে হবে যেগুলো আমাদের আশাপাশে বা নিকটে রয়েছে। ম্যাপ থেকে এগুলো দেখা যাবে [Azure geographies page](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn) এ গিয়ে।
1. নিচের কমান্ড রান করে `soil-moisture-sensor` নামক রিসোর্স গ্রুপ তৈরী করতে হবে। রিসোর্স গ্রুপের নামগুলি একটি সাবস্ক্রিপশনে অনন্য(unique) হতে হবে ।
```sh
az group create --name soil-moisture-sensor \
--location <location>
```
এখানে `<location>` এর পবিবর্তে পূর্ববর্তী ধাপে নির্দিষ্টকৃত লোকেশন দিতে হবে।
### কাজ - IoT Hub তৈরী
আমরা এখন আমাদের রিসোর্স গ্রুপে একটি আইওটি হাব রিসোর্স তৈরি করতে পারি।
1. নিচের কমান্ড ব্যবহার করে আইওটি হাব রিসোর্স তৈরি করি।
```sh
az iot hub create --resource-group soil-moisture-sensor \
--sku F1 \
--partition-count 2 \
--name <hub_name>
```
এখানে`<hub_name>` এর পরবর্তে আমাদের হাব এর নাম দিতে হবে। এই নাম বিশ্বজুড়ে ইউনিক বা একটিমাত্র হতে হবে - অন্য কোনও আইওটি হাব (যে কারও দ্বারা তৈরি) একই নাম এর হওয়া যাবেনা। কেননা এটি দ্বারা URL তৈরী করা হবে। এক্ষেত্রে `soil-moisture-sensor-` শব্দাংশের পর আমাদের নাম বা কোন সংখ্যা বা অন্য কিছু যোগ করে দেয়া যেতে পারে।
`--sku F1` দ্বারা বোঝায় এটি free tier ব্যবহার করছে। Free tier দ্বারা প্রতিদিন ৮০০০ ম্যাসেজ আদান প্রদান করা যায়।
> 🎓অ্যাজুর সার্ভিসের বিভিন্ন মূল্যের স্তরগুলিকে 'TIER' হিসাবে উল্লেখ করা হয়। প্রতিটি স্তরের আলাদা আলাদা খরচ থাকে এবং এগুলো বিভিন্ন বৈশিষ্ট্য বা ডেটা ভলিউম সরবরাহ করে।
> 💁 খরচ সম্পর্কে আরো বিস্তারিত [Azure IoT Hub pricing guide](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn) পড়লে জানা যাবে।
এখানে `--partition-count 2` নির্দিষ্ট করে যে এই হাব কয়টি ডাটা স্ট্রীম ব্যবহার করবে। পার্টিশন বেশি থাকলে তা আইওটি হাব থেকে একাধিক জিনিস পড়া এবং লেখার সময় ডেটা ব্লকিং হ্রাস করে। Partitions নিয়ে এই লেসনে আলোচনা করার সুযোগ নেই, তবে free tier IoT Hub তৈরীর জন্য এর ভ্যালু দিতে হবে।
> 💁 প্রতি সাবস্ক্রিপশনে সর্বোচ্চ ১টি free tier IoT Hub নেয়া যাবে।
আইওটি হাব তৈরি হয়ে যাবে। এটি সম্পূর্ণ হতে এক মিনিট বা তার একটু বেশি সময় নেয়।
## IoT Hub এর সাথে সংযোগ
শপূর্ববর্তী পাঠে, আমরা এমকিউটিটি ব্যবহার করেছি এবং বিভিন্ন বিষয়ে বিভিন্ন উদ্দেশ্য নিয়ে বিভিন্ন বার্তা প্রেরণ করেছি। আইওটি হাবের বিভিন্ন বিষয়ের উপর বার্তা প্রেরণের পরিবর্তে হাবের সাথে যোগাযোগের জন্য একাধিক সুনির্দিষ্ট উপায় রয়েছে।
> 💁 আইওটি হাব এবং ডিভাইসের মধ্যে এই যোগাযোগটি MQTT, HTTPS বা AMQP ব্যবহার করে করা যাবে।
* ডিভাইস থেকে ক্লাউডে (D2C) বার্তা - these are messages sent from a device to IoT Hub, such as telemetry. They can then be read off the IoT Hub by your application code.এগুলি আইওটি হাবের কাছে টেলিমেট্রির মতো কোন ডিভাইস থেকে প্রেরিত বার্তা। এরপরে আমাদের অ্যাপ্লিকেশন কোড আইওটি হাব থেকে সেই ডেটা নিতে পারে।
> 🎓 IoT Hub একটি Azure service ব্যবহার করে যার নাম [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn)। আমরা যখন হাবটিতে প্রেরিত বার্তাগুলি পড়ার জন্য কোড লিখি, তখন এগুলোকে প্রায়শই ইভেন্ট হিসাবে বলা হয়।
* ক্লাউড থেকে ডিভাইসে (C2D) বার্তা - আইওটি হাবের মাধ্যমে ডিভাইসে এসব বার্তা পাঠানো হয় এপ্লিকেশন কোড ব্যবহার করে।
* ডিরেক্ট মেথড রিকুয়েস্ট - আইওটি হাবের মাধ্যমে ডিভাইসে এসব বার্তা পাঠানো হয় এপ্লিকেশন কোড ব্যবহার করে। সাধারণত এসব কোড ব্যবহার করা হয় যাতে ডিভাইসটি কোন কাজ করে, যেমন- একচুয়েটর নিয়ন্ত্রণ করার জন্য অনুরোধ করা। এই বার্তাগুলির একটি প্রতিক্রিয়া প্রয়োজন যাতে আমাদের অ্যাপ্লিকেশন কোডটি সফলভাবে প্রক্রিয়া করা হয়েছে কিনা বোঝা যায়।
* ডিভাইস টুইন - এগুলি JSON ডকুমেন্ট যা ডিভাইস এবং আইওটি হাবের মধ্যে সামঞ্জস্যতা বজায় রাখে। এগুলো ব্যবহার করে সেটিং সমূহ এবং প্রপার্টিগুলো স্টোর করে রাখা হয় যা হয় ডিভাইস থেকে আসে অথবা আইওটি হাব কর্তৃক ডিভাইসে পাঠাতে হবে।
আইওটি হাব একটি কনফিগারযোগ্য কোন নির্দিষ্ট সময়ের জন্য (ডিফল্ট ১দিন) ডিরেক্ট মেথড রিকুয়েস্ট এবং ম্যাসেজগুলো স্টোর করতে পারে। সুতরাং যদি কোন ডিভাইস বা অ্যাপ্লিকেশন কোড সংযোগ হারিয়ে ফেলে তবে এটি পুনরায় সংযোগের পরে অফলাইনে থাকা বার্তাগুলি পুনরুদ্ধার করতে পারে। ডিভাইস টুইনগুলো আইওটি হাবে স্থায়ীভাবে রাখা হয়, তাই যে কোনও সময় কোন ডিভাইস পুনরায় সংযোগ করতে পারে এবং সর্বশেষতম ডিভাইস টুইনে সংযোগ পেতে পারে।
✅ ছোট একটি কাজ করা যাকঃ বিভিন্ন ধরণের ম্যাসেজ সম্পর্কে আরো জানতে [Device-to-cloud communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn) এবং [Cloud-to-device communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) পড়া উচিত হবে।
## IoT সার্ভিসগুলোর সাথে ডিভাইসের সংযোগ
হাবটি তৈরি হয়ে গেলে, আমাদের আইওটি ডিভাইস এটির সাথে সংযোগ করতে পারবে। কেবল নিবন্ধিত ডিভাইসগুলিই কোন সার্ভিসে সংযোগ করতে পারে। তাই আমাদেরকে প্রথমে আমাদের ডিভাইসটি নিবন্ধিত করতে হবে। নিবন্ধন করার সময় সংযোগ স্ট্রিং (Connection String) পাওয়া যাবে যা ক্লাউডে সংযোগের জন্য ডিভাইসটি ব্যবহার করতে পারে। এই সংযোগ স্ট্রিংটি ডিভাইস-নির্দিষ্ট এবং এতে আইওটি হাব, ডিভাইস এবং একটি গোপন কী রয়েছে যা এই ডিভাইসটিকে সংযোগ করার অনুমতি দেয়।
> 🎓 সংযোগ স্ট্রিং (Connection String) একটি জেনেরিক শব্দ যা সংযোগের তথ্য বিশিষ্ট কিছু টেক্সট এর একটি সমন্বয়। আইওটি হাব, ডাটাবেস এবং অন্যান্য অনেক পরিষেবাতে সংযোগ করার সময় এগুলি ব্যবহৃত হয়। এগুলিতে সাধারণত সার্ভিসের জন্য একটি শনাক্তকারী, যেমন একটি URL এবং সুরক্ষা তথ্য যেমন একটি গোপন কী থাকে। পরিষেবাগুলিতে যুক্ত হওয়ার জন্য এগুলিকে SDK এর মাধ্যমেই সংযোগ দেওয়া হয়।
> ⚠️ সংযোগ স্ট্রিংগুলি (Connection Strings) সুরক্ষিত রাখতে হবে! সামনের লেসনগুলোতে নিরাপত্তা বিষয়টি আরও বিস্তারিতভাবে ব্যখ্যা করা হবে।
### কাজ - IoT ডিভাইসের নিবন্ধন (Registration)
আইওটি ডিভাইস Azure CLI ব্যবহার কর আইওটি হাবের সাথে নিবন্ধনভুক্ত হতে পারে।
1. একটি ডিভাইসকে রেজিস্টার করতে, নিম্নের কমান্ডটি রান করতে হবে
```sh
az iot hub device-identity create --device-id soil-moisture-sensor \
--hub-name <hub_name>
```
এখানে `<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত নামটি দিতে হবে।
আমরা `soil-moisture-sensor` এর জন্য একটি ডিভাইস আইডি পাবো।
1. যখন আইওটি ডিভাইসটি SDK ব্যবহার করে , আইওটি হাবের সাথে সংযুক্ত হয়, তখন একটি সংযোগ স্ট্রিং ব্যবহার করতে হবে যা একটি গোপন কী সহ হাবের URL দেয়। সংযোগের স্ট্রিং পেতে নিম্নলিখিত কমান্ডটি চালাতে হবে:
```sh
az iot hub device-identity connection-string show --device-id soil-moisture-sensor \
--output table \
--hub-name <hub_name>
```
এখানে `<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত নামটি দিতে হবে।
1. আউটপুটে আসা কানেকশন স্ট্রিং কোথাও লিখে রাখতে হবে। পরবর্তীতে এটির দরকার হবে।
### কাজ - IoT ডিভাইসকে ক্লাউডের সাথে যুক্ত করা
নিম্নের যেকোন একটি প্রাসঙ্গিক গাইড ধরে, প্রাথমিক কাজগুলো সম্পন্ন করতে হবে।
* [Arduino - Wio Terminal](wio-terminal-connect-hub.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-connect-hub.md)
### কাজ - ইভেন্টগুলো পর্যবেক্ষণ
এখনই আমরা আমাদের সার্ভার কোড আপডেট করবোনা। এর পরিবর্তে আইওটি ডিভাইস থেকে ইভেন্টগুলি নিরীক্ষণ করতে Azure CLI ব্যবহার করবো।
1. এটি নিশ্চিত করতে হবে যে আমাদের আইওটি ডিভাইসটি চলছে এবং মাটির আর্দ্রতা টেলিমেট্রি মানগুলি প্রেরণ করছে ।
1. আইওটি হাবে আসা ম্যাসেজগুলো দেখতে কমান্ড প্রম্পট বা টার্মিনাল থেকে নিম্নের কোড কমান্ড রান করি।
```sh
az iot hub monitor-events --hub-name <hub_name>
```
এখানে `<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত নামটি দিতে হবে।
কনসোল আউটপুটে ম্যাসেজগুলো তখন দেখাবেঃ
```output
Starting event monitor, use ctrl-c to stop...
{
"event": {
"origin": "soil-moisture-sensor",
"module": "",
"interface": "",
"component": "",
"payload": "{\"soil_moisture\": 376}"
}
},
{
"event": {
"origin": "soil-moisture-sensor",
"module": "",
"interface": "",
"component": "",
"payload": "{\"soil_moisture\": 381}"
}
}
```
এখানে `payload` এর কনটেন্টগুলো আইওটি ডিভাইসে আসা ম্যাসেজের সাথে মিলবে।
1. এই বার্তাগুলিতে তাদের সাথে স্বয়ংক্রিয়ভাবে সংযুক্ত থাকা অসংখ্য বৈশিষ্ট্য রয়েছে, যেমন টাইমস্ট্যাম্প। এগুলি *annotations* বা টীকা হিসাবে পরিচিত। সমস্ত বার্তা টীকা বা message annotations দেখতে, নিম্নলিখিত কমান্ড ব্যবহার করতে হবে:
```sh
az iot hub monitor-events --properties anno --hub-name <hub_name>
```
`<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত নামটি দিতে হবে।
আইওটি ডিভাইস দ্বারা প্রেরিত হওয়ার সাথে সাথে বার্তাগুলি কনসোল আউটপুটে প্রদর্শিত হবে।
```output
Starting event monitor, use ctrl-c to stop...
{
"event": {
"origin": "soil-moisture-sensor",
"module": "",
"interface": "",
"component": "",
"properties": {},
"annotations": {
"iothub-connection-device-id": "soil-moisture-sensor",
"iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
"iothub-connection-auth-generation-id": "637553997165220462",
"iothub-enqueuedtime": 1619976150288,
"iothub-message-source": "Telemetry",
"x-opt-sequence-number": 1379,
"x-opt-offset": "550576",
"x-opt-enqueued-time": 1619976150277
},
"payload": "{\"soil_moisture\": 381}"
}
}
```
এনোটেশন গুলোর সময়ের ভ্যালু [UNIX time](https://wikipedia.org/wiki/Unix_time) এ প্রদর্শিত, যা ১জানুয়ারি, ১৯৭০ মধ্যরাত থেকে কত সেকেন্ড হয়েছে তা দেখায়।
কাজ শেষে ইভেন্ট মনিটর থেকে এক্সিট করতে হবে।
### কাজ - IoT device নিয়ন্ত্রণ
Azure CLI ব্যবহার করে direct method এ IoT device এ যোগাযোগ করা যাবে।
1. `relay_on` মেথড শুরু করতে কমান্ড প্রম্পট বা টার্মিনালে নিম্নের কমান্ড রান করিঃ
```sh
az iot hub invoke-device-method --device-id soil-moisture-sensor \
--method-name relay_on \
--method-payload '{}' \
--hub-name <hub_name>
```
`<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত নামটি দিতে হবে।
এটি `method-name` নামক মেথডের জন্য direct method এর রিকুয়েস্ট পাঠাবে। এগুলো একটি payload (যাতে মেথডের ডেটা রয়েছে) নিতে পারে এবং এটিকে `method-payload` প্যারামিটার হিসেবে JSON এ সুনির্দিষ্ট করতে হবে।
রিলে চালু হবে এবং আউটপুটে আসবেঃ
```output
Direct method received - relay_on
```
1. পূর্বের ধাপ আবারো করতে হবে, তবে `--method-name` পরিবর্তন করে `relay_off` দিতে হবে। তখন দেখা যাবে যে রিলে বন্ধ হয়ে গিয়েছে এবং আইওটি ডিভাইস থেকে সেরকম আউটপুটই আসবে।
---
## 🚀 চ্যালেঞ্জ
IoT Hub এর free tier দৈনিক ৮০০০ ম্যাসেজ এর সুযোগ দেয়। আমাদের কোডে প্রতি ১০ সেকেন্ডে একটি করে ম্যাসেজ যায়। তাহলে দৈনিক কতটি ম্যাসেজ হচ্ছে ?
একটু ভাবতে হবে যে কতটা সময় পরপর আর্দ্রতার মান জানলে আমাদের কাজ চলবে। Free tier এর ভিতরে থাকার জন্য কোড কীভাবে পরিবর্তন করতে হবে এবং ঘন ঘন মান না নিয়ে, শুধু প্রয়োজনের সময়ই দেখলাম - এটা কীভাবে করা যাবে? দ্বিতীয় আরেকটি ডিভাইস এখানে যুক্ত করলে সেক্ষেত্রে কী হবে?
## লেকচার পরবর্তী কুইজ
[লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16)
## রিভিউ এবং স্ব-অধ্যয়ন
IoT Hub SDK আরডুইনো এবং পাইথন উভয়ের জন্যই ওপেন সোর্স। গিটহাবে অনেকগুলো নমুনা রয়েছে আইওটি হাবের সাথে ব্যবহারের।
* Wio Terminal ব্যবহার করলে [Arduino samples on GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) দেখা উচিত।
* Raspberry Pi অথবা Virtual device ব্যবহার করলে [Python samples on GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples)দেখা উচিত।
## এসাইনমেন্ট
[ক্লাউড সার্ভিসের ব্যাপারে জানা](assignment.bn.md)

@ -1,19 +0,0 @@
# ক্লাউড সার্ভিসের ব্যাপারে জানা
## নির্দেশাবলী
ক্লাউড সার্ভিসগুলো, যেমন মাইক্রোসফট এর Azure, শুধুমাত্র একটা কম্পিউটার আমাদের ব্যবহার করতে দিলো - ব্যাপারটি আসলে এমন নয়। এখানে যেসকল সার্ভিস থাকে, সেগুলো হলোঃ
* Infrastructure as a service (IaaS)
* Platform as a service (PaaS)
* সার্ভারবিহীন পরিষেবা
* Software as a service (SaaS)
এই বিভিন্ন ধরণের অফার সম্পর্কে জানতে হবে এবং সেগুলি কী এবং কীভাবে তারা পৃথক তা ব্যাখ্যা করতে হবে। আইওটি ডেভলাপারদের জন্য কোন অফারগুলি প্রাসঙ্গিক তা জানতে হবে।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) |
| -------- | --------- | -------- | ----------------- |
| ক্লাউডের বিভিন্ন ধরণের অফার ব্যখ্যা করা | ধরণের অফার বিষদভাবে ব্যখ্যা করেছে | কেবল ৩ ধরণের অফার ব্যখ্যা করেছে | কেবল দুয়েক ধরণের অফার ব্যখ্যা করেছে |
| কোন অফারটি আইওটি এর জন্য ভালো তা ব্যখ্যা করা |আইওটি ডেভলাপারদের জন্য কোন অফারগুলি প্রাসঙ্গিক এবং এর কারণ ব্যাখ্যা করেছে | আইওটি ডেভলাপারদের জন্য কোন অফারগুলি প্রাসঙ্গিক কিন্তু এর কারণ ব্যাখ্যা করতে পারেনি | আইওটি ডেভলাপারদের জন্য কোন অফারগুলি প্রাসঙ্গিক তা বর্ণনা করতে পারেনি |

@ -1,607 +0,0 @@
# অ্যাপ্লিকেশন লজিককে ক্লাউডে স্থানান্তর
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-9.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17)
## সূচনা
গত পাঠে আমরা শিখেছি কীভাবে ক্লাউড-ভিত্তিক আইওটি পরিষেবাতে আমাদের উদ্ভিদকে সংযুক্ত করতে হবে এবং মাটির আর্দ্রতা পর্যবেক্ষণ এবং রিলে নিয়ন্ত্রণ এর মতো কাজগুলো কীভাবে ক্লাউড থেকে করা যায়। এখন পরবর্তী পদক্ষেপটি হল সার্ভার কোডকে ক্লাউডে স্থানান্তর করা যা রিলে এর টাইমিং নিয়ন্ত্রণ করে। এই পাঠে আমরা সার্ভারবিহীন (serverless) ফাংশন দ্বারা এই কাজটি করতে শিখব।
এই লেসনে রয়েছেঃ
* [সার্ভারলেস বলতে কী বোঝায়?](#সার্ভারলেস-বলতে-কী-বোঝায়)
* [একটি সার্ভারলেস অ্যাপ্লিকেশন তৈরি](#একটি-সার্ভারলেস-অ্যাপ্লিকেশন-তৈরি-করা)
* [একটি IoT Hub ইভেন্ট ট্রিগার তৈরি](#একটি-আইওটি-হাব-ইভেন্ট-ট্রিগার-তৈরি-করা)
* [সার্ভারলেস কোড থেকে ডিরেক্ট মেথড রিকুয়েস্ট পাঠানো](#সার্ভারলেস-কোড-থেকে-ডিরেক্ট-মেথড-রিকুয়েস্ট-পাঠানো)
* [ক্লাউডে সার্ভারলেস কোড ডেপ্লয় করা](#ক্লাউডে-সার্ভারলেস-কোড-ডেপ্লয়-করা)
## সার্ভারলেস বলতে কী বোঝায়?
সার্ভারলেস বা সার্ভারবিহীন কম্পিউটিং বলতে বোঝানো হয় বিভিন্ন ধরণের ইভেন্টের প্রতিক্রিয়া হিসাবে ক্লাউডে চালিত কোডের ছোট ছোট ব্লক । ইভেন্ট ঘটলে কোড চালিত হয় এবং এটি ইভেন্ট সম্পর্কিত ডেটা পাস করে। এই ইভেন্টগুলি বিভিন্ন বিষয় সম্পর্কিত হতে পারে যেমন, ওয়েব রিকোয়েস্ট, সারিতে অপেক্ষারত বার্তাসমূহ, একটি ডাটাবেসে ডেটা পরিবর্তন করা বা আইওটি ডিভাইসগুলির মাধ্যমে আইওটি পরিষেবাতে বার্তা প্রেরণ ইত্যাদি।
![Events being sent from an IoT service to a serverless service, all being processed at the same time by multiple functions being run](../../../../images/iot-messages-to-serverless.png)
> 💁 যদি আগে 'ডাটাবেস ট্রিগার' ব্যবহারের অভিজ্ঞতা থাকে, তবে এটাকেও একই জিনিস হিসাবে ভাবা যায় যা কোন ইভেন্টের মাধ্যমে কোড ট্রিগার করার মাধ্যমে কাজ করছে, যেমন একটি সারি বা row যোগ করা ।
![When many events are sent at the same time, the serverless service scales up to run them all at the same time](../../../../images/serverless-scaling.png)
আমাদের কোডটি কেবল তখনই রান হয়, যখন ইভেন্টটি ঘটে ; অন্য সময় কোড সক্রিয় থাকেনা। ইভেন্টটি ঘটামাত্র কোডটি লোড হয় এবং তা চালানো হয়। এটি সার্ভারলেসকে খুব স্কেলেবল (scalable) করে তোলে - যদি একই সাথে অনেকগুলি ইভেন্ট ঘটে, তবে ক্লাউড সরবরাহকারী যতবার প্রয়োজন ততবার কোড চালাতে পারে। তবে এটির অনেক সুবিধা থাকলেও, এর নেতিবাচক দিকটি হল যদি আমাদেরকে ইভেন্টগুলির মধ্যে তথ্য আদান-প্রদানের দরকার হয়, তবে এটি ডাটাবেসের মতো কোথাও সংরক্ষণ করতে হবে।
আমাদের কোড একটি ফাংশন আকারে লেখা হয়েছে, যা প্যারামিটার হিসাবে ইভেন্টটির তথ্য গ্রহণ করে। এই সার্ভারলেস ফাংশনগুলি লিখতে আমরা অনেকগুলো প্রোগ্রামিং ভাষা ব্যবহার করতে পারি।
> 🎓 সার্ভারলেসকে অনেকসময় Functions as a service (FaaS) হিসাবেও উল্লেখ করা হয় কারণ প্রতিটি ইভেন্ট ট্রিগারকে কোড এ ফাংশন হিসাবে প্রয়োগ করা হয়।
নাম "সার্ভারলেস" হলেও, এটি আসলে সার্ভার ব্যবহার করে। নামকরণটি এমন হওয়ার পিছনে কারণ হল আমরা ডেভলাপার হিসাবে কোড চালানোর জন্য সার্ভার বিষয়ে কোন চিন্তাই করি না, আমাদের সকল মনোযোগ থাকে কোন ইভেন্টের প্রতিক্রিয়াতে কোডটি চালানো হচ্ছে কিনা সে বিষয়ে। ক্লাউড সরবরাহকারীর একটি সার্ভারলেস *রানটাইম* রয়েছে যা সার্ভার, নেটওয়ার্কিং, স্টোরেজ, সিপিইউ, মেমরি এবং কোড চালানোর জন্য প্রয়োজনীয় সমস্ত কিছুর ব্যবস্থা করে। এই মডেলটিতে সার্ভার নেই বলে, আমরা এই সার্ভিসের জন্য সার্ভার ব্যবস্থাপনার অর্থ প্রদান করতে পারব না। এর পরিবর্তে আমাদেরকে বরং কোডটির চলমান সময় এবং মেমরির ব্যবহারের পরিমাণের উপর অর্থ প্রদান করতে হবে।
> 💰 ক্লাউডে কোড কম খরচে রান করার সবচেয়ে ভালো উপায় হলো সার্ভারলেস। উদাহরণস্বরূপ, (এই লেসন লেখার সময়) যেকোন ক্লাউড সরবরাহকারী এই ফাংশনগুলিতে চার্জ শুরু করার আগে একমাসে 1000,000 বার রান করার সুযোগ দেয় এবং তারপরে তারা প্রতিটি 1,000,000 বার কোড এক্সেকিউট করার জন্য $0.20 চার্জ করে। যখন কোড চলছে না, তখন আমাদেরকে অর্থ প্রদান করতে হবেনা।
আইওটি ডেভলাপার হিসাবে সার্ভারলেস মডেলটি সর্বোত্তম। এখানে চাইলে আমরা এমন ফাংশন লিখতে পারি যা আমাদের ক্লাউড-হোস্টেড আইওটি পরিষেবাতে সংযুক্ত যেকোন আইওটি ডিভাইস থেকে প্রেরিত বার্তাগুলির সাথে যুক্ত থাকবে। আমাদের কোড এইসব প্রেরিত ম্যাসেজগুলোকে পরিচালনা করবে, তবে প্রয়োজন ব্যাতীত রান করবেনা।
✅ এমকিউটিটি-তে বার্তা গ্রহণের জন্য যে কোডটিকে সার্ভার কোড হিসাবে লিখেছি, সেটির দিকে আরেকবার লক্ষ্য করা যাক! কীভাবে এটি সার্ভারলেস ব্যবহার করে ক্লাউডে চলতে পারে? কীভাবে পরিবর্তন করলে, এই কোডটি সার্ভারলেস কম্পিউটিং সাপোর্ট করতে পারে?
> 💁 সার্ভারলেস মডেল কোড রান করার পাশপাশি কিছু বিষয়ে অন্যান্য ক্লাউড পরিষেবার দিকে যাচ্ছে। উদাহরণস্বরূপ, সার্ভারহীন ডাটাবেসগুলি ক্লাউডে পাওয়া যাচ্ছে যেখানে ডাটাবেসে পাঠানো রিকুয়েস্টের সংখ্যা অনুসারে ফী প্রদান করতে হবে, যেমন একটি query বা row যুক্ত করা, তবে সাধারণত কতটা কাজ করা হচ্ছে তার ভিত্তিতে মূল্য নির্ধারণ করা হয়। উদাহরণস্বরূপ, প্রাইমারি কী এর ভিত্তিতে একটি সারি সিলেক্ট করা হলে, তার খরচ অনেক কম হবে - অনেকগুলো টেবল যোগ করে একটি জটিল কাজ করার তুলনায়।
## একটি সার্ভারলেস অ্যাপ্লিকেশন তৈরি করা
মাইক্রোসফটের সার্ভারলেস অ্যাপ্লিকেশন কে বলা হয় Azure Function ।
![The Azure Functions logo](../../../../images/azure-functions-logo.png)
নীচের সংক্ষিপ্ত ভিডিওটিতে অ্যাজুর ফাংশনগুলির একটি ওভারভিউ রয়েছে
[![Azure Functions overview video](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ)
> 🎥 ভিডিও দেখতে উপরের ছবিতে ক্লিক করতে হবে
✅ এই পর্যায়ে একটু সময় নিয়ে কিছু পড়াশোনা করা উচিত। আর অ্যাজুর ফাংশন এর ব্যপারে জানতে হলে [Microsoft Azure Functions documentation](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn) পড়া একটি ভালো উপায়।
অ্যাজুর ফাংশন লিখতে হলে, আমাদের পছন্দমতো কোন ল্যাংগুয়েজে অ্যাজুর ফাংশন এপ এ কাজ করা শুরু করতে হবে। Python, JavaScript, TypeScript, C#, F#, Java, এবং Powershell খুবসহজেই ব্যবহার করা যায়। এই অধ্যায়ে আমরা পাইথন ব্যবহার করা অ্যাজুর ফাংশন এপ লেখা শিখবো।
> 💁 অ্যাজুর ফাংশন আবার কাস্টম হ্যান্ডলারও সাপোর্ট করে, তাই যেকোন ভাষায় এমনকি COBOLএর মতো পুরনো ল্যাঙ্গুয়েজেও তা লেখা যায়, যদি HTTP রিকোয়েস্ট সাপোর্ট করে।
ফাংশন অ্যাপ্লিকেশনগুলিতে এক বা একাধিক *ট্রিগার* থাকে - এমন ক্রিয়াকলাপ যা ইভেন্টগুলিতে প্রতিক্রিয়া জানায়। আমাদের একটি ফাংশন অ্যাপ্লিকেশনের মধ্যে একাধিক ট্রিগার থাকতে পারে, সাধারণ একটি কনফিগারেশন নিয়েই। উদাহরণস্বরূপ, ফাংশন অ্যাপ্লিকেশনটির জন্য কনফিগারেশন ফাইলে আইওটি হাবের সংযোগের সকল তথ্য থাকতে পারে এবং অ্যাপ্লিকেশনটি্র সমস্ত ফাংশন এটি সংযোগ করতে এবং ইভেন্টগুলির তথ্য গ্রহণে এটি ব্যবহার করতে পারে
### কাজ - Azure Functions tooling ইন্সটল করা
অ্যাজুর ফাংশনগুলির একটি দুর্দান্ত বৈশিষ্ট্য হল এগুলি আমরা লোকালি চালাতে পারি। ক্লাউডের সমান রানটাইমে এটি আমাদের কম্পিউটারে চালানো যেতে পারে, যা আমাদেরকে আইওটি বার্তাগুলির প্রতিক্রিয়া জানায় এবং লোকালি চলতে পারে এমন কোড লেখার সুযোগ দেয়। এমনকি ইভেন্টগুলি হ্যান্ডেল হওয়ার সাথে সাথে আমরা নিজের কোডটি ডিবাগ করতে পারব। একবার কোড নিয়ে সন্তুষ্ট হলেই, এটি আমরা ক্লাউডে স্থাপন করতে পারবো।
Azure Functions tooling আমরা CLI এর মাধ্যমে ব্যবহার করতে পারি যাকে Azure Functions Core Tools ও বলা হয়।
1. Azure Functions Core Tools ইনস্টল করার জন্য [Azure Functions Core Tools documentation](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn) নির্দেশাবলী অনুসরণ করি।
1. VS Code এ Azure Functions extension ইন্সটল করতে হবে। এই এক্সটেনশনে মাধ্যমে Azure functions তৈরী, ডিবাগ এবং ডেপ্লয় করা যাবে। প্রয়োজনীয় নির্দেশনা [Azure Functions extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions) এ রয়েছে।
আমরা যখন ক্লাউডে অ্যাজুর ফাংশন অ্যাপ্লিকেশন শুরু করবো, তখন অ্যাপ্লিকেশন ফাইল এবং লগ ফাইলের মতো জিনিসগুলি সেভ রাখতে খুব অল্প পরিমাণে ক্লাউড স্টোরেজ ব্যবহার করা দরকার। যখন লোকালি আমরা ফাংশন অ্যাপ্লিকেশন চালাই তখন আমাদেরকে ক্লাউড স্টোরেজের সাথে সংযোগ স্থাপন করতে হবে, তবে প্রকৃত ক্লাউডের স্টোরেজ ব্যবহারের পরিবর্তে একটি স্টোরেজ এমুলেটর ব্যবহার করতে হবে যেমন [Azurite](https://github.com/Azure/Azurite)। এটি লোকাল ভাবে চলে, তবে ক্লাউড স্টোরেজের মতো কাজ করে।
> 🎓 অ্যাজুরে, অ্যাজুর ফাংশনগুলি যে স্টোরেজ ব্যবহার করে তা একটি অ্যাজুর স্টোরেজ অ্যাকাউন্ট। এই অ্যাকাউন্টগুলি ফাইল, ব্লবস, টেবিলগুলিতে ডেটা সংরক্ষণ করতে পারে। এখানে চাইলেই অনেকগুলি অ্যাপ্লিকেশনের মধ্যে একটি স্টোরেজ অ্যাকাউন্ট ভাগ করা যায় যেমন একটি ফাংশন অ্যাপ এবং একটি ওয়েব অ্যাপ্লিকেশনে একই স্টোরেজ ব্যবহার করা।
1. Azurite হলো একটি Node.js এপ। তাই এটির জন্য আগে Node.js ইন্সটল করতে হবে [Node.js website](https://nodejs.org/)এ সকল নির্দেশনা আছে। ম্যাক ব্যবহারকারীরা [Homebrew](https://formulae.brew.sh/formula/node) থেকেও ইন্সটল করতে পারবে।
1. নিচের কমান্ড ব্যবহার করে Azurite ইন্সটল করি :
```sh
npm install -g azurite
```
1. `azurite` নামে ফোল্ডার খুলি, এটির ডেটা স্টোর করার জন্য
```sh
mkdir azurite
```
1. Azurite রান করি -
```sh
azurite --location azurite
```
Azurite স্টোরেজ ইম্যুলেটর launch হয়ে লোকাল ফাংশন রানটাইমের জন্য অপেক্ষা করবে
```output
➜ ~ azurite --location azurite
Azurite Blob service is starting at http://127.0.0.1:10000
Azurite Blob service is successfully listening at http://127.0.0.1:10000
Azurite Queue service is starting at http://127.0.0.1:10001
Azurite Queue service is successfully listening at http://127.0.0.1:10001
Azurite Table service is starting at http://127.0.0.1:10002
Azurite Table service is successfully listening at http://127.0.0.1:10002
```
### কাজ - একটি অ্যাজুর ফাংশন প্রজেক্ট তৈরি
Azure Functions CLI দ্বারা নতুন Functions app তৈরী করা যাবে
1. ফাংশন এপ এর জন্য ফোল্ডার খুলে সেখানে যাই, নাম দিই `soil-moisture-trigger`
```sh
mkdir soil-moisture-trigger
cd soil-moisture-trigger
```
1. ফোল্ডারে পাইথন ভার্চুয়াল এনভায়রনমেন্ট তৈরী করি
```sh
python3 -m venv .venv
```
1. ভার্চুয়াল এনভায়রনমেন্ট এক্টিভেট করি
* উইন্ডোজে:
```cmd
.venv\Scripts\activate.bat
```
* macOS বা Linux এ:
```cmd
source ./.venv/bin/activate
```
1. এই ফোল্ডারে Functions app তৈরীর জন্য নিম্নের কমান্ড রান করি:
```sh
func init --worker-runtime python soil-moisture-trigger
```
এটি বর্তমান ফোল্ডারের ভিতরে তিনটি ফাইল তৈরি করবে:
* `host.json` - এই JSON ডকুমেন্টে ফাংশন অ্যাপ্লিকেশনের জন্য সেটিংস রয়েছে। এই সেটিংস পরিবর্তন করতে হবে না।
* `local.settings.json` - এই JSON ডকুমেন্টে লোকালি চলাকালীন আমাদের অ্যাপ্লিকেশন যে সেটিংস ব্যবহার করবে সেগুলি আছে, যেমন আইওটি হাবের জন্য সংযোগ স্ট্রিং । এই সেটিংসটি কেবল লোকাল, এবং সোর্স কোড নিয়ন্ত্রণে যুক্ত করা উচিত নয়। আমরা যখন ক্লাউডে অ্যাপ স্থাপন করব তখন এই সেটিংসটি স্থাপন করা হবে না, এর পরিবর্তে আমাদের সেটিংস অ্যাপ্লিকেশন সেটিংস থেকে লোড হবে। এই পাঠের পরবর্তী অংশে বিষয়টি আলোচনা করা হবে।
* `requirements.txt` - এটি একটি [Pip requirements file](https://pip.pypa.io/en/stable/user_guide/#requirements-files) যা প্রয়োজনীয় পিপ ফাইলগুলো ধারণ করে।
1. এখানে `local.settings.json` ফাইলটির স্টোরেজ অ্যাকাউন্টের জন্য একটি সেটিংস রয়েছে যা অ্যাপ্লিকেশন ব্যবহার করবে। এটির ডিফল্ট হিসেবে একটি ফাঁকা সেটিং আছে, সুতরাং এটি সেট করা দরকার। Azurite স্থানীয় স্টোরেজ এমুলেটর সাথে সংযোগ করতে, এই মানটি নিম্নলিখিত ভাবে সেট করতে হবে:
```json
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
```
1. প্রয়োজনীয় ফাইলগুলি ব্যবহার করে পিপ প্যাকেজ ইনস্টল করতে হবে:
```sh
pip install -r requirements.txt
```
> 💁 প্রয়োজনীয় পিপ প্যাকেজগুলি এই ফাইলে থাকা দরকার, যাতে ফাংশন অ্যাপ্লিকেশনটি যখন ক্লাউডে স্থাপন করা হবে, তখন রানটাইম যেন এটি নিশ্চিত করতে পারে যে সঠিক প্যাকেজগুলি ইনস্টল হয়েছে।
1. সবকিছু সঠিকভাবে কাজ করছে তা পরীক্ষা করতে আমরা ফাংশন রানটাইম শুরু করতে পারি। এটি করার জন্য নিম্নলিখিত কমান্ডটি রান দিই:
```sh
func start
```
দেখা যাবে যে রানটাইম শুরু হয়েছে কিন্তু তা রিপোর্ট করবে যে এটি কোন জব ফাংশন (ট্রিগার) খুঁজে পায় নি।
```output
(.venv) ➜ soil-moisture-trigger func start
Found Python version 3.9.1 (python3).
Azure Functions Core Tools
Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit)
Function Runtime Version: 3.0.15417.0
[2021-05-05T01:24:46.795Z] No job functions found.
```
> ⚠️ কোন ফায়ারওয়াল নোটিফিকেশন আসলে, একসেস দিতে হবে কারণ `func` এপ্লিকেশনটির এই নেটওয়ার্কে কাজ করতে হবে।
> ⚠️ ম্যাক-ওএস ব্যবহারকারীদের আউটপুটটিতে ওয়ার্নিং থাকতে পারে:
>
> ```output
> (.venv) ➜ soil-moisture-trigger func start
> Found Python version 3.9.1 (python3).
>
> Azure Functions Core Tools
> Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit)
> Function Runtime Version: 3.0.15417.0
>
> [2021-06-16T08:18:28.315Z] Cannot create directory for shared memory usage: /dev/shm/AzureFunctions
> [2021-06-16T08:18:28.316Z] System.IO.FileSystem: Access to the path '/dev/shm/AzureFunctions' is denied. Operation not permitted.
> [2021-06-16T08:18:30.361Z] No job functions found.
> ```
>
> যতক্ষণ ফাংশন অ্যাপ্লিকেশনটি সঠিকভাবে শুরু হচ্ছে এবং চলমান ফাংশনগুলির তালিকা ঠিকভাবে দেখাচ্ছে, ততক্ষণ এসব উপেক্ষা করা যায়। এখানে [Microsoft Docs Q&A](https://docs.microsoft.com/answers/questions/396617/azure-functions-core-tools-error-osx-devshmazurefu.html?WT.mc_id=academic-17441-jabenn) তেও এমনই বলা হয়েছে।
1. এবার `ctrl+c` ব্যবহার করে Functions app বন্ধ করি।
1. VS Code এ বর্তমান ফোল্ডারটি ওপেন করি:
```sh
code .
```
ভিএস কোড আমাদের ফাংশন প্রজেক্ট সনাক্ত করে একটি নোটিফিকেশন দেখিয়ে বলবে:
```output
Detected an Azure Functions Project in folder "soil-moisture-trigger" that may have been created outside of
VS Code. Initialize for optimal use with VS Code?
```
![The notification](../../../../images/vscode-azure-functions-init-notification.png)
এখানে **Yes** সিলেক্ট করতে হবে।
1. ভিএস কোড টার্মিনালে ভার্চুয়াল এনভায়রনমেন্ট রান করছে - এটি নিশ্চিত করতে হবে
## একটি আইওটি হাব ইভেন্ট ট্রিগার তৈরি করা
ফাংশন অ্যাপ্লিকেশন হলো আমাদের সার্ভারলেস কোডের শেল। আইওটি হাব ইভেন্টগুলির প্রতিক্রিয়া জানাতে, এই অ্যাপ্লিকেশনটিতে একটি আইওটি হাব ট্রিগার যুক্ত করা যায়। এই ট্রিগারটি আইওটি হাবে আসা বার্তাপ্রবাহের সাথে সংযুক্ত থাকা দরকার এবং তাদের প্রতিক্রিয়া জানানোর সক্ষমতা অর্জন করতে হবে। নিয়মিতভাবে বার্তা পেতে আমাদের ট্রিগারটি আইওটি হাবে *event hub compatible endpoint* এর সাথে সংযোগ স্থাপন করা দরকার।
আইওটি হাবটি Azure Event Hubs নামে পরিচিত আরেকটি অ্যাজুর সার্ভিসের সাথে যুক্ত। ইভেন্ট হাবস এমন একটি পরিষেবা যা আমাদেরকে বার্তা প্রেরণ এবং গ্রহণ করতে দেয়, আইওটি হাবটি তখন আইওটি ডিভাইসের জন্য অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে পারে। আইওটি হাব থেকে যেভাবে আমরা বার্তা গ্রহণ করেছি, ইভেন্ট হাবেও একদম একইভাবে ব্যবহার করা যায়।
✅ কিছু গবেষণা করা যাক: [Azure Event Hubs documentation](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn) থেকে ইভেন্ট হাব সম্পর্কে একটি সামগ্রিক ধারণা লাভ করে, এটির সাধারণ পর্যায়ের বৈশিষ্ট্যগুলোকে আইওটি হাবের সাথে তুলনা করি।
আইওটি হাবের সাথে সংযোগ স্থাপনের জন্য যেকোন আইওটি ডিভাইসকে একটি গোপন কী ব্যবহার করতে হবে যা কেবলমাত্র অনুমোদিত ডিভাইসগুলি সংযোগ করতে পারে। বার্তাগুলি পড়ার জন্য সংযোগ করার সময়ও একই বিষয় প্রযোজ্য, আমাদের কোডটিতে আইওটি হাবের বিবরণ সহ একটি গোপন কী যুক্ত connection string প্রয়োজন হবে।
> 💁 আমরা ডিফল্ট যে connection string পাই, সেটিতে **iothubowner** এর পার্মিশন থাকে যা কোন কোডে থাকলে - সম্পূর্ণ আইওটি হাবে একসেস/অনুমতি প্রদান করে। এটিকে আসলে আমাদের প্রয়োজনীয় অনুমতিগুলির সর্বনিম্ন স্তরে অর্থাৎ কম পার্মিশনে রাখা উচিত। পরবর্তী পাঠে এটি নিয়ে বিষদ আলোচনা হবে।
ট্রিগারটি একবার সংযুক্ত হয়ে গেলেই, আইওটি হাবের কাছে প্রেরিত প্রতিটি বার্তার জন্য - ফাংশনের কোডটি কল করা হবে,তা সেই ম্যাসেজ যে ডিভাইস থেকেই প্রেরিত হোক না কেন।
### কাজ - Event Hub compatible endpoint connection string তৈরী
1. VS Code টার্মিনাল থেকে নিম্নের কমান্ড রান করি:
```sh
az iot hub connection-string show --default-eventhub \
--output table \
--hub-name <hub_name>
```
এখানে `<hub_name>` এর পরিবর্তে আমাদের ব্যবহৃত হাবের নামটি ব্যবহার করতে হবে।
1. এবার VS Code এ `local.settings.json` ফাইলটি ওপেন করে, `Values` অংশের নিম্নের অতিরিক্ত ভ্যালুগুলো যোগ করি:
```json
"IOT_HUB_CONNECTION_STRING": "<connection string>"
```
এখানে আগের স্টেপ থেকে পাওয়া ভ্যালু্টি `<connection string>` এর জায়গায় বসাই। JSON ফাইলটি সঠিকভাবে তৈরী করতে আমাদেরকে উপরের লাইনের পরে কমা যুক্ত করতে হবে।
### কাজ - ইভেন্ট ট্রিগার তৈরী
আমরা এখন ইভেন্ট ট্রিগার তৈরী করার কাজ শুরু করতে পারি।
1. এখন `soil-moisture-trigger` ফোল্ডার থেকে VS Code terminal চালু করে নিম্নের কমান্ড রান করি:
```sh
func new --name iot-hub-trigger --template "Azure Event Hub trigger"
```
এটি `iot-hub-trigger` নামে নতুন একটি ফাংশন তৈরী করবে। এই ট্রিগারটি Event Hub compatible endpoint এর সাথে সংযুক্ত হবে। এখন আমরা ইভেন্ট হাব ট্রিগার নিয়ে কাজ করতে পারবো।
এখন দেখা যাবে `soil-moisture-trigger` ফোল্ডারের ভেতরে `iot-hub-trigger` নামে আরেকটি ফোল্ডার তৈরী হবে যেটিতে ফাংশন রয়েছে। এই ফোল্ডারে নিম্নলিখিত ফাইলগুলো থাকবে:
* `__init__.py` - এই পাইথন ফাইলে ট্রিগার রয়েছে এবং এটিকে মডিউল হিসাবে ব্যবহারযোগ্য করার জন্য সাধারণ নীতি অনুসারে এভাবে নামকরণ করা হয়েছে।
এই ফাইলে অন্তর্ভুক্ত কোড:
```python
from typing import List
import logging
import azure.functions as func
def main(events: List[func.EventHubEvent]):
for event in events:
logging.info('Python EventHub trigger processed an event: %s',
event.get_body().decode('utf-8'))
```
এই ট্রিগারের মূল চাবিকাঠি রয়েছে `main` ফাংশনে । আইওটি হাব থেকে ইভেন্টের সাথে এই ফাংশনকেই কল করা হয়। ফাংশনটিতে `events` নামে একটি প্যারামিটার রয়েছে যেটিতে `EventHubEvent` লিস্ট রয়েছে। এই লিস্টের প্রতিটি ইভেন্ট মূলত আইওটি হাবে পাঠানো এক একটি ম্যাসেজ যাতে এনোটেশনের মত প্রপার্টিও অন্তর্ভূক্ত থাকে যেমনটা আমরা গত লেসনে দেখেছি।
এই ট্রিগারটি প্রতিটি ইভেন্ট একটি একটি করে নয়, বরং অনেকগুলো ইভেন্টের একটি লিস্ট একসাথে নিয়ে কাজ করে। যখন প্রথমবার ট্রিগার রান করা হয়, তখন এটি আইওটি হাবের অসমাপ্ত ইভেন্টগুলোর কাজ আগে সমাপ্ত করে। তারপর যদি খুব অল্প সময়ের ভেতরে হাবে অনেকগুলো ইভেন্ট পাঠানো না হয়, তাহলে এটি একটি ইভেন্ট সম্বলিত লিস্ট নিয়ে কাজ শুরু করে দিবে।
এই ফাংশন মূলত লিস্ট ধরে কাজ করে এবং ইভেন্টগুলো নথিবদ্ধ রাখে।
* `function.json` - এটিতে ট্রিগারের কনফিগারেশন থাকে যা মূলত `bindings` অংশে আমরা দেখি। বাইন্ডিং হলো মূলত Azure Functions এবং অন্যান্য Azure services এর মধ্যকার সংযোগ। এটিতে input binding থাকে, কোন একটি ইভেন্ট হাবের জন্য - যা ইভেন্ট হাবের সাথে সংযুক্ত হয় এবং ডেটা গ্রহণ করে।
> 💁 এছাড়াও আমরা আউটপুট বাইন্ডিং ব্যবহার করতে পারি যা কোন ফাংশনের আউটপুটকে আরেকটি ডিভাইসে প্রেরণ করতে পারে। যেমন, কোন ডেটাবেসের সাথে আউটপুট বাইন্ডিং যোগ করে ফাংশন দ্বারা আইওটি হাবের সাথে রিটার্ন করতে দিলে - সকল ডেটা স্বংক্রিয়ভাবেই সেই ডেটাবেস এ চলে আসবে।
✅ এবার কিছু গবেষণা করা যাক: বাইন্ডিংস নিয়ে [Azure Functions triggers and bindings concepts documentation](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python)পড়ে আরো জেনে নিই এই বিষয়ে ।
`bindings` অংশে এর কনফিগারেশনগুলো রয়েছে। এর গুরুত্বপূর্ণ কিছু ভ্যালু হলো :
* `"type": "eventHubTrigger"` - এটির অর্থ হলো ফাংশনকে ইভেন্ট হাব থেকে ইভেন্টের ডেটা গ্রহণ করতে হবে।
* `"name": "events"` - এই প্যারামিটারটি ইভেন্ট হাবের ইভেন্টের জন্য ব্যবহৃত হয়। এটি পাইথন কোডের `main` function এর সাথে প্যারামিটার মিলিয়ে কাজ করে।
* `"direction": "in"` - এটি ইনপুট বাইন্ডিং, যেখানে ইভেন্ট হাব থেকে ফাংশনে ডেটা আসে।
* `"connection": ""` - কানেকশন স্ট্রিং থেকে ডেটা গ্রহণের যে সেটিং - সেটির সংজ্ঞা নির্ধারণ করে। লোকালি রান করলে, সেটি `local.settings.json` ফাইল থেকে সেটিংস রীড করে।
> 💁 এই connection string কিন্তু `function.json` ফাইলে স্টোর করা যাবেনা, এটি সেটিংস থেকেই রীড করতে হবে। এটি এভাবে সাজানো হয়েছে যাতে আকস্মিকভাবে কানেকশন স্ট্রিং প্রকাশিত হয়ে না যায়।
1. `"connection"` এর ভ্যালু `function.json` ফাইল থেকে নিতে হবে যাতে নতুন ভ্যালুগুলো `local.settings.json` ফাইলে থাকে:
```json
"connection": "IOT_HUB_CONNECTION_STRING",
```
> 💁 মনে রাখতে হবে - এটি যেন সেটিংস এ পয়েন্ট করে, এবং কানেকশন স্ট্রিং যেন এখানে না থাকে।
### কাজ - ইভেন্ট ট্রিগার রান করা
1. এটা নিশ্চিত করতে হবে যে আমরা যেন আইওটি হাব ইভেন্ট মনিটরে রান না করি। এটি এবং ফাংশন এপ্লিকেশন যদি একসাথে রান করে, তবে ফাংশন এপ যথাযথভাবে ইভেন্টের সাথে সঠিকভাবে কানেক্ট হতে পারবেনা, ফলে ইভেন্টের ডেটাও ঠিকমতো পাওয়া যাবেনা।
> 💁 একাধিক এপ্লিকেশন এখানে বিভিন্ন *consumer groups* ব্যবহার করে আইওটি হাব এন্ডপয়েন্টের সাথে যুক্ত হবে। এই সংক্রান্তে আরো বিস্তারিত আমরা পরবর্তী একটি অধ্যায়ে জানবো।
1. Functions app রান করার জন্য, VS Code terminal থেকে নিম্নের কোডগুলো রান দিই
```sh
func start
```
ফাংশন এপ চালু হয়ে, `iot-hub-trigger` ফাংশনটি খুঁজে নিবে । তারপর এটি আগে থেকেই আইওটি হাবে আসা ইভেন্টসমূহ প্রসেস করবে।
```output
(.venv) ➜ soil-moisture-trigger func start
Found Python version 3.9.1 (python3).
Azure Functions Core Tools
Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit)
Function Runtime Version: 3.0.15417.0
Functions:
iot-hub-trigger: eventHubTrigger
For detailed output, run func with --verbose flag.
[2021-05-05T02:44:07.517Z] Worker process started and initialized.
[2021-05-05T02:44:09.202Z] Executing 'Functions.iot-hub-trigger' (Reason='(null)', Id=802803a5-eae9-4401-a1f4-176631456ce4)
[2021-05-05T02:44:09.205Z] Trigger Details: PartionId: 0, Offset: 1011240-1011632, EnqueueTimeUtc: 2021-05-04T19:04:04.2030000Z-2021-05-04T19:04:04.3900000Z, SequenceNumber: 2546-2547, Count: 2
[2021-05-05T02:44:09.352Z] Python EventHub trigger processed an event: {"soil_moisture":628}
[2021-05-05T02:44:09.354Z] Python EventHub trigger processed an event: {"soil_moisture":624}
[2021-05-05T02:44:09.395Z] Executed 'Functions.iot-hub-trigger' (Succeeded, Id=802803a5-eae9-4401-a1f4-176631456ce4, Duration=245ms)
```
এই ফাংশনের প্রতিটি কলে `Executing 'Functions.iot-hub-trigger'` অথবা `Executed 'Functions.iot-hub-trigger'` ব্লকগুলো আউটপুটে আসবে। এতে করে আমরা জানতে পারবো প্রতিটি ফাংশন কলে কতটি ম্যাসেজ প্রসেস করা হয়েছে।
> যদি নিচের এই এররটি আসে:
```output
The listener for function 'Functions.iot-hub-trigger' was unable to start. Microsoft.WindowsAzure.Storage: Connection refused. System.Net.Http: Connection refused. System.Private.CoreLib: Connection refused.
```
তাহলে, এটা দেখতে হবে যে Azurite চলছে কিনা এবং আমরা `local.settings.json`ফাইলে `AzureWebJobsStorage` কে `UseDevelopmentStorage=true` করেছি কিনা সেই বিষয়টিও আমাদের নিশ্চিত করতে হবে।
1. এখন আমাদেরকে আমাদের আইওটি ডিভাইস চলছে কিনা খেয়াল রাখটে হবে এবং দেখতে পাব যে ফাংশন এপ এ মাটির আর্দ্রতার নতুন মানগুলো দেখাচ্ছে।
1. Functions app বন্ধ করে তা Restart করি। দেখা যাবে এটি আর আগের ম্যাসেজগুলো প্রসেস করছেনা, কেবল নতুন ম্যাসেজগুলো নিয়েই কাজ করছে।
> 💁 VS Code থেকেই ফাংশন ডিবাগ করা যায়। প্রতিটি লাইনের শুরুতে বর্ডারের অংশে ক্লিক করে অথবা কার্সরকে কোন লাইনে রেখে তারপর *Run -> Toggle breakpoint* এ গিয়ে বা `F9` প্রেস করার মাধ্যমে ব্রেকপয়েন্ট সেট করা যায়। এছাড়াও ডিবাগার launch করার জন্য *Run -> Start debugging* এ গিয়ে বা `F5` প্রেস করে অথবা আমরা *Run and debug* এ গিয়ে **Start debugging** এ ক্লিক করতে হবে। এখান থেকে ইভেন্ট প্রসেসিং এর ডিটেইলস জানা যাবে।
## সার্ভারলেস কোড থেকে ডিরেক্ট মেথড রিকুয়েস্ট পাঠানো
এখন পর্যন্ত আমাদের ফাংশন অ্যাপ্লিকেশনটি আইওটি হাব থেকে ইভেন্ট হাবের সামঞ্জস্যপূর্ণ এন্ড পয়েন্টটি ব্যবহার করে ডেটা গ্রহণ করছে। আমাদেরকে এখন আইওটি ডিভাইসে কমান্ড প্রেরণ করতে হবে। এটি *রেজিস্ট্রি ম্যানেজার* এর মাধ্যমে আইওটি হাবের সাথে একটি আলাদা সংযোগ দ্বারা করা হয়। রেজিস্ট্রি ম্যানেজার এমন একটি ট্যুল যা আমাদেরকে আইওটি হাবের সাথে কী কী ডিভাইসগুলি নিবন্ধভুক্ত রয়েছে তা দেখতে এবং ডিভাইসগুলোর সাথে যোগাযোগ করার জন্য ক্লাউড থেকে ডিভাইসে ম্যাসেজ পাঠানোর সুযোগ দেয়। এক্ষেত্রে direct method requests বা ডিভাইস টুইন আপডেট করার মাধ্যমে তা করা হয়। এছাড়াও আমরা এটি দ্বারা আইওটি হাব থেকে আইওটি ডিভাইসগুলি নিবন্ধকরণ, আপডেট করতে বা ডিলিট করতে পারবো।
Registry Manager এর সাথে কানেক্ট করার জন্য Connection String দরকারঃ
### কাজ - Registry Manager এর জন্য connection string নেয়া
1. নিচের কমান্ড রান করি:
```sh
az iot hub connection-string show --policy-name service \
--output table \
--hub-name <hub_name>
```
এখানে `<hub_name>` এর জায়গায় আমাদের ব্যবহৃত নামটি বসাই।
*ServiceConnect* পলিসির `--policy-name service` প্যারামিটারের মাধ্যমে কানেকশন স্ট্রিং চাওয়া হয়েছে। আমরা যখন connection string এর রিকুয়েস্ট করি, পার্মিশনগুলো প্রয়োজনমতো ঠিক করতে পারবো। এখানে ServiceConnect পলিসি আইওটি ডিভাইসে কানেক্ট করে ম্যাসেজ পাঠানোর সুযোগ দেয়।
✅ কিছু গবেষণা করা যাক: [IoT Hub permissions documentation](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) থেকে বিভিন্ন পলিসি সম্পর্কে জানতে হবে।
1. VS Code এ `local.settings.json` ফাইলটি ওপেন করি। তারপর `Values` অংশে নিচের ব্যালুগুলো যোগ করি:
```json
"REGISTRY_MANAGER_CONNECTION_STRING": "<connection string>"
```
এখানে আগের স্টেপ থেকে পাওয়া ভ্যালু্টি `<connection string>` এর জায়গায় বসাই। JSON ফাইলটি সঠিকভাবে তৈরী করতে আমাদেরকে উপরের লাইনের পরে কমা যুক্ত করতে হবে।
### কাজ - ডিভাইসে direct method request পাঠানো
1. Registry Manager এর SDK সহজেই Pip package এর মাধ্যমে পাওয়া যাবে। `requirements.txt` ফাইলে নিচের লাইনগুলো যোগ করি প্যাকেজের ডিপেন্ডেন্সি এড করার জন্য:
```sh
azure-iot-hub
```
1. Pip package ইন্সটল করার জন্য এটি নিশ্চিত করতে হবে যে আমরা virtual environment এক্টিভেট করেই ভিএস কোডে কাজ করছি :
```sh
pip install -r requirements.txt
```
1. `__init__.py` ফাইলে নিচের ইম্পোর্টগুলো যুক্ত করি:
```python
import json
import os
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import CloudToDeviceMethod
```
এটি কিছু সিস্টেম লাইব্রেরি এবং Registry Manager সাথে ইন্টারঅ্যাক্ট করতে এবং direct method requests প্রেরণের জন্য আরো কিছু লাইব্রেরি ইম্পোর্ট করে।
1. `main` মেথড থেকে কোডগুলো সরিয়ে ফেলি, তবে মেথডটি রাখতে হবে।
1. যখন একাধিক বার্তা গৃহীত হয়, কেবলমাত্র শেষেরটিকেই এটি প্রসেস করে কারণ এটি হল বর্তমান সময়ে মাটির আর্দ্রতা। এটির আগে থেকে আসা বার্তাগুলি প্রক্রিয়া করা নিষ্প্রয়োজন। এক্ষন `events` প্যারামিটার থেকে সর্বেশেষ ম্যাসেজ পেতে হলে নিচের কোডগুলো যুক্ত করতে হবে:
```python
event = events[-1]
```
1. তারপর নিম্নের কোডগুলো যুক্ত করি:
```python
body = json.loads(event.get_body().decode('utf-8'))
device_id = event.iothub_metadata['connection-device-id']
logging.info(f'Received message: {body} from {device_id}')
```
এই কোডটি আইওটি ডিভাইস থেকে আসা JSON ম্যাসেজের যে ইভেন্ট বডি রয়েছে তা সংগ্রহ করে।
তারপর এটি ম্যাসেজের সাথে আসা এনোটেশন থেকে ডিভাইস আইডি পেয়ে যায়। ইভেন্টের বডি তে টেলিমেট্রি হিসেবে আসা ম্যাসেজগুলো, `iothub_metadata` ডিকশনারি যেটিতে আবার প্রেরক (Sender) এর ডিভাইস আইডি এবং সময় উল্লেখিত থাকে।
সকল তথ্য সংরক্ষিত (logged) থাকে। Function app কে লোকালি রান করলে এই সংরক্ষণের বিষয়টি (logging) টার্মিনালে দেখা যাবে।
1. তারপর নিচের কোডগুলো যুক্ত করি:
```python
soil_moisture = body['soil_moisture']
if soil_moisture > 450:
direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}')
else:
direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}')
```
এই কোডটি ম্যাসেজ থেকে মাটির আর্দ্রতা পায়। তারপর এটি মাটির আর্দ্রতা চেক করে এবং আর্দ্রতার মানের উপর নির্ভর করে একটি helper class তৈরী করে direct method request পাঠানোর জন্য যেখানে `relay_on` বা `relay_off` করা যাবে। এটিতে payload এর প্রয়োজন নেই, তাই একটি ফাঁকা JSON document পাঠানো যাবে।
1. নিচের কোড যুক্ত করি:
```python
logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}')
registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING']
registry_manager = IoTHubRegistryManager(registry_manager_connection_string)
```
এই কোডটি `local.settings.json` ফাইল থেকে `REGISTRY_MANAGER_CONNECTION_STRING` ওপেন করবে। এই ফাইলের ভ্যালুগুলো এনভায়রনমেন্ট ভ্যারিয়েবল হিসেবে প্রদর্শন করা হয় এবং এগুলো `os.environ` ফাংশন (সকল এনভায়রনমেন্ট ভ্যারিয়েবল ডিকশনারি) দ্বারা ব্যবহারযোগ্য করা যায় ।
> 💁 এই কোডটি ক্লাউডে চলতে থাকলে,`local.settings.json` এর ভ্যালুগুলো *Application Settings* হিসেবে পাঠানো হয় যা এনভায়রনমেন্ট ভ্যারিয়েবল থেকে ব্যবহার করা যায়।
কোডটি পরে সংযোগ স্ট্রিংটি ব্যবহার করে রেজিস্ট্রি ম্যানেজার হেল্পার ক্লাসের একটি পরিস্থিতি তৈরি করে।
1. নিম্নের কোড যোগ করি:
```python
registry_manager.invoke_device_method(device_id, direct_method)
logging.info('Direct method request sent!')
```
এই কোডটি রেজিস্ট্রি ম্যানেজারকে টেলিমেট্রি প্রেরণকারী ডিভাইসে direct method request প্রেরণ করার নির্দেশ দেয়।
> 💁 এমকিউটিটি ব্যবহার করে আমাদের পূর্ববর্তী পাঠগুলিতে তৈরি করা অ্যাপ্লিকেশনগুলির সংস্করণগুলিতে, রিলে নিয়ন্ত্রণ কমান্ডগুলি সমস্ত ডিভাইসে প্রেরণ করা হয়েছিল। কোড ধরে নিয়েছে যে আমাদের কেবল একটি ডিভাইস থাকবে। কোডটির এই সংস্করণটি কোন একটিমাত্র ডিভাইসে রিকুয়েস্ট প্রেরণ করে, তাই আমাদের যদি আর্দ্রতা সেন্সর এবং রিলে এর একাধিক সেটআপ থাকে, তবে এটি সঠিক ডিভাইসে সংযুক্ত হয়ে কাজ করবে।
1. Functions app রান করে এটি নিশ্চিত করতে হবে যে IoT device ডেটা পাঠাচ্ছে। আমরা দেখতে পাব যে ম্যাসেজগুলো প্রসেস হচ্ছে এবং ডিরেক্ট মেথড রিকুয়েস্ট পাঠানো হচ্ছে। সেন্সরটি নাড়ালেই আমরা ভ্যালু চেঞ্জ হতে দেখব এবং রিলে তেও এই পরিবর্তন আসবে।
> 💁 সকল কোড [code/functions](code/functions) ফোল্ডারে রয়েছে।
## ক্লাউডে সার্ভারলেস কোড ডেপ্লয় করা
আমাদের কোডটি এখন লোকালি কাজ করছে, তাই পরবর্তী পদক্ষেপে আমরা ক্লাউডে ফাংশন অ্যাপ স্থাপন করব।
### কাজ - ক্লাউড রিসোর্স তৈরী
আমাদের ফাংশন অ্যাপটি কে একটি Azure Functions App রিসোর্সে ডেপ্লয় করতে হবে,যা আমাদের আইওটি হাবে তৈরী করা রিসোর্স গ্রুপে থাকবে। এছাড়াও ইম্যুলেটেড এর পরিবর্তে আমাদের একটি স্টোরেজ একাউন্ট প্রয়োজন।
1. স্টোরেজ একাউন্ট তৈরীর জন্য নিম্নের কমান্ড রান দিই:
```sh
az storage account create --resource-group soil-moisture-sensor \
--sku Standard_LRS \
--name <storage_name>
```
এখানে `<storage_name>` এর জায়গায় আমাদের স্টোরেজ একাউন্টের নাম দিতে হবে। এটি গ্লোবালি ইউনিক হতে হবে কেননা এটি URL হিসেবেও ব্যবহৃত হবে। এটির নাম ২৪ ক্যারেক্টারের মধ্যে হতে হবে এবং এখানে ছোট হাতের (lower case) ইংরেজি বর্ণ এবং সংখ্যা ব্যবহার করা যাবে। নাম হিসেবে `sms` এর সাথে কোন সংখ্যা বা নাম লেখা যেতে পারে।
এখানে `--sku Standard_LRS` -ই মূল্যমান নির্ধারণ করে যা এক্ষেত্রে সর্বনিম্ন দামের জেনারেল পারপাস একাউন্ট সিলেক্ট করছে। এখানে কোন ফ্রী সার্ভিস নেই এবং আমাদেরকে ব্যবহার অনুসারে ফী দিতে হবে। তবে এখানে খরচ বেশ কম, সবথেকে দামি সার্ভিসও .০৫ মার্কিন ডলার প্রতি মাসে প্রতি গিগাবাইটের জন্য।
✅ মূল্যমানের ব্যপারে [Azure Storage Account pricing page](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) থেকে বিস্তারিত জানা যাবে।
1. ফাংশন এপ তৈরীর জন্য নিম্নের কমান্ড রান করি:
```sh
az functionapp create --resource-group soil-moisture-sensor \
--runtime python \
--functions-version 3 \
--os-type Linux \
--consumption-plan-location <location> \
--storage-account <storage_name> \
--name <functions_app_name>
```
`<location>` এর স্থলে আগের লেসনে রিসোর্স গ্রুপ তৈরীর সময় যে লোকেশন ব্যবহার করেছি, তা দিতে হবে।
এছাড়াও `<storage_name>` এর জায়গায় আগের অংশে ব্যবহৃত নামটিই দিতে হবে।
তারপর `<functions_app_name>` এও একটি ইউনিক নাম দিতে হবে। এটি গ্লোবালি ইউনিক হতে হবে কেননা ফাংশন এপ একসেস করার জন্য URL এ এটি ব্যবহৃত হবে। এখানে `soil-moisture-sensor-` বা এই ধরণের কিছুর পরে কোন শব্দ বা নাম দেয়া যেতে পারে।
এখানে `--functions-version 3` এই অপশনটি ব্যবহার্য Azure Functions এর ভার্সন ঠিক করে। ভার্সন-৩ ই হলো সর্বশেষ সংস্করণ।
আর `--os-type Linux` Functions runtime কে এই ফাংশনগুলো হোস্ট করার জন্য OS হিসেবে Linux ব্যবহারের নির্দেশ দেয়। Function গুলো প্রোগ্রামিং ভাষার উপর ভিত্তি করে, Linux বা Windows এ হোস্ট করা যাবে। পাইথন ভাষার এপ্লিকেশন হলে, তা কেবল Linux এই রান করবে।
### কাজ - Application settings আপলোড করা
যখন আমরা ফাংশন এপ গুলো তৈরী করি, তখন `local.settings.json` ফাইলে আইওটি হাবের কানেকশন স্ট্রিংয়ের জন্য কিছু সেটিংস স্টোর হয়। এই সেটিংস গুলো Azure এ ফাংশন এপ এর এপ্লিকেশন সেটিং এও আসতে হবে যাতে আমাদের কোড তা ব্যবহার করতে পারে।
> 🎓 `local.settings.json` ফাইলটি কেবল লোকাল ডেভলাপমেন্ট সেটিংস এর জন্য যা সোর্স কোড কন্ট্রোলেও চেক করা হয়না। যখন আমরা পুরো কার্যক্রম ক্লাউডে আনি, তখন এপ্লিকেশন সেটিংসই ব্যবহৃত হয়। এগুলো কী/ভ্যালু পেয়ার হিসেবে ক্লাউডে থাকে যা এনভায়রনমেন্ট ভ্যারিয়েবল থেকেও গ্রহণ করা যায় কোডের মাধ্যমে অথবা রানটাইমে যখন আইওটি হাবের সাথে যুক্ত করা হয়,তখন।
1. নিচের কমান্ড রান করে, `IOT_HUB_CONNECTION_STRING` সেটিংসটি ফাংশন এপ এর এপ্লিকেশন সেটিং এ ঠিক করি:
```sh
az functionapp config appsettings set --resource-group soil-moisture-sensor \
--name <functions_app_name> \
--settings "IOT_HUB_CONNECTION_STRING=<connection string>"
```
এক্ষেত্রে `<functions_app_name>` এর জায়গায় আমাদের ব্যবহৃত নামটি দিতে হবে।
আর `<connection string>` এর স্থলাভিষিক্ত হবে `IOT_HUB_CONNECTION_STRING` এর ভ্যালু যা আমরা `local.settings.json` ফাইল থেকে পাব।
1. পূর্ববর্তী ধাপটি পুনরায় করি, তবে `REGISTRY_MANAGER_CONNECTION_STRING` ভ্যালু সেট করতে হবে `local.settings.json` ফাইলের ভিত্তিতে।
আমরা যখন এই আদেশগুলি পরিচালনা করি, তখন এগুলো ফাংশন অ্যাপ্লিকেশনের জন্য সমস্ত অ্যাপ্লিকেশন সেটিংসের একটি তালিকা আউটপুট হিসেবে প্রকাশ করে। আমাদের মানগুলি সঠিকভাবে সেট করা আছে কিনা তা পরীক্ষা করতে আমরা এই সুবিধা কাজে লাগাতে পারি।
> 💁 আমরা `AzureWebJobsStorage` তে আগে থেকেই ভ্যালু সেট করা দেখবো। এক্ষেত্রে `local.settings.json` ফাইলে যা লোকাল স্টোরেজ ইম্যুলেটর ব্যবহারের জন্য সেট করা হয়েছে। আমরা যখন ফাংশন অ্যাপ তৈরী করি, তখন এই স্টোরেজ একাউন্টটি প্যারামিটার হিসেবে পাস করা হয় যা অটোমেটিক্যালি সেটিংস এ চলে আসে।
### কাজ - ক্লাউডে ফাংশন অ্যাপ ডেপ্লয় করা
এখন যেহেতু আমাদের ফাংশন অ্যাপ রেডি রয়েছে, আমরা তা ক্লাউডে ডেপ্লয় করতে পারবো।
1. VS Code terminal এ নীচের কমান্ড রান করে Functions App পাবলিশ করি:
```sh
func azure functionapp publish <functions_app_name>
```
এক্ষেত্রে `<functions_app_name>` এর জায়গায় আমাদের ব্যবহৃত নামটি দিতে হবে।
কোডটি প্যাকেজ আকারে ফাংশন অ্যাপে প্রেরণ করা হবে, যেখানে এটি ডেপ্লয় এবং ব্যবহার করা শুরু করা হবে। প্রচুর কনসোল আউটপুট থাকবে, এটির ডেপ্লয়মেন্টের নিশ্চয়তা এবং ক্রিয়াকলাপগুলির একটি তালিকা দেখানো হবে। তবে এক্ষেত্রে তালিকায় কেবল ট্রিগার থাকবে।
```output
Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in soil-moisture-sensor:
iot-hub-trigger - [eventHubTrigger]
```
আমাদের আইওটি ডিভাইসটি চলছে কিনা তা আগে নিশ্চিত করি । সেন্সরটিকে বারবার মাটির অভ্যন্তরে এবং বাইরে সরিয়ে আর্দ্রতার স্তর পরিবর্তন করি। মাটির আর্দ্রতা পরিবর্তনের সাথে সাথে আমরা রিলেটি চালু এবং বন্ধ হতে দেখবো।
---
## 🚀 চ্যালেঞ্জ
পূর্ববর্তী পাঠে, রিলে চালু থাকা অবস্থায় এবং এটি বন্ধ হওয়ার পরে অল্প সময়ের জন্য - আমরা এমকিউটিটি বার্তাগুলি থেকে আনসাবস্ক্রাইব করে রিলে এর সময় ম্যানেজ করেছিলাম । আমরা এই পদ্ধতিটি এখানে ব্যবহার করতে পারব না - আইওটি হাব ট্রিগার আমরা আন-সাবস্ক্রাইব করতে পারব না।
আমাদের ফাংশন অ্যাপে এই সমস্যা মোকাবেলা করতে বিভিন্ন উপায় সম্পর্কে চিন্তা করি।
## লেকচার পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18)
## রিভিউ এবং স্ব-অধ্যয়ন
* সার্ভারলেস কম্পিউটিং নিয়ে [Serverless Computing page on Wikipedia](https://wikipedia.org/wiki/Serverless_computing) থেকে আরো জানা যাবে।
* উদাহরণসহ সার্ভারলেস নিয়ে আরো জানা যাবে [Go serverless for your IoT needs Azure blog post](https://azure.microsoft.com/blog/go-serverless-for-your-iot-needs/?WT.mc_id=academic-17441-jabenn) থেকে।
* Azure Functions নিয়ে [Azure Functions YouTube channel](https://www.youtube.com/c/AzureFunctions) থেকে আরো জানা যাবে।
## এসাইনমেন্ট
[ম্যানুয়াল রিলে কন্ট্রোল সংযোজন](assignment.bn.md)

@ -1,56 +0,0 @@
# ম্যানুয়াল রিলে কন্ট্রোল সংযোজন
## নির্দেশাবলি
এইচটিটিপি অনুরোধ সহ অনেকগুলি ভিন্ন উপায়ে সার্ভারলেস কোডকে ট্রিগার করা যায়। রিলে নিয়ন্ত্রণে ম্যানুয়াল ওভাররাইড যুক্ত করতে আমরা HTTP ট্রিগার ব্যবহার করতে পারি, কাউকে ওয়েব রিকুয়েস্ট দ্বারা রিলে চালু বা বন্ধ করার সুযোগ দিতে।
এই এসাইনমেন্টের জন্য, রিলে চালু এবং বন্ধ করতে ফাংশন অ্যাপটিতে দুটি এইচটিটিপি ট্রিগার যুক্ত করতে হবে। ডিভাইসে কমান্ড প্রেরণের জন্য আমরা এই পাঠটি থেকে যা শিখেছি তা ব্যবহার করেই এটি করতে পারবো।
কিছু হিন্টস:
* নিম্নলিখিত কমান্ডটি সহ আমাদের বিদ্যমান ফাংশন অ্যাপগুলিতে একটি HTTP ট্রিগার যুক্ত করতে পারি:
```sh
func new --name <trigger name> --template "HTTP trigger"
```
এখানে `<trigger name>` এর জায়গায় আমাদের ব্যবহৃত এইচটিটিপি ট্রিগারের নাম দিতে হবে। এখানে `relay_on` এবং `relay_off` এর মতো নাম দেয়া যায়।
* HTTP trigger এ একসেস কন্ট্রোল দেয়া যায়। এগুলো রান করার জন্য function-specific API key দরকার যা URL এর সাথে পাস করতে হবে। তবে এই এসাইনমেন্টের জন্য এই রেস্ট্রিকশন রিমুভ করে দেয়া যায় যাতে যে কেউই এই ফাংশন রান করতে পারে। এজন্য `authLevel` সেটিংসটি আপডেট করতে হবে `function.json` ফাইল থেকে :
```json
"authLevel": "anonymous"
```
> 💁 একসেস কন্ট্রোল নিয়ে আরো বিস্তারিত [Function access keys documentation](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys) থেকে জানা যাবে।
* HTTP ট্রিগারগুলো বাই ডিফল্ট GET এবং POST রিকুয়েস্টগুলো সাপোর্ট করে। অর্থাৎ ওয়েব ব্রাউজার দ্বারাই কাজ করা যাবে - GET রিকুয়েস্ট দিয়ে।
লোকালি ফাংশন এপ রান করলে, ট্রিগার ইউআরএল পাওয়া যাবে:
```output
Functions:
relay_off: [GET,POST] http://localhost:7071/api/relay_off
relay_on: [GET,POST] http://localhost:7071/api/relay_on
iot-hub-trigger: eventHubTrigger
```
ইউআরএল টি ব্রাউজারে পেস্ট করে `return` এ প্রেস করতে হবে অথবা VS Code টার্মিনালে লিংকটি `Ctrl+click` (`Cmd+click` macOS এর জন্য) সিলেক্ট করলে ডিফল্ট ব্রাউজারে তা ওপেন হবে এবং ট্রিগার রান করবে।
> 💁 খেয়াল করা দরকার যে URL-টি তে `/api` রয়েছে - HTTP ট্রিগারগুলো বাই ডিফল্ট `api` সাবডোমেইনে থাকে।
* ফাংশন অ্যাপ ডেপ্লয় করলে, তখন এইচটিটিপি ট্রিগার URL হবে:
`https://<functions app name>.azurewebsites.net/api/<trigger name>`
যেখানে `<functions app name>` হলো আমাদের ফাংশন এপ এর নাম এবং `<trigger name>` হলো ট্রিগারের নাম।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) |
| --------- | ------------------ | ------------- | --------------------- |
| HTTP ট্রিগার তৈরী | সঠিক নামকরণের মাধ্যমে ২টি ট্রিগার তৈরি করে রিলে অন/অফ করা হয়েছে | সঠিক নামকরণের মাধ্যমে ১টি ট্রিগার তৈরি করেছে | কোন ট্রিগার তৈরী করতে সমর্থ হয়নি |
| এইচটিটিপি ট্রিগারগুলি থেকে রিলে নিয়ন্ত্রণ করা | উভয় ট্রিগারকে আইওটি হাবের সাথে সংযুক্ত করতে এবং যথোপযুক্তভাবে রিলে নিয়ন্ত্রণ করতে সক্ষম হয়েছিল| কেবল ১টি ট্রিগারকে আইওটি হাবের সাথে সংযুক্ত করতে এবং যথোপযুক্তভাবে রিলে নিয়ন্ত্রণ করতে সক্ষম হয়েছিল | ট্রিগারকে আইওটি হাবের সাথে সংযুক্ত করতে সমর্থ হয়নি |

@ -1,245 +0,0 @@
# উদ্ভিদের নিরাপত্তা নিশ্চিতকরণ
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-10.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19)
## সূচনা
গত কয়েকটি পাঠে আমরা মাটি পর্যবেক্ষণের জন্য একটি আইওটি ডিভাইস তৈরি করেছি এবং এটিকে ক্লাউডের সাথে সংযুক্ত করেছি। তবে যদি হ্যাকাররা আমাদের আইওটি ডিভাইসগুলির নিয়ন্ত্রণ দখল করতে সক্ষম হয় তবে কী হবে? কী হবে যদি তারা মাটির আর্দ্রতার সঠিক মান পরিবর্তন করে, উচ্চমান পাঠায় - যাতে আমাদের গাছপালা কখনই সেচ না পায় অথবা আমাদের সেচব্যবস্থা সবসময় চালু রেখে যদি আমাদের গাছগুলিকে বেশি পানিতে ডুবিয়ে রাখে ?
এই পাঠে আমরা আইওটি ডিভাইসগুলি নিরাপত্তার বিষয়ে শিখব। যেহেতু এটি এই প্রকল্পের শেষ পাঠ, আমরা আমাদের ক্লাউড সার্ভিসগুলি কীভাবে গুছিয়ে রাখতে পারি যাতে ব্যয় হ্রাস হয় - তা শিখব।
এই পাঠে আমরা দেখবো:
* [কেন আমাদের আইওটি ডিভাইসগুলি সুরক্ষিত করা দরকার?](#কেন-আমাদের-আইওটি-ডিভাইসগুলি-সুরক্ষিত-করা-দরকার)
* [সংকেতলিপি (Cryptography)](#সংকেতলিপি)
* [আমাদের আইওটি ডিভাইস নিরাপদ রাখা](#আইওটি-ডিভাইস-নিরাপত্তা)
* [X.509 Certificate তৈরী ও ব্যবহার](#X.509-Certificate-তৈরী-ও-ব্যবহার)
> 🗑 এটি এই প্রজেক্টের শেষ লেসন, সুতরাং এই পাঠ এবং এর অ্যাসাইনমেন্ট শেষ করার পরে, আমাদের ক্লাউড ্সার্ভিসগুলি আমাদেরকে অবশ্যই গুছিয়ে রেখে দিতে হবে বা clean up করতে হবে। অ্যাসাইনমেন্টটি সম্পন্ন করার জন্য আমাদের যেসব সার্ভিসগুলির প্রয়োজন হবে, সেগুলো আগে নিশ্চিত করতে হবে।
> এক্ষেত্রে [প্রজেক্ট ক্লীন-আপ গাইডে](../../../../../translations/clean-up.bn.md) নির্দেশনা পাওয়া যাবে যাতে আমরা ক্লাউড সার্ভিস গুছিয়ে রাখতে পারি।
## কেন আমাদের আইওটি ডিভাইসগুলি সুরক্ষিত করা দরকার?
আইওটি সুরক্ষার মধ্যে এটি নিশ্চিত করা হয় যে কেবলমাত্র নির্দিষ্ট কিছু ডিভাইসই আমাদের ক্লাউড আইওটি ্সার্ভিসতে সংযোগ করতে পারে এবং তাদের টেলিমেট্রি পাঠাতে পারে। এটিও নিশ্চিত করা হয় যেন কেবল আমাদের ক্লাউড সার্ভিসই আমাদের ডিভাইসে নির্দেশ পাঠাতে পারে। আইওটি ডেটা চিকিত্সা বা বেশ অন্তরঙ্গ ডেটা সহ ব্যক্তিগতও হতে পারে, তাই এই তথ্য ফাঁস হওয়া বন্ধ করতে আমাদের পুরো ব্যবস্থাপনার সুরক্ষা বিবেচনা করা উচিত।
যদি আমাদের আইওটি অ্যাপ্লিকেশনটি সুরক্ষিত না হয় তবে বিভিন্ন ঝুঁকি রয়েছে:
* একটি নকল ডিভাইস আমাদের অ্যাপ্লিকেশনটিকে ভুলভাবে প্রতিক্রিয়া দিতে পারে। উদাহরণস্বরূপ, মাটির আর্দ্রতার সঠিক মান পরিবর্তন করে, উচ্চমান পাঠালে আমাদের সেচ ব্যবস্থা কখনই চালু হবেনা এবং আমাদের গাছপালা পানির অভাবে মারা যাবে।
* অননুমোদিত ব্যবহারকারীরা ব্যক্তিগত বা ব্যবসায়িক গুরুত্বপূর্ণ ডেটা পড়তে পারবে।
* হ্যাকাররা কোন ডিভাইসে এমনভাবে কমান্ডগুলি প্রেরণ করতে পারে যাতে ডিভাইসটি বা এর সাথে হার্ডওয়ার এর ক্ষতি করতে পারে।
* আইওটি ডিভাইসের সাথে সংযোগ স্থাপনের মাধ্যমে, হ্যাকাররা এটি অতিরিক্ত নেটওয়ার্কগুলিতে প্রবেশের অনুমতি পেয়ে যেতে পারে।
* ক্ষতিকারক ব্যবহারকারীরা ব্যক্তিগত ডেটা অ্যাক্সেস করতে এবং এটি ব্ল্যাকমেইলের জন্য ব্যবহার করতে পারে
এগুলি বাস্তব পরিস্থিতি এবং সর্বদাই ঘটে। পূর্ববর্তী পাঠগুলিতে কিছু উদাহরণ দেওয়া হয়েছিল, এখানে আরও কিছু রয়েছে:
* 2018 সালে, হ্যাকাররা ডেটা চুরির জন্য ক্যাসিনোর নেটওয়ার্কে অ্যাক্সেস পেতে একটি ফিশ ট্যাঙ্ক থার্মোস্টেটে একটি ওপেন ওয়াইফাই অ্যাক্সেস পয়েন্ট ব্যবহার করেছিল। [সূত্রঃ The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html)
* ২০১৬ সালে মিরাই বটনেট denial of service (Dos) এর মাধ্যমে Dyn নামক একটি ইন্টারনেট সার্ভিস প্রদানকারী সরবরাহকারীর বিরুদ্ধে আক্রমণ করে। এই বটনেট সাধারণ আইওটি ডিভাইস যেমন ডিভিআর এবং ক্যামেরাগুলিতে ডিফল্ট ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহার করে এবং সেখান থেকে আক্রমণ চালিয়েছিল connect [সূত্রঃ The Guardian - DDoS attack that disrupted internet was largest of its kind in history, experts say](https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet)
* Spiral Toys এর কাছে ইন্টারনেটে সকলের জন্য এভেইলেবল ডেটাবেস ছিলো যেটিতে তাদের ক্লাউডপেটস সংযুক্ত খেলনাগুলির ব্যবহারকারীর তথ্য ছিলো । [সূত্রঃ Troy Hunt - Data from connected CloudPets teddy bears leaked and ransomed, exposing kids' voice messages](https://www.troyhunt.com/data-from-connected-cloudpets-teddy-bears-leaked-and-ransomed-exposing-kids-voice-messages/).
* Strava তে একজন এথলিট আরেকজনকে পাশাপাশি অতিক্রম করে গেলে, একে অপরের রূট সহ অনেক ব্যক্তিগত তথ্য ফাঁস করে দেয় [সূত্রঃ Kim Komndo - Fitness app could lead a stranger right to our home — change this setting](https://www.komando.com/security-privacy/strava-fitness-app-privacy/755349/).
✅ কিছু গবেষণা করা যাক: আরও উদাহরণের জন্য অনুসন্ধান করি আইওটি হ্যাকস এবং আইওটি ডেটা লঙ্ঘনের ঘটনাগুলি, বিশেষত ব্যক্তিগত বিষয়াদি যেমন ইন্টারনেট সংযুক্ত টুথব্রাশ বা স্কেল ব্যবহার করে হ্যাক। এই হ্যাকগুলি ভুক্তভোগী বা গ্রাহকদের উপর কী প্রভাব ফেলতে পারে সে সম্পর্কে চিন্তা করি।
> 💁 নিরাপত্তা একটি বিশাল বিষয় এবং এই পাঠটি কেবলমাত্র আমাদের ডিভাইসটিকে ক্লাউডের সাথে সংযুক্ত করার জন্য কয়েকটি প্রাথমিক বিষয় শেখাবে। অন্যান্য বিষয় যা আলোচনা করা হবে না তার মধ্যে রয়েছে ট্রানজিটে ডেটা পরিবর্তনের জন্য নজরদারি, সরাসরি ডিভাইস হ্যাকিং, বা ডিভাইস কনফিগারেশনে পরিবর্তন ইত্যাদি । IoT হ্যাকিং এর মত সমস্যা মোকাবেলা করতে [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn) তৈরী করা হয়েছে। এটি আমাদের কম্পিউটারে ব্যবহৃত এন্টিভাইরাসেরই মতো, যা ছোট এবং কম পাওয়ারে চলমান আইওটি ডিভাইসের জন্য বানানো।
## সংকেতলিপি
যখন কোন ডিভাইস আইওটি পরিষেবাতে সংযুক্ত থাকে, তখন এটি নিজেকে সনাক্ত করতে একটি আইডি ব্যবহার করে। সমস্যা হল এই আইডিটি ক্লোন করা যায় - হ্যাকার একটি নকল ডিভাইস সেট আপ করতে পারে যা একই আইডিটিকে আসল ডিভাইস হিসাবে ব্যবহার করে তবে ভুল ডেটা প্রেরণ করে।
![Both valid and malicious devices could use the same ID to send telemetry](../../../../images/iot-device-and-hacked-device-connecting.png)
এই সমস্যার সমাধানের জন্য কেবলমাত্র ডিভাইস এবং ক্লাউডের পরিচিত কিছু ভ্যালু বা গোপন সংকেত দ্বারা ডেটা আদান প্রদানের সময় তা অগোছালো করে একধরণের গোপন সংকেত-নির্ভর করে দেয়া। এই প্রক্রিয়াকে বলে *encryption* এবং যে ভ্যালু বা গোপন সংকেত দ্বারা ডেটাকে পরিবর্তিত করা হয়, তাকে বলে *encryption key*
![If encryption is used, then only encrypted messages will be accepted, others will be rejected](../../../../images/iot-device-and-hacked-device-connecting-encryption.png)
যে ক্লাউড পরিষেবাটি একটি প্রক্রিয়া ব্যবহার করে ডেটাটিকে একটি পঠনযোগ্য ফর্ম্যাটে রূপান্তর করতে পারে সেই প্রক্রিয়াকে বলে *decryption (ডিক্রিপশন)* এবং এই কাজে একই এনক্রিপশন কী বা একটি *ডিক্রিপশন কী* ব্যবহার করা হয়। যদি এনক্রিপ্ট করা বার্তা কী দ্বারা ডিক্রিপ্ট করা না যায়, সেক্ষেত্রে ধরে নেয়া হয় যে ডিভাইসটি হ্যাক হয়ে গেছে এবং বার্তাটি তখন প্রত্যাখ্যান করা হয়।
এনক্রিপশন এবং ডিক্রিপশনের টেকনিককে একসাথে বলা হয় - *সংকেতলিপি (Cryptography)*
### আদিপর্যায়ের সংকেতলিপি
সবথেকে আদিযুগের সংকেতলিপি (Cryptography) ছিলো সাইফার প্রতিস্থাপন যা প্রায় ৩৫০০ বছর আগে ব্যবহার করা হতো। এগুলোতে একটি বর্ণের পরিবর্তে আরেকটি বসানো হত। উদাহরণস্বরূপ, [সিজার সাইফারে](https://wikipedia.org/wiki/Caesar_cipher) বর্ণগুলো সামনে বা পেছনে নির্দিষ্ট সংখ্যক ঘর অবস্থান পরিবর্তন করা হতো যে পরিবর্তনের মান কেবল প্রেরক ও গ্রাহক জানতো।
আবার [Vigenère cipher](https://wikipedia.org/wiki/Vigenère_cipher) এর ক্ষেত্রে বর্ণগুলো ভিন্ন ভিন্ন ঘর পর্যন্ত মান পরিবর্তন করতো যা সাইফার টেক্সট থেকেও কঠিন হয়ে যায়।
ক্রিপ্টোগ্রাফি বিভিন্ন উদ্দেশ্যে যেমন প্রাচীন মেসোপটেমিয়ায় একটি কুমার গ্লাইজ রেসিপি রক্ষা করা বা ভারতে প্রেমের গোপন চিঠি লেখার জন্য বা প্রাচীন মিশরীয় যাদুকরী মন্ত্রকে গোপন রাখার মতো কাজে ব্যবহার করা হয়েছিল।
### আধুনিক সংকেতলিপি (Cryptography)
আধুনিক ক্রিপ্টোগ্রাফি অনেক বেশি উন্নত, এটি প্রাথমিক পদ্ধতির চেয়ে ক্র্যাক করা আরও অনেক কঠিন করে তোলে। আধুনিক ক্রিপ্টোগ্রাফি ব্রুট ফোর্স আক্রমণকে অকার্যকর করার জন্য অনেকগুলি সম্ভাব্য কী(key) দিয়ে ডেটা এনক্রিপ্ট করতে জটিল গণিত ব্যবহার করে।
সুরক্ষিত যোগাযোগের জন্য এটি বিভিন্ন উপায়ে ব্যবহার করা হয়। যদি আমরা এই লেসনটি যদি গিটহাব এ পড়ি, তবে আমরা লক্ষ্য করতে পারি যে ওয়েব সাইটের ঠিকানাটি *https* দিয়ে শুরু হয়, যার অর্থ আমাদের ব্রাউজার এবং গিটহাবের ওয়েব সার্ভারের মধ্যে যোগাযোগ এনক্রিপ্ট করা আছে। যদি কেউ আমাদের ব্রাউজার এবং গিটহাবের মধ্যে প্রবাহিত ইন্টারনেট ট্র্যাফিক পড়তে সক্ষম হয়ও তবুও তারা এনক্রিপ্ট করা ডেটা পড়তে সক্ষম হবে না। আমাদের কম্পিউটার এমনকি আমাদের হার্ডড্রাইভে সমস্ত ডেটা এনক্রিপ্ট করতে পারে যাতে কেউ যদি এটি চুরি করে, তবুও যেন তারা আমাদের পাসওয়ার্ড ছাড়াই আমাদের ডেটা পড়তে না পারে।
> 🎓 HTTPS হলো HyperText Transfer Protocol **Secure**
দুর্ভাগ্যক্রমে, সবকিছুই নিরাপদ নয়। কিছু ডিভাইসের কোন সুরক্ষা নেই, অন্যকিছু ডিভাইসে আবার সহজেই ক্র্যাক করা যায় এমন কী(KEY) গুলি ব্যবহার করে বা কখনও কখনও একই কী(KEY) ব্যবহার করে একই ধরণের সমস্ত ডিভাইসে। খুব ব্যক্তিগত আইওটি ডিভাইসগুলির জন্য অ্যাকাউন্ট রয়েছে যেগুলির সাথে ওয়াইফাই বা ব্লুটুথের মাধ্যমে সংযোগ করার জন্য পাসওয়ার্ড রয়েছে। আমরা যদি আমাদের নিজস্ব ডিভাইসে সংযোগ করতে পারি তবে কিন্তু আমরা চাইলে অন্য কারও ডিভাইসেও সংযোগ করতে পারি (অনুমতি ব্যাতিরেকে এটি করা অপরাধ)। একবার সংযুক্ত হয়ে আমরা কিছু খুব প্রাইভেট ডেটা অ্যাক্সেস করতে পারি, বা তাদের ডিভাইসে নিয়ন্ত্রণ রাখতে পারি।
> 💁 আধুনিক সংকেতলিপি (Cryptography) এর জটিলতা এবং এনক্রিপশন ভাঙতে বিলিয়ন বিলিয়ন বছর লাগবে - এমন দাবি স্বত্বেও কোয়ান্টাম কম্পিউটিং এর আবির্ভাবের ফলে এই এনক্রিপশন কী (KEY) গুলো ভেঙে ফেলা অনেক সহজ হয়ে গিয়েছে।
### Symmetric এবং asymmetric keys
এনক্রিপশন ২ভাবে হয় - symmetric এবং asymmetric.
**Symmetric** এনক্রিপশন ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে একই কী ব্যবহার করে। প্রেরক এবং প্রাপক উভয়েরই একই কী (KEY)টি জানা দরকার। এটি সর্বনিম্ন সুরক্ষা স্তর, কারণ কী (KEY)টি শেয়ার করতে হবে। প্রেরকের দ্বারা প্রাপকের কাছে একটি এনক্রিপ্ট করা বার্তা প্রেরণের জন্য, প্রেরককে প্রথমে প্রাপককে কী (KEY) টি পাঠাতে হবে।
![Symmetric key encryption uses the same key to encrypt and decrypt a message](../../../../images/send-message-symmetric-key.png)
If the key gets stolen in transit, or the sender or recipient get hacked and the key is found, the encryption can be cracked.
যদি ট্রানজিটে কী (KEY) টি চুরি হয়ে যায়, বা প্রেরক বা প্রাপক হ্যাক হয়ে যায় এবং কী(KEY)টি পাওয়া যায়, তাহলে এনক্রিপশনটি ক্র্যাক হয়ে যাবে।
![Symmetric key encryption is only secure if a hacker doesn't get the key - if so they can intercept and decrypt the message](../../../../images/send-message-symmetric-key-hacker.png)
**Asymmetric** এনক্রিপশনটিতে 2টি KEY ব্যবহৃত হয় - একটি এনক্রিপশন কী এবং একটি ডিক্রিপশন কী, এটি পাবলিক/প্রাইভেট KEY Pair হিসাবে উল্লেখ করা হয়। বার্তাটি এনক্রিপ্ট করার জন্য সর্বজনীন (PUBLIC) কী ব্যবহৃত হয় তবে এটি ডিক্রিপ্ট করতে তা ব্যবহার করা যায় না। ব্যক্তিগত (PRIVATE) KEY এখানে বার্তাটি ডিক্রিপ্ট করার জন্য ব্যবহৃত হয় তবে এটি আবার এনক্রিপ্ট করার জন্য ব্যবহার করা যায় না।
![Asymmetric encryption uses a different key to encrypt and decrypt. The encryption key is sent to any message senders so they can encrypt a message before sending it to the recipient who owns the keys](../../../../images/send-message-asymmetric.png)
প্রাপক তার পাবলিক KEY শেয়ার করে এবং প্রেরক এটি ব্যবহার করে বার্তা এনক্রিপ্ট করে। ম্যাসেজ পাঠানোর পরে,প্রাপক তার প্রাইভেট কী দ্বারা তা ডিক্রিপ্ট করে। এসিমেট্রিক এনক্রিপশন তুলনামূলকভাবে বেশি নিরাপদ কারণ এখানে প্রাপকের প্রাইভেট কী কখনই শেয়ার করা হয়না। পাবলিক কী তে যে কেউই একসেস পেতে পারে, তবে এটি দিয়ে কেবলমাত্র এনক্রিপ্ট করা যাবে।
সিমেট্রিক পদ্ধতিটি এসিমেট্রিক এর তুলনায় দ্রুত কাজ করতে পারে, যদিও তা কম নিরাপদ। কিছু ক্ষেত্রে উভয় পদ্ধতিই ব্যবহৃত হয়। এসিমেট্রিক পদ্ধতিতে এনক্রিপ্ট করা, আবার সিমেট্রিক কী টি শেয়ার করে সকল ডেটা সিমেট্রিক কী দ্বারা এনক্রিপ্ট করা হয়। এতে করে প্রেরক ও প্রাপকের মধ্যে সিমেট্রিক কী শেয়ার করলেও সেটা অনেক বেশি নিরাপদ থাকে আবার দ্রুতও হয়।
## আইওটি ডিভাইস নিরাপত্তা
আইওটি ডিভাইসের নিরাপত্তার জন্য সিমেট্রিক এবং এসিমেট্রিক পদ্ধতি ব্যবহার করা যায়। সিমেট্রিকটি সহজ, তবে কম নিরাপদ।
### সিমেট্রিক KEYs
আইওটি হাবের সাথে আমাদের ডিভাইসের যোগাযোগ এর জন্য আমরা কানেকশন স্ট্রিং ব্যবহার করেছিলাম। উদাহরণস্বরূপ :
```output
HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=
```
এই কানেকশন স্ট্রিং ৩ভাগে বিভক্ত যার প্রতিটি অংশ সেমিকোলন দ্বারা পৃথকীকৃত, যেখানে প্রতি অংশে Key এবং Value রয়েছে।
| কী | ভ্যালু | বর্ণনা |
| --- | ----- | ----------- |
| Hostname | `soil-moisture-sensor.azure-devices.net` | এটি আইওটি হাবের URL |
| DeviceID | `soil-moisture-sensor` | এটি ডিভাইসের ইউনিক আইডি |
| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | ডিভাইস এবং আইওটি হাবের কাছে থাকা সিমেট্রিক KEY |
কানেকশন স্ট্রিং এর শেষাংশ `SharedAccessKey` মূলত একটি symmetric key যা ডিভাইস এবং আইওটি হাব উভয়ের কাছেই রয়েছে। এটি কখনই ডিভাইস থেকে ক্লাউডে বা ক্লাউড থেকে ডিভাইসে প্রেরণ করা হয়না। বরং এটি পরিবাহিত ডেটাকে এনক্রিপ্ট করে।
✅ একটি এক্সপেরিমেন্ট করা যাক। আমরা আইওটি ডিভাইসে সংযুক্ত হবার সময় কানেকশন স্ট্রিং এর `SharedAccessKey` পরিবর্তন করে দিলে কী হবে? চেষ্টা করে দেখো।
ডিভাইসটি প্রথমে আইওটি হাবের সাথে সংযোগ দেওয়ার চেষ্টা করলে, তখন URL সহ shared access signature (SAS) টোকেন , একটি টাইমস্ট্যাম্প যেটির সিগনেচার একসেস একটি নির্দিষ্ট সময় পর (সাধারণত বর্তমান সময় থেকে 1 দিন পর্যন্ত) শেষ হয়ে যায় এবং একটি সিগনেচার - এসব প্রেরণ করে। এই সিগনেচারে কানেকশন স্ট্রিং থেকে ইউআরএল, মেয়াদোত্তীর্ণের সময় এবং এনক্রিপটেড শেয়ারড একসেস কী থাকে।
আইওটি হাব শেয়ারড একসেস কী দিয়ে সিগনেচারটি ডিক্রিপ্ট করে এবং যদি ডিক্রিপ্ট করা মানটি ইউআরএল এবং মেয়াদোত্তীর্ণের সময়ের সাথে মিলে যায় তবে ডিভাইসটি সংযোগ করার অনুমতি পায়। এটিও যাচাই করা হয় যে বর্তমান সময়টি মেয়াদোত্তীর্ণের সময়ের আগে যাতে করে কোন দুষ্ট (malicious) ডিভাইস কোন আসল ডিভাইসের এসএএস টোকেন ক্যাপচার করে তা ব্যবহার করতে না পারে।
প্রেরকটি সঠিক ডিভাইস কিনা তা যাচাই করার জন্য এটি একটি উত্তম উপায়। ডিক্রিপ্ট এবং এনক্রিপ্ট করা কিছু জ্ঞাত ডেটা প্রেরণ করে সার্ভার ডিভাইসটিকে যাচাই করে দেখতে পারে যে এনক্রিপ্ট করা ডেটার ডিক্রিপ্ট ভার্সনটি, প্রেরণ করা ডিক্রিপ্ট করা সংস্করণের সাথে মেলে কিনা। যদি এটি মেলে, তবে প্রেরক এবং প্রাপক উভয়েরই একই Symmetric Encryption Key রয়েছে।
> 💁 যেহেতু এখানে মেয়াদোত্তীর্ণের একটি বিষয় রয়েছে, আমাদের আইওটি ডিভাইসের জন্য তাই বর্তমান সময়টি জানা জরুরী। সাধারণত [NTP](https://wikipedia.org/wiki/Network_Time_Protocol) সার্ভার থেকেই এটি সময় সংক্রান্ত ডেটা নেয়। সময় সঠিক না হলে, কানেকশন হবেনা।
সংযোগের পরে, ডিভাইস থেকে আইওটি হাবের কাছে বা আইওটি হাব থেকে ডিভাইসে প্রেরিত সমস্ত ডেটা shared access key দিয়ে এনক্রিপ্ট করা হবে।
✅ একাধিক ডিভাইস একই সংযোগের স্ট্রিং শেয়ার করলে কী ঘটবে বলে মনে হয়?
> 💁 কোডের মধ্যেই এই KEY সংরক্ষণ করা নিরাপত্তার প্রেক্ষিতে বেশ বাজে একটি চর্চা। কোন হ্যাকার যদি আমাদের সোর্স কোড পায় তবে তারা আমাদের KEY পেয়ে যেতে পারে। এছাড়াও কোড রিলিজ করার সময় এটি আরও কঠিন হয় কারণ আমাদের প্রতিটি ডিভাইসের জন্য একটি আপডেট কী দিয়ে পুনরায় ্তা পরিবর্তন করতে হবে। একটি হার্ডওয়্যার সুরক্ষা মডিউল থেকে এই KEY লোড করা ভাল উপায়। এই মডিউল হলো আইওটি ডিভাইসের একটি চিপ যা এনক্রিপ্ট করা মানগুলিকে স্টোর করে যা আমাদের কোড দ্বারা একসেস করা যাবে।
>
> আইওটি শেখার সময় KEY গুলো কোডে রাখলে কাজ করা সহজ হয়, যেমন আমরা পূর্ববর্তী পাঠে করেছিলাম। তবে আমাদের অবশ্যই নিশ্চিত করতে হবে যে এই KEY জনসাধারণের জন্য সোর্স কোডে উন্মুক্ত করা হয়নি।
Devices have 2 keys, and 2 corresponding connection strings. This allows we to rotate the keys - that is switch from one key to another if the first gets compromised, and re-generate the first key.
ডিভাইসগুলিতে 2 টি কী এবং 2 টি কানেকশন স্ট্রিং রয়েছে। এটি আমাদের কীগুলির মধ্যে পরিবর্তনের অনুমতি দেয় । যদি প্রথম কী টি সমস্যার মুখে পড়ে, তবে ২য়টি ব্যবহার করা এবং প্রথম কী পুনরায় তৈরী করে।
### X.509 সার্টিফিকেট
যখন আমরা কোনও পাবলিক/প্রাইভেট কী পেয়ার এর সাথে এসিমেট্রিক এনক্রিপশন ব্যবহার করি, আমাদেরকে কেউ ডেটা প্রেরণ করতে চাইলে তাকে আমাদের পাবলিক কী সরবরাহ করতে হবে। সমস্যাটি হল কীভাবে আমাদের প্রাপক নিশ্চিত করতে পারেন যে এটি আসলেই আমাদের পাবলিক কী এবং অন্য কেউ আমাদের রূপধারণ করে সংযোগের চেষ্টা করছে না? KEY সরবরাহ করার পরিবর্তে, আমরা বরং আমাদের পাবলিক কী এমন একটি সার্টিফিকেটের ভিতরে সরবরাহ করতে পারি যা একটি বিশ্বস্ত তৃতীয় পক্ষ দ্বারা যাচাই করা হয়েছে এবং এটিকে বলা হয় X.509 সার্টিফিকেট।
X.509 সার্টিফিকেট হলো ডিজিটাল ডকুমেন্ট যেগুলো পাবলিক/প্রাইভেট কী পেয়ার এর পাবলিক অংশটি ধারণ করে। এগুলি সাধারণত বেশ কয়েকটি বিশ্বস্ত সংস্থার দ্বারা ইস্যু করা হয় যেগুলোকে বলা হয় [Certification authorities](https://wikipedia.org/wiki/Certificate_authority) (CAs) এবং এসকল সংস্থা এই ডকুমেন্টগুলো সাইন করে দেয় যা বোঝায় যে key গুলো সঠিক এবং ঠিক ব্যবহারকারীর কাছ থেকেই আসছে। যেভাবে আমরা পাসপোর্ট বা ড্রাইভিং লাইসেন্সে বিশ্বাস করি (যেহেতু নির্দিষ্ট কর্তৃপক্ষ দ্বারা তা স্বীকৃত, সেভাবেই এখানেও আমরা সার্টিফিকেটগুলো বিশ্বাস করি। এগুলোর জন্য অর্থ ব্যয় হয়, তাই আমরা 'স্ব-স্বাক্ষর'ও করতে পারি, এটি পরীক্ষার উদ্দেশ্যে আমাদের স্বাক্ষরিত একটি সার্টিফিকেট তৈরি করে।
> 💁 আমাদের কোনও প্রোডাকশন রিলিজের জন্য স্ব-স্বাক্ষরিত সার্টিফিকেট ব্যবহার করা উচিত নয়।
These certificates have a number of fields in them, including who the public key is from, the details of the CA who issued it, how long it is valid for, and the public key itself. Before using a certificate, it is good practice to verify it by checking that is was signed by the original CA.
এই সার্টিফিকেট গুলির মধ্যে বেশ কয়েকটি ক্ষেত্র রয়েছে যেমন - কোথায় পাবলিক কী রয়েছে , যে CA এটির স্বীকৃতি দিয়েছে তার তথ্যাবলি, কতক্ষণের জন্য এটি বৈধ হবে তার বিবরণ এবং সেই পাবলিক কী। কোন সার্টিফিকেট ব্যবহার করার আগে, এটি যে সিএ স্বাক্ষর করেছে তা যাচাই করা ভাল একটি চর্চা।
✅ সার্টিফিকেট গুলির সকল ক্ষেত্র এর বর্ণনা [Microsoft Understanding X.509 Public Key Certificates tutorial](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields) এ রয়েছে।
X.509 সার্টিফিকেট ব্যবহার করার সময়, প্রেরক এবং প্রাপক উভয়েরই নিজস্ব public and private keys এবং সেইসাথে উভয়েরই X.509 শংসাপত্র থাকবে যাতে পাবলিক কী রয়েছে। এরপরে তারা X.509 সার্টিফিকেট কোনভাবে বিনিময় করেন, একে অপরকে তারা পাঠানো ডেটা এনক্রিপ্ট করার জন্য পাবলিক কী এবং তাদের প্রাপ্ত ডেটা ডিক্রিপ্ট করার জন্য তাদের নিজস্ব প্রাইভেট কী ব্যবহার করে।
![Instead of sharing a public key, we can share a certificate. The user of the certificate can verify that it comes from we by checking with the certificate authority who signed it.](../../../../images/send-message-certificate.png)
X.509 শংসাপত্রগুলি ব্যবহার করার একটি বড় সুবিধা হল এগুলি ডিভাইসের মধ্যে শেয়ার করা যায়। আমরা একটি শংসাপত্র তৈরি করতে পারি, এটি আইওটি হাবে আপলোড করতে পারি এবং আমাদের সমস্ত ডিভাইসের জন্য এটি ব্যবহার করতে পারি। আইওটি হাব থেকে প্রাপ্ত বার্তাগুলি ডিক্রিপ্ট করার জন্য প্রতিটি ডিভাইসটির তখন কেবল প্রাইভেট কী জানতে হবে।
আইওটি হাবের কাছে পাঠানো বার্তাগুলি এনক্রিপ্ট করার জন্য আমাদের ডিভাইস দ্বারা ব্যবহৃত শংসাপত্রটি মাইক্রোসফ্ট প্রকাশ করে। এটি একই শংসাপত্র যা প্রচুর অ্যাজুর সার্ভিস ব্যবহার করে এবং কখনও কখনও SDK-গুলিতে অন্তর্নির্মিত থাকে।
> 💁 মনে রাখতে হবে, একটি public key আসলেই 'public'. অ্যাজুরে পাবলিক কী কেবল এখানে প্রেরিত ডেটা এনক্রিপ্ট করতে ব্যবহার করা যেতে পারে, এটি ডিক্রিপ্ট করার জন্য নয়, সুতরাং এটি সোর্স কোড সহ সর্বত্র শেয়ার করা যায়। উদাহরণস্বরূপ, আমরা [Azure IoT C SDK source code](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c) এও তা দেখতে পাবো।
✅ X.509 certificates এ কিছু নির্দিষ্ট শব্দ বা ভাষা রয়েছে। অপিরিচিত কোন শোব্দের মুখোমুখি হলে আমরা [The laymans guide to X.509 certificate jargon](https://techcommunity.microsoft.com/t5/internet-of-things/the-layman-s-guide-to-x-509-certificate-jargon/ba-p/2203540?WT.mc_id=academic-17441-jabenn) পড়লে তা পাবো।
## X.509 certificate তৈরী ও ব্যবহার
একটি X.509 শংসাপত্র তৈরী করার পদক্ষেপগুলি হল:
1. একটি public/private key pair তৈরী করা। এটির জন্য বহুল ব্যবহৃত একটি এলগরিদম হলো [RivestShamirAdleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA) পদ্ধতি।
1. CA বা self-signing এর মাধ্যমে পাবলিক কী এবং প্রয়োজনীয় তথ্য সাবমিট করা।
আইওটি হাবটিতে একটি নতুন ডিভাইস আইডেনটিটি তৈরি করতে এবং স্বয়ংক্রিয়ভাবে পাবলিক / প্রাইভেট কী পেয়ার তৈরী করতে এবং স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করার জন্য আজুর সিএলআইয়ের কমান্ড রয়েছে।
> 💁 কাজের ধাপগুলো বিস্তারিত দেখতে হলে আমরা বরং CLI এর পরিবর্তে [Using OpenSSL to create self-signed certificates tutorial in the Microsoft IoT Hub documentation](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn) দেখতে পারি।
### কাজ - X.509 certificate দ্বারা ডিভাইস আইডেনটিটি তৈরী
1. নতুন ডিভাইস আইডেনটিটি তৈরীর জন্য নিম্নের কমান্ড রান দিই, স্বয়ংক্রিয়ভাবে কী এবং শংসাপত্রগুলি তৈরি করা হচ্ছে:
```sh
az iot hub device-identity create --device-id soil-moisture-sensor-x509 \
--am x509_thumbprint \
--output-dir . \
--hub-name <hub_name>
```
এখানে `<hub_name>` এর জায়গায় আমাদের IoT Hub এ ব্যবহৃত নামটি দিতে হবে।
এটি `soil-moisture-sensor-x509` এর জন্য একটি আইডি সহ ডিভাইস তৈরী করে দিবে যা আগের লেসনে তৈরী করা ডিভাইস থেকে ভিন্ন । এছাড়াও ২টি ফাইল তৈরী হবে:
* `soil-moisture-sensor-x509-key.pem` - এই ফাইলে ডিভাইসের জন্য প্রাইভেট কী থাকে।
* `soil-moisture-sensor-x509-cert.pem` - এটিতে X.509 সার্টিফিকেট থাকে।
এই ফাইল গুলো সুরক্ষিত রাখতে হবে! পাবলিকে একসেস পাওয়ার মত করে রাখা যাবেনা।
### কাজ - ডিভাইস কোডে X.509 certificate ব্যবহার
নিম্নের প্রাসঙ্গিক কোন একটি গাইড অনুসরণ করতে হবে ঃ
* [Arduino - Wio Terminal](wio-terminal-x509.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md)
---
## 🚀 চ্যালেঞ্জ
Azure সার্ভিস তৈরী, পরিচালনা এবং ডিলিট করার জন্য অনেকগুলো উপায় রয়েছে। এর মধ্যে একটি হলো [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - একটি ওয়য়েব-ভিত্তিক ইন্টারফেস এক্সেখান থেকে আমরা সহজেই Azure services ব্যবহার করতে পারি।
আমরা [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) এ গিয়ে পোর্টালটি দেখতে পারি। এখানে আইওটি হাব তৈরী করে, পরে ডিলিট করে দিই।
**Hint** - পোর্টালের মাধ্যমে পরিষেবাগুলি তৈরি করার সময়, আমাদের শুরুতেই কোনও রিসোর্স গ্রুপ তৈরি করার দরকার নেই, যখন পরিষেবাটি তৈরি করা হয় তখন একটি রিসোর্স গ্রুপ তৈরি করা যেতে পারে। সবশেষে নিশ্চিত হয়ে নিতে হবে যে আমরা কাজ শেষ হয়ে গেলে এটি মুছে ফেলেছি!
Azure Portal নিয়ে ডকুমেন্ট, টিউটোরিয়াল, গাইড [Azure portal documentation](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn) এ পাওয়া যাবে।
## লেকচার-পরবর্তী কুইজ
[লেকচার পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20)
## রিভিউ এবং স্ব-অধ্যয়ন
* সংকেতলিপি এর ইতিহাস [History of Cryptography - Wikipedia](https://wikipedia.org/wiki/History_of_সংকেতলিপি (Cryptography))থেকে জেনে নিই।
* X.509 সার্টিফিকেট সম্পর্কে [X.509 page on Wikipedia](https://wikipedia.org/wiki/X.509) থেকে বিশদভাবে জ্ঞান অর্জন করি।
## এসাইনমেন্ট
[নতুন আইওটি ডিভাইস তৈরি](assignment.bn.md)

@ -1,15 +0,0 @@
# নতুন আইওটি ডিভাইস তৈরি
## নির্দেশাবলী
আমরা ডিজিটাল কৃষিকাজ এবং উদ্ভিদ বৃদ্ধির পূর্বাভাস দেওয়ার ডেটা সংগ্রহ করার জন্য আইওটি ডিভাইসগুলি কীভাবে ব্যবহার করব এবং মাটির আর্দ্রতা পাঠের উপর ভিত্তি করে সেচকার্য স্বয়ংক্রিয়ভাবে কীভাবে করব সে সম্পর্কে গত 6 টি পাঠে শিখেছি।
আমাদের পছন্দমতো সেন্সর এবং অ্যাকচুয়েটর ব্যবহার করে নতুন আইওটি ডিভাইস তৈরি করতে হবে। একটি আইওটি হাবে টেলিমেট্রি প্রেরণ করি এবং সার্ভারলেস কোডের মাধ্যমে কোন অ্যাকচুয়েটরকে নিয়ন্ত্রণ করতে এটি ব্যবহার করি। আমরা তো ইতিমধ্যেই বেশ কিছু সেন্সর এবং অ্যাকচুয়েটর ব্যবহার শিখেছি - সেগুলো বা একদম নতুন কিছু নিয়ে কাজ করতে পারি।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) |
| --------- | ------------------ | -------------- | -------------------- |
| সেন্সর এবং অ্যাকচুয়েটর ব্যবহার করতে একটি আইওটি ডিভাইস কোড করা | সেন্সর এবং অ্যাকচুয়েটর এর সাথে কার্যকর আইওটি ডিভাইস তৈরী করেছে |হয় সেন্সর বা অ্যাকচুয়েটর এর সাথে কার্যকর আইওটি ডিভাইস তৈরী করেছে| সেন্সর এবং অ্যাকচুয়েটর এর সাথে কার্যকর আইওটি ডিভাইস তৈরী করতে ব্যার্থ |
| আইওটি ডিভাইসের সাথে আইওটি হাবের কানেকশন | একটি আইওটি হাব ডেপ্লয় করতে এবং এতে টেলিমেট্রি পাঠাতে সক্ষম হয়েছিল এবং এর থেকে নির্দেশ গ্রহণ করতে পেরেছিল | একটি আইওটি হাব ডেপ্লয় করতে এবং হয় এতে টেলিমেট্রি পাঠাতে সক্ষম হয়েছিল অথবা এর থেকে নির্দেশ গ্রহণ করতে পেরেছিল | একটি আইওটি হাব ডেপ্লয় করতে এবং সংযোগ তৈরী করতে ব্যার্থ |
| সার্ভারলেস কোড দ্বারা অ্যাকচুয়েটর নিয়ন্ত্রণ | টেলিমেট্রি ইভেন্টগুলির দ্বারা ট্রিগার হওয়া ডিভাইস নিয়ন্ত্রণ করতে একটি অ্যাজুর ফাংশন ডেপ্লয় করতে সক্ষম | টেলিমেট্রি ইভেন্টগুলি দ্বারা ট্রিগার করা একটি অ্যাজুর ফাংশন তৈরী করতে সক্ষম হয়েছিল কিন্তু অ্যাকচুয়েটর ব্যবহার করতে পারেনি | অ্যাজুর ফাংশন ডেপ্লয় করতে ব্যার্থ |

@ -1,206 +0,0 @@
# লোকেশন ট্র্যাকিং
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-11.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21)
## সূচনা
কৃষকের কাছ থেকে গ্রাহকের কাছে খাবার পৌঁছানোর মূল প্রক্রিয়াটি হল ট্রাক, জাহাজ, বিমান বা অন্যান্য বাণিজ্যিক পরিবহণ যানবাহনে পণ্য বাক্স লোড করা এবং খাদ্য সরবরাহ করা - এটি সরাসরি গ্রাহকের কাছে বা কেন্দ্রীয় হাব বা গুদামে সরবরাহ করা যেতে পারে। খামার থেকে গ্রাহক পর্যন্ত পুরো end-to-end process বা প্রক্রিয়াটি "সরবরাহ চেইন" (ব্যবসায়িক ইংরেজি ভাষায় - *supply chain* ) নামে পরিচিত একটি প্রক্রিয়ার অংশ। অ্যারিজোনা স্টেট ইউনিভার্সিটির W. P. Carey School of Business এর নীচের ভিডিওটিতে সরবরাহ চেইনের ধারণা এবং কীভাবে এটি আরও বিশদভাবে পরিচালনা করা হয় সে সম্পর্কে আলোচনা করা হয়েছে।
[![What is Supply Chain Management? A video from Arizona State University's W. P. Carey School of Business](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw)
> 🎥 ভিডিও দেখার জন্য উপরের ছবিতে ক্লিক করতে হবে।
আইওটি ডিভাইস যুক্ত করা আমাদের সাপ্লাই চেইনে প্রচন্ডরকমের উন্নতি করতে পারে, আমাদেরকে আইটেমগুলি কোথায় রয়েছে তা পরিচালনা করার সুযোগ দেয়, পরিবহন এবং পণ্যগুলি হ্যান্ডলিংয়ের আরও ভাল পরিকল্পনা করা এবং সমস্যার দ্রুত প্রতিক্রিয়া জানানোর মাধ্যমে কার্যক্রমে উন্নতি ঘটায়।
ট্রাকের মতো বিশাল যানবাহনের বহর পরিচালনা করার সময়, প্রতিটি যানবাহন একটি নির্দিষ্ট সময়ে কোথায় তা জানা থাকা দরকার। যানবাহনগুলিতে জিপিএস সেন্সর লাগানো যেতে পারে যা - তাদের অবস্থান আইওটি সিস্টেমে প্রেরণ করে, মালিকদেরকে গাড়ির অবস্থান জানায়, তারা যে পথটি নিয়েছে তা দেখতে এবং তারা কখন তাদের গন্তব্যে পৌঁছাবে তা জানাতে পারে। বেশিরভাগ যানবাহন ওয়াইফাই কভারেজের বাইরে কাজ করে, তাই তারা এই জাতীয় ডেটা প্রেরণে সেলুলার নেটওয়ার্কগুলি ব্যবহার করে। কখনও কখনও জিপিএস সেন্সরগুলো আরও জটিল আইওটি ডিভাইসে যেমন ইলেক্ট্রনিক লগ বুকে তৈরি করা হয়। চালকরা কাজের সময় স্থানীয় আইন মেনে চলে তা নিশ্চিত করার জন্য এই ডিভাইসগুলি ট্রাক কতক্ষণ ট্রানজিটে ছিল সেটিও পর্যন্ত ট্র্যাক করে।
এই পাঠে আমরা গ্লোবাল পজিশনিং সিস্টেম (জিপিএস) সেন্সর ব্যবহার করে কীভাবে কোন যানবাহনের অবস্থান ট্র্যাক করা যায় তা শিখব।
এই লেসনে আমরা দেখতে যাচ্ছি:
* [সংযুক্ত যানবাহনসমূহ](#সংযুক্ত-যানবাহনসমূহ)
* [ভূ-স্থানাংক](#ভূ-স্থানাংক)
* [Global Positioning Systems (GPS)](#global-positioning-systems-gps)
* [জিপিএস সেন্সর ডেটা গ্রহণ](#জিপিএস-সেন্সর-ডেটা-গ্রহণ)
* [NMEA GPS data](#nmea-gps-data)
* [GPS sensor data ডিকোড করা](#GPS-sensor-data-ডিকোড-করা)
## সংযুক্ত যানবাহনসমূহ
পণ্য পরিবহনের ক্ষেত্রে *সংযুক্ত যানবাহনসমূহ* এর ক্ষেত্রে আইওটি আমূল পরিবর্তন আনছে। কেন্দ্রীয় আইটি সিস্টেম এর সাথে এই যানগুলির অবস্থান সম্পর্কিত তথ্য এবং অন্যান্য সেন্সর ডেটা সংযুক্ত রয়েছে। এখানে রয়েছে বিস্তৃত সুবিধা, যেমন:
* লোকেশন ট্র্যাকিং - যানবাহন যেকোন সময় কোথায় রয়েছে তা আমরা চিহ্নিত করতে পারি, আমরা এখানে -
* যখন কোন গাড়ি আনলোডিং জন্য আসতে থাকে, কর্মকর্তা-কর্মচারীরা আগেই তা জানতে পারেন এবং যথাযথ প্রস্তুতি নিতে পারেন।
* চুরি হওয়া গাড়ি সনাক্ত করা যায়।
* ট্রাফিক সমস্যার সাথে অবস্থান এবং রুটের ডেটা একত্রিত করে বিশ্লেষণ করা যায় যাতে মাঝপথে রাস্তা পরিবর্তন করার দরকার হলে দ্রুত নির্দেশনা দেয়া যায়।
* কর সংক্রান্ত নিয়ম সহজেই মানা যায়। কিছু দেশ সরকারী রাস্তায় চালিত মাইলেজের পরিমাণ উপর নির্ভর করে যানবাহন এর উপর করারোপ করে (যেমন - [New Zealand এর RUC](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), তাই কোন যানবাহন কখন পাবলিক রাস্তায় আর কখন ব্যক্তিগত রাস্তায় থাকছে তা জেনে রাখলে, বকেয়া করের গণনা সহজ হয়।
* গাড়ির সমস্যা হলে সেই পরিস্থিতিতে রক্ষণাবেক্ষণ কর্মীদের কোথায় পাঠাতে হবে তা দ্রুত জানা যায়।
* ড্রাইভার টেলিমেট্রি - বিভিন্ন বিষয়, যেমনঃ চালকরা গতির সীমা মেনে চলছে, উপযুক্ত গতিতে চালাচ্ছে, তাড়াতাড়ি এবং দক্ষতার সাথে ব্রেক করেছেন এবং নিরাপদে গাড়ি চালাচ্ছেন তা নিশ্চিত করা যায়। সংযুক্ত যানবাহনগুলিতে ঘটনা রেকর্ড করার জন্য ক্যামেরা থাকতে পারে। এটিকে ইন্স্যুরেন্সের সাথে যুক্ত করা যেতে পারে, ভাল ড্রাইভারের জন্য অতিরিক্ত সুবিধা দেওয়া যায়।
* ড্রাইভারদের যথাযথ কর্মঘন্টা নিশ্চিতকরণ - ড্রাইভারদের ইঞ্জিন চালু এবং বন্ধ করার সময়ের উপর ভিত্তি করে কেবল তাদের জন্য আইনীভাবে অনুমোদিত সময় পর্যন্ত গাড়ি চালানো নিশ্চিত করতে হবে কেননা অনেক দেশেই এই শ্রমিক আইন যথাযথভাবে মানতে হয়।
এই সুবিধাগুলি একত্রিত করা যায় - উদাহরণস্বরূপ, ড্রাইভাররা যদি তাদের অনুমতিপ্রাপ্ত ড্রাইভিং সময়ের মধ্যে তাদের গন্তব্যে পৌঁছাতে না পারে তবে রুট পরিবর্তন করে দেয়া যাবে। এগুলি অন্যান্য যানবাহন-ভিত্তিক টেলিমেট্রির সাথেও মিলিত হতে পারে, যেমন তাপমাত্রা-নিয়ন্ত্রিত ট্রাকগুলির তাপমাত্রার ডেটা - যদি তাদের বর্তমান রুটের তাপমাত্রায় পণ্য রাখা না যায় তবে যানবাহনগুলিকে অন্য রুটে পাঠাতে হবে।
> 🎓 লজিস্টিকস (LOGISTICS) হল এক জায়গা থেকে অন্য জায়গায় পণ্য পরিবহণের প্রক্রিয়া, যেমন ফার্ম বা সুপারমার্কেটে এক বা একাধিক গুদামের মাধ্যমে পণ্য পরিবহন করা। একজন কৃষক থেকে একটি ট্রাকের উপর ভর করে কোন ফসল, যেমনঃ টমেটো একটি কেন্দ্রীয় গুদামে সরবরাহ করা হয় এবং সুপার মার্কেটে সরবরাহ করার সময় বিভিন্ন ধরণের পণ্যের মিশ্রণ থাকতে পারে দ্বিতীয় ট্রাকে ।
যানবাহন ট্র্যাকিংয়ের মূল উপাদান হল জিপিএস - সেন্সর যা পৃথিবীর যে কোন জায়গায় অবস্থান নির্ধারণ করতে পারে। এই পাঠে আমরা কীভাবে একটি জিপিএস সেন্সর ব্যবহার করব তা শিখতে শুরু করব।
## ভূ-স্থানাংক
কম্পিউটারের স্ক্রিনে পিক্সেল ধরে ধরে আঁকতে যেভাবে তার স্থানাঙ্কগুলি ব্যবহার করা যায় তার অনুরূপ Geospatial coordinates বা ভূ-স্থানাংক পৃথিবীর পৃষ্ঠের পয়েন্টগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়। একক পয়েন্টের জন্য, আমাদের ২টি অক্ষ রয়েছে। উদাহরণস্বরূপ, মার্কিন যুক্তরাষ্ট্রের ওয়াশিংটনের রেডমন্ডের মাইক্রোসফ্ট ক্যাম্পাসটি 47.6423109, -122.1390293 এ অবস্থিত।
### অক্ষাংশ ও দ্রাঘিমাংশ
পৃথিবী একটি গোলক , একটি ত্রি-মাত্রিক বৃত্ত। এর কারণে, পয়েন্টগুলিকে 360 ডিগ্রিতে ভাগ করে গণনা করা হয় যা বৃত্তের জ্যামিতির সমান । অক্ষাংশ উত্তর থেকে দক্ষিণে ডিগ্রি সংখ্যার পরিমাপ করে, দ্রাঘিমাংশ পূর্ব থেকে পশ্চিমে ডিগ্রির সংখ্যা পরিমাপ করে।
> 💁 বৃত্ত 360 ডিগ্রিতে বিভক্ত হওয়ার মূল কারণটি কেউ আসলে জানে না। এখানে [degree (angle) - Wikipedia](https://wikipedia.org/wiki/Degree_(angle)) কিছু সম্ভাব্য কারণ দেয়া হয়েছে।
![Lines of latitude from 90° at the North Pole, 45° halfway between the North Pole and the equator, 0° at the equator, -45° halfway between the equator and the South Pole, and -90° at the South Pole](../../../../images/latitude-lines.png)
অক্ষাংশ এমন রেখা ব্যবহার করে পরিমাপ করা হয় যা পৃথিবীটিকে প্রদক্ষিণ করে এবং নিরক্ষরেখার (equator) সাথে সমান্তরালভাবে চলে, উত্তর এবং দক্ষিণ গোলার্ধ প্রতিটিকে 90° তে বিভক্ত করে। নিরক্ষীয় (equator) স্থান হলো 0°, উত্তর মেরু 90°, এটি 90° উত্তর হিসাবেও পরিচিত এবং দক্ষিণ মেরুটি -90° বা 90° দক্ষিণে রয়েছে।
দ্রাঘিমাংশ পূর্ব এবং পশ্চিম পরিমাপকৃত ডিগ্রির সংখ্যা হিসাবে পরিমাপ করা হয়। দ্রাঘিমাংশের 0° কে বলা হয় *প্রাইম মেরিডিয়ান* এবং এটি 1884 সালে নির্ধারিত হয় যা উত্তর থেকে দক্ষিণ মেরু পর্যন্ত একটি রেখা যেটি কিনা [British Royal Observatory in Greenwich, England](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich) এর মধ্যে দিয়ে যায়।
![Lines of longitude that go from -180° to the west of the Prime Meridian, to 0° on the Prime Meridian, to 180° east of the Prime Meridian](../../../../images/longitude-meridians.png)
> 🎓 মেরিডিয়ান একটি কাল্পনিক সরল রেখা যা উত্তর মেরু থেকে দক্ষিণ মেরুতে গিয়ে একটি অর্ধবৃত্ত গঠন করে ।
একটি বিন্দুর দ্রাঘিমাংশ পরিমাপ করার জন্য, আমরা প্রাইম মেরিডিয়ান থেকে অন্য মেরিডিয়ান পর্যন্ত মধ্যবর্তী নিরক্ষীয় অঞ্চলের ডিগ্রির সংখ্যা পরিমাপ করি। দ্রাঘিমাংশ -180° বা 180° পশ্চিম থেকে প্রাইম মেরিডিয়ানে 0° হয়ে 180° বা 180° পূর্ব দিকে যায়। 180° এবং -180° একই বিন্দু যা অ্যান্টিমেরিডিয়ান বা 180-তম মেরিডিয়ান হিসেবে পরিচিত। এটি প্রাইম মেরিডিয়ান থেকে পৃথিবীর বিপরীত দিকে একটি মেরিডিয়ান।
> 💁 অ্যান্টিমেরিডিয়ান এবং আন্তর্জাতিক তারিখ রেখার মধ্যে বিভ্রান্ত হওয়ার দরকার নেই। যদিও দুটিই প্রায় একই অবস্থানে রয়েছে, তবে তারিখ রেখা কোনও সরল রেখা নয় এবং ভূ-রাজনৈতিক সীমানার আশেপাশে এটি পরিবর্তিত হয়।
✅ কিছু গবেষণা করা যাক: আমাদের বর্তমান অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ সন্ধান করার চেষ্টা করি।
### Degrees, minutes and seconds বনাম decimal degrees
ঐতিহাসিকভাবে, অক্ষাংশ এবং দ্রাঘিমাংশের ডিগ্রিগুলির পরিমাপটি sexagesimal সংখ্যায়ন বা বেস -60 ব্যবহার করে সম্পন্ন করা হত। এটি দ্বারা প্রাচীন ব্যাবিলিয়ানরা সময় এবং দূরত্বের প্রথম পরিমাপ এবং রেকর্ডিং করেছিলেন এবং তাদের দ্বারা ব্যবহৃত একটি সংখ্যায়ন ব্যবস্থা এটি । আমরা প্রতিদিন উপলব্ধিও করিনা ,অথচ sexagesimal পদ্ধতি ব্যবহার করি - ঘন্টাকে 60 মিনিট এবং মিনিটকে 60 সেকেন্ডে ভাগ করে।
দ্রাঘিমাংশ এবং অক্ষাংশকে ডিগ্রি, মিনিট এবং সেকেন্ডে পরিমাপ করা হয়, এক মিনিটের ডিগ্রির 1/60 এবং 1 সেকেন্ডটি 1/60 মিনিট হয়।
উদাহরণস্বরূপ, নিরক্ষীয় (equator) অঞ্চলে:
* 1° অক্ষাংশ হলো **111.3 কিলোমিটার**
* 1 মিনিট অক্ষাংশ হলো 111.3/60 = **1.855 কিলোমিটার**
* 1 সেকেন্ড অক্ষাংশ হলো 1.855/60 = **0.031 কিলোমিটার**
The symbol for a minute is a single quote, for a second it is a double quote. 2 degrees, 17 minutes, and 43 seconds for example, would be written as 2°17'43". Parts of seconds are given as decimals, for example half a second is 0°0'0.5".
এক মিনিটের প্রতীক হলো একটি একক উদ্ধৃতি চিহ্ন (') এবং এক সেকেন্ডের জন্য এটি দ্বি-উদ্ধৃতি চিহ্ন (")। 2 ডিগ্রি, 17 মিনিট এবং 43 সেকেন্ড কে 2°17'43"হিসাবে লেখা হবে। সেকেন্ডের অংশগুলি দশমিক হিসাবে দেওয়া হয়, উদাহরণস্বরূপ অর্ধেক সেকেন্ডকে 0° 0'0.5" লেখা হয়।
কম্পিউটার বেস -60 স্নগখ্যাপদ্ধতিতে কাজ করে না, তাই বেশিরভাগ কম্পিউটার সিস্টেমে জিপিএস ডেটা ব্যবহার করার সময় এই সমন্বয়গুলিকে দশমিক ডিগ্রি হিসাবে দেওয়া হয়। উদাহরণস্বরূপ, 2° 17'43" হল 2.295277 - ডিগ্রি চিহ্নটি সাধারণত বাদ দেওয়া হয়।
একটি পয়েন্টের জন্য স্থানাঙ্কগুলি সর্বদা `অক্ষাংশ,দ্রাঘিমাংশ (latitude,longitude) ` হিসাবে দেওয়া হয়, সুতরাং মাইক্রোসফ্ট ক্যাম্পাসের আগের উদাহরণটিতে তার অবস্থান 47.6423109, -122.117198 এ রয়েছে:
* অক্ষাংশ 47.6423109 (47.6423109 নিরক্ষীয় অঞ্চল থেকে কত ডিগ্রি উত্তরে রয়েছে )
* দ্রাঘিমাংশ -122.1390293 (122.1390293 প্রাইম মেরিডিয়ান থেকে কত ডিগ্রি পশ্চিমে রয়েছে).
![The Microsoft Campus at 47.6423109,-122.117198](../../../../images/microsoft-gps-location-world.png)
## Global Positioning Systems (GPS)
জিপিএস সিস্টেমগুলি একাধিক উপগ্রহ ব্যবহার করে আমাদের অবস্থান সনাক্ত করতে পৃথিবী প্রদক্ষিণ করে । আমরা সম্ভবত এটি না জেনেও জিপিএস সিস্টেমগুলি ব্যবহার করেছি - অ্যাপল মানচিত্র বা গুগল ম্যাপের মতো আমাদের ফোনে একটি ম্যাপিং অ্যাপে আমাদের অবস্থান সন্ধান করতে বা Uber বা Lyft এর মতো আমাদের রাইডটি কোথায় রয়েছে তা দেখতে অথবা আমাদের গাড়িতে স্যাটেলাইট নেভিগেশন (স্যাট-ন্যাভ) ব্যবহার করার ক্ষেত্রে ।
> 🎓 'স্যাটেলাইট নেভিগেশন (স্যাট-ন্যাভ)' এ ব্যবহৃত উপগ্রহগুলো জিপিএস স্যাটেলাইট !
জিপিএস সিস্টেমগুলি বেশ কয়েকটি উপগ্রহ যা প্রতিটি উপগ্রহের বর্তমান অবস্থান এবং একটি সঠিক টাইমস্ট্যাম্প সহ একটি সংকেত প্রেরণ করে কাজ করে। এই সংকেতগুলি রেডিও তরঙ্গ এর মাধ্যমে প্রেরণ করা হয় এবং জিপিএস সেন্সরে একটি অ্যান্টেনার দ্বারা সনাক্ত করা হয়। একটি জিপিএস সেন্সর এই সংকেতগুলি সনাক্ত করবে এবং বর্তমান সময়ের পরিমাপটি ব্যবহার করে উপগ্রহ থেকে সেন্সরটি পৌঁছাতে কত সময় লেগেছে তা নির্ণয় করে। রেডিও তরঙ্গগুলির গতি অবিচ্ছিন্ন থাকার কারণে, জিপিএস সেন্সর স্যাটেলাইট থেকে সেন্সরটি কতটা দূরে রয়েছে তা নির্ধারণের জন্য প্রেরণ করা টাইমস্ট্যাম্পটি ব্যবহার করতে পারে। প্রেরিত পজিশনের সাথে কমপক্ষে 3 টি উপগ্রহের উপাত্তগুলিকে একত্রিত করে, জিপিএস সেন্সরটি পৃথিবীতে তার অবস্থান নির্ধারণ করতে সক্ষম হয়।
> 💁 জিপিএস সেন্সরগুলির রেডিও তরঙ্গগুলি সনাক্ত করতে অ্যান্টেনার প্রয়োজন। অন-বোর্ড জিপিএস সহ ট্রাক এবং গাড়িতে তৈরি অ্যান্টেনা সাধারণত উইন্ডশীল্ড বা ছাদে অবস্থিত - যা একটি ভাল সংকেত পাওয়ার জন্য যথেষ্ট । যদি আমরা একটি পৃথক জিপিএস সিস্টেম ব্যবহার করি, যেমন স্মার্টফোন বা আইওটি ডিভাইস, তবে আমাদের এটি নিশ্চিত করতে হবে যে জিপিএস সিস্টেম বা ফোনে থাকা অ্যান্টেনার সাথে আকাশের উন্মুক্ত যোগাযোগ থাকতে পারবে।
![By knowing the distance from the sensor to multiple satellites, the location be calculated](../../../../images/gps-satellites.png)
জিপিএস উপগ্রহগুলি সেন্সরের উপরে নির্দিষ্ট স্থানে অবস্থিত নয়, বরং এরা পৃথিবী প্রদক্ষিণ করছে। সুতরাং অবস্থানের ডেটাতে সমুদ্র স্তর থেকে উচ্চতার পাশাপাশি অক্ষাংশ এবং দ্রাঘিমাংশ অন্তর্ভুক্ত রয়েছে।
জিপিএসে মার্কিন সেনা দ্বারা প্রয়োগ করা নির্ভুলতার সীমাবদ্ধতা থাকত, যেখানে নির্ভুলতা প্রায় 5 মিটারের মধ্যে সীমাবদ্ধ থাকে। এই সীমাবদ্ধতাটি 2000 ্সালে উঠিয়ে নেয়া হয় এবং প্রায় ৩০ সেন্টিমিটার পর্যন্ত এক্যুরেট মান পাওয়া যেত। তবে সিগন্যালের সাথে বিভিন্ন ইন্টারফেরেন্স বা সমস্যার কারণে এই নির্ভুলতা র্জন করা সর্বদা সম্ভব হয় না।
✅ আমাদের যদি স্মার্ট ফোন থাকে তবে ম্যাপিং অ্যাপটি চালু করে দেখতে পারি আমাদের অবস্থানটি কতটা সঠিক। আরও সঠিক অবস্থান পেতে একাধিক উপগ্রহ দ্বারা সনাক্ত করার জন্য অল্প সময় নিতে পারে।
> 💁 উপগ্রহগুলিতে atomic clock রয়েছে যা অবিশ্বাস্যরূপে নির্ভুল, তবে তারা পৃথিবীতে পারমাণবিক ঘড়ির তুলনায় একদিনে 38 মাইক্রোসেকেন্ড (0.0000038 সেকেন্ড) হেরফের করে এবং সময়টি ধীরে ধীরে বেড়ে যায়। পৃথিবীর ঘূর্ণনের চেয়ে দ্রুত ভ্রমণ করায় এই ঘটনা ঘটে যা আইনস্টাইনের বিশেষ এবং সাধারণ আপেক্ষিকতার ত্বত্তে অনুমান করা হয়েছিলো এবং সময়ের এই হেরফেরই আইন্সটাইনের তত্ত্ব প্রমাণ করে। আক্ষরিক অর্থেই জিপিএস স্যাটেলাইটে সময় ধীর হয়ে যায় ।
মার্কিন যুক্তরাষ্ট্র, রাশিয়া, জাপান, ভারত, ইইউ এবং চীন সহ বেশ কয়েকটি দেশ এবং রাজনৈতিক ইউনিয়ন জিপিএস সিস্টেমগুলি বিকাশ ও স্থাপন করেছে। আধুনিক জিপিএস সেন্সর দ্রুত এবং আরও নির্ভুল ভাবে কাজ করতে পারে।
> 🎓 প্রতিটি ডেপ্লয়মেন্টে উপগ্রহের যে গুচ্ছ পাঠানো হয়, তাদেরকে 'constellations' বলা হয়।
## জিপিএস সেন্সর ডেটা গ্রহণ
বেশিরভাগ জিপিএস সেন্সর UART এর মাধ্যমে জিপিএস ডেটা প্রেরণ করে।
> ⚠️ UART বিষয়টি [project 2, lesson 2](../../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart) এ বর্ণনা করা হয়েছে।
আমরা জিপিএস ডেটা পেতে আমাদের আইওটি ডিভাইসে একটি জিপিএস সেন্সর ব্যবহার করতে পারি।
### কাজ - জিপিএস সেন্সর কানেক্ট করে ডেটা গ্রহণ
আমাদের আইওটি ডিভাইস ব্যবহার করে জিপিএস ডেটা গ্রহণ করতে নিম্নের প্রাসঙিক গাইডের মাধ্যমে কাজ শুরু করি:
* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md)
* [Single-board computer - Raspberry Pi](pi-gps-sensor.md)
* [Single-board computer - Virtual device](virtual-device-gps-sensor.md)
## NMEA GPS data
আমরা যখন আমাদের কোড রান করি, তখন দেখতে পেতাম যে আউটপুটটিতে কিছু হযবরল, অর্থহীন ডেটা রয়েছে । এটি আসলে স্ট্যান্ডার্ড জিপিএস ডেটা এবং এর অর্থ রয়েছে।
জিপিএস সেন্সরগুলি NMEA 0183 স্ট্যান্ডার্ড ব্যবহার করে, NMEA বার্তায় আউটপুট দেয়। NMEA এর পূর্ণরূপ [National Marine Electronics Association](https://www.nmea.org), মার্কিন যুক্তরাষ্ট্র ভিত্তিক বাণিজ্য সংস্থা যা সামুদ্রিক ইলেকট্রনিক্সের মধ্যে যোগাযোগের জন্য মান নির্ধারণ করে।
> 💁 এই স্ট্যান্ডার্ডটি মালিকানাধীন এবং কমপক্ষে ২০০০ মার্কিন ডলারে বিক্রি হয়, তবে এ সম্পর্কে পর্যাপ্ত তথ্য জনসাধারণের কাছে আছে যে স্ট্যান্ডার্ডটির বেশিরভাগ অংশই বিপরীত ইঞ্জিনিয়ারড (reverse engineered) হয়েছে এবং ওপেন সোর্স ও অন্যান্য অ-বাণিজ্যিক কোডে তাই ব্যবহার করা যেতে পারে।
এই বার্তাগুলি টেক্সট-ভিত্তিক। প্রতিটি বার্তায় একটি *বাক্য* থাকে যা একটি `$` চিহ্ন দিয়ে শুরু হয়, তারপরে বার্তাটির সোর্স বোঝানোর জন্য ২টি বর্ণ (উদাহরণস্বরূপ মার্কিন যুক্তরাষ্ট্রের জিপিএস সিস্টেমের জন্য GP, রাশিয়ান জিপিএস সিস্টেম GLONASS এর জন্য GN) এবং 3 টি বর্ণ থাকে বার্তার ধরণটি নির্দেশ করতে। বার্তাটির বাকি অংশ কমা দ্বারা আলাদা করা থাকে এবং একটি new line দিয়ে তা শেষ হয়।
প্রাপ্ত বার্তার কয়েকটি প্রকার হল:
| প্রকার | বর্ণনা |
| ---- | ----------- |
| GGA | GPS Fix Data যা জিপিএস সেন্সর থেকে latitude, longitude, and altitude এর তথ্য গ্রহণের পাশাপাশি কতটি স্যাটেলাইট ব্যবহার করে এই তথ্য নেয়া হয়েছে তাও জানায় |
| ZDA | লোকাল টাইমজোন সহ বর্তমান সময় এবগ তারিখও জানায় |
| GSV | দৃশ্যমান স্যাটেলাইটের তথ্যাবলি - যেসকল স্যাটেলাইট এর সাথে জিপিএস সেন্সর যুক্ত থাকে |
> 💁 জিপিএস ডেটাতে টাইমস্ট্যাম্প অন্তর্ভুক্ত রয়েছে, সুতরাং আমাদের আইওটি ডিভাইসটি কোনও এনটিপি সার্ভার বা অভ্যন্তরীণ রিয়েল-টাইম ক্লকের উপর নির্ভর না করে কোন জিপিএস সেন্সর থেকে সময় পেতে পারে।
GGA টাইপের ম্যাসেজে অবস্থান নির্দেশ করার জন্য নির্দিষ্ট ফর্ম্যাট ব্যবহার করে যা হলো `(dd)dmm.mmmm` যার সাথে একটি একক অক্ষর ব্যবহার করে বর্তমান অবস্থান এর দিক অন্তর্ভুক্ত করা হয়। এই বিন্যাসে `d` হলো ডিগ্রি ,` m` এবং সেকেন্ডকে মিনিটের দশমিক হিসাবে দেখানো হয় ; উদাহরণস্বরূপ - 2° 17'43" কে 217.716666667 - 2 ডিগ্রি , 17.716666667 মিনিট হিসাবে দেখানো হবে।
দিকনির্দেশক বর্ণ `N` অথবা `S` হবে অক্ষাংশের জন্য এবং `E` বা `W` হবে দ্রাঘিমাংশের জন্য। উদাহরণস্বরূপ, 2°17'43" অক্ষাংশে দিকনির্দেশক বর্ণ হবে `N` এবং -2°17'43" হলে তখন তা হতো `S`.
উদাহরণস্বরূপ - একটি NMEA sentence হলোঃ `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67`
* অক্ষাংশ বোঝানো হচ্ছে `4738.538654,N` অংশে, যা পরিবর্তিত হয়ে 47.6423109 হচ্ছে ডেসিমাল সংখ্যাপদ্ধতিতে। `4738.538654` হলো 47.6423109 এবং এর দিক `N` (north বা উত্তর), তাই এটি ধ্বনাত্মক অক্ষাংশ।
* দ্রাঘিমাংশ বোঝানো হচ্ছে `12208.341758,W` অংশে, যা পরিবর্তিত হয়ে -122.1390293 হচ্ছে ডেসিমাল সংখ্যাপদ্ধতিতে। `12208.341758` হলো 122.1390293°, এবং এর দিক `W` (west বা পশ্চিম), তাই এটি ঋণাত্মক দ্রাঘিমা।
## GPS sensor data ডিকোড করা
সরাসরি NMEA data ব্যবহারের পরিবর্তে তা উপযোগী ফরম্যাটে পরিবর্তন করা উচিত। NMEA ফরম্যাটের বার্তাগুলি থেকে দরকারী ডেটা বের করতে আমরা একাধিক ওপেন-সোর্স লাইব্রেরি ব্যবহার করতে পারি।
### কাজ - GPS sensor data ডিকোড করা
আমাদের আইওটি ডিভাইসটি ব্যবহার করে জিপিএস সেন্সর ডেটা ডিকোড করতে নিম্নের যেকোন একটি উপযোগী গাইডের মাধ্যমে কাজ শুরু করি:
* [Arduino - Wio Terminal](wio-terminal-gps-decode.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-gps-decode.md)
---
## 🚀 চ্যালেঞ্জ
আমাদের নিজেদের বানানো NMEA decoder থাকলে কেমন হয় ? থার্ড পার্টি লাইব্রেরির উপর নির্ভর না করেই, নিজেদের প্রয়োজনের ডেটা গ্রহণের জন্য কী ডিকোডার বানাতে পারি? চেষ্টা করে দেখা যাক !
## লেকচার-পরবর্তী কুইজ
[লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22)
## রিভিউ ও স্ব-অধ্যয়ন
* ভূ-স্থানাংকের ব্যাপারে আরো জানতে [Geographic coordinate system - Wikipedia](https://wikipedia.org/wiki/Geographic_coordinate_system)পড়ি ।
* অন্য মহাজাগতিক বস্তুর Prime Meridians সম্পর্কে জানতে [Prime Meridian page on Wikipedia](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies) পড়ি।
* ইউরোপীয় ইউনিয়ন, জাপান, রাশিয়া, ভারত এবং মার্কিন যুক্তরাষ্ট্রের মতো বিভিন্ন বিশ্ব সরকার এবং রাজনৈতিক ইউনিয়নগুলির বিভিন্ন বিভিন্ন জিপিএস সিস্টেমগুলি গবেষণা করি।
## এসাইনমেন্ট
[অন্যান্য জিপিএস ডেটা পর্যালোচনা করা](assignment.bn.md)

@ -1,205 +0,0 @@
# 위치 추적
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-11.jpg)
> [Nitya Narasimhan](https://github.com/nitya)의 스케치노트. 사진을 클릭하여 더 크게 보세요
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21)
## 도입
농부로부터 소비자에게 음식을 전달하는 주요 과정은 트럭, 선박, 비행기 또는 기타 상업 운송 차량에 농산물 상자를 적재하고, 음식을 고객에게 직접 전달하거나 중앙 허브 또는 창고로 가공하는 것을 포함합니다. 농장에서 소비자에 이르는 전체 엔드 투 엔드 프로세스는 *supply-chain*이라는 프로세스의 일부입니다. 아래 영상은 애리조나 주립 대학의 W.P. Carey 경영대학원에서 공급망의 아이디어와 공급망이 어떻게 관리되는지에 대하여 더 자세히 설명하는 영상입니다.
[![What is Supply Chain Management? A video from Arizona State University's W. P. Carey School of Business](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw)
> 🎥 이미지를 클릭하여 영상을 시청하세요.
IoT 장치를 추가하면 공급망을 획기적으로 개선하여 물품들이 있는 곳을 관리하고, 운송 및 물품 처리를 더 잘 계획하며 문제에 더 빨리 대응할 수 있습니다.
트럭과 같은 일련의 차량을 관리할 때는 주어진 시간에 각 차량이 어디에 있는 지 아는 것이 도움이 됩니다. 차량에는 현재 차량의 위치를 IoT 시스템으로 전송하는 GPS 센서가 장착되어 있어 소유자가 위치를 정확히 파악하고, 선택한 경로를 확인하고, 목적지에 언제 도착할지 알 수 있습니다. 대부분의 차량은 WiFi 서비스 범위 밖에서 작동하므로 이러한 종류의 데이터를 전송하기 위해 셀룰러 네트워크를 사용합니다. 때때로 GPS 센서는 전자 로그 북과 같은 더 복잡한 IoT 장치에 내장됩니다. 이 장치들은 운전자들이 근무 시간에 관한 현지 법을 준수하기 위해 트럭이 운송된 기간 또한 추적합니다.
이번 강의에서는 GPS(Global Positioning System)센서를 사용하여 차량 위치를 추적하는 방법을 배웁니다.
이번 강의에서 다룰 내용은 다음과 같습니다:
* [차량과 연결](#차량과-연결)
* [지리공간 좌표](#지리공간-좌표)
* [Global Positioning Systems (GPS)](#global-positioning-systems-gps)
* [GPS 센서 데이터 읽기](#gps-센서-데이터-읽기)
* [NMEA GPS 데이터](#nmea-gps-데이터)
* [GPS 센서 데이터 디코딩](#gps-센서-데이터-디코딩)
## 차량과 연결
IoT는 *연결된 차량*의 함대를 만들어 상품 운송 방식을 변화시키고 있습니다. 이러한 차량은 중앙 IT 시스템에 연결되어 위치 정보 및 기타 센서 데이터를 보고합니다. 일련의 연결 차량을 보유하는 것은 다음과 같은 다양한 이점을 제공합니다.
* 위치 추적 - 언제든지 차량의 위치를 정확히 파악할 수 있으므로 다음과 같은 이점이 있습니다.
* 차량이 목적지에 도착하기 직전에 미리 알람을 받아 직원이 물픔을 내릴 준비를 할 수 있습니다.
* 도난 차량의 위치 파악이 가능합니다.
* 위치 및 경로 데이터를 교통 문제와 결합하여 운송 중간에 차량의 경로를 변경할 수 있습니다.
* 세금을 준수합니다. 일부 국가에서는 공공 도로에서 주행하는 차량에 주행 거리 만큼의 요금을 부과합니다. ([New Zealand's RUC](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), 따라서 차량이 공공 도로에서 주행하는 시간과 개인 도로에서 주행하는 시간을 파악하면 세금을 더 쉽게 계산할 수 있습니다.
* 고장이 발생할 경우 유지보수 인력을 어디에 파견해야 하는지 파악할 수 있습니다.
* 운전자 원격 측정 - 운전자가 제한 속도를 준수하고 적절한 속도로 코너링하며 조기에 효율적으로 제동을 걸고 안전하게 주행할 수 있도록 보장합니다. 연결된 차향에는 사고를 기록하는 카메라가 있을 수도 있습니다. 이는 좋은 운전자들에게 할인된 요금을 주는 보험과 연결될 수 있습니다.
* 운전자 시간 준수 - 운전자가 엔진을 켜고 끄는 시간을 기준으로 확인하여 법적으로 허용된 시간 동안만 운전하도록 보장합니다.
이러한 이점들은 결합될 수 있습니다 - 예를 들어, 운전자가 허용된 운전 시간 내에 목적지에 도착할 수 없는 경우, 위치 추적과 결합하여 운전자를 재 경로화 할 수 있습니다. 이는 온도 제어 트럭의 온도 데이터는 현재 경로로 인해 차량이 온도 유지를 할 수 없는 경우 차량을 재 구매 할 수 있도록 합니다.
> 🎓 물품 유통은 농장에서 슈퍼마켓으로 하나 이상의 창고를 통해 상품을 한 장소에서 다른 장소로 운송하는 과정입니다. 한 농부가 토마토 상자를 트럭에 싣고 중앙 창고로 배달한 다음, 슈퍼마켓으로 배달되는 트럭에는 농부의 토마토와 다른 종류의 농산물들이 혼합되어 있습니다..
차량 추적의 핵심 구성 요소는 GPS입니다. GPS는 지구상 어디에서나 위치를 정확히 파악할 수 있는 센서입니다. 이 강의에서는 GPS 센서를 사용하는 방법부터 시작하여 지구의 위치를 정의하는 방법에 대해 알아봅니다.
## 지리공간 좌표
지리공간 좌표는 지구 표면의 점을 정의하는 데 사용되며, 컴퓨터 화면의 픽셀을 그리거나 십자 스티치로 꿰매는 데 좌표를 사용할 수 있는 방법과 유사합니다. 단일 점의 경우 좌표 쌍이 있습니다. 예를 들어, 미국 워싱턴주 레드몬드에 있는 마이크로소프트 캠퍼스는 47.6423109, -122.1390293에 위치해 있습니다.
### 위도와 경도
지구는 3차원 원인 구입니다. 이 때문에 점은 원의 기하학적 구조와 마찬가지로 360도로 나누어 정의된다. 위도는 남북의 의치를 측정하고 경도는 동서의 위치를 측정한다.
> 💁 아무도 원이 360도로 나뉘는 원래의 이유를 알지 못합니다. 위키피디아의 [degree (angle)](https://wikipedia.org/wiki/Degree_(angle))페이지에서 가능성 있는 몇가지 이유들을 다룹니다.
![Lines of latitude from 90° at the North Pole, 45° halfway between the North Pole and the equator, 0° at the equator, -45° halfway between the equator and the South Pole, and -90° at the South Pole](../../../../images/latitude-lines.png)
위도는 북반구와 남반구를 각각 90°씩 나누며 지구를 돌고 적도와 평행하게 달리는 선을 이용해 측정합니다. 적도는 0도, 북극은 90도, 남극은 -90도, 남극은 -90도입니다.
경도는 동서로 측정된 위치로 측정됩니다. 경도의 0°원점은 *원초 자오선*이라고 불리며, 1884년에 [영국 그리니치에 있는 영국 왕립 천문대](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich))를 통과하는 북극에서 남극점까지의 선으로 정의되었습니다.
![Lines of longitude that go from -180° to the west of the Prime Meridian, to 0° on the Prime Meridian, to 180° east of the Prime Meridian](../../../../images/longitude-meridians.png)
> 🎓 자오선은 북극점에서 남극점까지 반원을 이루는 가상의 직선이다.
점의 경도를 측정하려면 본초 자오선에서 해당 점을 통과하는 자오선까지의 적도 주위의 좌표를 측정합니다. 경도는 본초 자오선에서 서경 180도에서 동경 180도까지이다. 180°와 -180°는 같은 점, 즉 반경 또는 180도를 가리킵니다. 이것은 본초 자오선에서 지구 반대편에 있는 자오선이다.
> 💁 반자오선은 국제일자선과 거의 같은 위치에 있는 것과 혼동해서는 안 됩니다. 그러나 국제일자선은 직선이 아니며 지정학적 경계에 맞게 다향합니다.
✅ 조사 해 봅시다 : 현재 위치의 위도와 경도를 찾으십시오.
### Degree, 분 및 초 VS 십진수 Degree
전통적으로 위도와 경도의 측정은 시간과 거리를 최초로 측정하고 기록한 고대 바빌로니아인들이 사용했던 숫자 체계인 Base-60을 사용하여 수행되었습니다. 여러분은 아마 시간을 60분으로, 분을 60초로 나누는 것을 깨닫지도 못한 채 매일 60진법을 사용할 것입니다.
경도와 위도는 Degree, 분, 초 단위로 측정되며 1분은 Degree의 1/60, 1초는 1/60분이다.
예를 들어, 적도에서:
* 위도 1°는 **111.3km**입니다.
* 위도의 1분은 111.3/60 = **1.855km**
* 위도의 1초는 1.855/60 = **0.031km**
1분이라는 표현은 하나의 인용구이고, 1초라는 표현은 이중 인용구입니다. 예를 들어, 2도, 17분, 43초는 2°17'43"로 기록됩니다. 초의 일부는 소수로 주어지는데, 예를 들어 0.0초는 0°0'0.5"입니다.
컴퓨터는 Base-60에서 작동하지 않으므로 대부분의 컴퓨터 시스템에서 GPS 데이터를 사용할 때 이러한 좌표는 십진법으로 제공됩니다. 예를 들어, 2°17'43"은 2.295277입니다. Degree 기호는 일반적으로 생략됩니다.
점에 대한 좌표는 항상 "위도, 경도"로 제공되므로 47.6423109,-122.117198의 이전 마이크로소프트 캠퍼스의 예는 다음과 같습니다.
* 위도 47.6423109(적도에서 북쪽으로 47.6423109도)
* 경도 -122.1390293(원초 자오선에서 서쪽으로 122.1390293도)
![The Microsoft Campus at 47.6423109,-122.117198](../../../../images/microsoft-gps-location-world.png)
## Global Positioning Systems (GPS)
GPS 시스템은 사용자의 위치를 찾기 위해 지구 주위를 도는 여러 위성을 사용합니다. 여러분은 아마도 휴대폰의 지도 앱(예: Apple Maps 또는 Google Maps)에서 위치를 찾거나 Uber 또는 Lyft와 같은 놀이기구 호출 앱에서 또는 자동차에서 위성 내비게이션(sat-nav)을 사용할 때 위치를 확인하기 위해 GPS 시스템을 사용했을 것입니다.
> 🎓 '위성항법'의 위성은 GPS 위성입니다!
GPS 시스템은 각 위성의 현재 위치와 정확한 타임스탬프로 신호를 보내는 다수의 위성을 가지고 작동합니다. 이러한 신호는 전파를 통해 전송되며 GPS 센서의 안테나에 의해 감지됩니다. GPS 센서가 이러한 신호를 감지하고 현재 시간을 사용하여 신호가 위성에서 센서에 도달하는 데 걸린 시간을 측정합니다. 전파의 속도가 일정하기 때문에 GPS 센서는 전송된 타임스탬프를 사용하여 센서가 위성으로부터 얼마나 떨어져 있는지 알아낼 수 있습니다. 적어도 3개의 위성으로부터 온 데이터를 전송된 위치와 결합함으로써, GPS 센서는 지구상의 위치를 정확히 찾아낼 수 있다.
> 💁 GPS 센서는 전파를 감지하기 위해 안테나가 필요합니다. 트럭과 자동차에 내장된 안테나는 일반적으로 앞유리나 지붕에 신호를 받을 수 있도록 배치되어 있습니다. 스마트폰이나 IoT 기기와 같은 별도의 GPS 시스템을 사용하는 경우, GPS 시스템이나 전화기에 내장된 안테나가 앞쪽에 장착되는 등 하늘을 바라 볼 수 있도록 해야 합니다.
![By knowing the distance from the sensor to multiple satellites, the location be calculated](../../../../images/gps-satellites.png)
GPS 위성은 센서 위 고정점이 아닌 지구를 돌고 있어 위치정보에는 위도와 경도 뿐만 아니라 해수면 이상 고도도 포함됩니다.
과거 GPS는 미군이 시행하는 정확도에 한계가 있어, 정확도가 5m 안팎으로 제한되었습니다. 이 제한은 2000년에 사라지고 30cm의 정확도를 허용했습니다. 신호 간섭으로 인해 이 정확도를 얻는 것이 항상 가능한 것은 아닙니다.
✅ 스마트폰이 있으면 지도 앱을 실행하여 위치가 얼마나 정확한지 확인해보세요. 전화기가 더 정확한 위치를 얻기 위해 여러 위성을 감지하는 데 짧은 시간이 걸릴 수 있습니다.
> 💁 이 위성들은 믿을 수 없을 정도로 정확한 원자 시계를 포함하고 있지만, 그것들은 지구의 원자 시계에 비해 하루에 38마이크로초(0.0000038초)씩 표류하는데, 이는 아인슈타인의 특수 상대성 이론과 일반 상대성 이론에 의해 예측된 속도가 증가함에 따라 시간이 느려지기 때문입니다. - 위성들은 지구의 자전보다 더 빨리 이동합니다. 이 드리프트는 특수 상대성 이론과 일반 상대성 이론의 예측을 증명하는 데 사용되어 왔으며 GPS 시스템의 설계에서 조정되어야합니다. 문자 그대로 GPS 위성에서는 시간이 더 느리게 흐릅니다.
GPS 시스템은 미국, 러시아, 일본, 인도, 유럽연합, 중국을 포함한 많은 국가와 정치 연합에 의해 개발되고 배치되었습니다. 최신 GPS 센서는 이러한 시스템 대부분에 연결하여 더 빠르고 정확한 수정을 할 수 있습니다.
> 🎓 각 비군사적 사역에서의 위성그룹을 constellations라고 부릅니다.
>
## GPS 센서 데이터 읽기
대부분의 GPS 센서는 UART를 통해 GPS 데이터를 전송합니다.
> ⚠️ UART는[project 2, lesson 2](../../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart)에서 다루었습니다. 필요한 경우 해당 강의를 참조하세요.
IoT 장치의 GPS 센서를 사용하여 GPS 데이터를 가져올 수 있습니다.
### 작업 - GPS 센서를 연결하고 GPS 데이터를 읽어봅시다.
IoT 장치를 사용하여 GPS 데이터를 읽으려면 관련 가이드를 참조하십시오. :
* [Arduino - Wio Terminal](../wio-terminal-gps-sensor.md)
* [Single-board computer - Raspberry Pi](../pi-gps-sensor.md)
* [Single-board computer - Virtual device](../virtual-device-gps-sensor.md)
## NMEA GPS 데이터
당신이 코드를 실행했을 때, 당신은 출력에서 횡설수설하는 것처럼 보일 수 있는 것을 보았을 것입니다. 이것은 사실 표준 GPS 데이터이고, 모두 의미가 있습니다.
GPS 센서는 NMEA 0183 표준을 사용하여 NMEA 메시지로 데이터를 출력합니다. NMEA는 해양 전자 간 통신 표준을 설정하는 미국의 무역 조직인 [National Marine Electronics Association](https://www.nmea.org)의 약자입니다.
> 💁 이 표준은 독점적이며 최소 미화 2,000 달러에 판매되지만, 이에 대한 충분한 정보는 대부분의 표준이 리버스 엔지니어링되었으며 오픈 소스 및 기타 비상업 코드에서 사용될 수 있습니다.
이 메시지는 텍스트 기반입니다. 각 메시지는 `$` 문자로 시작하는 *문장*으로 구성되며, 그 다음으로 메시지의 소스를 나타내는 2개의 문자(예: 미국 GPS 시스템의 경우 GP, 러시아 GPS 시스템의 경우 GN), 메시지 유형을 나타내는 3개의 문자로 구성됩니다. 메시지의 나머지 부분은 쉼표로 구분된 필드로, 새 줄 문자로 끝납니다.
수신할 수 있는 메시지 유형은 다음과 같습니다.:
| 유형 | 설명 |
| ---- | ----------- |
| GGA | GPS 센서의 위도, 경도, 고도를 포함한 GPS 수정 데이터와 이 수정을 계산하기 위해 볼 수 있는 위성의 수. |
| ZDA | 현지 시간대를 포함한 현재 날짜 및 시간 |
| GSV | 보기에 있는 위성의 세부 정보 - GPS 센서가 신호를 감지할 수 있는 위성으로 정의됩니다. |
> 💁 GPS 데이터에는 타임스탬프가 포함되어 있으므로 IoT 장치는 NTP 서버나 내부 실시간 시계에 의존하지 않고 GPS 센서에서 필요한 경우 시간을 얻을 수 있습니다.
GGA 메시지는 방향을 나타내는 단일 문자와 함께 `(dd)dmm.mmm` 형식을 사용하는 현재 위치를 포함합니다. 형식의 `d`는 도, `m`은 분, 초는 분 단위입니다. 예를 들어, 2°17'43"은 217.7166667 - 2도, 17.7166667분입니다.
The direction character can be `N` or `S` for latitude to indicate north or south, and `E` or `W` for longitude to indicate east or west. For example, a latitude of 2°17'43" would have a direction character of `N`, -2°17'43" would have a direction character of `S`.
방향 문자는 북쪽이나 남쪽을 나타내는 위도의 경우 `N`이나 `S`, 동쪽이나 서쪽을 나타내는 경도의 경우 `E``W`가 될 수 있습니다. 예를 들어, 2°17'43"의 위도는 `N`의 방향 문자를 가지며, -2°17'43"의 방향 문자는 `S`의 방향 문자를 갖는다.
예시 NMEA 문장 `$GNGGA, 020604.001, 4738.538654, N, 12208.341758, W, 1,3,164.7, M, -17.1, M, *67`
* 위도 부분은 `4738.538654,N`으로 소수점에서 47.6423109로 변환된다. `4738.538654`는 47.6423109, 방향은 `N`(북)이므로 양위도이다.
* 경도 부분은 -122.1390293(10진수)으로 환산한 `12208.341758,W`이다. `12208.341758`은 122.1390293°이고 방향은 `W`(서쪽)이므로 음경이다.
## GPS 센서 데이터 디코딩
원시 NMEA 데이터를 사용하는 것보다 더 유용한 형식으로 디코딩하는 것이 좋습니다. 원시 NMEA 메시지에서 유용한 데이터를 추출하는 데 사용할 수 있는 여러 오픈 소스 라이브러리가 있습니다.
### 작업 - GPS 센서 데이터를 디코딩 해 봅시다
IoT 장치를 사용하여 관련 가이드를 통해 GPS 센서 데이터를 디코딩합니다.:
* [Arduino - Wio Terminal](../wio-terminal-gps-decode.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](../single-board-computer-gps-decode.md)
---
## 🚀 도전
여러분만의 NMEA 디코더를 쓰세요! NMEA 문장을 해독하기 위해 타사 라이브러리에 의존하는 대신, 여러분은 NMEA 문장에서 위도와 경도를 추출하기 위해 여러분만의 디코더를 작성할 수 있을까요?
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22)
## 복습 및 독학
* 지리공간 좌표에 대한 자세한 내용은 [Wikipedia의 지리 좌표 시스템 페이지](https://wikipedia.org/wiki/Geographic_coordinate_system))를 참조하세요.
* [위키피디아의 프라임 자오선 페이지](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies)에서 지구 외 다른 천체의 프라임 자오선에 대해 자세히 읽어보세요.
* EU, 일본, 러시아, 인도 및 미국과 같은 다양한 세계 정부 및 정치 연합의 다양한 GPS 시스템을 찾아보세요.
## 과제
[다른 GPS 데이터 조사](../assignment.md)

@ -1,15 +0,0 @@
# অন্যান্য জিপিএস ডেটা পর্যালোচনা করা
## নির্দেশাবলী
আমাদের জিপিএস সেন্সর থেকে আসা NEMA বাক্যগুলিতে লোকেশন ছাড়াও অন্যান্য ডেটা রয়েছে। অতিরিক্ত ডেটা অনুসন্ধান করে আইওটি ডিভাইসে তা ব্যবহার করি।
উদাহরণস্বরূপ - আমরা কী বর্তমান তারিখ এবং সময় পেতে পারি? আমরা যদি কোন মাইক্রোকন্ট্রোলার ব্যবহার করি, তবে যেভাবে পূর্বের প্রজেক্টে এনটিপি সিগন্যাল ব্যবহার করেছি সেটাকে ব্যবহার করে জিপিএস ডেটা দ্বারা ঘড়ি সেট করা যাবে? আমরা কি উচ্চতা (সমুদ্রতল থেকে আমাদের উচ্চতা) বা বর্তমান গতি পেতে পারি?
আমরা যদি ভার্চুয়াল আইওটি ডিভাইস ব্যবহার করে থাকি, তবে NMEA sentences এর ডেটা [nmeagen.org](https://www.nmeagen.org) থেকে পেতে পারি।
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) |
| --------- | ------------------ | -------------- | -------------------- |
| আরো বেশি GPS data সংগ্রহ করা | টেলিমেট্রি হিসাবে বা আইওটি ডিভাইস সেট আপ এর মাধ্যমে আরো জিপিএস ডেটা পেতে এবং ব্যবহার করতে সক্ষম | আরো বেশি GPS data পেতে সক্ষম হলেও ব্যবহার করতে ব্যার্থ|আরো বেশি GPS data পেতে ব্যার্থ |

@ -1,469 +0,0 @@
# লোকেশন ডেটা সংরক্ষণ
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-12.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23)
## সূচনা
গত পাঠে কীভাবে অবস্থানের ডেটা ক্যাপচার করতে একটি জিপিএস সেন্সর ব্যবহার করতে হয় তা আমরা শিখেছিলাম। খাদ্যসামগ্রীতে ভর্তি একটি ট্রাকের অবস্থান এবং এটির যাত্রার জন্য এই ডেটাটি ব্যবহার করতে, এটি ক্লাউডে আইওটি সার্ভিসে প্রেরণ করতে হবে এবং তারপরে কোথাও সংরক্ষণ করা দরকার।
এই পাঠে আইওটি ডেটা সঞ্চয় করার বিভিন্ন উপায় সম্পর্কে আমরা শিখব এবং সার্ভারলেস কোড ব্যবহার করে কীভাবে আইওটি পরিষেবা থেকে ডেটা সংরক্ষণ করা যায় তাও শিখতে পারবো।
এই পাঠে আমরা দেখবো:
* [কাঠামোগত এবং কাঠামোবিহীন ডেটা](#কাঠামোগত-এবং-কাঠামোবিহীন-ডেটা)
* [GPS ডেটা IoT Hub এ প্রেরণ](#send-gps-data-to-an-iot-hub)
* [Hot, Warm, এবং Cold Path](#Hot-Warm-এবং-Cold-Path)
* [সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা](#সার্ভারবিহীন-কোড-ব্যবহার-করে-জিপিএস-ইভেন্টগুলি-পরিচালনা)
* [Azure স্টোরেজ অ্যাকাউন্ট](#azure-স্টোরেজ-অ্যাকাউন্ট)
* [সার্ভারবিহীন-কোডকে-স্টোরেজে-সংযুক্তকরণ](#সার্ভারবিহীন-কোডকে-স্টোরেজে-সংযুক্তকরণ)
## কাঠামোগত এবং কাঠামোবিহীন ডেটা
কম্পিউটার সিস্টেমগুলি ডেটা নিয়ে কাজ করে এবং এই ডেটা বিভিন্ন আকার এবং ধরণের হয়ে থাকে। এটি একক সংখ্যা থেকে শুরু করে প্রচুর পরিমাণে টেক্সট, ভিডিও, চিত্র বা আইওটি ডেটা হতে পারে। ডেটা সাধারণত দুই ভাগে বিভক্ত করা যায় - *কাঠামোগত* ডেটা এবং *কাঠামোবিহীন* ডেটা।
* **কাঠামোগত ডেটা (Structured Data)** হল এমন ধরণের ডেটা যা একটি সংজ্ঞায়িত, অনমনীয় কাঠামোযুক্ত, যা পরিবর্তিত হয়না এবং সাধারণত টেবিল আকারে সাজানো যায় এবং অন্যান্য ডেটার সাথে কোনোভাবে সম্পর্কিত করা যায়। একটি উদাহরণ হল কোনো ব্যক্তির নাম, জন্ম তারিখ এবং ঠিকানা সহ বিশদ বিবরণ।
* **কাঠামোবিহীন ডেটা (Unstructured Data)** হল একটি অসংজ্ঞায়িত, নমনীয় কাঠামোযুক্ত ডেটা, যা ঘন ঘন কাঠামো পরিবর্তন করতে পারে। একটি উদাহরণ হলো - লিখিত নথি বা স্প্রেডশিট ।
✅ আর কী কী উদাহরণ আমরা কাঠামোগত এবং কাঠামোবিহীন ডেটাতে ভাবতে পারি তা চিন্তা করি।
> 💁 এছাড়াও আধা-কাঠামোগত (Semi-Structured) ডেটা রয়েছে যা কাঠামোগত, তবে তথ্যের নির্দিষ্ট টেবিল আকারে সাজানো যায়না ।
আইওটি ডেটা সাধারণত কাঠামোবিহীন ডেটা (Unstructured Data) হিসাবে বিবেচিত হয়।
কল্পনা করি আমরা একটি বড় বাণিজ্যিক খামারের জন্য যানবাহনের বহরে আইওটি ডিভাইস যুক্ত করেছি। বিভিন্ন ধরণের গাড়ির জন্য বিভিন্ন ডিভাইস ব্যবহার করার দরকার হতে পারে। উদাহরণস্বরূপ:
* ট্রাক্টরের জন্য জিপিএস ডেটা দরকার হতে পারে এটি নিশ্চিত করার জন্য যে তারা সঠিক খামারে বা ক্ষেতে কাজ করছে
* চালকরা নিরাপদে গাড়ি চালাচ্ছে কিনা, ড্রাইভারের পরিচয় নিশ্চিতকরণ এবং কতক্ষণ কাজ করছে তা নিশ্চিত করার জন্য খাদ্যসামগ্রী পরিবহনের ট্রাকগুলিতে জিপিএস ডেটার পাশাপাশি গতিসংক্রান্ত ডেটাও প্রয়োজন।
* রেফ্রিজারেটেড ট্রাকের জন্য তাপমাত্রার তথ্য খুব গুরুত্বপূর্ণ যাতে খাবার খুব গরম বা ঠান্ডা না হয় এবং পরিবহণের সময় তা নষ্ট না হয়।
এই ডেটা পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, যদি আইওটি ডিভাইসটি একটি ট্রাকের ক্যাবে থাকে, তবে ট্রেলার পরিবর্তনের সাথে সাথে ডেটাও পরিবর্তিত হতে পারে, উদাহরণস্বরূপ যখন একটি রেফ্রিজারেটেড ট্রেলার ব্যবহার করা হবে, তখনই শুধু তাপমাত্রার ডেটা প্রেরণ করা হবে।
✅ আর কোন কোন আইওটি ডেটা গ্রহণ যেতে পারে? ট্রাকগুলি যে ধরণের বোঝা বহন করতে পারে সে সম্পর্কে একটু চিন্তা করি এবং সেইসাথে রক্ষণাবেক্ষণের ডেটা সম্পর্কেও ভাবা যেতে পারে।
এই তথ্য যানবাহনের উপর নির্ভর করে পরিবর্তিত হয়, কিন্তু এসব তথ্যাবলি আসলে প্রক্রিয়াকরণের জন্য একই IoT সার্ভিসে পাঠানো হয়। আইওটি সার্ভিসটিকে এই কাঠামোবিহীন ডেটা প্রক্রিয়া করতে পারতে হবে, এটিকে এমনভাবে সংরক্ষণ করতে হবে যা এটি অনুসন্ধান বা বিশ্লেষণের অনুমতি দেয় আবার এই ডেটা বিভিন্ন কাঠামোর সাথেও যেন কাজ করতে পারে।
### SQL এবং NoSQL স্টোরেজ
ডেটাবেসগুলি এমন পরিষেবা যা ডেটা সংরক্ষণ এবং কুয়েরি করার সুযোগ দেয়। ডাটাবেস দুই প্রকার হয় - SQL এবং NoSQL
#### SQL databases
প্রথমদিকের ডাটাবেসগুলো ছিল রিলেশনাল ডাটাবেস ম্যানেজমেন্ট সিস্টেমস (আরডিবিএমএস), বা রিলেশনাল ডাটাবেস। স্ট্রাকচার্ড ক্যোয়ারী ল্যাঙ্গুয়েজ (এসকিউএল) এখানে ডেটা যোগ, অপসারণ, আপডেট বা কোয়েরি করার জন্য তাদের সাথে ইন্টারঅ্যাক্ট করার পরে এটি এসকিউএল ডেটাবেস নামেও পরিচি্তি লাভ করে। এই ডাটাবেসগুলো একটি স্কিমা নিয়ে গঠিত যা স্প্রেডশীটের মতই ডেটা টেবিলের একটি সু-সংজ্ঞায়িত সেট। প্রতিটি টেবিলে একাধিক নামযুক্ত কলাম রয়েছে। যখন ডেটা যোগ বা insert করা, টেবিলে একটি সারি যোগ করা, প্রতিটি কলামে মান রাখা - এসব করা যায়। এটি ডেটাগুলিকে একটি অত্যন্ত কঠোর কাঠামোর মধ্যে রাখে - যদিও কলামগুলি আমরা চাইলে খালি রাখতে পারি, তবে একটি নতুন কলাম যুক্ত করতে চাইলে অবশ্যই বিদ্যমান সারির (ROW) মানগুলি পূরণ করতে হবে। এই ডেটাবেসগুলি রিলেশনাল - তাই এখানে একটি টেবিলের অন্যটির সাথে সম্পর্ক থাকতে পারে।
![A relational database with the ID of the User table relating to the user ID column of the purchases table, and the ID of the products table relating to the product ID of the purchases table](../../../../images/sql-database.png)
উদাহরণস্বরূপ, যদি কোন একটি টেবিলে আমরা কোনো ব্যবহারকারীর ব্যক্তিগত বিবরণ সংরক্ষণ করি, তাহলে প্রতি ব্যবহারকারীর জন্য অভ্যন্তরীণ স্বতন্ত্র (UNIQUE) আইডি থাকবে যা ব্যবহারকারীর নাম এবং ঠিকানা সম্বলিত সারিতে ব্যবহৃত হয়। আমরা যদি সেই ব্যবহারকারী সম্পর্কে অন্যান্য বিবরণ যেমন তাদের ক্রয় তালিকা অন্য টেবিলে সংরক্ষণ করতে চাই, তাহলে সেই ব্যবহারকারীর আইডির জন্য আমাদের নতুন টেবিলে একটি কলাম থাকবে। যখন আমরা কোন ব্যবহারকারী্র তথ্য খুঁজবো, আমরা তাদের আইডি ব্যবহার করে তাদের ব্যক্তিগত তথ্য এক টেবিল থেকে এবং অন্য টেবিল থেকে তাদের কেনাকাটার সকল তথ্য পেয়ে যাব।
এসকিউএল ডেটাবেসগুলি কাঠামোগত ডেটা সংরক্ষণের জন্য এবং স্কিমার সাথে সামঞ্জস্য রাখার জন্য আদর্শ।
✅ এসকিউএল ব্যবহারের অভিজ্ঞতা না থাকলে [SQL page - Wikipedia](https://wikipedia.org/wiki/SQL) থেকে বিস্তারিত জানতে পারবো।
কিছু বহুল পরিচিত এসকিউএল ডেটাবেস হলো Microsoft SQL Server, MySQL এবং PostgreSQL ।
✅ কিছু গবেষণা করা যাক: এসকিউএল ডেটাবেস এবং এদের কর্মপরিধি সম্পর্কে জ্ঞান অর্জন করি।
#### NoSQL ডেটাবেস
NoSQL ডেটাবসেসের নামের আগে NO বা 'না' রাখার কারণই হলো তাদের সেই সুগঠিত কাঠামো নেই। তারা 'ডকুমেন্ট ডেটাবেস' নামেও পরিচিত কারণ তারা ডকুমেন্টের মতো অসংগঠিত ডেটা সংরক্ষণ করতে পারে।
> 💁 এক্ষেত্রে জেনে রাখা ভালো যে কিছু NoSQL ডেটাবেসে আমরা SQL এর মত করে কুয়েরি করতে পারবো।
![Documents in folders in a NoSQL database](../../../../images/noqsl-database.png)
NoSQL ডাটাবেসের একটি পূর্বনির্ধারিত স্কিমা নেই যা ডেটা কিভাবে সংরক্ষণ করা হয় তা সীমাবদ্ধ করবে, বরং এর পরিবর্তে আমরা সাধারণত JSON ডকুমেন্ট ব্যবহার করে যেকোনো অবিক্রিত ডেটা সন্নিবেশ করতে পারি। এই ডকুমেন্টগুলো আমাদের কম্পিউটারের ফাইলের মতো ফোল্ডারে সংগঠিত হতে পারে। প্রতিটি ডকুমেন্টে ভিন্ন ভিন্ন ফিল্ড থাকতে পারে - উদাহরণস্বরূপ, যদি আমরা আমাদের খামারের যানবাহন থেকে আইওটি ডেটা সংরক্ষণ করি, কারও কারও জন্য অ্যাকসিলরোমিটার এবং গতির ডেটার ফিল্ড থাকতে পারে, অন্যদের ট্রেলারে তাপমাত্রার ফিল্ড থাকতে পারে। যদি আমরা একটি নতুন ধরণের ট্রাক যোগ করতে চাই, যেমন একটি বিল্ট-ইন স্কেল যুক্ত গাড়ি যা এতে থাকা ওজন ট্র্যাক করতে পারে, তাহলে আমাদের IoT ডিভাইসটি এই নতুন ফিল্ডটি যোগ করতে পারে এবং এটি ডাটাবেসের কোন পরিবর্তন ছাড়াই সংরক্ষণ করা যাবে।
কিছু সুপরিচিত NoSQL database হলো Azure CosmosDB, MongoDB এবং CouchDB ।
✅ একটু গবেষণা করা যাক: নোএসকিউএল ডেটাবেস এবং এদের কর্মপরিধি সম্পর্কে জ্ঞান অর্জন করি।
এই পাঠে, আমরা আইওটি ডেটা সঞ্চয় (Store) করতে NoSQL স্টোরেজ ব্যবহার করব।
## GPS ডেটা IoT Hub এ প্রেরণ
গত পাঠে আমরা আমাদের আইওটি ডিভাইসের সাথে সংযুক্ত একটি জিপিএস সেন্সর থেকে জিপিএস ডেটা ক্যাপচার করেছি। এই আইওটি ডেটা ক্লাউডে সংরক্ষণ করতে, তা একটি আইওটি পরিষেবাতে পাঠাতে হবে। এবারও আমরা Azure IoT Hub ব্যবহার করব, একই IoT ক্লাউড পরিষেবা যা আমরা আগের প্রজেক্টে ব্যবহার করেছিলাম।
![Sending GPS telemetry from an IoT device to IoT Hub](../../../../images/gps-telemetry-iot-hub.png)
### কাজ - GPS ডেটা IoT Hub এ প্রেরণ
1. নতুন একটি আইওটি হাব খুলতে হবে free tier এর ।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন- থেকে আইওটি হাব তৈরীর নির্দেশাবলি অনুসরণ করা যাবে](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) প্রয়োজনবোধে।
নতুন একটি Resource Group খোলার বিষয়টি মনে রাখতে হবে, যেটির নাম `gps-sensor` দেয়া যায় নতুন IoT Hub এর জন্য একটি ইউনিক নাম যেমন `gps-sensor-<your name>` দেয়া যেতে পারে।
> 💁 যদি পূর্ববর্তী প্রজেক্টে ব্যবহৃত আইওটি হাব থাকে, সেটিও পুনরায় ব্যবহার করা যাবে। এক্ষেত্রে আইওটি হাব এবং রিসোর্স গ্রুপের নাম সঠিকভাবে ব্যবহার করতে হবে সার্ভিস তৈরির সময়।
1. হাবে একটি নতুন ডিভাইস যোগ করি এবং `gps-sensor` নাম দিই। কানেকশন স্ট্রিং টি নোট রাখি
1. আগের ধাপ থেকে ডিভাইস সংযোগ স্ট্রিং ব্যবহার করে নতুন আইওটি হাব -এ জিপিএস ডেটা পাঠাতে ডিভাইস কোড আপডেট করতে হবে।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন- থেকে আইওটি সার্ভিসের সাথে ডিভাইস সংযোজনের নির্দেশাবলি ](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) অনুসরণ করা যাবে।
1. যখন জিপিএস ডেটা প্রেরণ করব, তখন এটি নিম্নলিখিত বিন্যাসে JSON হিসাবে করতে হবে:
```json
{
"gps" :
{
"lat" : <latitude>,
"lon" : <longitude>
}
}
```
1. প্রতি মিনিটে জিপিএস ডেটা পাঠাতে হবে যাতে দৈনিক ম্যাসেজ ব্যবহার এর লিমিট শেষ না হয়।
আমরা যদি Wio টার্মিনাল ব্যবহার কর্রি, তাহলে সমস্ত প্রয়োজনীয় লাইব্রেরি যোগ করতে হবে এবং একটি NTP সার্ভার ব্যবহার করে সময় নির্ধারণ করার প্রয়োজন হবে। গত পাঠ থেকে বিদ্যমান কোড ব্যবহার করে , আমাদের কোডটি দ্বারা নিশ্চিত করতে হবে যে এটি জিপিএস লোকেশন পাঠানোর আগে সিরিয়াল পোর্ট থেকে সমস্ত ডেটা পড়েছে। JSON ডকুমেন্ট তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করি:
```cpp
DynamicJsonDocument doc(1024);
doc["gps"]["lat"] = gps.location.lat();
doc["gps"]["lon"] = gps.location.lng();
```
ভার্চুয়াল আইওটি ডিভাইস ব্যবহার করলে, এটির জন্য প্রয়োজনীয় সমস্ত লাইব্রেরি ইনস্টল করার বিষয়টি মনে রাখতে হবে।
রাস্পবেরি পাই এবং ভার্চুয়াল আইওটি উভয় ডিভাইসের জন্য, অক্ষাংশ এবং দ্রাঘিমাংশের মানগুলি পেতে গত পাঠ থেকে বিদ্যমান কোডটি ব্যবহার করে নিম্নলিখিত কোড সহ তাদের সঠিক JSON ফর্ম্যাটে পাঠাতে হবে:
```python
message_json = { "gps" : { "lat":lat, "lon":lon } }
print("Sending telemetry", message_json)
message = Message(json.dumps(message_json))
```
> 💁 প্রয়োজনীয় সকল কোড [code/wio-terminal](code/wio-terminal), [code/pi](code/pi) বা [code/virtual-device](code/virtual-device) ফোল্ডারে পাওয়া যাবে ।
Run your device code and ensure messages are flowing into IoT Hub using the `az iot hub monitor-events` CLI command.
ডিভাইস কোডটি রান করে নিশ্চিত করতে হবে যে বার্তাগুলি আইওটি হাবের মধ্যে প্রবাহিত হচ্ছে `az iot hub monitor-events` এর মাধ্যমে, সিএলআই কমান্ড ব্যবহার করে।
## Hot, Warm, এবং Cold Path
একটি IoT ডিভাইস থেকে ক্লাউডে প্রবাহিত ডেটা সবসময় রিয়েল টাইমে প্রসেস করা হয় না। কিছু ডেটা রিয়েল টাইম প্রক্রিয়াকরণের প্রয়োজন হয়, কিছু ডেটা অল্প কিছুক্ষণ পরে প্রক্রিয়া করা যায়, এবং অন্যান্য ডেটা অনেক পরে প্রক্রিয়া করলেও হয়। বিভিন্ন সময়ে ডেটা প্রক্রিয়া করে এমন বিভিন্ন পরিষেবাতে তথ্য প্রবাহকে Hot, Warm এবং Cold Path বলা হয়।
### Hot Path
হট পাথ (Hot Path) এমন ডেটা বোঝায় যা রিয়েল টাইমে বা রিয়েল টাইমের কাছাকাছি সময়েই প্রক্রিয়াকরণের প্রয়োজন হয়। এলার্ট দেয়ার জন্য যেমন - যে কোনও গাড়ি একটি ডিপোর কাছে আসছে অথবা একটি রেফ্রিজারেটেড ট্রাকের তাপমাত্রা খুব বেশি এমন পরিস্থিতির মোকাবেলা করতে সতর্কতার জন্য হট পাথ ডেটা ব্যবহার করা হয়।
হট পাথ ডেটা ব্যবহার করার জন্য, ক্লাউড পরিষেবাগুলি কোড পাওয়ার সাথে সাথে আমাদের ইভেন্টগুলিতে সাড়া দেবে।
### Warm path
উষ্ণ পথ (Warm path) বলতে এমন তথ্যকে বোঝায় যা প্রাপ্তির পরে অল্প কিছুক্ষণ সময় নিয়ে প্রক্রিয়া করা যায়, উদাহরণস্বরূপ রিপোর্টিং বা স্বল্পমেয়াদী বিশ্লেষণ। আগের দিনের সংগৃহীত ডেটা ব্যবহার করে গাড়ির মাইলেজের দৈনিক রিপোর্টের জন্য এই ধরণের পদ্ধতি ব্যবহার করা হয়।
ক্লাউড সার্ভিসের মাধ্যমে এই ডেটা এমনভাবে স্টোর করা হয় যাতে দ্রুত অ্যাক্সেস করা যায়।
### Cold path
ঠান্ডা পথ (Cold path) বলতে ঐতিহাসিক তথ্য বোঝায়, দীর্ঘমেয়াদে তথ্য সংরক্ষণ করে যখনই প্রয়োজন হয় তখন বিশ্লেষণ করা হবে। উদাহরণস্বরূপ, যানবাহনের বার্ষিক মাইলেজ রিপোর্ট পেতে ঠান্ডা পথ ব্যবহার করা যায় অথবা জ্বালানি খরচ কমানোর জন্য সবচেয়ে অনুকূল রুট খুঁজে বের করার জন্য রুট বিশ্লেষণ চালাতেও এটি ব্যবহার করা যায় ।
কোল্ড পাথ ডেটা সাধারণত data warehouse এ সংরক্ষিত হয় - ডেটাগুলির বড় পরিমাণে সংরক্ষণের জন্য ডিজাইন করা ডেটাবেস যা কখনও পরিবর্তন হবে না এবং দ্রুত এবং সহজেই কুয়েরি করা যাবে। সাধারণত ক্লাউড অ্যাপ্লিকেশনে নিয়মিতভাবে প্রতিদিন, সপ্তাহ বা মাসে একটি নিয়মিত সময়ে চলবে উষ্ণ পথের স্টোরেজ থেকে ওয়্যারহাউসে এই ডেটা স্থানান্তর করার কাজ।
✅ এই পাঠগুলিতে আমরা এখন পর্যন্ত যে ডেটা ক্যাপচার করেছি সে সম্পর্কে চিন্তা করি। এগুলো কি hot, warm নাকি cold path এর তথ্য?
## সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা
একবার আমাদের আইওটি হাবের মধ্যে ডেটা প্রবাহিত হয়ে গেলে, ইভেন্ট-হাব সামঞ্জস্যপূর্ণ এন্ডপয়েন্টে প্রকাশিত ইভেন্টগুলি শোনার জন্য কিছু সার্ভারলেস কোড লিখতে পারবো। এটি উষ্ণ পথে ডেটা সংরক্ষণ করা হবে এবং পরবর্তী পাঠে যাত্রার প্রতিবেদন তৈরী করার জন্য ব্যবহার করা হবে।
![Sending GPS telemetry from an IoT device to IoT Hub, then to Azure Functions via an event hub trigger](../../../../images/gps-telemetry-iot-hub-functions.png)
### কাজ - সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা
1. Azure Functions CLI ব্যবহার করে একটি Azure Functions অ্যাপ তৈরি করি। পাইথন রানটাইম ব্যবহার করি এবং এটি একটি ফোল্ডারে তৈরি করি যার নাম `gps-trigger` এবং ফাংশন অ্যাপ প্রজেক্টের নামের জন্য একই নাম ব্যবহার করতে হবে। Virtual environment তৈরীর বিষয়টি নিশ্চিত করতে হবে।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে আইওটি সার্ভিসের সাথে সার্ভারলেস এপ্লিকেশন তৈরীর নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) অনুসরণ করা যাবে।
1. Add an IoT Hub event trigger that uses the IoT Hub's Event Hub compatible endpoint.
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে আইওটি হাব ইভেন্ট ট্রিগার তৈরীর নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) অনুসরণ করা যাবে।
1. ইভেন্ট হাব সামঞ্জস্যপূর্ণ এন্ডপয়েন্ট সংযোগ স্ট্রিং সেট করতে হবে `local.settings.json` ফাইলে এবং `function.json` ফাইলের জন্য সেই এন্ট্রির KEY ব্যবহার করতে হবে।
1. এক্ষেত্রে Azurite app ব্যবহার করতে হবে local storage emulator হিসেবে।
1. জিপিএস ডিভাইস থেকে ইভেন্ট গ্রহণ করছে কিনা তা নিশ্চিত করতে ফাংশন অ্যাপটি চালাতে হবে। এখান থেকেই নিশ্চিত করা যাবে যে আইওটি ডিভাইসটি চলছে এবং জিপিএস ডেটা পাঠাচ্ছে।
```output
Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}}
```
## Azure স্টোরেজ অ্যাকাউন্ট
![The Azure Storage logo](../../../../images/azure-storage-logo.png)
Azure স্টোরেজ অ্যাকাউন্ট একটি সাধারণ উদ্দেশ্যে (General Purpose) ব্যবহৃত স্টোরেজ পরিষেবা যা বিভিন্ন উপায়ে ডেটা সংরক্ষণ করতে পারে। আমরা ব্লব হিসাবে, সারিতে, টেবিলে বা ফাইল হিসাবে ডেটা সংরক্ষণ করতে পারি।
### Blob storage
*ব্লব* মানে হলো বাইনারি বড় বস্তু (binary large objects) তবে যেকোন কাঠামোবিহীন ডেটার জন্য এই শব্দ ব্যবহৃত হয়। আইওটি ডেটা ধারণকারী JSON ডকুমেন্ট থেকে শুরু করে ইমেজ এবং মুভি ফাইলগুলিতেও ব্লব স্টোরেজে যেকোন ডেটা সংরক্ষণ করা যায়। ব্লব স্টোরেজে *কনটেইনার* এর ধারণা রয়েছে, এগুলো নামযুক্ত বাকেট/পাত্র যার মধ্যে ডেটা সংরক্ষণ করা যায়, একটি রিলেশনাল ডাটাবেজে টেবিলের মতো। এই পাত্রে ব্লব সংরক্ষণের জন্য এক বা একাধিক ফোল্ডার থাকতে পারে এবং প্রতিটি ফোল্ডারে অন্যান্য ফোল্ডার থাকতে পারে, যেভাবে কম্পিউটারের হার্ডডিস্কে ফাইল সংরক্ষণ করা হয়।
IoT ডেটা সংরক্ষণ করতে আমরা এই পাঠে ব্লব স্টোরেজ ব্যবহার করব।
✅ কিছু গবেষণা করা যাক:[Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি।
### Table storage
টেবিল স্টোরেজ আমাদের আধা কাঠামোগত ডেটা সংরক্ষণ করতে দেয়। টেবিল স্টোরেজ আসলে একটি NoSQL ডাটাবেস, তাই টেবিলের একটি সংজ্ঞায়িত সেট প্রয়োজন হয় না, কিন্তু এটি এক বা একাধিক টেবিলে ডেটা সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে, প্রতিটি সারির সংজ্ঞা দিতে অনন্য কী (unique key) দিয়ে।
✅ কিছু গবেষণা করা যাক: [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি।
### Queue storage
কিউ স্টোরেজ একটি সারিতে 64KB আকারের বার্তা সংরক্ষণ করতে দেয়। আমরা সারির পিছনের দিকে বার্তা যোগ করতে পা্রি এবং সেগুলি আবার সামনে থেকে পড়তে পারি। Queue এখানে বার্তাগুলিকে অনির্দিষ্টকালের জন্য সংরক্ষণ করে যতক্ষণ স্টোরেজ স্পেস রয়েছে, তাই এটি বার্তাগুলিকে দীর্ঘমেয়াদী সংরক্ষণ করতে দেয়। তারপর যখন প্রয়োজন হয় তা ব্যবহার করা যায়। উদাহরণস্বরূপ, যদি জিপিএস ডেটা প্রসেস করার জন্য একটি মাসিক কাজ চালাতে হয়, তাহলে প্রতিদিন এটিকে এক মাসের জন্য সারিতে যোগ করতে পারবো, তারপর মাসের শেষে সারির সব বার্তা একসাথে প্রক্রিয়া করতে পারবো।
✅ কিছু গবেষণা করা যাক: [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি।
### File storage
ফাইল স্টোরেজ হল ক্লাউডে ফাইলের স্টোরেজ এবং যে কোনও অ্যাপ বা ডিভাইস স্বীকৃত স্ট্যান্ডার্ড প্রোটোকল ব্যবহার করে সংযোগ করতে পারে। আমরা ফাইল স্টোরেজে আমাদের তথ্য রাখতে পারি, তারপরে পিসি বা ম্যাকের ড্রাইভ হিসাবে মাউন্ট করা যায়।
✅ কিছু গবেষণা করা যাক: [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি।
## সার্ভারবিহীন কোডকে স্টোরেজে সংযুক্তকরণ
আইওটি হাব থেকে বার্তাগুলি সঞ্চয় করতে আমাদের ফাংশন অ্যাপটিকে এখন ব্লব স্টোরেজের সাথে সংযুক্ত করতে হবে। এটি করার 2 টি উপায় রয়েছে:
* ফাংশন কোডের ভিতরে, আমাদের ব্লব স্টোরেজ Python SDK ব্যবহার করে ব্লব স্টোরেজে সংযোগ করতে হবে এবং ডেটা ব্লব হিসাবে রাখতে হবে।
* আমাদের একটি আউটপুট ফাংশন বাইন্ডিং ব্যবহার করতে হবে ফাংশনের রিটার্ন ভ্যালু ব্লোব স্টোরেজে বাইন্ড করতে এবং এক্ষেত্রে ব্লবটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করতে হবে।
এই পাঠে, আমরা ব্লব স্টোরেজের সাথে কীভাবে যোগাযোগ করতে হয় তা দেখতে Python SDK ব্যবহার করব।
![Sending GPS telemetry from an IoT device to IoT Hub, then to Azure Functions via an event hub trigger, then saving it to blob storage](../../../../images/save-telemetry-to-storage-from-functions.png)
নিম্নলিখিত ফরম্যাটে ডেটা একটি JSON ব্লব হিসাবে সংরক্ষণ করা হবে:
```json
{
"device_id": <device_id>,
"timestamp" : <time>,
"gps" :
{
"lat" : <latitude>,
"lon" : <longitude>
}
}
```
### কাজ - সার্ভারবিহীন কোডকে স্টোরেজে সংযুক্তকরণ
1. একটি Azure স্টোরেজ অ্যাকাউন্ট তৈরি করে এমন একটি নাম দিই `gps<your name>`.
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে স্টোরেজ একাউন্ট তৈরীর নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---create-the-cloud-resources) অনুসরণ করা যাবে।
যদি এখনও পূর্ববর্তী প্রজেক্টে্র স্টোরেজ অ্যাকাউন্ট থাকে,এটি পুনরায় ব্যবহার করা যাবে।
> 💁 এই পাঠে আমরা আমাদের Azure Functions অ্যাপটি স্থাপন করতে একই স্টোরেজ অ্যাকাউন্ট ব্যবহার করতে পারব।
1. স্টোরেজ অ্যাকাউন্টের জন্য সংযোগ স্ট্রিং পেতে নিম্নলিখিত কমান্ডটি চালাই:
```sh
az storage account show-connection-string --output table \
--name <storage_name>
```
এক্ষেত্রে `<storage_name>` এর পরিবর্তে আগের ধাপে আমাদের ব্যবহৃত স্টোরেজ এর নামটি বসাতে হবে।
1. `local.settings.json` ফাইলে স্টোরেজ একাউন্টের কানেকশন জন্য নতুন এন্ট্রি দিতে হবে, আগের ধাপের ভ্যালু ব্যবহার করে। এটির নাম দিই `STORAGE_CONNECTION_STRING`
1. এরপর `requirements.txt` এ স্টোরেজ পিপ প্যাকেজ ইন্সটল করার জন্য নিম্নের অংশ যোগ করি
```sh
azure-storage-blob
```
ভার্চুয়াল এনভায়রনমেন্টে এই ফাইল থেকে প্যাকেজ ইনস্টল করতে হবে।
> যদি কোন এরর থাকে, তাহলে আমাদের আমাদের ভার্চুয়াল পরিবেশে আমাদের পিপ সংস্করণটি নিম্নোক্ত কমান্ড দিয়ে সর্বশেষ সংস্করণে আপগ্রেড করা উচিত, তারপর আবার চেষ্টা করতে হবে:
>
> ```sh
> pip install --upgrade pip
> ```
1. এখানে `__init__.py` ফাইলে `iot-hub-trigger` এ নিম্নের ইম্পোর্ট স্টেটমেন্ট দিতে হবেঃ
```python
import json
import os
import uuid
from azure.storage.blob import BlobServiceClient, PublicAccess
```
JSON পড়তে এবং লিখতে `json` সিস্টেম মডিউল ব্যবহার করা হবে,`os` সিস্টেম মডিউলটি সংযোগ স্ট্রিং পড়ার জন্য ব্যবহার করা হবে, `uuid` সিস্টেম মডিউলটি GPS পড়ার জন্য একটি অনন্য আইডি তৈরি করতে ব্যবহৃত হবে।
আর `azure.storage.blob` প্যাকেজটিতে Python SDK রয়েছে blob storage এর সাথে কাজ করার জন্য।
1. এখন `main` মেথডের আগেই,নিম্নলিখিত হে্লপার ফাংশন যোগ করি:
```python
def get_or_create_container(name):
connection_str = os.environ['STORAGE_CONNECTION_STRING']
blob_service_client = BlobServiceClient.from_connection_string(connection_str)
for container in blob_service_client.list_containers():
if container.name == name:
return blob_service_client.get_container_client(container.name)
return blob_service_client.create_container(name, public_access=PublicAccess.Container)
```
পাইথন ব্লব এসডিকে তে যদি কোন কন্টেইনার না থাকে তবে একটি কন্টেইনার তৈরি করার জন্য কোন সহায়ক পদ্ধতি নেই। এই কোডটি `local.settings.json` ফাইল থেকে সংযোগ স্ট্রিং লোড করবে (অথবা অ্যাপ্লিকেশন সেটিংস যা ক্লাউডে রয়েছে তা থেকে ), তারপর ব্লব স্টোরেজ অ্যাকাউন্টের সাথে ইন্টারঅ্যাক্ট করার জন্য এটি থেকে একটি` BlobServiceClient` ক্লাস তৈরি করতে হবে। এটি ব্লব স্টোরেজ অ্যাকাউন্টের জন্য সমস্ত পাত্রে লুপ করে, প্রদত্ত নামের সাথে মিলিয়ে সন্ধান করে - যদি এটি একটি খুঁজে পায় তবে এটি একটি 'কনটেইনার ক্লায়েন্ট' ক্লাস ফিরিয়ে দেবে যা ব্লব তৈরি করতে কন্টেইনারের সাথে যোগাযোগ করতে পারে। যদি এটি খুঁজে না পায়, তাহলে কন্টেইনার তৈরি করা হয় এবং নতুন পাত্রে ক্লায়েন্ট রিটার্ন করা হয়।
যখন নতুন কন্টেইনার তৈরি করা হয়, তখন এতে থাকা ব্লবগুলি কুয়েরি করার জন্য সর্বজনীন অ্যাক্সেস দেওয়া হয়। এটি একটি মানচিত্রে জিপিএস ডেটা প্রদর্শন করার জন্য পরবর্তী পাঠে ব্যবহার করা হবে।
1. এই কোডের সাহায্যে আমরা প্রতিটি ইভেন্ট সংরক্ষণ করতে চাই (যা মাটির আর্দ্রতা সংরক্ষণের মত নয়), তাই লগিং স্টেটমেন্টের নীচে `মেইন` ফাংশনে `for event in events:` ল্যুপে নিম্নের কোড যোগ করি:
```python
device_id = event.iothub_metadata['connection-device-id']
blob_name = f'{device_id}/{str(uuid.uuid1())}.json'
```
এই কোডটি ইভেন্ট মেটাডেটা থেকে ডিভাইস আইডি পায়, তারপর এটি একটি ব্লব নাম তৈরি করতে ব্যবহার করে। ব্লবগুলি ফোল্ডারে সংরক্ষণ করা যেতে পারে এবং ফোল্ডারের নামের জন্য ডিভাইস আইডি ব্যবহার করা হবে, তাই প্রতিটি ডিভাইসে তার সমস্ত জিপিএস ইভেন্ট একটি ফোল্ডারে থাকবে। ব্লব নামটি এই ফোল্ডার, এর পরে একটি ডকুমেন্টের নাম, ফরওয়ার্ড স্ল্যাশ দিয়ে আলাদা, লিনাক্স এবং ম্যাকওএস পাথের মতো (উইন্ডোজের মতোই, তবে উইন্ডোজ ব্যাক স্ল্যাশ ব্যবহার করে)। ডকুমেন্টের নাম হল একটি ইউনিক আইডি যা পাইথন `uuid` মডিউল ব্যবহার করে তৈরি করা হয়, যার ফাইল টাইপ `json` থাকে।
যেমন, `gps-sensor` ডিভাইস ID এর জন্য, ব্লবের নাম হতে পারে`gps-sensor/a9487ac2-b9cf-11eb-b5cd-1e00621e3648.json` ।
1. এরপর নীচের কোড যোগ করি:
```python
container_client = get_or_create_container('gps-data')
blob = container_client.get_blob_client(blob_name)
```
এরপর `get_or_create_container` হেল্পার ক্লাস ব্যবহার করে, এই কোডটি কন্টেইনার ক্লায়েন্ট পায় এরপর blob name ব্যবহার করে ব্লব ক্লায়েন্ট অবজেক্ট পায়। এই ব্লব ক্লায়েন্টগুলো বিদ্যমান ব্লব, অথবা এই ক্ষেত্রে, নতুন ব্লবকে রেফার করতে পারে।
1. তারপর নীচের কোড যোগ করি:
```python
event_body = json.loads(event.get_body().decode('utf-8'))
blob_body = {
'device_id' : device_id,
'timestamp' : event.iothub_metadata['enqueuedtime'],
'gps': event_body['gps']
}
```
এটি ব্লবের বডি তৈরি করে যাতে ব্লব স্টোরেজে লেখা হবে। এটি একটি JSON ডকুমেন্ট যা ডিভাইসের আইডি, টেলিমেট্রি আইওটি হাব -এ পাঠানোর সময় এবং জিপিএস টেলিমেট্রি থেকে সমন্বয় করে।
> 💁 বার্তা প্রেরণ এর সময় জানার জন্য বর্তমান সময় ব্যবহার না করে বরং এই ম্যাসেজগুলোর enqueued time বিবেচনায় নেয়া গুরুত্বপূর্ণ। ফাংশন অ্যাপ চালু না থাকলে এটি গৃহিত হওয়ার আগে কিছুক্ষণের জন্য আইওটি হাবে থাকতে পারে।
1. এবার নীচের কোড যোগ করি:
```python
logging.info(f'Writing blob to {blob_name} - {blob_body}')
blob.upload_blob(json.dumps(blob_body).encode('utf-8'))
```
এই কোডটি লগ করে যে একটি ব্লব তার বিশদ বিবরণ সহ তৈরী হতে চলেছে, তারপর নতুন ব্লবের বিষয়বস্তু হিসাবে ব্লব বডি আপলোড করে।
1. এখন ফাংশন অ্যাপ রান করি। আউটপুটে সমস্ত জিপিএস ইভেন্টের জন্য ব্লব লেখা দেখা যাবে:
```output
[2021-05-21T01:31:14.325Z] Python EventHub trigger processed an event: {"gps": {"lat": 47.73092, "lon": -122.26206}}
...
[2021-05-21T01:31:14.351Z] Writing blob to gps-sensor/4b6089fe-ba8d-11eb-bc7b-1e00621e3648.json - {'device_id': 'gps-sensor', 'timestamp': '2021-05-21T00:57:53.878Z', 'gps': {'lat': 47.73092, 'lon': -122.26206}}
```
> 💁 সতর্ক থাকতে হবে যে আমরা একই সময়ে IoT Hub ইভেন্ট মনিটরটি চালাচ্ছি না।
> 💁 সকল কোড [code/functions](code/functions) ফোল্ডারে রয়েছে।
### কাজ - আপলোড করা ব্লব যাচাইকরণ
1. তৈরি ব্লবগুলি দেখতে, আমরা [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer/?WT.mc_id=academic-17441-jabenn),একটি ফ্রি টুল যা স্টোরেজ অ্যাকাউন্টগুলি দেখতে এবং পরিচালনা করতে দেয় তা ব্যবহার করতে পারি অথবা সরাসরি CLI থেকেও কাজ করা যায়।
1. CLI ব্যবহার করার জন্য প্রথমে একটি অ্যাকাউন্ট কী (KEY) প্রয়োজন হবে। এই কী পেতে নিম্নলিখিত কমান্ডটি চালাই:
```sh
az storage account keys list --output table \
--account-name <storage_name>
```
`<storage_name>` এর স্থলে আমাদের ব্যবহৃত স্টোরেজের নামটিই দিতে হবে।
`key1` এর ভ্যালু কপি করে রাখি।
1. কন্টেইনারে ব্লবগুলি তালিকাভুক্ত করতে নিম্নলিখিত কমান্ডটি চালাইঃ
```sh
az storage blob list --container-name gps-data \
--output table \
--account-name <storage_name> \
--account-key <key1>
```
`<storage_name>` এর স্থলে আমাদের ব্যবহৃত স্টোরেজের নামটিই দিতে হবে এবং `<key1>` এর জায়গায় আগের ধাপে কপি করা মানটি বসাতে হবে।
এটি সমস্ত ব্লবগুলি তালিকাভুক্ত করবে:
```output
Name Blob Type Blob Tier Length Content Type Last Modified Snapshot
---------------------------------------------------- ----------- ----------- -------- ------------------------ ------------------------- ----------
gps-sensor/1810d55e-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:27+00:00
gps-sensor/18293e46-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
gps-sensor/1844549c-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
gps-sensor/1894d714-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
```
1. নিম্নলিখিত কমান্ড ব্যবহার করে একটি ব্লব ডাউনলোড করি:
```sh
az storage blob download --container-name gps-data \
--account-name <storage_name> \
--account-key <key1> \
--name <blob_name> \
--file <file_name>
```
`<storage_name>` এর স্থলে আমাদের ব্যবহৃত স্টোরেজের নামটিই দিতে হবে এবং `<key1>` এর জায়গায় আগের ধাপে কপি করা মানটি বসাতে হবে।
আর `<blob_name>` এর পরিবর্তে কাজের পূর্ববর্তী ধাপের `Name` কলামের আউটপুটটি বসাই ফোল্ডারের নাম সহ। এক্ষেত্রে ব্লব সংরক্ষণ করতে `<file_name>` এর জায়গায় একটি লোকাল ফাইলের জন্য নাম দিই।
একবার ডাউনলোড হয়ে গেলে, আমরা VS কোডে JSON ফাইলটি খুলতে পারব এবং আমরা জিপিএস অবস্থানের বিবরণ সহ ব্লব দেখতে পাব:
```json
{"device_id": "gps-sensor", "timestamp": "2021-05-21T00:57:53.878Z", "gps": {"lat": 47.73092, "lon": -122.26206}}
```
### কাজ - ক্লাউডে ফাংশন এপ ডেপ্লয় করা
এখন যেহেতু ফাংশন অ্যাপটি কাজ করছে, আমরা এটিকে ক্লাউডে ডেপ্লয় করতে পারি।
1. আগে তৈরি করা স্টোরেজ অ্যাকাউন্ট ব্যবহার করে নতুন Azure ফাংশন অ্যাপ তৈরি করা যাক। এটির নাম দিই `gps-sensor-` এবং এর শেষে কোন ইউনিক নাম বা সংখ্যা যোগ করে দিই।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে ফাংশন ডেপ্লয় করার নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---create-the-cloud-resources) অনুসরণ করা যাবে।
1. `IOT_HUB_CONNECTION_STRING` এবং `STORAGE_CONNECTION_STRING` ভ্যালুগুলো এপ্লিকেশন সেটিংস এ আপলোড করি।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে এপ্লিকেশন সেটিংস আপলোড করার নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---upload-your-application-settings) অনুসরণ করা যাবে।
1. ্লোকাল ফাংশন এপ কে ক্লাউডে ডেপ্লয় করি।
> ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে ফাংশন এপ কে ক্লাউডে ডেপ্লয় করার নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---deploy-your-functions-app-to-the-cloud) অনুসরণ করা যাবে।
---
## 🚀 চ্যালেঞ্জ
জিপিএস ডেটা পুরোপুরি সঠিক নয়, এবং সনাক্ত করা অবস্থানগুলি কয়েক মিটার পর্যন্ত ভুল হতে পারে, আর টানেল এবং লম্বা ভবনের এলাকায় তা আরো বেশি হয়ে থাকে।
স্যাটেলাইট নেভিগেশন কীভাবে এটি কাটিয়ে উঠতে পারে সে সম্পর্কে চিন্তা করি। আমাদের sat-nav এর কোন ডেটা আছে যা এটি আমাদেরকে অবস্থানে্র ব্যাপারে আরও ভাল ভবিষ্যদ্বাণী করতে দেয়?
## লেকচার-পরবর্তী কুইজ
[লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/24)
## রিভিউ এবং স্ব-অধ্যয়ন
* কাঠামোগত ডেটা এর ব্যাপারে [Data model - Wikipedia](https://wikipedia.org/wiki/Data_model) থেকে পড়তে পারি।
* Semi-structured ডেটা এর ব্যাপারে [Semi-structured data - Wikipedia](https://wikipedia.org/wiki/Semi-structured_data) থেকে পড়তে পারি।
* কাঠামোবিহীন ডেটা এর ব্যাপারে [Unstructured data - Wikipedia](https://wikipedia.org/wiki/Unstructured_data) থেকে পড়তে পারি।
* Azure Storage এবং বিভিন্ন ধরণের স্টোরেজ সম্পর্কে [Azure Storage documentation](https://docs.microsoft.com/azure/storage/?WT.mc_id=academic-17441-jabenn) থেকে পড়তে পারি।
## এসাইনমেন্ট
[ফাংশন বাইন্ডিং পর্যালোচনা](assignment.bn.md)

@ -1,468 +0,0 @@
# 위치 데이터 저장
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-12.jpg)
> [Nitya Narasimhan](https://github.com/nitya)의 스케치노트. 크게 보려면 클릭하세요.
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23)
## 개요
지난 강의에서는 위치 정보를 캡처하기 위한 GPS 센서 사용법에 대해 배웠습니다. 이 데이터를 사용하여 음식을 실은 트럭으 위치와 이동 경로를 시각화 하기 위해서는 이 데이터가 클라우드의 IoT 서비스로 전송하고 어딘가에 저장해야 합니다.
이 강의에서는 IoT 데이터를 저장하는 다양한 방법과 서버리스 코드를 이용하여 IoT 서비스의 데이터를 저장하는 방법에 대해 배웁니다.
이 강의에서는 다음을 배웁니다:
- [정형 및 비정형 데이터](#정형-및-비정형-데이터)
- [IoT Hub로 GPS 데이터 전송하기](#IoT-Hub로-GPS-데이터-전송하기)
- [Hot, Warm, Cold 경로](#hot,-warm-cold-경로)
- [서버리스 코드를 이용한 GPS 이벤트 처리](#서버리스-코드를-이용한-GPS-이벤트-처리)
- [Azure Storage 계정](#Azure-Storage-계정)
- [서버리스 코드와 저장소 연결하기](#서버리스-코드와-저장소-연결하기)
## 정형 및 비정형 데이터
컴퓨터 시스템은 데이터를 다루고, 이 데이터는 다양한 모양과 크기로 제공됩니다. 단일 숫자에서 많은 양의 텍스트, 비디오 및 이미지, IoT 데이터까지 다양합니다. 데이터는 _정형 데이터__비정형 데이터_ 두 가지 중 하나로 나눌 수 있습니다.
- **정형 데이터**는 변경되지 않는 잘 정의되고 엄격한 구조를 가진 데이터로, 일반적으로 관계가 있는 데이터 테이블에 매핑됩니다. 이름, 생년월일, 주소를 포함한 개인 정보를 예로 들 수 있습니다.
- **비정형 데이터** 는 잘 정의되고 엄격한 구조가 없는 데이터로, 자주 구조가 변경될 수 있는 데이터입니다. 문서나 스프레드 시트와 같은 것을 예로 들 수 있습니다.
✅ 조사해봅시다 : 정형 데이터와 비정형 데이터의 다른 예를 생각해 볼 수 있습니까?
> 💁 구조화는 되었지만 고정된 테이블에 맞지 않는 반정형 데이터도 존재합니다.
IoT 데이터는 주로 비정형 데이터로 간주됩니다.
대규모 상업 농장의 차량에 IoT 장치를 추가한다고 생각해봅시다. 차량 유형에 따라 다른 장치를 사용하기를 원할 것입니다. 예를 들어:
- 트랙터와 같은 농업용 차량의 경우 올바른 밭에서 동작하는지 확인하기 위한 GPS 데이터가 필요합니다.
- 식량을 창고로 나르는 배달 트럭의 경우 GPS 데이터는 물론이고 운전자가 안전하게 운전할 수 있도록 속도 및 가속 데이터를 제공하고, 운전자 식별 및 시작/정지 데이터를 제공하여 운전자가 근무 시간에 대한 현지 법률을 준수하도록 보장해야 합니다.
- 냉장 트럭의 경우 음식이 너무 뜨겁거나 차갑지 않고 운송 중에 상하지 않도록 온도 데이터도 필요합니다.
이러한 데이터는 지속적으로 변합니다. 예를 들어, 트럭 운전실에 IoT 장치가 있다면 트레일러가 변경된다면 전송하는 데이터가 변경될 수 있습니다. 예를 들어 냉장 트레일러를 사용할 때만 온도 데이터를 전송합니다.
✅ 다른 캡처되는 IoT 데이터 어떤 것이 있을까요? 트럭이 운반할 수 있는 화물의 종류와 유지 관리 데이터에 대해 생각해 보십시오.
이 데이터는 차량에 따라 변하지만 처리를 위해 모두 동일한 IoT 서비스로 전송됩니다. IoT 서비스는 이 비정형 데이터를 검색하거나 분석할 수 있는 방식으로 저장하면서 이 데이터와 다른 구조로도 작동할 수 있어야 합니다.
### SQL vs NoSQL 스토리지
데이터베이스는 데이터를 저장하고 쿼리할 수 있는 서비스입니다. 데이터 베이스는 SQL과 NoSQL 2개의 타입으로 나뉩니다.
#### SQL 데이터베이스
첫 번째 데이터베이스는 관계형 데이터베이스 관리 시스템(RDBMS) 또는 관계형 데이터베이스입니다. 이는 데이터를 추가, 제거, 업데이트 또는 쿼리하기 위해 SQL(Structured Query Language)을 사용하여 SQL 데이터베이스라고도 합니다. 이러한 데이터베이스는 스프레드시트와 유사한 잘 정의된 데이터 테이블 집합인 스키마로 구성됩니다. 각 테이블에는 여러 개의 명명된 열이 있습니다. 데이터를 삽입할 때 테이블에 행을 추가하여 각 열에 값을 넣습니다. 이렇게 하면 데이터가 매우 엄격한 구조로 유지됩니다. 열을 비워 둘 수 있지만 새 열을 추가하려면 데이터베이스에서 이 작업을 수행하여 기존 행의 값을 채워야 합니다. 이러한 데이터베이스는 한 테이블이 다른 테이블과 관계를 가질 수 있다는 점에서 관계형이라고 합니다.
![구매 테이블의 사용자 ID 열과 관련된 User 테이블의 ID와 구매 테이블의 제품 ID와 관련된 제품 테이블의 ID가 있는 관계형 데이터베이스](../../../../images/sql-database.png)
예를 들어, 사용자 개인 정보를 테이블에 저장한 경우 사용자 이름과 주소가 포함된 테이블의 행에 사용되는 사용자당 내부 고유 ID가 있을 수 있습니다. 그런 다음 해당 사용자에 대한 구매 정보와 같은 다른 세부 정보를 다른 테이블에 저장하려는 경우, 해당 사용자 ID에 대한 하나의 열이 새 테이블에 저장됩니다. 사용자를 조회할 때 사용자 ID를 사용하여 한 테이블에서 사용자의 개인 정보를 가져오고 다른 테이블에서 구입한 사용자의 정보를 가져올 수 있습니다.
SQL 데이터베이스는 정형 데이터를 저장하고 데이터와 스키마가 매치하는지 확인하고자 하는 경우에 이상적입니다.
✅ 이전에 SQL을 사용해본 적이 없다면 잠시 시간을 내어 [SQL page on Wikipedia](https://wikipedia.org/wiki/SQL)에서 읽어보세요.
잘 알려진 SQL 데이터베이스로는 Microsoft SQL Server, MySQL, PostgreSQL이 있습니다.
✅ 조사해봅시다 : 이러한 몇몇 SQL 데이터베이스 및 기능에 대해 읽어봅시다.
#### NoSQL 데이터베이스
NoSQL 데이터베이스는 SQL 데이터베이스와 동일한 엄격한 구조를 가지고 있지 않기 때문에 NoSQL이라 불립니다. 또한 문서와 같은 구조화되지 않은 데이터를 저장할 수 있으므로 문서 데이터베이스라고도 불립니다.
> 💁 이름과는 무관하게 일부 NoSQL 데이터베이스에서는 SQL을 사용하여 데이터를 쿼리할 수 있습니다.
![NoSQL 데이터베이스의 폴더에 있는 문서](../../../../images/noqsl-database.png)
NoSQL 데이터베이스에는 데이터 저장 방법을 제한하는 미리 정의된 스키마가 없으며, 대신 일반적으로 JSON 문서를 사용하여 비정형 데이터를 삽입할 수 있습니다. 이러한 문서는 컴퓨터의 파일과 유사하게 폴더로 구성할 수 있습니다. 각 문서는 다른 문서와 다른 필드를 가질 수 있습니다. 예를 들어, 농장 차량의 IoT 데이터를 저장하는 경우 일부는 가속도계 및 속도 데이터를 위한 필드를 가질 수 있고, 다른 일부는 트레일러의 온도를 위한 필드를 가질 수 있습니다. 운반되는 농산물의 무게를 추적하기 위해 척도가 내장된 트럭과 같은 새로운 트럭 유형을 추가하는 경우, IoT장치가 해당 새로운 필드를 추가할 수 있고 그것은 데이터베이스를 변경하지 않고 저장될 수 있습니다.
잘 알려진 NoSQL 데이터베이스에는 Azure CosmosDB, MongoDB, CouchDB가 있습니다.
✅ 조사해봅시다 : 이러한 몇몇 NoSQL 데이터베이스 및 기능에 대해 읽어봅시다.
이 강의에서는 IoT 데이터를 저장하기 위해 NoSQL을 사용합니다.
## IoT Hub로 GPS 데이터 전송하기
지난 강의에서는 IoT 장치에 연결된 GPS 센서로부터 GPS 데이터를 캡처했습니다. IoT 데이터를 클라우드에 저장하기 위해서 그것을 IoT 서비스로 보내야합니다. 이전 프로젝트에서 사용한 것과 동일한 IoT 클라우드 서비스인 Azure IoT Hub를 다시 한 번 사용하게 됩니다.
![IoT 장치에서 IoT 허브로 GPS 원격 측정 전송](../../../../images/gps-telemetry-iot-hub.png)
### 작업 - GPS 데이터를 IoT Hub로 전송하기
1. free 티어를 사용해서 새로운 IoT Hub를 생성합니다.
> ⚠️ 필요하다면 [프로젝트 2의 Lesson 4에서 IoT Hub 생성을 위한 지침](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) 을 참조할 수 있습니다.
새로운 리소스 그룹을 생성해야합니다. 새 리소스 그룹을 `gps-sensor`라고 지정하고, 새로운 IoT Hub의 이름을 `gps-sensor-<your name>`과 같이 `gps-sensor`에 기반한 고유한 이름으로 지정합니다.
> 💁 이전 프로젝트에서 사용한 IoT Hub를 가지고 있다면 그것을 재사용해도 좋습니다. 다른 서비스를 만들 때 이 IoT Hub의 이름과 해당 서비스가 속한 리소스 그룹을 사용해야 합니다.
1. IoT Hub에 새 장치를 추가합니다. 해당 장치를 `gps-sensor`라 부릅니다. 장치의 연결 문자열을 가져옵니다.
1. 이전 단계의 장치 연결 문자열을 사용하여 GPS 데이터를 새로운 IoT 허브로 전송하도록 디바이스 코드를 업데이트합니다.
> ⚠️ 필요한 경우 [프로젝트 2의 lesson 4에서 IoT와 장치를 연결하는 방법](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service)을 참조할 수 있습니다.
1. GPS data를 전송할 때 다음 형식의 JSON으로 보냅니다:
```json
{
"gps" :
{
"lat" : <latitude>,
"lon" : <longitude>
}
}
```
1. GPS 데이터를 1분마다 보내서 일일 메세지 할당량을 모두 사용하지 않도록 합니다.
Wio Terminal을 사용한다면 필요한 라이브러리들을 모두 추가하고 NTP serer에서 사용하여 시간을 설정해야 합니다. 또한 코드는 지난 수업의 기존 코드를 사용하여 GPS 위치를 보내기 전에 직렬 포트에서 모든 데이터를 읽었는지 확인해야 합니다. 다음 코드를 사용하여 JSON 문서를 생성합니다:
```cpp
DynamicJsonDocument doc(1024);
doc["gps"]["lat"] = gps.location.lat();
doc["gps"]["lon"] = gps.location.lng();
```
가상 IoT 장치를 사용하는 경우 가상 환경을 사용하여 필요한 라이브러리들을 모두 설치해야합니다.
Raspberry Pi나 가상 IoT 장치 모두 이전 강의의 기존 코드를 사용하여 위도 및 경도 값을 가져온 후 다음 코드를 사용하여 올바른 JSON 형시으로 전송합니다:
```python
message_json = { "gps" : { "lat":lat, "lon":lon } }
print("Sending telemetry", message_json)
message = Message(json.dumps(message_json))
```
> 💁 해당 코드는 [code/wio-terminal](../code/wio-terminal), [code/pi](../code/pi) or [code/virtual-device](../code/virtual-device) 폴더에 있습니다.
> 디바이스 코드를 실행하고 CLI 명령 을 사용하여 메시지가 IoT Hub로 흘러들어가고 있는지 확인합니다 .
## Hot, Warm, Cold 경로
IoT 장치에서 클라우드로 전송되는 데이터들이 항상 실시간으로 처리되는 것은 아닙니다. 어떤 데이터는 실시간 처리가 필요하고, 다른 데이터는 짧은 시간 뒤에 처리될 수 있으며, 또 다른 데이터는 훨씬 더 나중에 처리되어도 됩니다. 서로 다른 시간에 데이터를 처리하는 서로 다른 서비스로의 데이터 흐름을 Hot 경로, Warm 경로, Cold 경로라고 합니다.
### Hot 경로
Hot 경로는 실시간으로 처리되거나 거의 실시간에 근접하게 처리되어야 하는 데이터를 말합니다. 차량이 차고에 접근하고 있거나 냉장 트럭의 온도가 너무 높다는 경고를 받는 등의 경고에 Hot 경로 데이터를 사용할 수 있습니다.
Hot 경로 데이터를 사용하기 위해서 코드는 클라우드 서비스에서 이벤트를 수신하는 즉시 이벤트에 응답합니다.
### Warm 경로
Warm 경로는 수신 후 짧은 시간 동안 보고 또는 단기 분석같은 처리할 수 있는 데이터를 말합니다. 전날 수집된 데이터를 사용하는 차량 주행 거리에 대한 일일 보고서에 웜 경로 데이터를 사용할 수 있습니다.
Warm 경로 데이터는 빠르게 액세스할 수 있는 일종의 스토리지 내부의 클라우드 서비스에서 수신한 후 저장됩니다.
### Cold 경로
Cold 경로는 과거 데이터를 말하며 데이터를 장기간 저장하여 필요할 때마다 처리합니다. 예를 들어, Cold 경로를 사용하여 차량의 연간 주행 거리 보고서를 얻거나, 경로 분석을 실행하여 연료 비용을 절감할 수 있는 최적의 경로를 찾을 수 있습니다.
Cold 경로 데이터는 절대 변경되지 않고 빠르고 쉽게 쿼리할 수 있는 대량의 데이터를 저장하도록 설계된 데이터베이스인 데이터 웨어하우스에 저장됩니다. 일반적으로 클라우드 애플리케이션에서는 매일, 매주 또는 매월 정기적으로 실행되어 Warm 경로 스토리지에서 데이터 웨어하우스로 데이터를 이동하는 정기적인 작업을 수행합니다.
✅ 이 강의에서 지금까지 캡처한 데이터에 대해 생각해 봅시다. Hot 경로, Warm 경로, Cold 경로 중 어떤 데이터 입니까?
## 서버리스 코드를 이용한 GPS 이벤트 처리
데이터가 IoT 허브로 유입되면 서버리스 코드를 작성하여 Event-Hub와 호환되는 엔드포인트에 게시된 이벤트를 수신 대기할 수 있습니다. 이 경로는 Warm 경로입니다. 이 데이터는 다음 레슨에서의 여정 보고를 위해 저장되고 사용됩니다.
![IoT 장치에서 IoT 허브로 GPS 원격 측정을 전송하고 Event-Hub 트리거를 통해 Azure Functions로 전송](../../../../images/gps-telemetry-iot-hub-functions.png)
### 작업 - 서버리스 코드를 이용하여 GPS 이벤트 처리하기
1. Azure Functions CLI를 사용하여 Azure Functions App을 생성합니다. 파이썬 런타임을 사용하여 `gps-trigger` 폴더 안에에 만들고 Functions App 프로젝트 이름에도 동일한 이름을 사용합니다. 이 작업에 사용할 가상 환경을 생성해야 합니다.
> ⚠️ 필요한 경우 [프로젝트 2의 Lesson 5에서 Azure Functions Project 생성을 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application)을 참조할 수 있습니다.
1. IoT Hub의 Event Hub 호환 엔드포인트를 사용하는 IoT Hub 이벤트 트리거를 추가합니다.
> ⚠️ 필요한 경우 [프로젝트 2의 Lesson 5에서 IoT Hub 이벤트 트리거 생성을 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger)을 참조할 수 있습니다.
1. `local.settings.json` 파일에서 Event Hub 호환 엔드포인트 연결 문자열을 설정하고 `function.json` 파일에서 해당 항목에 대한 키를 사용합니다.
1. Azurite app을 로컬 저장 에뮬레이터로 사용합니다.
1. functions app을 실행하여 GPS 장치에서 이벤트를 수신하고 있는지 확인합니다. IoT 장치도 실행 중이고 GPS 데이터를 전송하고 있는지 확인하십시오.
```output
Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}}
```
## Azure Storage 계정
![The Azure Storage logo](../../../../images/azure-storage-logo.png)
Azure Storage 계정은 다양한 방식으로 데이터를 저장할 수 있는 범용 스토리지 서비스입니다. 데이터를 Blob, 큐, 테이블 또는 파일로 동시에 저장할 수 있습니다.
### Blob 스토리지
_Blob_ 이라는 단어는 이진 대형 개체를 의미하지만, 구조화되지 않은 모든 데이터를 가리키는 용어가 되었습니다. IoT 데이터가 포함된 JSON 문서에서 이미지 및 동영상 파일에 이르기까지 모든 데이터를 Blob 스토리지에 저장할 수 있습니다. Blob 스토리지에는 관계형 데이터베이스의 테이블과 유사하게 데이터를 저장할 수 있는 bucket이라는 _컨테이너_ 개념이 있습니다. 이러한 컨테이너에는 Blob을 저장할 하나 이상의 폴더가 있을 수 있으며, 각 폴더에는 파일이 컴퓨터 하드 디스크에 저장되는 방식과 유사하게 다른 폴더가 포함될 수 있습니다.
이번 강의에서는 IoT 데이터를 저장하기 위해 Blob 스토리지를 사용합니다.
✅ 조사하기: [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn)에 대해 읽어보세요.
### Table 스토리지
Table 스토리지는 반정형 데이터를 저장할 수 있습니다. Table 스토리지는 실제로 NoSQL 데이터베이스이므로 미리 정의된 테이블 집합이 필요하지 않지만 각 행을 정의하는 고유 키를 사용하여 하나 이상의 테이블에 데이터를 저장하도록 설계되었습니다.
✅ 조사하기: [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn)에 대해 읽어보세요.
### Queue 스토리지
Queue 스토리지를 사용하면 최대 64KB 크기의 메시지를 큐에 저장할 수 있습니다. Queue의 뒤에 메시지를 추가하고 앞에서 읽어나갈 수 있습니다. Queue는 저장 공간이 있는 한 메시지를 무기한 저장하므로 메시지를 장기간 저장하고 필요할 때 읽을 수 있습니다. 예를 들어 GPS 데이터를 처리하기 위해 매달 작업을 실행하려는 경우 한 달 동안 매일 작업을 Queue에 추가한 다음 월말에 모든 메시지를 Queue에서 처리할 수 있습니다.
✅ 조사하기: [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn)에 대해 읽어보세요.
### 파일 스토리지
파일 스토리지는 클라우드의 파일 저장소이며 모든 앱 또는 장치와 업계 표준 프로토콜을 사용하여 연결할 수 있습니다. 파일 스토리지에 파일을 쓴 다음 PC 또는 Mac의 드라이브로 마운트할 수 있습니다.
✅ 조사하기: [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn)에 대해 읽어보세요.
## 서버리스 코드와 저장소 연결하기
이제 IoT Hub의 메시지를 저장하기 위해 function app을 Blob Storage에 연결해야 합니다. 이를 수행하는 방법에는 두 가지가 있습니다:
- function 코드 내에서 Blob 스토리지 Python SDK를 사용하여 Blob 스토리지에 연결하고 데이터를 Blob으로 작성합니다.
- 출력 함수 바인딩을 사용하여 함수의 반환 값을 Blob 스토리지에 바인딩하고 Blob을 자동으로 저장합니다.
이 강의에서는 Blob 스토리지와 어떻게 상호작용 하는지 확인하기 위해 Python SDK를 사용합니다.
![이벤트 허브 트리거를 통해 IoT 장치에서 IoT 허브로 GPS 원격 측정 전송한 뒤 Azure Functions로 전송하고 BLOB 스토리지에 저장](../../../../images/save-telemetry-to-storage-from-functions.png)
데이터는 다음 형식의 JSON Blob으로 저장됩니다:
```json
{
"device_id": <device_id>,
"timestamp" : <time>,
"gps" :
{
"lat" : <latitude>,
"lon" : <longitude>
}
}
```
### 작업 - 서버리스 코드와 저장소 연결하기
1. Azure Storage 계정을 생성합니다. 이름을 `gps<your name>`과 같이 지정합니다.
> ⚠️ 필요한 경우 [프로젝트 2의 Lesson 5에서 저장소 계정 생성을 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---create-the-cloud-resources)을 읽어보세요.
이전 프로젝트에서 사용한 스토리지 계정이 아직 있다면 이를 다시 사용할 수 있습니다.
> 💁 이 단원의 뒷부분에서 동일한 저장소 계정을 사용하여 Azure Functions 앱을 배포할 수 있습니다.
1. 다음 명령을 실행하여 스토리지 계정에 대한 연결 문자열을 가져옵니다.
```sh
az storage account show-connection-string --output table \
--name <storage_name>
```
`<storage_name>`을 이전 단계에서 만든 스토리지 계정의 이름으로 변경합니다.
1. 이전 단계의 값을 사용하여 스토리지 계정 연결 문자열에 대한 새 항목을 `local.settings.json` 파일에 추가합니다. 이름을 `STORAGE_CONNECTION_STRING`으로 지정하십시오.
1. `requirements.txt` 파일에 다음 내용을 추가하여 Azure storage Pip 패키지를 설치합니다 :
```sh
azure-storage-blob
```
가상 환경에 이 파일의 패키지들을 설치합니다.
> 오류가 발생하면 다음 명령을 사용하여 가상 환경의 Pip 버전을 최신 버전으로 업그레이드한 후 다시 시도하십시오.
>
> ```sh
> pip install --upgrade pip
> ```
1. `__init__.py` 파일의 `iot-hub-trigger`에 다음 import문을 추가합니다:
```python
import json
import os
import uuid
from azure.storage.blob import BlobServiceClient, PublicAccess
```
`json` 시스템 모듈은 JSON을 읽어오고 작성하는 데 사용됩니다. `os` 시스템 모듈은 연결 문자열을 읽어오는 데 사용됩니다. `uuid` 시스템 모듈은 GPS 판독을 위한 고유 ID를 생성하는 데 사용됩니다.
`azure.storage.blob` 패키지는 Blob 스토리지에서 작동하는 Python SDK가 포함되어 있습니다.
1. `main` 메서드 앞에 다음 도우미 함수를 추가합니다:
```python
def get_or_create_container(name):
connection_str = os.environ['STORAGE_CONNECTION_STRING']
blob_service_client = BlobServiceClient.from_connection_string(connection_str)
for container in blob_service_client.list_containers():
if container.name == name:
return blob_service_client.get_container_client(container.name)
return blob_service_client.create_container(name, public_access=PublicAccess.Container)
```
Python blob SDK에는 컨테이너가 없는 경우 컨테이너를 만드는 도우미 메서드가 없습니다. 이 코드는 `local.settings.json` 파일(또는 클라우드에 배포된 이후 애플리케이션 설정)에서 연결 문자열을 로드한 다음, 여기에서 `BlobServiceClient` 클래스를 만들어 blob 스토리지 계정과 상호 작용합니다. 그런 다음 blob 저장소 계정에 대한 모든 컨테이너를 순회하여 제공된 이름을 가진 컨테이너를 찾습니다. 해당 컨테이너를 찾으면 해당 컨테이너와 상호 작용하여 blob을 만들 수 있는 `ContainerClient` 클래스를 반환합니다. 컨테이너가 발견되지 않으면 컨테이너가 생성되고 새 컨테이너의 클라이언트가 반환됩니다.
새 컨테이너가 생성되면 컨테이너의 Blob을 쿼리할 수 있는 공용 액세스 권한이 부여됩니다. 이것은 다음 강의에서 GPS 데이터를 지도에 시각화하는 데 사용됩니다.
1. 토양 수분과는 달리 이 코드를 사용하면 모든 이벤트를 저장할 수 있으므로 다음 코드를 `main` 함수의 `logging` 문 아래에 있는 `for event in events:` 루프 안에 추가합니다:
```python
device_id = event.iothub_metadata['connection-device-id']
blob_name = f'{device_id}/{str(uuid.uuid1())}.json'
```
이 코드는 이벤트 메타데이터에서 장치 ID를 가져온 다음 이를 사용하여 Blob 이름을 만듭니다. Blob은 폴더에 저장될 수 있으며 장치 ID는 폴더 이름에 사용되므로 각 장치는 하나의 폴더에 모든 GPS 이벤트를 포함합니다. Blob 이름은 이 폴더 다음에 슬래시로 구분된 문서 이름으로, Linux 및 macOS 경로와 유사합니다(Windows와 유사하지만 Windows는 백슬래시를 사용함). 문서 이름은 Python의 `uuid` 모듈을 사용하여 생성된 고유 ID이며 파일 형식은 `json`을 사용합니다.
예를 들어, `gps-sensor` 디바이스 ID의 경우 Blob 이름은 `gps-sensor/a9487ac2-b9cf-11eb-b5cd-1e00621e3648.json`이 됩니다.
1. 이 뒤에 다음 코드를 추가합니다:
```python
container_client = get_or_create_container('gps-data')
blob = container_client.get_blob_client(blob_name)
```
이 코드는 `get_or_create_container` 도우미 클래스를 사용하여 컨테이너 클라이언트를 가져온 다음 blob 이름을 사용하여 blob 클라이언트 개체를 가져옵니다. 이러한 blob 클라이언트는 기존 blob을 참조하거나, 이 경우처럼 새로운 blob을 참조할 수 있습니다.
1. 이 뒤에 다음 코드를 추가합니다:
```python
event_body = json.loads(event.get_body().decode('utf-8'))
blob_body = {
'device_id' : device_id,
'timestamp' : event.iothub_metadata['enqueuedtime'],
'gps': event_body['gps']
}
```
이렇게 하면 Blob Storage에 기록될 Blob의 본문이 빌드됩니다. 이는 장치 ID, 원격 분석이 IoT Hub로 전송된 시간 및 원격 분석의 GPS 좌표가 포함하는 JSON 문서입니다.
> 💁 메시지가 전송된 시간을 가져오려면 현재 시간이 아니라 메시지의 대기열에 포함된 시간을 사용하는 것이 중요합니다. Functions App이 실행되고 있지 않으면 선택되기 전에 잠시 동안 허브에 있을 수 있습니다.
1. 이 코드 아래에 다음을 추가합니다:
```python
logging.info(f'Writing blob to {blob_name} - {blob_body}')
blob.upload_blob(json.dumps(blob_body).encode('utf-8'))
```
이 코드는 blob이 세부 정보와 함께 작성될 예정임을 기록한 다음, blob 본문을 새 blob의 내용으로 업로드합니다.
1. Functions app을 실행합니다. 출력에서 모든 GPS 이벤트에 대해 Blob이 작성되는 것을 볼 수 있습니다.
```output
[2021-05-21T01:31:14.325Z] Python EventHub trigger processed an event: {"gps": {"lat": 47.73092, "lon": -122.26206}}
...
[2021-05-21T01:31:14.351Z] Writing blob to gps-sensor/4b6089fe-ba8d-11eb-bc7b-1e00621e3648.json - {'device_id': 'gps-sensor', 'timestamp': '2021-05-21T00:57:53.878Z', 'gps': {'lat': 47.73092, 'lon': -122.26206}}
```
> 💁 동시에 IoT Hub 이벤트 모니터를 실행하고 있지는 않은지 확인합니다.
> 💁 해당 코드는 [code/functions](../code/functions) 폴더에 있습니다.
### 작업 - 업로드된 Blob 확인
1. 생성된 blob을 보려면 스토리지 계정을 보고 관리할 수 있는 무료 도구인 [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer/?WT.mc_id=cademic-17441-jaben)를 사용하거나 CLI에서 확인할 수 있습니다.
1. CLI를 사용하기 위해서는 우선적으로 계정 key가 필요합니다. 다음 명령어를 실행하여 해당 key를 얻습니다:
```sh
az storage account keys list --output table \
--account-name <storage_name>
```
`<storage_name>`을 스토리지 계정의 이름으로 수정합니다.
`key1`의 값을 복사합니다.
1. 다음 명령어를 실행하여 컨테이너의 Blob을 나열합니다.
```sh
az storage blob list --container-name gps-data \
--output table \
--account-name <storage_name> \
--account-key <key1>
```
`<storage_name>` 을 스토리지 계정의 이름으로 바꾸고, `<key1>`값을 이전 단계에서 복사한 `<key1>` 값으로 바꿉니다.
그러면 컨테이너의 모든 Blob이 나열됩니다:
```output
Name Blob Type Blob Tier Length Content Type Last Modified Snapshot
---------------------------------------------------- ----------- ----------- -------- ------------------------ ------------------------- ----------
gps-sensor/1810d55e-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:27+00:00
gps-sensor/18293e46-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
gps-sensor/1844549c-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
gps-sensor/1894d714-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
```
1. 다음 명령어를 이용하여 blob 중 하나를 다운로드 합니다:
```sh
az storage blob download --container-name gps-data \
--account-name <storage_name> \
--account-key <key1> \
--name <blob_name> \
--file <file_name>
```
`<storage_name>`를 스토리지 계정의 이름으로 바꿉니다. `<key1>` 값을 이전 단계에서 복사한 `<key1>` 값으로 바꿉니다.
폴더 이름을 포함하여 마지막 단계 출력의 `Name` 열에 있는 전체 이름으로 `<blob_name>`을 바꿉니다. `<file_name>`을 blob을 저장할 로컬 파일의 이름으로 바꿉니다.
다운로드가 완료되면 이 JSON 파일을 VS Code에서 열 수 있으며 GPS 위치 세부 정보가 포함된 Blob이 표시됩니다:
```json
{
"device_id": "gps-sensor",
"timestamp": "2021-05-21T00:57:53.878Z",
"gps": { "lat": 47.73092, "lon": -122.26206 }
}
```
### 업무 - Functions App을 클라우드에 배포가히
이제 Function app이 작동하므로 클라우드에 배포할 수 있습니다.
1. 이전에 생성한 스토리지 계정을 사용하여 새로운 Azure Functions app을 생성합니다. `gps-sensor-`와 같이 이름을 지정하고 끝 부분에 임의의 단어나 이름과 같은 고유 식별자를 추가합니다.
> ⚠️ 필요하다면 [프로젝트 2의 Lesson 5에서 Functions app을 생성하기 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---create-the-cloud-resources)을 읽어보세요.
1. `IOT_HUB_CONNECTION_STRING``STORAGE_CONNECTION_STRING` 값을 Application 설정에 업로드합니다.
> ⚠️ 필요하다면 [프로젝트 2의 Lesson 5에서 Application 설정 업로드를 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---upload-your-application-settings)을 읽어보세요.
1. 로컬에 있는 Functions app을 클라우드로 배포합니다.
> ⚠️ 필요하다면 [프로젝트 2의 Lesson 5에서 Functions app 배포를 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---deploy-your-functions-app-to-the-cloud)을 읽어보세요.
---
## 🚀 도전
GPS 데이터는 완벽하게 정확하지 않으며, 특히 터널과 높은 건물의 지역에서 감지되는 위치는 수 미터 정도 떨어져 있을 수 있습니다.
위성 내비게이션이 이를 어떻게 이것을 극복할 수 있을지 생각해 보세요. 위성 내비게이션이 당신의 위치를 더 잘 예측할 수 있게 해주는 데이터에는 무엇이 있습니까?
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/24)
## 복습 및 자습
- 정형 데이터에 대해 [Data model page on Wikipedia](https://wikipedia.org/wiki/Data_model)에서 더 읽어보세요.
- 반정형 데이터에 대해 [Semi-structured data page on Wikipedia](https://wikipedia.org/wiki/Semi-structured_data)에서 더 읽어보세요
- 비정형 데이터에 대해 [Unstructured data page on Wikipedia](https://wikipedia.org/wiki/Unstructured_data)에서 더 읽어보세요
- Azure 스토리지와 다른 스토리지 타임에 대해 더 알아보고 싶다면 [Azure Storage documentation](https://docs.microsoft.com/azure/storage/?WT.mc_id=academic-17441-jabenn)를 참고하세요.
## 과제
[함수 바인딩 조사](../assignment.md)

@ -1,19 +0,0 @@
# ফাংশন বাইন্ডিং পর্যালোচনা
## নির্দেশাবলী
ফাংশন বাইন্ডিংগুলি মূলত আমাদের কোডগুলিকে `main` ফাংশন থেকে রিটার্ন করে ব্লব স্টোরেজে সংরক্ষণ করার সুযোগ দেয়। Azure স্টোরেজ অ্যাকাউন্ট এবং অন্যান্য বিবরণ `function.json` ফাইলে কনফিগার করা আছে।
Azure বা অন্যান্য Microsoft প্রযুক্তির সাথে কাজ করার সময়, তথ্যের সর্বোত্তম উৎস হল [docs.com এ Microsoft ডকুমেন্টেশনগুলো](https://docs.microsoft.com/?WT.mc_id=academic-17441-jabenn) । এই অ্যাসাইনমেন্টে আমাদেরকে আউটপুট বাইন্ডিং কিভাবে সেটআপ করতে হবে তা জানতে Azure Functions বাইন্ডিং ডকুমেন্টেশন পড়তে হবে।
কাজের আগে কিছু রিসোর্স দেখে নেয়া যেতে পারেঃ
* [Azure Functions triggers and bindings concepts](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?tabs=python&WT.mc_id=academic-17441-jabenn)
* [Azure Blob storage bindings for Azure Functions overview](https://docs.microsoft.com/azure/azure-functions/functions-bindings-storage-blob?WT.mc_id=academic-17441-jabenn)
* [Azure Blob storage output binding for Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-bindings-storage-blob-output?tabs=python&WT.mc_id=academic-17441-jabenn)
## এসাইনমেন্ট মূল্যায়ন মানদন্ড
| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) |
| --------- | ------------------ | -------------- | -------------------- |
| ব্লব স্টোরেজ আউটপুট বাইন্ডিং কনফিগার করা | আউটপুট বাইন্ডিং কনফিগার করতে সক্ষম হয়েছিল, যেখানে ব্লবটি রিটার্ন এবং সফলভাবে ব্লব স্টোরেজে সংরক্ষণ হয়েছিলো | আউটপুট বাইন্ডিং কনফিগার করতে বা ব্লবটি রিটার্ন করতে সক্ষম হয়েছিল কিন্তু ব্লব স্টোরেজে সংরক্ষণ করতে পারেনি| আউটপুট বাইন্ডিং কনফিগার করতে ব্যার্থ |

@ -1,340 +0,0 @@
# লোকেশন ডেটা প্রদর্শন
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-13.jpg)
> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে।
## লেকচার-পূর্ববর্তী কুইজ
[লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/25)
## সূচনা
গত পাঠে আমরা শিখেছি কিভাবে সার্ভারবিহীন কোড ব্যবহার করে স্টোরেজ কন্টেইনারে ক্লাউডে সংরক্ষণ করতে আমাদেরকে সেন্সর থেকে জিপিএস ডেটা পেতে হয়। এখন আমরা দেখবো কিভাবে একটি Azure ম্যাপে সেই পয়েন্টগুলি দেখানো যায়। আমরা একটি ওয়েব পেজে একটি মানচিত্র তৈরি করতে শিখব, GeoJSON ডেটা ফরম্যাট এবং আমাদেরকে ম্যাপে ক্যাপচার করা সমস্ত জিপিএস পয়েন্ট প্লট করার জন্য এটি কীভাবে ব্যবহার করতে হবে তা শিখব।
এই লেসনে আমরা দেখবোঃ
* [ডেটা ভিস্যুয়ালাইজেশন কী ?](#ডেটা-ভিস্যুয়ালাইজেশন-কী)
* [ম্যাপ সার্ভিস](#ম্যাপ-সার্ভিস)
* [Azure Maps রিসোর্স তৈরী করা](#Azure-Maps-রিসোর্স-তৈরী-করা)
* [ওয়েব পেইজে ম্যাপ প্রদর্শন](#ওয়েব-পেইজে-ম্যাপ-প্রদর্শন)
* [GeoJSON ফরম্যাট](#geojson-ফরম্যাট)
* [GeoJSON দ্বারা ম্যাপে জিপিএস ডেটা প্লট করা](#GeoJSON-দ্বারা-ম্যাপে-জিপিএস-ডেটা-প্লট-করা)
> 💁 এই লেসনে HTML এবং JavaScript এর ব্যবহার থাকবে। এই ল্যাংগুয়েজগুলো ব্যবহার করে ওয়েব ডেভলাপমেন্ট বিষয়ে আরো জানতে চাইলে [Web development for beginners](https://github.com/microsoft/Web-Dev-For-Beginners) কারিক্যুলাম দেখতে পারি।
## ডেটা ভিস্যুয়ালাইজেশন কী
ডেটা দৃশ্যায়ন বা ভিস্যুয়ালাইজেশন, নাম থেকেই বোঝা যায়, ডেটা ভিজুয়ালাইজ বা প্রদর্শন করা হয় এমন উপায়ে যা মানুষের পক্ষে বোঝা সহজ হয়। এটি সাধারণত চার্ট এবং গ্রাফের সাথে যুক্ত থাকে, মানুষকে কেবল তথ্য উপাত্তকে আরও ভালভাবে বুঝতে সাহায্য করার পাশাপাশি, তাদের প্রয়োজনীয় সিদ্ধান্ত নিতেও সাহায্য করে।
একটি সহজ উদাহরণ নিই- শুরুর দিকের একটি প্রজেক্টে আমরা মাটির আর্দ্রতা সংগ্রহ করেছি । ১লা জুন ২০২১ -এর জন্য প্রতি ঘণ্টায় মাটির আর্দ্রতার তথ্যের একটি টেবিল নিম্নরূপ :
| সময় | মান |
| ---------------- | ------: |
| 01/06/2021 00:00 | 257 |
| 01/06/2021 01:00 | 268 |
| 01/06/2021 02:00 | 295 |
| 01/06/2021 03:00 | 305 |
| 01/06/2021 04:00 | 325 |
| 01/06/2021 05:00 | 359 |
| 01/06/2021 06:00 | 398 |
| 01/06/2021 07:00 | 410 |
| 01/06/2021 08:00 | 429 |
| 01/06/2021 09:00 | 451 |
| 01/06/2021 10:00 | 460 |
| 01/06/2021 11:00 | 452 |
| 01/06/2021 12:00 | 420 |
| 01/06/2021 13:00 | 408 |
| 01/06/2021 14:00 | 431 |
| 01/06/2021 15:00 | 462 |
| 01/06/2021 16:00 | 432 |
| 01/06/2021 17:00 | 402 |
| 01/06/2021 18:00 | 387 |
| 01/06/2021 19:00 | 360 |
| 01/06/2021 20:00 | 358 |
| 01/06/2021 21:00 | 354 |
| 01/06/2021 22:00 | 356 |
| 01/06/2021 23:00 | 362 |
একজন সাধারণ মানুষ হিসাবে, এই ডেটা বোঝা কঠিন হতে পারে। এটি কোন অর্থ ছাড়া সংখ্যার একটি প্রাচীর মাত্র। এই ডেটা ভিজ্যুয়ালাইজ করার প্রথম পদক্ষেপ হিসাবে, এটি একটি লাইন চার্টে প্লট করা যেতে পারে:
![A line chart of the above data](../../../../images/chart-soil-moisture.png)
এই লাইন চার্টটি আরো উন্নত করা যেতে পারে যদি আমরা মাটির আর্দ্রতার মান 450 হলে, স্বয়ংক্রিয় জল ব্যবস্থা চালু করা হয়েছিল এটি বোঝাতে একটি লাইন টেনে দিই।
![A line chart of soil moisture with a line at 450](../../../../images/chart-soil-moisture-relay.png)
এই চার্টটি খুব তাড়াতাড়ি দেখায় যে মাটির আর্দ্রতার মাত্রা কত ছিল এবং ঠিক কোন পয়েন্ট থেকে সেচ ব্যবস্থা চালু হয়েছিল।
ডেটা ভিজ্যুয়ালাইজ করার জন্য চার্টই একমাত্র হাতিয়ার নয়। আইওটি ডিভাইসগুলি যেগুলি আবহাওয়া ট্র্যাক করে সেগুলিতে ওয়েব অ্যাপস বা মোবাইল অ্যাপ থাকতে পারে যা বিভিন্ন প্রতীক ব্যবহার করে আবহাওয়ার অবস্থা যেমন মেঘলা দিনের জন্য মেঘের প্রতীক, বৃষ্টির দিনের জন্য বৃষ্টির চিহ্ন ইত্যাদি। ডেটা ভিজ্যুয়ালাইজ করার অনেক উপায় আছে, কিছু বেশ সিরিয়াস, আবার কিছু অনেক মজার।
✅ আমরা ডেটা ভিজ্যুয়ালাইজেশনের যেসব উপায় ইতোমধ্যে দেখেছি, সে সম্পর্কে চিন্তা করি। কোন পদ্ধতিগুলি সবচেয়ে পরিষ্কার এবং দ্রুততম সিদ্ধান্ত নেওয়ার সুযোগ দেয় ?
ভালো ভিজ্যুয়ালাইজেশনগুলি মানুষকে দ্রুত সিদ্ধান্ত নিতে সহায়তা করে। উদাহরণস্বরূপ, শিল্প যন্ত্রপাতি থেকে সব ধরনের রিডিং স্ক্রিনে দেখানো হলে, এগুলো বিশ্লেষণ করা কঠিন। কিন্তু যদি আমরা যেকোন সমস্যাজনক পরিস্থিতিতে একটি লাল বাতি জ্বালাই, তাহলে একজন মানুষ সহজে সিদ্ধান্ত নিতে পারে।
জিপিএস ডেটা নিয়ে কাজ করার সময় সবচেয়ে স্পষ্ট দৃশ্যায়ন হলো একটি মানচিত্রে ডেটা প্লট করা। উদাহরণস্বরূপ ডেলিভারি ট্রাক এর অবস্থাম দেখানো একটি মানচিত্র, একটি কারখানার শ্রমিকদের ট্রাক কখন আসবে তা দেখতে সাহায্য করতে পারে। যদি এই মানচিত্রটি তাদের বর্তমান অবস্থানে ট্রাকের শুধু ছবি দেখানোর পাশাপাশি ট্রাকের অন্যান্য তথ্য সম্পর্কে ধারণা দেয়, তাহলে প্লান্টের শ্রমিকরা সেই অনুযায়ী পরিকল্পনা করতে পারে। যদি তারা তাদের কারখানার কাছাকাছি একটি রেফ্রিজারেটেড ট্রাক দেখতে পায় তবে তারা দ্রুত প্রস্তুতি নিতে পারে।
## ম্যাপ সার্ভিস
মানচিত্র নিয়ে কাজ করা বেশ চিত্তাকর্ষক একটি কাজ। ম্যাপের জন্য অনেকগুলো সার্ভিস যেমন Bing মানচিত্র, লিফলেট, ওপেন স্ট্রিট মানচিত্র এবং গুগল মানচিত্র থেকে বেছে নেওয়া যায়। এই লেসনে আমরা [Azure Maps](https://azure.microsoft.com/services/azure-maps/?WT.mc_id=academic-17441-jabenn) নিয়ে আরো বিস্তারিত জানবো এবং কীভাবে ডেটা প্লট করা হবে তা শিখবো
![The Azure Maps logo](../../../../images/azure-maps-logo.png)
Azure ম্যাপ হলো ভূ-স্থানিক পরিষেবা এবং SDK- এর একটি সংগ্রহ যা ওয়েব এবং মোবাইল অ্যাপ্লিকেশনগুলিকে ভৌগলিক প্রেক্ষাপট সরবরাহ করতে নতুন ম্যাপিং ডেটা ব্যবহার করে। ডেভেলপারদের সুন্দর, ইন্টারেক্টিভ মানচিত্র তৈরির জন্য ট্যুল দেওয়া হয় যা সুপারিশকৃত ট্রাফিক রুট প্রদান, ট্রাফিক ঘটনা সম্পর্কে তথ্য প্রদান, অভ্যন্তরীণ নেভিগেশন, অনুসন্ধান ক্ষমতা, উচ্চতা তথ্য, আবহাওয়া পরিষেবা এবং আরও অনেক কিছু করতে পারে।
✅ এখানে কিছু [কোড স্যাম্পল](https://docs.microsoft.com/samples/browse?WT.mc_id=academic-17441-jabenn&products=azure-maps) রয়েছে যা আমরা এক্সপেরিমেন্ট করে দেখতে পারি।
আমরা বিভিন্নভাবে মানচিত্র প্রদর্শন করতে পারি, যেমনঃ ফাঁকা ক্যানভাস, টাইলস, স্যাটেলাইট ইমেজ, রাস্তা সহ স্যাটেলাইট ইমেজ, গ্রেস্কেল মানচিত্র, উচ্চতা দেখানোর জন্য ছায়াময় মানচিত্র, রাতের দৃশ্যের মানচিত্র এবং হাই-কনট্রাস্ট ইত্যাদি । [Azure Event Grid](https://azure.microsoft.com/services/event-grid/?WT.mc_id=academic-17441-jabenn) এর সাথে একীভূত করে আমরা আমাদের মানচিত্রে রিয়েল-টাইম আপডেট পেতে পারি। আমাদের মানচিত্রের আচরণ এবং ভিস্যুয়াল পরিবর্তন করতে পারি বিভিন্ন নিয়ন্ত্রণ যুক্ত করে, যেমনঃ pinch, drag এবং ক্লিক করার মতো অপারেশনের মাধ্যমে। মানচিত্রের রূপ পরিবর্তন করতে, আমরা বাবল, লাইন, বহুভুজ, হিটম্যাপ এবং আরও অনেক কিছু অন্তর্ভুক্ত করতে পারি। কোন মানচিত্রটি বাস্তবায়ন করবো তা আমাদের SDK এর পছন্দের উপর নির্ভর করে।
[REST API](https://docs.microsoft.com/javascript/api/azure-maps-rest/?WT.mc_id=academic-17441-jabenn&view=azure-maps-typescript-latest) ব্যবহার করে আমরা Azure Maps APIs একসেস করতে পারি। এছাড়াও এটির [Web SDK](https://docs.microsoft.com/azure/azure-maps/how-to-use-map-control?WT.mc_id=academic-17441-jabenn) বা মোবাইলের জন্য [Android SDK](https://docs.microsoft.com/azure/azure-maps/how-to-use-android-map-control-library?WT.mc_id=academic-17441-jabenn&pivots=programming-language-java-android) আমরা কাজে লাগাতে পারি।
এই পাঠে, আমরা একটি মানচিত্র আঁকতে এবং আমাদের সেন্সরের জিপিএস অবস্থানের পথ প্রদর্শন করতে ওয়েব SDK ব্যবহার করবো।
## Azure Maps রিসোর্স তৈরী করা
আমাদের প্রথম ধাপ হল একটি Azure Maps অ্যাকাউন্ট তৈরি করা।
### কাজ - Azure Maps রিসোর্স তৈরী করা
1. টার্মিনাল বা কমান্ড প্রম্পট থেকে নিম্নের কমান্ড রান করে `gps-sensor` রিসোর্স গ্রুপে Azure Maps রিসোর্স তৈরী করি।
```sh
az maps account create --name gps-sensor \
--resource-group gps-sensor \
--accept-tos \
--sku S1
```
এটি Azure Maps রিসোর্স তৈরী করবে যার নাম `gps-sensor` । এক্ষেত্রে `S1` tier ব্যবহৃত হচ্ছে যা একটি paid tier যাতে অনেকগুলো ফীচার থাকে।
> 💁 Azure Maps ব্যবহারের খরচ সম্পর্কে জানতে, [Azure Maps pricing page](https://azure.microsoft.com/pricing/details/azure-maps/?WT.mc_id=academic-17441-jabenn) পড়তে পারি।
1. ম্যাপের জন্য API key প্রয়োজন। নীচের কমান্ড দিয়ে তা পাওয়া যাবেঃ
```sh
az maps account keys list --name gps-sensor \
--resource-group gps-sensor \
--output table
```
এখানে `PrimaryKey` ভ্যালুটি কপি করে নিতে হবে।
## ওয়েব পেইজে ম্যাপ প্রদর্শন
এখন আমরা পরবর্তী পদক্ষেপ নিতে পারি যা হলো একটি ওয়েব পেজে মানচিত্র প্রদর্শন করা। ছোট ওয়েব অ্যাপের জন্য মাত্র একটি `html` ফাইল ব্যবহার করবো; তবে এক্ষেত্রে মনে রাখতে হবে যে একটি উত্পাদন শিল্প বা দলগত পরিবেশে, ওয়েব অ্যাপ্লিকেশনে সম্ভবত আরো কিছু চলমান অংশ থাকবে!
### Task - ওয়েব পেইজে ম্যাপ প্রদর্শন
1. এখন index.html নামে একটি ফাইল তৈরী করতে হবে লোকাল কম্পিউটারের কোন ফোল্ডারে । HTML মার্ক-আপ দিয়ে ম্যাপ স্থাপন করিঃ
```html
<html>
<head>
<style>
#myMap {
width:100%;
height:100%;
}
</style>
</head>
<body onload="init()">
<div id="myMap"></div>
</body>
</html>
```
ম্যাপটি `myMap` `div` এ তৈরী হবে । পেইজের প্রস্থ এবং উচ্চতা ঠিক করার জন্য কিছু HTML স্টাইল ব্যবহার করলেই হবে।
> 🎓`div` একটি ওয়েব পেজের একটি বিভাগ বা অংশ যেটিতে আমরা নাম এবং স্টাইল পরিবর্তন করতে পারি সহজেই ।
1. শুরুতেই `<head>` ট্যাগের অধীনে একটি এক্সটার্নাল style sheet যুক্ত করতে হবে ম্যাপ সুন্দরভাবে প্রদর্শনের জন্য। এছাড়াও ম্যাপের ব্যবহার নিয়ন্ত্রণ করতে, একটি বাহ্যিক script ফাইল দরকার যা আমরা Web SDK থেকে পাব:
```html
<link rel="stylesheet" href="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.css" type="text/css" />
<script src="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.js"></script>
```
এই স্টাইল শীটে মানচিত্রটি কেমন দেখায় সেটির সেটিংস রয়েছে এবং স্ক্রিপ্ট ফাইলে মানচিত্র লোড করার কোড রয়েছে। এই কোড যোগ করার কাজটি C++ এ হেডার ফাইল বা পাইথন মডিউল ইম্পোর্ট করার অনুরূপ।
1. এবার নিম্নের স্ক্রিপ্ট ব্লক যোগ করি
```javascript
<script type='text/javascript'>
function init() {
var map = new atlas.Map('myMap', {
center: [-122.26473, 47.73444],
zoom: 12,
authOptions: {
authType: "subscriptionKey",
subscriptionKey: "<subscription_key>",
}
});
}
</script>
```
এক্ষেত্রে `<subscription_key>` এর পরিবর্তে API key ব্যবহার করতে হবে Azure Maps একাউন্টের।
যদি আমরা `index.html` পেজটি ব্রাউজারে ওপেন করি, তাহলে আমরা ম্যাপ দেখতে পাব যা Seattle অঞ্চলে ফোকাস করে।
![A map showing Seattle, a city in Washington State, USA](../../../../images/map-image.png)
✅ মানচিত্র প্রদর্শন পরিবর্তন করতে জুম এবং কেন্দ্রের পরামিতিগুলি নিয়ে পরীক্ষা করি। আমরা অক্ষাংশ এবং দ্রাঘিমাংশের সাথে সম্পর্কিত বিভিন্ন স্থানাঙ্ক যোগ করে মানচিত্রে পরিবর্তন লক্ষ্য করতে পারবো।
> 💁 Web apps নিয়ে কাজ করা ক্ষেত্রে একটি ভালো উপায় হলো [http-server](https://www.npmjs.com/package/http-server) কে লোকালি ইন্সটল করা। তবে আমাদেরকে [node.js](https://nodejs.org/) এবং [npm](https://www.npmjs.com/) ইন্সটল করতে হবে আগেই। এগুলো ইনস্টল হয়ে গেলে, `index.html` ফাইলে নেভিগেট করে, ` http-server` টাইপ করলে ওয়েব অ্যাপটি একটি স্থানীয় ওয়েব সার্ভারে খুলবে [http://127.0.0.1:8080/](http://127.0.0.1:8080/) ।
## GeoJSON ফরম্যাট
এখন যেহেতু মানচিত্র প্রদর্শনের সাথে আমাদের ওয়েব অ্যাপটি রয়েছে, আমাদেরকে আমাদের স্টোরেজ অ্যাকাউন্ট থেকে জিপিএস ডেটা বের করতে হবে এবং এটি মানচিত্রের উপরে মার্কারের একটি স্তরে প্রদর্শন করতে হবে। আমরা এটি করার আগে, [GeoJSON](https://wikipedia.org/wiki/GeoJSON) ফর্ম্যাটটি দেখি যা Azure মানচিত্রের জন্য প্রয়োজনীয়।
[GeoJSON](https://geojson.org/) হল একটি ওপেন স্ট্যান্ডার্ড JSON স্পেসিফিকেশন যা ভৌগোলিক-নির্দিষ্ট ডেটা হ্যান্ডেল করার জন্য ডিজাইন করা হয়েছে বিশেষ ফর্ম্যাটিং সহ। আমরা [geojson.io](https://geojson.io) ব্যবহার করে নমুনা ডেটা পরীক্ষা করে এটি সম্পর্কে জানতে পার্রি, যা GeoJSON ফাইলগুলি ডিবাগ করার জন্য একটি দরকারী ট্যুল।
GeoJSON ডেটার একটি নমুনা ফাইলঃ
```json
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-2.10237979888916,
57.164918677004714
]
}
}
]
}
```
একটি বিশেষ বৈশিষ্ট্য হল ডেটাকে একটি 'ফিচারকলেকশন' এর মধ্যে 'ফিচার' হিসেবে নেস্ট করা। সেই বস্তুর মধ্যে অক্ষাংশ এবং দ্রাঘিমাংশ নির্দেশকারী 'স্থানাঙ্ক' এর 'জ্যামিতি' পাওয়া যাবে।
✅ GeoJSON তৈরি করার সময়, বস্তুর মধ্যে 'অক্ষাংশ' এবং 'দ্রাঘিমাংশ' এর ক্রমটির দিকে মনোযোগ দিতে হবে নয়তো মান অনুযায়ী অবস্থান যেখানে দেখা উচিত, সেখানে তা উপস্থাপিত হবে না! GeoJSON পয়েন্টের জন্য `lon,lat` এই ক্রমানুসারে ডেটা প্রদান করতে হয় , `lat,lon` ফরম্যাটে নয়।
`জ্যামিতি` বিভিন্ন ধরনের হতে পারে, যেমন একক বিন্দু বা বহুভুজ। এই উদাহরণে, আমরা কাজ করছি বিন্দু নিয়ে যার দুটি স্থানাঙ্কঃ দ্রাঘিমাংশ এবং অক্ষাংশ রয়েছে।
✅ Azure Maps সকল GeoJSON এবং এর সাথে অতিরিক্ত কিছু [উন্নত বৈশিষ্ট্য](https://docs.microsoft.com/azure/azure-maps/extend-geojson?WT.mc_id=academic-17441-jabenn) সাপোর্ট করে যেমনঃ বৃত্ত এবং অন্যান্য জ্যামিতিক গঠন আঁকার ক্ষমতা।
## GeoJSON দ্বারা ম্যাপে জিপিএস ডেটা প্লট করা
এখন আমরা আগের পাঠে যে স্টোরেজটি তৈরি করেছিলাম সেখান থেকে ডেটা গ্রহণ করার জন্য প্রস্তুত। এগুলো ব্লব স্টোরেজে বেশ কয়েকটি ফাইল হিসাবে সংরক্ষণ করা হয়েছে যাতে আমাদেরকে ফাইলগুলি পুনরুদ্ধার করতে হয় এবং সেগুলি বিশ্লেষণ করতে হবে যাতে Azure Maps সেই ডেটা ব্যবহার করতে পারে।
### কাজ - ওয়েব পেজ থেকে একসেস করার জন্য স্টোরেজ কনফিগার করা
আমরা যদি ডেটা আনতে আমাদের স্টোরেজে কল করি, তবে আমাদের ব্রাউজারের কনসোলে অনেক এরর দেখে অনেকেই অবাক হইয়ে যেতে পারে। এর কারণ হল এই স্টোরেজে [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) এর জন্য আমাদেরকে পার্মিশন সেট করতে হবে যাতে বাইরের ওয়েব অ্যাপস থেকে ডেটা একসেস করা যায়।
> 🎓 CORS এর পূর্ণরূপ হলো "Cross-Origin Resource Sharing" এবং সাধারণত নিরাপত্তাজনিত কারণে Azure এ এটি স্পষ্টভাবে সেট করা প্রয়োজন। যেসকল সাইটগুলিকে ডেটা একসেস করার অনুমতি দেয়ার প্রয়োজন নেই, তা আমরা এখান থেকে নিয়ন্ত্রণ করতে পারি।
1. নিম্নের কমান্ড রান করে CORS চালু করি:
```sh
az storage cors add --methods GET \
--origins "*" \
--services b \
--account-name <storage_name> \
--account-key <key1>
```
এখানে `<storage_name>` এর জায়গায় আমাদের ব্যবহৃত স্টোরেজটির নাম দিতে হবে এবং `<key1>` এর পরিবর্তে স্টোরেজ একাউন্টের key দিতে হবে।
এই কমান্ড যেকোনো ওয়েবসাইটকে (ওয়াইল্ডকার্ড `*` চিহ্ন মানে হলো 'যেকোনো') আমাদের স্টোরেজ অ্যাকাউন্ট থেকে একটি *GET* অনুরোধ করার জন্য অনুমতি দেয়, অর্থাৎ ডেটা পাওয়ার সুযোগ করে দেয়। আর `--services b` মানে হলো শুধুমাত্র ব্লবগুলির জন্য এই সেটিং প্রয়োগ করা হচ্ছে।
### কাজ - স্টোরেজ থেকে জিপিএস ডেটা লোড করা
1. `init` ফাংশনের সবগুলো কনটেন্টকে নিম্নের কোড দিয়ে রিপ্লেস করে দিইঃ
```javascript
fetch("https://<storage_name>.blob.core.windows.net/gps-data/?restype=container&comp=list")
.then(response => response.text())
.then(str => new window.DOMParser().parseFromString(str, "text/xml"))
.then(xml => {
let blobList = Array.from(xml.querySelectorAll("Url"));
blobList.forEach(async blobUrl => {
loadJSON(blobUrl.innerHTML)
});
})
.then( response => {
map = new atlas.Map('myMap', {
center: [-122.26473, 47.73444],
zoom: 14,
authOptions: {
authType: "subscriptionKey",
subscriptionKey: "<subscription_key>",
}
});
map.events.add('ready', function () {
var source = new atlas.source.DataSource();
map.sources.add(source);
map.layers.add(new atlas.layer.BubbleLayer(source));
source.add(features);
})
})
```
আর `<storage_name>` এর জায়গায় আমাদের ব্যবহৃত স্টোরেজের নামটি দিতে হবে আর `<subscription_key>` এর পরিবর্তে API key দিতে হবে Azure Maps একাউন্ট এর ।
এখানে বেশ কিছু ঘটনা ঘটছে। প্রথমে, কোডটি আমাদের স্টোরেজ অ্যাকাউন্টের নাম ব্যবহার করে নির্মিত একটি ইউআরএল এন্ডপয়েন্ট ব্যবহার করে আমাদের ব্লব কন্টেইনার থেকে জিপিএস ডেটা নিয়ে আসে। এই ইউআরএল `gps-data` থেকে পুনরুদ্ধার করে, রিসোর্সের ধরন নির্দেশ করে একটি কন্টেইনার (`restype=container`) এবং সমস্ত ব্লব সম্পর্কে তথ্য তালিকাভুক্ত করে। এই তালিকাটি ব্লবগুলি নিজেরা রিটার্ন দেবে না, তবে প্রতিটি ব্লবের জন্য একটি URL রিটার্ন করবে যা ব্লব ডেটা লোড করতে ব্যবহার করা যেতে পারে।
> 💁 এই ইউআরএলটি আমাদের ব্রাউজারে সমস্ত ব্লবের বিষদ বিবরণ দেখতে পারে। প্রতিটি আইটেমের একটি `Url` প্রপার্টি থাকবে, যার দ্বারা আমরা আমাদের ব্রাউজারেও ব্লবের বিষয়বস্তু দেখতে পারি।
এই কোডটি তারপর প্রতিটি ব্লব লোড করে, একটি `loadJSON` ফাংশন কল করে, যা পরবর্তীতে তৈরি করা হবে। এটি তখন মানচিত্রের নিয়ন্ত্রণ তৈরি করে এবং `ready` ইভেন্টে কোড যোগ করে। ওয়েব পেজে মানচিত্র প্রদর্শিত হলে এই ইভেন্টকে কল করা হয়।
প্রস্তুতকৃত ইভেন্টটি একটি Azure Maps ডেটা উৎস তৈরি করে - একটি কন্টেইনার যা GeoJSON ডেটা ধারণ করে যা পরে পপুলেটেড হবে। এই ডেটা সোর্সটি তখন একটি বাবল বা বুদবুদ স্তর তৈরি করতে ব্যবহৃত হয় - এটি GeoJSON এর প্রতিটি বিন্দুকে কেন্দ্র করে মানচিত্রে বৃত্তের একটি সেট তৈরী করে।
1. `loadJSON` ফাংশনটি `init` ফাংশনের নীচে স্ক্রিপ্ট ব্লক হিসেবে যোগ করিঃ
```javascript
var map, features;
function loadJSON(file) {
var xhr = new XMLHttpRequest();
features = [];
xhr.onreadystatechange = function () {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
gps = JSON.parse(xhr.responseText)
features.push(
new atlas.data.Feature(new atlas.data.Point([parseFloat(gps.gps.lon), parseFloat(gps.gps.lat)]))
)
}
}
};
xhr.open("GET", file, true);
xhr.send();
}
```
এই ফাংশনটি ফেচ রুটিন দ্বারা কল করে, JSON ডেটার মাধ্যমে বিশ্লেষণ করা হয় এবং এটিকে জিওজেসন হিসাবে দ্রাঘিমাংশ এবং অক্ষাংশ স্থানাঙ্ক হিসাবে রূপান্তরিত করা হয়।
একবার বিশ্লেষণ করা হলে, ডেটা একটি জিওজেসন `ফিচার` এর অংশ হিসাবে সেট করা হয়। মানচিত্রটি চালু হবে এবং ডেটা প্লটিং এর পথে ছোট ছোট বাবল উপস্থিত হবেঃ
1. ব্রাউজারে HTML পেইজটি লোড করি। এটি প্রথমে ম্যাপ লোড করবে, তারপর সকল জিপিএস ডেটা স্টোরেজ থেকে সংগ্রহ করে তা ম্যাপে প্লট করে দিবে।
![A map of Saint Edward State Park near Seattle, with circles showing a path around the edge of the park](../../../../images/map-path.png)
> 💁 সকল কোড পাওয়া যাবে এখানে [code](./code) ফোল্ডারটিতে ।
---
## 🚀 চ্যালেঞ্জ
একটি মানচিত্রে মার্কার হিসেবে স্ট্যাটিক ডেটা প্রদর্শন করতে পারাটা বেশ বড় একটি সাফল্য। টাইমস্ট্যাম্পড JSON ফাইল ব্যবহার করে অ্যানিমেশন যুক্ত করতে এবং সময়ের সাথে চিহ্নিতকারীদের পথ দেখানোর জন্য এই ওয়েব অ্যাপটির কী আরো উন্নয়ন ঘটানো যায়? মানচিত্রের মধ্যে অ্যানিমেশন ব্যবহারের [কিছু নমুনা](https://azuremapscodesamples.azurewebsites.net/) দেওয়া হল।
## লেকচার-পরবর্তী কুইজ
[লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/26)
## রিভিউ এবং স্ব-অধ্যয়ন
IoT ডিভাইস নিয়ে কাজ করার ক্ষেত্রে Azure Maps খুবই ভালো একটি ট্যুল।
* [Azure Maps documentation নিয়ে Microsoft docs](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps?WT.mc_id=academic-17441-jabenn) থেকে পড়ে ইউজ কেইস গুলো আমরা দেখতে পারি।
* এছাড়াও Azure Maps নিয়ে আমাদের জ্ঞান আরো বাড়ানোর জন্য আমরা আমাদের জন্য [route finding app তৈরী করতে পারি Azure Maps self-guided learning module ব্যবহার করে](https://docs.microsoft.com/learn/modules/create-your-first-app-with-azure-maps/?WT.mc_id=academic-17441-jabenn) ।
## এসাইনমেন্ট
[অ্যাপ ডেপ্লয় করা](assignment.bn.md)

@ -1,352 +0,0 @@
# 위치 데이터 시각화
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-13.jpg)
> [Nitya Narasimhan](https://github.com/nitya)의 스케치 노트. 더 큰 버전을 보려면 이미지를 클릭하십시오.
이 비디오는 이번 단원에서 다룰 Azure Maps의 IoT에 대한 개요를 제공합니다.
[![Azure Maps - The Microsoft Azure Enterprise Location Platform](https://img.youtube.com/vi/P5i2GFTtb2s/0.jpg)](https://www.youtube.com/watch?v=P5i2GFTtb2s)
> 🎥 위 이미지를 클릭하면 영상을 볼 수 있습니다.
## 강의 전 퀴즈
[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/25)
## 개요
지난 수업에서는 서버리스 코드를 사용하여 스토리지 컨테이너의 클라우드에 저장하기 위해 센서에서 GPS 데이터를 가져오는 방법을 배웠습니다. 이제 Azure 맵에서 해당 지점을 시각화하는 방법을 알아봅니다. 웹 페이지에서 지도를 만드는 방법, GeoJSON 데이터 형식 및 이를 사용하여 지도에 캡처된 모든 GPS 지점을 표시하는 방법을 배우게 됩니다.
이 강의에서는 다음을 다룰 것입니다:
- [데이터 시각화란](#what-is-data-visualization)
- [지도 서비스](#map-services)
- [Azure Maps 리소스 만들기](#create-an-azure-maps-resource)
- [웹 페이지에 지도 표시](#show-a-map-on-a-web-page)
- [GeoJSON 형식](#the-geojson-format)
- [GeoJSON을 사용하여 지도에 GPS 데이터 표시하기](#plot-gps-data-on-a-map-using-geojson)
> 💁 This lesson will involve a small amount of HTML and JavaScript. If you would like to learn more about web development using HTML and JavaScript, check out [Web development for beginners](https://github.com/microsoft/Web-Dev-For-Beginners).
## 데이터 시각화란
데이터 시각화는 이름에서 알 수 있듯이 사람이 이해하기 쉽게 데이터를 시각화하는 것입니다. 일반적으로 차트 및 그래프와 연관되지만 사람이 데이터를 더 잘 이해할 수 있을 뿐만 아니라 의사 결정을 내리는 데 도움이 되도록 데이터를 그림으로 나타내는 모든 방법을 말합니다.
간단한 예를 들자면, 지난 농장 프로젝트에서 토양 수분 설정을 캡처했습니다. 2021년 6월 1일에 매시간 수집된 토양 수분 데이터 테이블은 다음과 같을 수 있습니다:
| Date | Reading |
| ---------------- | ------: |
| 01/06/2021 00:00 | 257 |
| 01/06/2021 01:00 | 268 |
| 01/06/2021 02:00 | 295 |
| 01/06/2021 03:00 | 305 |
| 01/06/2021 04:00 | 325 |
| 01/06/2021 05:00 | 359 |
| 01/06/2021 06:00 | 398 |
| 01/06/2021 07:00 | 410 |
| 01/06/2021 08:00 | 429 |
| 01/06/2021 09:00 | 451 |
| 01/06/2021 10:00 | 460 |
| 01/06/2021 11:00 | 452 |
| 01/06/2021 12:00 | 420 |
| 01/06/2021 13:00 | 408 |
| 01/06/2021 14:00 | 431 |
| 01/06/2021 15:00 | 462 |
| 01/06/2021 16:00 | 432 |
| 01/06/2021 17:00 | 402 |
| 01/06/2021 18:00 | 387 |
| 01/06/2021 19:00 | 360 |
| 01/06/2021 20:00 | 358 |
| 01/06/2021 21:00 | 354 |
| 01/06/2021 22:00 | 356 |
| 01/06/2021 23:00 | 362 |
인간으로서, 데이터를 이해하는 것은 어려울 수 있습니다. 이는 아무런 의미가 없는 숫자입니다. 이 데이터를 시각화하는 첫 번째 단계는 꺾은선형 차트에 그리는 것입니다:
![A line chart of the above data](../../../../images/chart-soil-moisture.png)
이는 언제 자동 급수 시스템이 토양 수분 판독값 450을 읽어 켜지는지를 나타내는 선을 추가하여 더욱 발전시킬 수 있습니다.
![A line chart of soil moisture with a line at 450](../../../../images/chart-soil-moisture-relay.png)
이 차트는 토양 수분 수준 뿐만 아니라, 급수 시스템이 켜진 지점을 매우 빠르게 보여줍니다.
차트는 데이터를 시작화하는 유일한 도구가 아닙니다. 날씨를 추적하는 IoT 장치에는 흐린 날의 구름 기호, 비 오는 날의 비구름 등과 같은 기호를 사용하여 날씨 상태를 시각화하는 웹 앱, 또는 모바일 앱이 있을 수 있습니다. 데이터를 시각화하는 방법은 무수히 많고, 진지하고 재미있는 경우도 많습니다.
✅ 시각화된 데이터를 보는 방법에 대해 생각해 보십시오. 어떤 방법이 가장 명확했고 가장 빠르게 결정을 내릴 수 있었습니까?
최고의 시각화를 통해 사람과 사람이 빠르게 의사 결정을 내릴 수 있습니다. 예를 들어 산업용 기계의 모든 판독값을 표시하는 게이지를 갖는 것은 처리하기 어렵지만 무언가 잘못되었을 때 빨간색 표시등이 깜박이면 사람이 결정을 내릴 수 있습니다. 때때로 최고의 시각화는 번쩍이는 불빛입니다!
GPS 데이터로 작업할 때 가장 명확한 시각화는 지도에 데이터를 표시하는 것입니다. 예를 들어 배달 트럭을 표시하는 지도는 가공 공장의 작업자가 트럭이 도착하는 시기를 확인하는 데 도움이 될 수 있습니다. 이 지도가 현재 위치에 있는 트럭 사진보다 더 많은 것을 보여주고 트럭의 내용물에 대한 아이디어를 제공한다면 공장의 작업자는 그에 따라 계획을 세울 수 있습니다. 만약 근처에 냉장 트럭이 보이면 냉장고에 공간을 마련해야 한다는 것을 압니다.
## 지도 서비스
지도로 작업하는 것은 흥미롭습니다. Bing Maps, Leaflet, Open Street Maps 및 Google Maps와 같이 선택할 수 있는 것이 많습니다. 이 단원에서는 [Azure Maps](https://azure.microsoft.com/services/azure-maps/?WT.mc_id=academic-17441-jabenn) 과 GPS 데이터를 표시하는 방법에 대해 알아봅니다.
![The Azure Maps logo](../../../../images/azure-maps-logo.png)
Azure Maps는 "새로운 매핑 데이터를 사용하여 웹 및 모바일 애플리케이션에 지리학적 환경을 제공하는 지리 공간 서비스 및 SDK 모음"입니다. 개발자에게는 권장 교통 경로 제공, 교통 사고에 대한 정보 제공, 실내 내비게이션, 검색 기능, 고도 정보, 날씨 서비스 등을 수행할 수 있는 아름다운 대화형 지도를 만드는 도구가 제공됩니다.
✅ [매핑 코드 샘플](https://docs.microsoft.com/samples/browse?WT.mc_id=academic-17441-jabenn&products=azure-maps) 로 실험하기
지도의 빈 캔버스, 타일, 위성 이미지, 도로가 중첩된 위성 이미지, 다양한 유형의 회색조 지도, 고도를 표시하는 음영 부조가 있는 지도, 야경 지도, 고대비 지도로 지도를 표시할 수 있습니다. [Azure Event Grid](https://azure.microsoft.com/services/event-grid/?WT.mc_id=academic-17441-jabenn)와 통합하여 지도에서 실시간 업데이트를 받을 수 있습니다. 핀치, 드래그와 클릭과 같은 이벤트에 지도가 반응할 수 있도록 다양한 제어를 활성화하여 지도의 동작과 모양을 제어할 수 있습니다. 지도의 모양을 제어하기 위해 버블, 라인, 다각형, 히트 맵 등을 포함하는 레이어를 추가할 수 있습니다. 구현하는 지도의 스타일은 선택한 SDK에 따라 다릅니다.
[REST API](https://docs.microsoft.com/javascript/api/azure-maps-rest/?WT.mc_id=academic-17441-jabenn&view=azure-maps-typescript-latest), [Web SDK](https://docs.microsoft.com/azure/azure-maps/how-to-use-map-control?WT.mc_id=academic-17441-jabenn), 모바일 어플리케이션을 만드는 경우, [Android SDK](https://docs.microsoft.com/azure/azure-maps/how-to-use-android-map-control-library?WT.mc_id=academic-17441-jabenn&pivots=programming-language-java-android)를 활용하여 Azure Maps API에 접근할 수 있습니다.
이 수업에서는 웹 SDK를 사용하여 지도와 센서의 GPS 위치 경로를 표시합니다.
## Azure Maps 리소스 만들기
첫 번째 단계는 Azure Maps 계정을 만드는 것입니다.
### 작업 - Azure Maps 리소스 만들기
1. 터미널 또는 명령 프롬프트에서 다음 명령을 실행하여 `gps-sensor` 리소스 그룹에 Azure Maps 리소스를 만듭니다:
```sh
az maps account create --name gps-sensor \
--resource-group gps-sensor \
--accept-tos \
--sku S1
```
이렇게 하면 Azure Maps의 `gps-sensor`라는 리소스가 생성됩니다. 사용 중인 계층은 `S1`으로, 다양한 기능을 포함하는 유료 계층이지만, 무료로 제공되는 부분이 있습니다.
> 💁 Azure Maps의 사용 비용을 보려면, [Azure Maps 가격 페이지](https://azure.microsoft.com/pricing/details/azure-maps/?WT.mc_id=academic-17441-jabenn)를 확인하세요.
2. 지도 리소스에 대한 API 키가 필요합니다. 이 키를 얻으려면 다음 명령어를 사용하십시오:
```sh
az maps account keys list --name gps-sensor \
--resource-group gps-sensor \
--output table
```
`PrimaryKey` 값을 복사해 놓으십시오.
## 웹 페이지에 지도 표시
이제 웹 페이지에 지도를 표시하는 다음 단계를 수행할 수 있습니다. 작은 웹 앱에 대해 하나의 `html` 파일만 사용 합니다. 상품이나 팀 환경에서는 웹 앱에 움직이는 부분이 더 많을 가능성이 높습니다!
### 작업 - 웹 페이지에 지도 표시
1. 로컬 컴퓨터의 폴더에 index.html 이라는 파일을 만듭니다. 지도를 보관할 HTML 마크업을 추가합니다:
```html
<html>
<head>
<style>
#myMap {
width: 100%;
height: 100%;
}
</style>
</head>
<body onload="init()">
<div id="myMap"></div>
</body>
</html>
```
지도에 `myMap` `div` 가 로드됩니다. 몇 가지 스타일을 사용하면 페이지의 너비와 높이를 확장할 수 있습니다.
> 🎓 `div` 는 웹 페이지의 섹션으로, 이름과 스타일을 지정할 수 있습니다.
2. 여는 `<head>` 태그 아래에, 외부 스타일시트를 추가하여 지도 표시를 제어하고, 웹 SDK의 외부 스크립트를 추가하여 해당 동작을 관리합니다:
```html
<link
rel="stylesheet"
href="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.css"
type="text/css"
/>
<script src="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.js"></script>
```
이 스타일시트에는 지도 모양에 대한 설정이 포함되어 있으며, 스크립트 파일에는 지도를 로드하는 코드가 포함되어 있습니다. 이 코드를 추가하는 것은 C++ 헤더 파일을 포함하거나 Python 모듈을 가져오는 것과 유사합니다.
3. 해당 스크립트 아래에, 스크립트 블록을 추가하여 지도를 시작합니다.
```javascript
<script type='text/javascript'>
function init() {
var map = new atlas.Map('myMap', {
center: [-122.26473, 47.73444],
zoom: 12,
authOptions: {
authType: "subscriptionKey",
subscriptionKey: "<subscription_key>",
}
});
}
</script>
```
`<subscription_key>` 를 Azure Maps 계정의 API 키로 변경합니다.
웹 브라우저에서 `index.html` 페이지를 열면, 지도가 로드되고, 시애틀 지역에 초점이 맞춰져 있어야 합니다.
![A map showing Seattle, a city in Washington State, USA](../../../../images/map-image.png)
✅ 확대/축소 및 중심 매개변수를 변경하여 지도 표시를 실험합니다. 데이터의 위도와 경도에 해당하는 다른 좌표를 추가하여 지도의 중심을 다시 맞출 수 있습니다.
> 💁 웹 앱을 로컬에서 사용하는 더 좋은 방법은 [http-server](https://www.npmjs.com/package/http-server)를 설치하는 것입니다. 이 도구를 사용하려면 [node.js](https://nodejs.org/) 와 [npm](https://www.npmjs.com/) 이 설치되어 있어야 합니다. 도구들이 설치되면 `index.html``http-server` 타입의 위치를 다룰 수 있습니다. 웹 앱은 로컬 웹 서버 [http://127.0.0.1:8080/](http://127.0.0.1:8080/)에서 열립니다.
## GeoJSON 형식
이제 지도가 표시되는 웹 앱이 준비되었으므로, 저장소 계정에서 GPS 데이터를 추출하여 지도 위에 있는 마커를 레이어에 표시해야 합니다. 그 전에 Azure Maps에 필요한 [GeoJSON](https://wikipedia.org/wiki/GeoJSON) 형식을 살펴보겠습니다.
[GeoJSON](https://geojson.org/)은 지리적 특정 데이터를 처리하도록 설계된 특수 형식의 개방형 표준 JSON 사양입니다. GeoJSON 파일을 디버깅하는 데 유용한 도구인 [geojson.io](https://geojson.io) 를 사용하여 샘플 데이터를 테스트하여 이에 대해 알아볼 수 있습니다 .
샘플 GeoJSON 데이터는 다음과 같습니다:
```json
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-2.10237979888916, 57.164918677004714]
}
}
]
}
```
특히 흥미로운 점은 데이터가 `FeatureCollection`내에 `Feature`로 중첩되는 방식입니다. 해당 객체 내에서 위도와 경도를 나타내는 `coordinates`가 있는 `geometry`를 찾을 수 있습니다.
✅ When building your geoJSON, pay attention to the order of `latitude` and `longitude` in the object, or your points will not appear where they should! GeoJSON expects data in the order `lon,lat` for points, not `lat,lon`.
`Geometry` 는 단일 점 또는 다각형과 같은 다른 유형을 가질 수 있습니다. 이 예시에서는 경도와 위도라는 두 좌표가 지정된 점입니다.
✅ Azure Maps는 표준 GeoJSON 과 원 및 기타 기하 도형을 그리는 기능을 비롯한 몇 가지 [향상된 기능들](https://docs.microsoft.com/azure/azure-maps/extend-geojson?WT.mc_id=academic-17441-jabenn) 을 제공합니다.
## GeoJSON을 사용하여 지도에 GPS 데이터 표시하기
이제 이전 학습에서 빌드한 저장소에서 데이터를 사용할 준비가 되었습니다. 참고로 Blob 저장소에 여러 파일로 저장되므로 Azure Maps에서 데이터를 사용할 수 있도록 파일을 검색하고 구문 분석해야 합니다.
### 작업 - 웹 페이지에서 액세스할 스토리지 구성
데이터를 가져오기 위해 저장소를 호출하면 브라우저 콘솔에서 발생하는 오류를 보고 놀랄 수 있습니다. 외부 웹 앱이 해당 데이터를 읽을 수 있도록 하려면 이 저장소에서 [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) 에 대한 권한을 설정해야 하기 때문입니다.
> 🎓 CORS는 "Cross-Origin Resource Sharing"을 나타내며 일반적으로 보안상의 이유로 Azure에서 명시적으로 설정해야 합니다. 이는 데이터에 접근할 수 있는 것으로 예상하지 않는 사이트를 중지합니다.
1. 다음 명령을 실행하여 CORS를 활성화합니다:
```sh
az storage cors add --methods GET \
--origins "*" \
--services b \
--account-name <storage_name> \
--account-key <key1>
```
`<storage_name>` 을 저장소 계정의 이름으로 바꿉니다. `<key1>` 를 저장소 계정의 키로 바꿉니다.
이 명령은 모든 웹 사이트(와일드 카드 `*` 는 모두를 의미)가 저장소 계정에서 _GET_ 요청, 즉 데이터 가져오기를 수행할 수 있습니다. `--services b` 는 blobs에만 이 설정을 적용한다는 의미입니다.
### 작업 - 저장소에서 GPS 데이터 로드
1. `init` 함수의 전체 내용을 다음 코드로 변경합니다:
```javascript
fetch(
"https://<storage_name>.blob.core.windows.net/gps-data/?restype=container&comp=list"
)
.then((response) => response.text())
.then((str) => new window.DOMParser().parseFromString(str, "text/xml"))
.then((xml) => {
let blobList = Array.from(xml.querySelectorAll("Url"));
blobList.forEach(async (blobUrl) => {
loadJSON(blobUrl.innerHTML);
});
})
.then((response) => {
map = new atlas.Map("myMap", {
center: [-122.26473, 47.73444],
zoom: 14,
authOptions: {
authType: "subscriptionKey",
subscriptionKey: "<subscription_key>",
},
});
map.events.add("ready", function () {
var source = new atlas.source.DataSource();
map.sources.add(source);
map.layers.add(new atlas.layer.BubbleLayer(source));
source.add(features);
});
});
```
`<storage_name>` 를 저장소 계정의 이름으로 변경합니다. `<subscription_key>` Azure Maps 계정의 API 키로 변경합니다.
여기에서 여러 가지 일이 발생합니다. 먼저 코드는 저장소 계정 이름을 사용하여 빌드된 URL 엔드포인트를 사용하여 Blob 컨테이너에서 GPS 데이터를 가져옵니다. 이 URL은 리소스 유형이 컨테이너(`restype=container`) 임을 나타내는 `gps-data`에서 검색하고 모든 Blob 에 대한 정보를 나열합니다. 이 목록은 Blob 자체를 반환하지 않지만 Blob 데이터를 로드하는 데 사용할 수 있는 각 Blob에 대한 URL을 반환합니다.
> 💁 You can put this URL into your browser to see details of all the blobs in your container. Each item will have a `Url` property that you can also load in your browser to see the contents of the blob. 이 URL을 브라우저에 넣으면 컨테이너의 모든 Blob에 대한 세부 정보를 볼 수 있습니다. 각 항목은 Blob의 콘텐츠를 보기 위해 브라우저에 로드할 수 있는 `Url` 속성이 있습니다.
이 코드는 다음에 생성될 `loadJSON` 함수를 호출하여 각 Blob을 로드합니다. 그런 다음 지도 제어를 만들고 `ready` 이벤트에 코드를 추가합니다. 이 이벤트는 웹 페이지에 지도가 표시될 때 호출됩니다.
ready 이벤트는 나중에 채워질 GeoJSON 데이터를 포함하는 컨테이너인 Azure Maps 데이터 원본을 만듭니다. 그런 다음 이 데이터 원본을 사용하여 GeoJSON의 각 지점 중심에 있는 지도의 원 집합인 버블 레이어를 만듭니다.
2. `init` 함수 아래의 스크립트 블록에 `loadJSON` 함수를 추가합니다:
```javascript
var map, features;
function loadJSON(file) {
var xhr = new XMLHttpRequest();
features = [];
xhr.onreadystatechange = function () {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
gps = JSON.parse(xhr.responseText);
features.push(
new atlas.data.Feature(
new atlas.data.Point([
parseFloat(gps.gps.lon),
parseFloat(gps.gps.lat),
])
)
);
}
}
};
xhr.open("GET", file, true);
xhr.send();
}
```
이 함수는 패치(fetch) 루틴에 의해 호출되어 JSON 데이터를 구문 분석하고 경도 및 위도 좌표를 geoJSON으로 읽도록 변환됩니다. 파싱되면 데이터는 geoJSON의 `Feature`의 일부로 설정됩니다. 지도가 초기화되고 경로 주위에 작은 점들이 나타납니다.
3. 브라우저에서 HTML 페이지를 로드합니다. 지도를 로드한 다음 저장소에서 모든 GPS 데이터를 로드하고 지도에 표시합니다.
![A map of Saint Edward State Park near Seattle, with circles showing a path around the edge of the park](../../../../images/map-path.png)
> 💁 이 코드는 [코드](.././code) 폴더에서 찾을 수 있습니다.
---
## 🚀 도전
정적 데이터를 지도에 마커로 표시할 수 있다는 점이 좋습니다. 이 웹 앱에 타임스탬프가 있는 json 파일을 사용하여 애니메이션을 추가하고 시간 경과에 따른 마커의 경로를 표시할 수 있습니까? 여기 지동 애니메이션을 사용한 [일부 샘플들](https://azuremapscodesamples.azurewebsites.net/) 이 있습니다.
## 강의 후 퀴즈
[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/26)
## 복습 및 독학
Azure Maps은 특히 IoT 장치 작업에 유용합니다.
- [Microsoft 문서의 Azure Maps 문서](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps?WT.mc_id=academic-17441-jabenn)에서 일부 용도를 조사합니다.
- [Microsoft의 Azure Maps의 자기 학습 모듈을 사용하여 첫번째 경로 찾기 앱 만들기](https://docs.microsoft.com/learn/modules/create-your-first-app-with-azure-maps/?WT.mc_id=academic-17441-jabenn)를 통해 지도 작성 및 웨이포인트에 대한 지식을 심화하세요.
## 과제
[앱 배포](assignment.md)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save