جدول المحتويات:

مقياس حرارة تسجيل DIY مع مستشعرين: 3 خطوات (بالصور)
مقياس حرارة تسجيل DIY مع مستشعرين: 3 خطوات (بالصور)

فيديو: مقياس حرارة تسجيل DIY مع مستشعرين: 3 خطوات (بالصور)

فيديو: مقياس حرارة تسجيل DIY مع مستشعرين: 3 خطوات (بالصور)
فيديو: How to configure the ADC of Arduino for Data Acquisition System 2024, يوليو
Anonim
مقياس حرارة تسجيل DIY مع 2 مستشعرات
مقياس حرارة تسجيل DIY مع 2 مستشعرات
مقياس حرارة تسجيل DIY مع 2 مستشعرات
مقياس حرارة تسجيل DIY مع 2 مستشعرات

هذا المشروع هو تحسين لمشروعي السابق "DIY Logging Thermometer". يقوم بتسجيل قياسات درجة الحرارة في بطاقة micro SD.

تغييرات الأجهزة

أضفت مستشعر درجة حرارة DS18B20 إلى وحدة ساعة الوقت الحقيقي ، حيث يوجد توفير على لوحة الدوائر المطبوعة لهذا الجهاز ؛ وأضاف السلك المناسب من دبوس "DS" في RTC إلى D2 في Arduino.

تغييرات البرامج

ثم أضفت إلى البرنامج وعدّلته. التغييرات الرئيسية هي:

تعرض شاشة LCD درجتي حرارة "داخل" و "خارج".

تحتوي ملفات السجل المسجلة على بطاقة SD على مجالين لدرجة الحرارة ، "درجة الحرارة داخل" و "درجة الحرارة خارج".

نظرًا للسجل الأطول على بطاقة SD ، كانت المخازن المؤقتة للعمل لـ EEPROM أكبر ونتيجة لذلك بدأت أعاني من مشاكل تعارض الذاكرة. لقد أجريت عددًا من التغييرات التي تهدف إلى تقليل استخدام الذاكرة الديناميكية ، بما في ذلك استخدام مصفوفات الأحرف لجميع السلاسل بدلاً من كائن String.

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

وفقًا للاختبار الذي أجريته ، لا يزال تحديد مجسات درجة الحرارة والاستجابة لإزالة بطاقة SD واستبدالها يعمل بسلاسة.

الخطوة 1: تطوير البرمجيات

تمنحك هذه الخطوة البرنامج الكامل للمشروع المكتمل. قمت بتجميعها باستخدام Arduino IDE 1.6.12. يستخدم 21400 بايت من ذاكرة البرنامج (69٪) و 1 278 بايت من الذاكرة الديناميكية (62٪).

لقد وضعت تعليقات في الكود على أمل أن يوضح ما يجري.

الخطوة 2: العمل مع اثنين من مستشعرات درجة الحرارة - التفاصيل

يستخدم هذا البرنامج مكتبة "OneWire". لا يستخدم أي "DallasTemperature" أو مكتبات مماثلة. بدلاً من ذلك ، يتم تنفيذ الأوامر والبيانات الواردة من مستشعرات درجة الحرارة بواسطة الرسم ويمكن رؤيتها وفهمها بسهولة تامة. لقد وجدت قائمة مفيدة لأوامر مكتبة OneWire في

www.pjrc.com/teensy/td_libs_OneWire.html

عندما يكون هناك مستشعران (أو أكثر) لدرجة الحرارة ، يصبح من الضروري تحديد أيهما.

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

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

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

يعمل مثل هذا.

تحتوي مكتبة OneWire على أمر "OneWireObject.search (عنوان)" حيث يكون "العنوان" عبارة عن مصفوفة من 8 بايت و "OneWireObject" هو اسم مثيل لكائن OneWire الذي تم إنشاؤه مسبقًا. يمكن أن يكون لها أي اسم تريده. منجم يسمى "س". عند إصدار أمر "البحث" هذا ، تقوم مكتبة OneWire ببعض الإشارات على ناقل سلكي واحد. إذا عثر على مستشعر استجابة ، فإنه يقوم بإرجاع قيمة منطقية "TRUE" ويملأ مصفوفة "العنوان" بالمعرف الفريد 8 بايت للمستشعر. يتضمن هذا المعرف رمز العائلة (في البداية) ومبلغ شيك (في النهاية). يوجد بين 6 بايتات تحدد بشكل فريد المستشعر داخل عائلته.

يتم الحصول على نتيجة واحدة (العنوان والعودة TRUE) في كل مرة يتم فيها إعطاء هذا الأمر ، مع التنقل بين جميع الأجهزة الموجودة على ناقل OneWire. بمجرد أن يستجيب كل جهاز ، في المرة التالية التي يتم فيها إصدار "بحث" ، يكون العائد "FALSE" ، مما يشير إلى أن كل جهاز في الناقل قد استجاب بالفعل. إذا تم إصدار "البحث" مرة أخرى ، فإن الجهاز الأول يستجيب مرة أخرى - وهكذا إلى أجل غير مسمى. تستجيب الأجهزة دائمًا بنفس الترتيب. يعتمد ترتيب الردود على معرّفات الأجهزة الموجودة في ناقل OneWire. يبدو أنه بحث ثنائي يبدأ من وحدات البت الأقل أهمية لمعرفات الجهاز. البروتوكول المستخدم للعثور على هذه المعرفات معقد للغاية ، وهو موصوف في الصفحات 51-54 من المستند "كتاب معايير iButton" وهو مستند بتنسيق pdf على https://pdfserv.maximintegrated.com/en/an/AN937.pd …

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

في هذا المشروع مع جهازي استشعار ، أحدهما ملحوم في مكانه على وحدة RTC ؛ يتم توصيل الآخر باستخدام رأس ذكر على السبورة ورأس أنثى على الكابل. يمكن فصله بسهولة.

عند فصل المستشعر الموجود على الكبل (المستشعر "الخارج") ، ينتج عن أمر "البحث" إرجاع "TRUE" و "FALSE" بالتبادل.

عندما يتم توصيل المستشعر الموجود على الكبل ، ينتج عن أمر "search" دورة من 3 مراحل ، مع إرجاع "TRUE" و "FALSE" واحد.

الإجراء الخاص بي هو إصدار أوامر "بحث" 1 أو 2 أو 3 ، حتى يتم إرجاع نتيجة FALSE. ثم أصدر أمرين آخرين "بحث". إذا فشل الثاني (أي خطأ) ، فأنا أعلم أنه لا يوجد سوى مستشعر واحد في الحافلة وأنه مستشعر "in". يتم تسجيل هوية الجهاز وتخصيصها لجهاز الاستشعار "in".

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

النقطة الثانوية الأخرى هي أن تجميع النتائج من المستشعرين يتم عن طريق إرسال "بدء التحويل" بواسطة ما يعرف بأمر "تخطي ROM". لدينا خيار إرسال الأوامر إلى جهاز واحد (باستخدام معرفه الفريد) أو إلى جميع الأجهزة الموجودة على الناقل (تخطي ROM). يبدو الرمز كما يلي:

ds.reset () ؛ //

// أرسل أمر "تخطي ROM" (لذا يعمل الأمر التالي في كلا المستشعرين) ds.write (0xCC) ؛ // Skip ROM command ds.write (0x44، 0) ؛ // بدء التحويل في كلا التحقيقين temperature_state = wait_convert ؛ // انتقل إلى حالة التأخير

عند مرور وقت التأخير المطلوب ، يتم تلقي درجات الحرارة من كل جهاز استشعار على حدة. هذا هو رمز المستشعر الثاني (أي مستشعر OUT).

إذا (flag2) {

الحاضر = ds.reset () ؛ ds.select (DS18B20_addr_out) ؛ ds.write (0xBE) ؛ // قراءة مسودة بيانات التحقيق "الصادرة" [0] = ds.read () ؛ البيانات [1] = ds.read () ؛ temperature_out = (البيانات [1] << 8) + البيانات [0] ؛ temperature_out = (6 * temperature_out) + temperature_out / 4 ؛ // اضرب بـ 6.25} else {// not flag2 - أي مستشعر الإخراج غير متصل temperature_out = 30000 ؛ // الإصلاح عند 300.00 درجة مئوية إذا كان مستشعر درجة الحرارة لا يعمل} // نهاية if (flag2)

لقد عملت على معظم هذا البرنامج في رسم تخطيطي قائم بذاته يحتوي للتو على مستشعرات درجة الحرارة فيه ، دون تعقيدات دعم LCD و RTC و SD. مخطط التطوير هذا موجود في الملف أدناه.

الخطوة الثالثة: النتائج الأولية

نتائج اولية
نتائج اولية

هذا الرسم البياني هو مزيج من أول يومين جزئيين من القراءات.

موصى به: