خبرة في استخدام شاشات LCD استنادًا إلى منتجات MELT

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

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

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

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

حول دائرة قياس المستشعر


فيما يتعلق بخفض عتبة البدء ، نشأ السؤال عن الوقت الكبير الذي يستغرقه لقياس الترددات المنخفضة القادمة من مستشعر السرعة (لمزيد من التفاصيل ، انظر هذا المنشور حول طرق قياس الترددات المنخفضة). من أجل عدم الحد من عتبة البدء بشكل مصطنع ، في هذه الحالة يجب أن نقيس الترددات التي تبدأ من 1-2 هرتز: مع الأخذ بعين الاعتبار أن المستشعر يحتوي على 16 حفرة في دائرة (انظر صورة المستشعر في المقالة الأصلية ) ، هذا يقابل ثورة واحدة تقريبًا في 8-16 الثواني ، والتي من الواضح أنها أقل من أي عتبة للبدء. أي أن مهلة انتظار وصول نبض التردد التالي يجب أن تكون 1 ثانية على الأقل (انظر المقالة المشار إليها حول طرق القياس) ، وهو ما يجعل القصة موفرة للطاقة منطقية: من أجل الحصول على وقت تحديث مقبول وفي نفس الوقت تمكن من متوسط ​​البيانات لتجنب الثرثرة على الشاشة ، علينا أن نوقظ وحدة التحكم كل ثانيتين. وإذا استغرق نصفها وقتًا في انتظار النبضات ، فلن يكون هناك توفير للطاقة - مع الأخذ في الاعتبار حقيقة أن الصمام الباعث للمستشعر يعمل طوال هذا الوقت ، ويستهلك حوالي 20 مللي أمبير.

بعض التفاصيل بين قوسين
ألاحظ بين قوسين أنه فيما يتعلق بهذه المشكلة ، تذكرت على الفور العداد الحالي الذي تم تصميمه في مكتب التصميم لدينا في أوائل الثمانينيات ، حتى قبل ظهور جميع أنواع وحدات التحكم. تم تطبيق متوسط ​​المتجه الحقيقي في ذلك: أي أن تسجيل جميع القراءات تم تسجيله بواسطة الإشارة من القرص الدوار لجهاز استشعار السرعة نفسه - وهو تناظري تقريبي بعد انقطاع خارجي. وبعبارة أخرى ، إذا لم يكن هناك تيار ، فلن يتم تسجيل أي شيء ، ولم تستهلك الدائرة شيئًا - فقط الساعات في الوقت الفعلي عملت. كانت عتبة بدء القرص الدوار ، المصممة على شكل دافع بدون طفو صفري ، هي قول الحقيقة ، 2-3 سم / ثانية ، وأشار المقياس إلى الاتجاه بتحويل الجسم بالكامل. لذا فهي في الماء ، وهي أكثر كثافة بـ 700 مرة من الهواء! خلال متوسط ​​الوقت ، الذي يصل إلى ساعات ، ستدور عجلة المروحة هذه مرة واحدة على الأقل ، لأنه لم تكن هناك قياسات فارغة تقريبًا هناك. وبالنسبة لمحطة الأرصاد الجوية ، كما سبق ذكره ، فإن طريقة حساب المتوسط ​​الحسابية الصحيحة ليست مناسبة ، لأنه في حالة عدم وجود الرياح يجب أن تظهر شيئًا حقيقيًا. لذلك ، هنا لا يمكننا الاستغناء عن مهلة محدودة بشكل مصطنع لانتظار نبضات من المستشعر.

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

بالنسبة لقراءات الساعة ، لم أزعج الموقتات أو عد Arduino millis () ، ولكن ببساطة قم بإعداد مولد تردد خارجي بدائي لمدة 1.5 ثانية تقريبًا على المؤقت 555:


كما نتذكر ، تستخدم دائرة المستشعر وحدة تحكم Atmega328 "العارية" في حزمة DIP ، مبرمجة عبر Uno ومثبتة على المقبس ؛ يتم استخدام Arduino نفسه فقط للنماذج الأولية. تم توصيل خرج المولد بدبوس المقاطعة INT0 ، دبوس 4 للدائرة الدقيقة (دبوس D2 للوحة Uno). إن مقاطعة الاختلاف الإيجابي (RISING) تحدد علامة معينة ، والتي يتم بموجبها أخذ القراءة التالية في الدورة الرئيسية. يتم قياس التردد من المستشعر أيضًا بواسطة طريقة المقاطعة (يتم توصيل خرج المستشعر بمدخل مقاطعة INT1 ، دبوس 4 (D3) ، انظر الطريقة الأخيرة في نفس المقالة ) ، لأن الحد الأقصى لوقت الانتظار هو ضعف فترة التردد المقاس. مع مهلة ثانية واحدة ، فإن الحد الأدنى للتردد المقيس هو 2 هرتز (دورة واحدة من مقياس شدة الريح في 8 ثوان). في كل دورة رابعة ، يحدث المتوسط ​​ويتم إرسال البيانات النهائية إلى الوحدة الرئيسية ، أي يتم تحديث القراءات كل 6 ثوانٍ تقريبًا.

يجب معايرة القصة بأكملها مع مستشعر محدث وفحصها بشكل دوري لمعرفة ما إذا كان الاحتكاك قد زاد ، مقارنة القراءات بمقياس شدة الريح اليدوي. لذلك ، من غير المريح للغاية أن يتم عرض القراءات في مكان واحد (في المنزل) ، ويتم تثبيت المستشعر الخارجي في مكان مختلف تمامًا - في حديقة الحديقة. نشأ سؤال حول تثبيت شاشة LCD في مبيت المستشعر. نظرًا لأن الجمال غير مطلوب هنا ، فإن متطلبات المعلومات لذلك هي الحد الأدنى: يكفي عرض سطر واحد من 10 أحرف. لكن المتطلبات الهندسية صارمة تمامًا: يجب أن تناسب الشاشة الحالة الموجودة في العرض ، وهي 70 مم. يجب أن أقول أنه بسبب عدم كراهي العضوي لشاشات عرض LCD (خافتة ، منخفضة التباين ، بأحرف صغيرة ، جودة إضاءة خلفية مثيرة للاشمئزاز ، وكذلك تستهلك الكثير ، المزيد عن ذلك لاحقًا) ، لا أعلم تقريبًا النطاق المتاح في البيع بالتجزئة. وهكذا أصبح من الواضح على الفور أن الشاشات التي أحتاجها يجب أن يتم البحث عنها كثيرًا للبيع: شاشة LCD مقاس 16 × 2 القياسية ، السائدة في المتاجر ، تحتوي على لوحة بطول 80 مم ولا يمكن احتواؤها في المستشعر ، وجميع الأنواع الأخرى أكبر حجمًا ، بغض النظر من الشركة. في الطبيعة ، بالطبع ، هناك أصناف أصغر ، ولكن بعد ذلك في الطبيعة ، وليس في متاجر التجزئة المحلية.

الحل: يا ذوبان!


في النهاية ، اكتشفت MELTs في وقت واحد تناسب مهمتي بشكل رائع. أولهم هو MT-10S1 أحادي الخط مكون من 10 أحرف مع وحدة تحكم ، والتي ، وفقًا للمصنعين ، " تشبه HD44780 من HITACHI و KS0066 من SAMSUNG ." لديها أحرف كبيرة إلى حد ما: أكثر من 8 مم في الارتفاع ، وهو في الواقع سمة من سمات العروض الصينية بأحجام أكبر بكثير. عرض اللوح 66 مم ، أبعاد الشاشة البارزة (الخارجية) هي 62x19.5. الاستهلاك في هذه الحالة لا يزعجني كثيرًا (لأن المستشعر الخارجي مدعوم ببطارية شمسية ذات طاقة أكبر بشكل واضح من اللازم) ، ولكن عادة ، بالنظر إلى الخط في ورقة البيانات ، وجدت أنه أصغر أيضًا من المعتاد - 0.7 مللي أمبير (جميع شاشات LCD العادية تستهلك شاشات العرض على نظائر HD44780 من 1.2 مللي أمبير وأعلى). لا يزال هناك ضوء خلفي إلى كومة الذاكرة المؤقتة ، كما هو معتاد لجميع هذه الأنواع - إلى حد ما بائسة وتستهلك في الوقت نفسه الكثير من الطاقة.



العرض الثاني من MT-10T7 أكثر إثارة للدهشة: بالضبط في نفس الأبعاد تتناسب مع 10 أرقام من سبعة أجزاء بارتفاع يصل إلى 13 ملم. كانت بعض الشكوك ناتجة عن واجهة غير قياسية ، وعلى ما يبدو ، واجهة ذاتية الصنع (حيث يتم إعطاء مثال البرمجة في الشفرة الكاذبة اللفظية في ورقة البيانات). لا تحتوي الشاشة على وحدة تحكم حقيقية: هناك مجموعة من مشغلات المزلاج الثابتة يتم التحكم فيها بواسطة المنطق التوافقي. ولكن بفضل هذه البساطة ، يستهلك هذا التصميم بالكامل 30 μA فقط ، أي أنه مناسب حقًا للأجهزة التي تعمل على طاقة البطارية على مدار الساعة (استهلاك 1.4 مللي أمبير في الشاشات التقليدية وحتى 0.7 مللي أمبير في MT-10S1 أعلى بكثير مما هو مسموح به لمثل هذه تطبيق القيمة - احسبوا بأنفسكم المدة التي ستعمل فيها هذه الشاشة ، حتى دون مراعاة المكونات المتبقية للجهاز ، على سبيل المثال ، من بطاريات AAA بسعة حوالي 1500 مللي أمبير في الساعة).



باختصار ، امنح اثنين!

MT-10T7


محاولة إعادة إنتاج الخوارزمية بشكل مستقل لـ MT-10T7 ، الموصوفة في ورقة البيانات (على كل من Arduino وفي المجمع النقي) ، لم تؤد إلى النجاح. لم أكن أفهم ما حدث من خطأ ، لأنني صادفت هذا المنشور ، حيث قدم المؤلف (eshkinkot) مثالًا مكتوبًا جيدًا وتم تنفيذه بالكامل للتعامل مع MT-10T7 ، وبعد ذلك عمل كل شيء على الفور. إذا كان أي شخص مهتمًا ، فهنا يكمن مثال معدّل لـ eshkinkot ، مكملاً بجميع الرموز ذات المغزى الصالحة للمؤشرات المكونة من سبعة أرقام ، بما في ذلك الأحرف التي لا تتطابق مع الأرقام:






في هذه الصور ، يكون تباين الشاشة مشوهاً قليلاً عن طريق تعيين المقسم لإخراج Vo - 18 كيلو أوم (إلى الطاقة): 10 كيلو أوم (على الأرض) ، على الرغم من أنه بدونه يكون التباين "الافتراضي" مقبولًا تمامًا.

ثم أضفت إلى المثال المشار إليه دالة تعيد إنتاج رقم عشوائي على الشاشة في غضون ثلاثة إلى أربعة منازل عشرية - موجبة أو سالبة أو عدد صحيح أو فاصلة عائمة ، أي أن إجمالي عدد الأحرف يمكن أن يصل إلى خمسة: "-12.7" ، على سبيل المثال. نظرًا لأن النقطة في كود السبعة أجزاء لا تشغل ألفة منفصلة ، فإن الحد الأقصى لعدد البتات المراد عرضها هو 4. معلمات الإدخال لهذه الوظيفة هي: أ) مصفوفة (char buf [5]) تحتوي على تمثيل ACSII للرقم ، ب) العدد الفعلي للأحرف فيه (2 من 1 إلى 5) و ج) الموضع (نقاط البيع من 0 إلى 9) حيث تضع العلامة الأولى (اليسرى) للرقم (للوظائف والتدوين المستخدم على طول الطريق ، انظر المنشور المشار إليه بواسطة eshkinkot أو في المثال بالإشارة):

رمز الوظيفة
void writeASCIIdig_serial(char buf[5], byte ii, byte pos) //      { boolean dot; //     //  ,   pos: pos=pos+(4-ii); //  ,    : for (byte i=0; i <= ii; i++) if (buf[i]=='.') pos++; // : for (byte i=0; i <= ii; i++){ // .  ,    : if (buf[i+1]=='.') dot=true; else dot=false; switch (buf[i]) { //decoder ASCII -> 7-  case '0': writeSymbol(pos, DIGIT_ZERO, dot); break; case '1': writeSymbol(pos, DIGIT_ONE, dot); break; case '2': writeSymbol(pos, DIGIT_TWO, dot); break; case '3': writeSymbol(pos, DIGIT_THREE, dot); break; case '4': writeSymbol(pos, DIGIT_FOUR, dot); break; case '5': writeSymbol(pos, DIGIT_FIVE, dot); break; case '6': writeSymbol(pos, DIGIT_SIX, dot); break; case '7': writeSymbol(pos, DIGIT_SEVEN, dot); break; case '8': writeSymbol(pos, DIGIT_EIGHT, dot); break; case '9': writeSymbol(pos, DIGIT_NINE, dot); break; case '-': writeSymbol(pos, SYMBOL_MINUS, dot); break; } //end decoder if (buf[i]!='.') pos++; //  ,  +1  }//end for i } 


تعد وحدة MT-10T7 لمخرجات التحكم في القيم العددية أكثر ملاءمة من شاشات مصفوفة الخطوط العادية: فهي تحتوي على أرقام كبيرة ، ولا تشغل الفاصلة العشرية ألفة منفصلة ، وبالتالي ، يمكنك احتواء حرف واحد آخر في نفس المواضع. ولكن لأغراضي ، يكون الأمر أكثر ملاءمة إذا كان هناك إمكانية لإخراج الحروف (وإلا سيتعين عرض الاتجاه بدرجات بوصلة ، وهو أمر غير معتاد إلى حد ما). لذلك ، في هذه الحالة ، وجهت عيناي إلى المصفوفة أحادية الخط ذات الحجم الواحد MT-10S1 ، والتي ، على الرغم من عدد من العيوب ، وانتقلت إلى التصميم النهائي. في الوقت نفسه ، لديه بالفعل إضاءة خلفية ، والتي تفتقر إليها MT-10T7 (لهذا كان من الضروري شراء MT-10T8 على الفور) ، وقررت أن وجودها في هذه الحالة لن يضر.

MT-10S1


تحتوي شاشة MT-10S1 على أحرف أصغر مرة ونصف ، ولكن أيضًا حجم لائق جدًا. بالإضافة إلى ذلك ، فإن شاشته ممتلئة اقتصاديًا بالأبعاد الإجمالية: لا توجد نظائر استيراد مكونة من 10 أرقام ، ولكن في Winstar WH1601L (حيث تكون الأحرف أصغر قليلاً في الارتفاع) ، هناك علامة واحدة أكثر من المليمتر أكثر من الطول الإجمالي للوحة والشاشة. حسنًا ، انخفض استهلاك وحدة التحكم إلى النصف تقريبًا (مقارنة بنفس WH1601L). في الواقع ، تنتهي المزايا عند هذا الحد ، ثم تبدأ "الميزات".

تفتخر الوحدة النمطية ، كما سبق ذكره ، بأنها تحتوي على وحدة تحكم متوافقة مع HD44780 من HITACHI. أي أنه يجب أن يعمل مع الكريستال السائل المحبوب بدون ضغط لا داعي له. علاوة على ذلك ، تتزامن صفحة التشفير "الافتراضية" مع الصفحة الإنجليزية السيريلية HD44780 ونظائرها العديدة ، أي أن MT-10S1 يجب أن تعمل مع Liquid Crystal Rus دون أي مشاكل ، لا يلزم صفحات ترميز لتبديل هذا. وهو يفعل كل هذا حقًا ، ولكن مع الفروق الدقيقة.

التحذير الأول - في إصدار سطر واحد ، يبدو أن المطورين يحفظون على التسجيلات ، وهناك 8 أحرف فقط من السلسلة (العناوين 00h - 07h) في الذاكرة لكل تسجيل (والحرفان المتبقيان موجودان بالفعل في سجل آخر (40h-41h). أي أن العرض الواقعي يتكون من سطرين ، حيث يقع كلا الخطين فعليًا في سطر واحد. عند الفحص الدقيق ، اتضح أن الشيء نفسه ينطبق على WH1601 (هناك فقط السجل الثاني يأخذ ثمانية أرقام كاملة). لماذا يتم القيام بذلك بشكل غير مريح غير واضح تمامًا ، في الشاشات العادية بحجم 16 × 2 ، تكون السجلات ستة عشر بتًا ، وهذا الاقتطاع بالكاد يجعل المنتج أرخص ، بدلاً من ذلك ، على العكس من ذلك ، بسبب الحاجة إلى إنتاج إصدارات مختلفة من وحدة التحكم (إذا كانت مختلفة ، وأنا لست متأكدًا منها على الإطلاق). اعتقدت أنه كان مرتبطًا باستهلاك أقل من المعتاد لـ MT-10S1 ، ولكن WH1601 نفسه يستهلك 1.2-1.4 مللي أمبير ، أي أنه لا يختلف عن نظرائه المتقدمين.

حسنًا ، يبدو ، حسنًا - في Liquid Crystal Rus ، تم العثور على وظيفة setDRAMModel () والثابت المقابل لـ LCD_DRAM_WH1601. في هذا الوضع ، تحتوي المكتبة على ترجمة عنوان واضحة:

 if (ac>7 && ac<0x14) command(LCD_SETDDRAMADDR | (0x40+ac-8)); 

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

يجب تعريف شاشة MT-10S1 بخطين: lcd.begin (16، 2)؛ (بدلاً من 16 يمكنك استبدال 10 أو 12 ، لن يتغير شيء ، لأن العدد الحقيقي للأحرف في سطر واحد لا يزال 8). ستؤدي محاولة تهيئته كخط مفرد (الرقم 1 في الموضع الثاني) إلى الفشل - ستتحول الخلفية إلى اللون الداكن. ولا يمكن عرض الأرقام متعددة الأرقام إلا في غضون 8 أحرف ، أما بالنسبة للخطوط الأطول ، فستختفي الأحرف القصوى بعد 8. لذلك ، فإن الأحرف 9 و 10 مناسبة فقط لعرض الكميات المساعدة (وحدات القياس ، على سبيل المثال) ، أو تحتاج إلى تقسيم رقم السطر إلى أرقام منفصلة ، وعند تجاوز الحرف الثامن ، قم بتغيير موضع المؤشر إلى الحرف الأول من السطر الثاني.

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

واجهة مع وحدة تحكم


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

يستدعي ذلك حل I 2 C استنادًا إلى PCF8574 (أو العديد من نظائرها) ، خاصة وأن هذه الشريحة نفسها ليست سوى سجل تغيير خادع ، وبالتالي تستهلك عدة عشرات من الميكرامبيرات في العمل وأقل من 10 ميكرامبيرات في حالة الراحة. جنبا إلى جنب مع MT-10T7 ، يشكلون زوجًا ممتازًا لإنشاء أجهزة منخفضة الطاقة مع مؤشرات ، وحتى MELT لديه خيار جاهز لهذه الحالة: MT-10T11 بإجمالي استهلاك 30 μA.

ولكن بالنسبة إلى MT-10S1 لا يوجد مثل هذا الحل الملائم - لسبب ما ، يتم فقط توفير الإصدارات ذات التكوين 20x4 مع إضافة في شكل تناظري من PCF8574 بين شاشات MELT ( UPD: في التعليقات ، اقترحوا أن هناك أيضًا تكوين MT-16S2H من 16x4 مع نفس الواجهة ، على الرغم من ، أبعاده تتجاوز الأبعاد التي أحتاجها). الوحدة النمطية النهائية من النوع الموصوفة في هذه المقالة غير ملائمة للاستخدام في هذه الحالة ، لأن الميزة الثانية غير السارة لشاشة MT-10S1 هي pinout غير القياسي. الاستنتاجات هي نفسها (HD44780 ، ومع ذلك ، بشكل أدق ، نظيرتها المحلية ، KB1013VG6) ، لكنها تقع في ترتيب غير قياسي تمامًا. من أجل الاهتمام ، راجعت كل من المستورد 16x1 و MELT من سطرين / أربعة أسطر - كلهم ​​لديهم ترتيب إخراج قياسي ، و MT-10S1 تبرز على هذه الخلفية لسبب ما. لذلك عليك أن تتخذ قرارًا ذاتيًا.

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

يتحدث عن إعادة تعيين تسلسل
بالمناسبة ، حول دائرة إعادة الضبط: لدي مكثف صغير مثل 1 μF على المقاوم لعدة kOhms ، أي أن وقت التأخير عند تشغيل الطاقة هو بضع مللي ثانية. كم؟ يعلمنا الدليل أنه ، بالنسبة للعائلة الكبيرة بأكملها ، لا يلزم وجود سلسلة خارجية على الإطلاق هنا ، من المفترض أن تبدأ الدائرة الداخلية البداية الصحيحة ، وأسرع بكثير. لكن عادة وضع سلسلة RC خارجية على دبوس 1 من وحدة التحكم لتأخير بدء التشغيل عندما قمت بتشغيلها بقيت معي من وقت عائلة AVR Classic المنسية بالفعل ، حيث قد لا تبدأ وحدة التحكم بشكل صحيح إذا لم يزداد جهد الإمداد بسرعة كافية. وفي عائلة Mega Brown-out Detector قد لا تعمل بشكل جيد للغاية. في الحالات الحرجة ، لا يزال من المفيد تثبيت شاشة طاقة خارجية ، ولكن هنا لا تؤذي سلسلة RC أي شيء ، ولكنها يمكن أن تساعد في الحالات التي تكون فيها مصادر الطاقة سيئة. بالمناسبة ، فإن مطوري لوحات Arduino على دراية بذلك ، لأنه على لوحة Uno ، على سبيل المثال ، هناك نفس السلسلة من 10 kOhm / 100 nF.

وأمر الله نفسه بإرساء جهازي تحكم AVR متطابقين على الواجهة التسلسلية المعتادة ، والتي على أي حال ، باستثناء عملية البرمجة ، لا تستخدم في أي مكان آخر في هذا المشروع ، والتي تستخدم كل شيء في متناول اليد بالفعل. بالمناسبة ، لا يختلف هذا الحل في السعر عن المكونات القائمة على PCF8574 ويمكن أن ينافسه من حيث توفير الطاقة في البديل مع MT-10T7 - في حالة عدم توفر MT-10T11 المذكور أعلاه.

إجمالاً ، تكون دائرة وحدة MT-10S1 مع وحدة التحكم كما يلي (في الرسم البياني ، يتم تعيين محطات ATmega328 بين قوسين بعد استنتاجات مجلس Arduino):



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

سر الطبيعة
يرتبط سر واحد من الطبيعة بهذا الأمر ، والذي لم أستطع حله. من المعروف أنه لا يمكن إخراج ميجا من النوم العميق إلا من خلال مقاطعة خارجية غير متزامنة ، حيث يتم إيقاف تشغيل الساعة ولا يمكن أن يحدث المقاطعة المتزامنة. والعائلة بأكملها من وحدات تحكم AVR ذات 28 سنًا ، والتي تقود شجرة عائلتها من ATmega8 (48/88/168/328) ، لديها على هذا النحو المقاطعات ذات المستوى المنخفض فقط INT0 و INT1 (ومقاطعة PCINT ، ولكنها لا تستخدم في Arduino). ترتبط جميع التوصيات الرسمية بهذا في كل من مواد Atmel ومواقع Arduino. يقول المثال الموجود على موقع arduino.cc صراحةً: " في جميع أوضاع النوم IDLE فقط يمكن استخدام LOW فقط ". وهذا ، كما هو ، ليس موضع شك ، على سبيل المثال ، يكرر مونك الشيء نفسه بمزيد من التفصيل في كتابه : " لاحظ أنه تم تحديد نوع المقاطعة LOW. هذا هو نوع المقاطعة الوحيد الذي يمكن استخدامه في هذا المثال. لن تعمل الأنواع الصاعدة والتساقط والتغيير ".

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

ولدهشتي ، عمل كل شيء بشكل مثالي. وضع توفير الطاقة - SLEEP_MODE_PWR_DOWN ؛ بسبب عدم الجدوى ، لم أتخذ تدابير لزيادة تقليل الاستهلاك عن طريق تعطيل جميع الوظائف الأخرى ، ولكن لا يزال من الواضح أن مولد الساعة مغلق. ومع ذلك ، تستيقظ وحدة التحكم بانتظام على الحافة المتساقطة ، وتطلب البيانات ، وتعرضها على الشاشة وتغفو مرة أخرى. من أجل نقاء التجربة ، قمت بإزالة عضو الكنيست من لوحة UNO وأدخلته في مقبسي مع الكوارتز المتصل ، وما زال كل شيء يعمل. يمكن ملاحظة ذلك من الاستهلاك: ما يقرب من 17 مللي أمبير في الوضع العادي و 0.9-1 مللي أمبير مع تشغيل توفير الطاقة (يجب أن يعزى 0.7 مللي أمبير إلى الشاشة).

دون الخروج من دهشتي ، قرأت أوراق البيانات من Atmel ، نظرت في كتاب Evstifeev (مع ترجمتها) ، حتى نظرت إلى دليل Atmel القديم حول العائلة الكلاسيكية ، ثم أمضيت نصف يوم في البحث على الأقل عن بعض التفسير لما كان يحدث (في كل من الروسية و باللغة الإنجليزية) في اثنين من محركات البحث المعروفة ، ولكن لم يجد أي تلميح حتى في أي مكان. ما لم يكن ذلك مفيدًا في ملاحظات تطبيق Atmel ، لأنه من المشكوك فيه أنه تم نشر أي شيء يتعارض مع أوراق البيانات هناك. سأكون سعيدًا إذا عرف شخص ما ما أسأت فهمه.
UPD: أظهر فحص المجمع المباشر (ATmega8) امتثالًا كاملاً لأوراق البيانات ، أي أنه يعمل فقط على مستوى المقاطعة. التفسير الوحيد الذي يتبادر إلى الذهن هو أن Arduino ربط بطريقة أو بأخرى مقاطعة PCINT بمقاطعة عادية. محاولة لتوضيح الوضع من خلال دراسة نص مكتبات نظام Arduino لم تسفر عن شيء - هناك سيكسر الشيطان ساقه.

يتم تنظيم نقل البيانات من وحدة تحكم المستشعر إلى وحدة تحكم العرض عبر UART في شكل مربع حوار. الاستيقاظ ، كل مقاطعة رابعة ، تطلب وحدة تحكم العرض البيانات بدورها:

 . . . . . if (flag==1) { //   4-  ~6  Serial.print('T'); //   while(!Serial.available()); //  T iit = Serial.readBytes(buft,5); //  5  , //  ii    Serial.print('H'); //   while(!Serial.available()); //  iihh=Serial.readBytes(bufhh,5); //  5  , //  ii    Serial.print('S'); //   while(!Serial.available()); //  iiss=Serial.readBytes(bufss,5); //  5  , //  ii    Serial.print('D'); //   while(!Serial.available()); //  iid=Serial.readBytes(bufd,5); //  5  , //  ii    flag=0; //   } . . . . . 

هنا buft و bufhh و bufss و bufd عبارة عن صفائف (وليس سلاسل!) من خمسة بايت ، والتي تحتوي على بيانات عن درجة الحرارة والرطوبة والسرعة والاتجاه في شكل تحلل ASCII للأرقام المقابلة. لكي لا يقبل الكثير ، يحدد الإعداد مهلة مختصرة للاستقبال:

 . . . . . Serial.begin(9600); Serial.setTimeout(10); //   10  . . . . . 

إنه أكثر ملاءمة للعرض: أولاً ، لديك على الفور طول الرقم المستلم ، وثانيًا ، ترسل الدالة Serial.print () سلسلة ASCII من جانب وحدة تحكم المستشعر ، مع تعيين الإيقاف المؤقت في نفس 10 مللي ثانية بين عمليات الإرسال :

 . . . . . //     : if (Serial.available()>0) //  { char ch=Serial.read(); if (ch=='T') { Serial.print(temperature,1); delay(10);} if (ch=='H') { Serial.print(humidity,0); delay(10);} if (ch=='S') { float wFrq=(3+0.8*f)/10; //   / if (wFrq>0.3) Serial.print(wFrq,1); else Serial.print(0.0,1); delay(10);} if (ch=='D') { // Serial.println(wind_G); Serial.println(wind_Avr); delay(10); }//end ch }//end serial . . . . . 

يتطابق حساب السرعة بوحدة م / ث هنا مع العملية التي تم إجراؤها في الوحدة الرئيسية للمحطة (يتم تعيين عتبة البدء بشكل عشوائي إلى 0.3 م / ث) ويجب أيضًا تغييرها وفقًا لنتائج المعايرة.

إذا حاولت قبول البيانات باستخدام Serial.read () المعتاد ، ثم عرض نتيجة الاستلام على شاشة مع وظيفة مثل lcd.print (t ، 1) ، حيث t هي درجة الحرارة بالدرجات ، تساوي ، على سبيل المثال ، إلى 12.7 ، ثم MT-10S1 استجابة لذلك سيخرج الأمر "49.5". خمنت أم توحي؟ هذه هي الأحرف الثلاثة الأولى في التسلسل "49 50 46 55" ، أي في توسيع ASCII للرقم "12.7". لذلك ، من الأسهل قبول مجموعة من الأحرف على الفور وعرض عدد الأحرف التي تم إرسالها مباشرةً (العدد هو عداد يزداد بمقدار كل مقاطعة):

 . . . . if (count%8==0){ // 8   lcd.clear(); if (buft[0]!='-') lcd.print("+"); for (byte i = 0; i < iit; i++) lcd.print(buft[i]); //  lcd.setCursor(6, 0); for (byte i = 0; i < iihh; i++) lcd.print(bufhh[i]); //  lcd.setCursor(0, 1); lcd.print("%"); } if ((count+4)%8==0){ //  4  lcd.clear(); lcd.setCursor(0, 0); for (byte i = 0; i < iiss; i++) lcd.print(bufss[i]); //  lcd.setCursor(5, 0); dir_dd(bufd); //  } . . . . . 

يجب فك تشفير السطر الأخير. والحقيقة هي أن بيانات الاتجاه يتم إرسالها في رمز 0-15 (والتي لا يزال يتم نقلها من الرمز الرمادي عند تطبيق متوسط ​​المتجه ). في حالة شاشة السبعة أجزاء MT-10T7 ، تُرجمت إلى درجات بوصلة:

 . . . . . dd=atoi(bufd); //   dd=dd*22.5; //   itoa(dd,bufd,10); //    . . . . . 

وهنا يمكننا الكتابة مباشرة بالحروف الروسية ، بنفس الطريقة كما في الوحدة الرئيسية لمحطة الطقس (التي تم اختيار هذا العرض في الواقع):

 . . . . . void dir_dd(char dd[]) {switch(atoi(dd)) { case 0: {lcd.print(""); break;} case 1: {lcd.print("C"); break;} case 2: {lcd.print("C"); break;} case 3: {lcd.print("C"); break;} case 4: {lcd.print(""); break;} case 5: {lcd.print(""); break;} case 6: {lcd.print(""); break;} case 7: {lcd.print(""); break;} case 8: {lcd.print(""); break;} case 9: {lcd.print(""); break;} case 10: {lcd.print(""); break;} case 11: {lcd.print(""); break;} case 12: {lcd.print(""); break;} case 13: {lcd.print("C"); break;} case 14: {lcd.print("C"); break;} case 15: {lcd.print("C"); break;} }//end switch }//end dir . . . . . 

المظهر


تظهر الصورة مظهر الشاشة مع وحدة التحكم المتصلة في حالة العمل:



هذه هي الطريقة التي تبدو بها مجموعة المستشعرات المعدلة:



معلمات الإضاءة الخلفية هي تلك المشار إليها في الرسم البياني أعلاه. نظرًا لأن انخفاض الجهد عبر الإضاءة الخلفية في وحدات MELT هو 4.5 فولت ، مع مصدر طاقة 12 فولت ، فإن تيار الإضاءة الخلفية هو 50 مللي أمبير (كحد أقصى لهذه الوحدة 60 مللي أمبير).

يتم إغلاق الهيكل إلى أقصى حد لتجنب دخول الهواء الرطب إلى الداخل (الإطار الأسود لشاشة العرض من الغلاف المطاطي لكابل رفيع). اللوحة البيضاء على اليمين هي حاوية جهاز استشعار درجة حرارة الرطوبة SHT-75 ، مأخوذة من العلبة (يقع المستشعر نفسه خلفه). السلك الأصفر أعلاه هو هوائي الإرسال 433 MHz. على اليسار توجد الموصلات حيث يتم توصيل مستشعرات السرعة والاتجاه.

وهذه هي الطريقة التي تبدو بها القراءات على شاشة الوحدة الرئيسية لمحطة الطقس (الوحدة السوداء ذات الهوائي الأبيض على اليمين هي جهاز استقبال 433 ميجاهرتز):

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


All Articles