ShIoTiny: ساعة بدون ربيع أو في الوقت الحقيقي وكيفية التعامل معها



ما هو هذا المقال حول

نواصل سلسلة المقالات على ShIoTiny - وحدة تحكم قابلة للبرمجة بصريًا تستند إلى شريحة ESP8266 .

يتحدث هذا المقال عن الساعة في الوقت الفعلي في وحدة تحكم ShIoTiny ، ومزامنة الوقت واستخدام العقد للعمل على مدار الساعة.

موقع مشروع ShIoTiny

المقالات السابقة في السلسلة.

ShIoTiny: أتمتة صغيرة ، إنترنت الأشياء ، أو "ستة أشهر قبل الإجازات"

ShIoTiny: العقد والروابط والأحداث أو ميزات برامج الرسم

ShIoTiny: تهوية الغرفة الرطبة (مثال على ذلك المشروع)

ShIoTiny والعالم المحيط: ربط أجهزة الاستشعار إلى المدخلات الثنائية ، اتصل ترتد وغيرها من القضايا

ShIoTiny والعالم: أجهزة استشعار تمثيلية أو ADC للأصغر

البرامج الثابتة الثنائية ، دائرة التحكم والوثائق

دخول


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

الشيء هو أن الساعة في الوقت الحقيقي غير متقلبة في رقاقة ESP8266 وحدة تحكم ShIoTiny مفقودة. إن إصابة المواليد بوحدة التحكم ShIoTiny هي خطأي بالكامل. ولكن ما تم القيام به هو القيام به.

بمجرد رؤية البرنامج الثابت للضوء ، بدأ الجمهور ، الغاضب من موقفي في الوقت الحقيقي ، في بث أنفي في هذا الخلل.

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

حول ShIoTiny ووتش


كما ذكرنا سابقًا ، لا توجد "ساعات مع بطارية" في ShIoTiny . ولكن في الوقت نفسه ، يتم تطبيق العد التنازلي للثواني بدءًا من 1 يناير 1970.

هذا هو الوقت نفسه الذي يطلق عليه UNIX-time ، ويتم تخزينه في متغيرات type time_t بلغات C / C ++ والتي يجب أن تنتهي في 19 يناير 2038 في أنظمة 32 بت.

لكن لا تخف. أعتقد أنه بحلول عام 2038 ، سيكون لدى الجميع وقت لإعداد نوع 64 بت من الوقت ، وسيتم حل المشكلة في 292 مليار سنة القادمة. حسنًا ، هناك شيء آخر سنتوصل إليه.

لاحظ أن الوقت بالتنسيق time_t يسمى أحيانًا (في مقالتي أيضًا) - الطابع الزمني أو ، بالروسية ، الطابع الزمني .

لكن العودة إلى وحدة تحكم لدينا. لذلك ، هناك ساعة فيه ، ولكن يتم إعادة تعيين هذه الساعة إلى 0 بعد إيقاف الطاقة. هذا يؤدي إلى استنتاج تافه أن المشكلة الرئيسية في حساب الوقت في وحدة تحكم ShIoTiny هي الحاجة إلى مزامنة ساعة وحدة التحكم عند تشغيل الطاقة. الباقي هو مشاكل فنية بحتة.

تزامن الوقت


تعد خوادم NTP إحدى الطرق القديمة لمزامنة الوقت على الإنترنت. وكانت الفكرة الأولى هي إنشاء عقدة تزامن الوقت مع خادم NTP معطى.

لكن ، بعد أن استنشق هواءً طازجًا قليلاً وتفكر في اليقطين ، أدركت أن هذا النهج خاطئ أيديولوجيًا.

ليست حقيقة أن المستخدم يريد سحب وحدة التحكم باستخدام ShIoTiny الثابتة على الإنترنت. ويمكن إرسال وقت التزامن ليس فقط من خادم NTP ، ولكن أيضًا عبر UDP-multicast ، أو بجودة اتصال معروفة - عبر MQTT .

لذلك ، تم اتخاذ قرار مصيري - لفصل العقد لتلقي الوقت من خادم NTP وضبط وقت النظام.

في المجموع ، تم تطوير عقدتين لمزامنة الوقت: العقدة لاستقبال الوقت من خادم NTP وقت NTP



وضبط الوقت عقدة تركيب ساعة النظام



عقدة تلقي الوقت من خادم NTP كما المعلمات يتلقى اسم أو عنوان IP لملقم NTP ، مفصولة بفاصلة ، الفترة الزمنية من خادم NTP في دقائق. بشكل افتراضي ، يتم طلب الوقت من خادم NTP كل 60 دقيقة أو 1 ساعة. عند الإخراج ، تحدد هذه العقدة 0 حتى تتم مزامنة الوقت أو يكون طابع الوقت نتيجة لآخر التزامن مع الخادم.

تتلقى عقدة تثبيت ساعة النظام طابعًا زمنيًا كمدخل وتعيين ساعة النظام وفقًا لهذا التصنيف.

يظهر الشكل الأكثر بساطة لمزامنة ساعة النظام مع خادم NTP .



لم يتم تعيين فترة التزامن و 60 دقيقة بشكل افتراضي. يوضح الشكل الطابع الزمني.

لاحظ أنه لا يمكن أن يكون هناك أكثر من عقدة واحدة لتلقي الوقت من خادم NTP وأكثر من عقدة واحدة لتحديد وقت النظام في مخطط البرنامج.

إذا كنت بحاجة إلى نظام التزامن الغريب ، فيمكنك استخدام UDP-multicast أو MQTT . المخططات متشابهة تمامًا.

لمزامنة البث المتعدد UDP ، تقريبًا كما في الشكل.



وللمزامنة عبر MQTT (أنا لا أنصح ، بالطبع ، ولكن في الحالات القصوى) - مثل.



آمل الآن أن كل شيء واضح مع تزامن ساعة النظام لوحدة التحكم ShIoTIny . دعنا ننتقل إلى العقد من تلقي ومعالجة الوقت.

كم الساعة؟


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

يمكن لخادم NTP ، بناءً على الإعدادات ، إرجاع طابع زمني مرتبط بمناطق زمنية مختلفة. عادةً ما يرتبط هذا الطابع الزمني بالتوقيت العالمي المتفق عليه ( UTC) .

ولكن عادة ما نحتاج إلى التوقيت المحلي للمنطقة حيث تعمل وحدة التحكم الخاصة بنا. كيف تكون هنا؟

إنه أمر بسيط للغاية - للحصول على الطابع الزمني لساعة النظام في وحدة تحكم ShIoTIny ، تم تطوير عقدة Get Time ، حيث يمكنك ضبط المنطقة الزمنية كإزاحة زمنية من -12 ساعة إلى +12 ساعة بالنسبة لساعة النظام الخاصة بوحدة التحكم.

افترض أننا حصلنا على الوقت من خادم pool.ntp.org ونقوم بمزامنة ساعة النظام ، كما في مثالنا السابق. هذا الخادم يعود الوقت العالمي. نحن بحاجة المحلية ، مثل تومسك ، مثل بلدي. أعلم أن Tomsk موجود في المنطقة الزمنية UTC + 7 . لذلك ، دعونا نضبط وحدة استلام الوقت على الإزاحة + 7 أو 7 فقط. كما في الشكل أدناه.



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

تحقق على مدار الساعة


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

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

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

كيف يعمل كل هذا واضح من الشكل أدناه.



لاحظ أن العقد " تقسيم الوقت" و " وقت التوليف" أشهر (شهر) وأيام الأسبوع (wday) تحسب من صفر. للأشهر: 0-يناير ، 11 ديسمبر. لأيام الأسبوع 0-الأحد ، 6-السبت.
المخرجات الأخرى: يتم حساب اليوم بالشهر (اليوم) ، والسنة (السنة) ، والساعة (ساعة) ، والدقيقة (الدقيقة) ، والثانية (الثانية) - بالشكل المعتاد. الساعات والدقائق والثواني - من 0 إلى 59. يوم الشهر - اعتمادًا على الشهر من اليوم الأول إلى الثلاثين أو 31 ، وفي فبراير ، إلى 28 أو 29.
حسنًا ، سنة - إنه العام. 2019 الآن.
آمل أن كل شيء واضح.

مثال النظام


لكي لا تكون بلا أساس ، سأقدم مثالًا على استخدام الساعات. بالطبع ، مبسطة.

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

دعنا نحاول تنفيذ هذا.



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

بمجرد مزامنة الوقت ، يتم تحديد تشغيل / إيقاف المروحة حسب الوقت ومستوى الرطوبة الحالي. بمجرد أن يتجاوز مستوى الرطوبة 70٪ والوقت من الساعة 23:00 حتى 06:00 ، سيتم تشغيل المروحة ولن يتم تهوية الغرفة.

بالطبع ، من الأفضل استبدال ثوابت الوقت والرطوبة في مشروع حقيقي بالمعلمات المخزنة في FLASH وتعيينها ، على سبيل المثال ، وفقًا لـ MQTT . نعم ، والحالة الحالية للنظام - مستوى الرطوبة والحالية والوقت وحالة المروحة - لا تؤذي أيضًا للنشر على الشبكة للتحكم في النظام من الهاتف الذكي. ولكن هذا بالفعل أترك مجالا لخيالك.

استنتاج


لذلك قدمنا ​​تحكمنا مع الوقت الحقيقي أقرب.

أود أن أشكر كل من أرسل لي رسائل النقد البناء والمشورة بشأن ترقيات البرامج. شكرا يا شباب!

كالعادة - النقد البناء مرحب به. بالإضافة إلى ذلك ، التعليقات والاقتراحات هي موضع ترحيب.

يمكنك إرسال جميع الانتقادات والتعليقات والاقتراحات كالمعتاد في تعليق أو عن طريق البريد: shiotiny@yandex.ru .

Source: https://habr.com/ru/post/ar467545/


All Articles