أريد أن أجمع افعلها بنفسك أداة لقياس الضغط الجوي ودرجة الحرارة. يجب أن يكون مستشعر درجة الحرارة بعيدًا ومحكمًا ، لأنه يجب أن يقيس درجة الحرارة على مسافة معينة من الجهاز. أود الحصول على مثل هذا الجهاز المحمول مع نطاق عمل من -30 درجة مئوية إلى 50 درجة مئوية. ولكن هذا يتطلب أن تكون جميع المكونات قادرة على العمل في نطاق درجة الحرارة هذا. المكونات التي يمكن أن تعمل في نطاق درجة حرارة ممتدة أكثر تكلفة ، ويصعب شرائها.
لتحقيق حلمي على أرض الواقع ، سيتم مساعدتي من قبل المجلس ، الذي وصفته في المقالة "لوحة GY-BMP280-3.3 لقياس الضغط الجوي ودرجة الحرارة».
من الممارسة ، من المعروف أنه أثناء التجميع والتكوين إلكتروني المنتجات قبل تصنيعها ، تحتاج إلى التحقق من صلاحية جميع المواد والمكونات لكل منها على حدة. خلاف ذلك ، يمكنك الخلط في وقت لاحق ، ونتيجة لذلك ، لن يعمل المنتج الإلكتروني ، وسيكون من الصعب جدًا العثور على سبب العطل.
دعنا نبدأ.
المرحلة الأولى. قم بتثبيت غلاف برنامج مجاني على جهاز الكمبيوتر الخاص بك اردوينو IDE لكتابة البرامج (الرسومات) ، وتجميعها ثم كتابتها إلى وحدة التحكم الدقيقة Mega328P المثبتة على اللوحة. أوصي بتنزيل إصدار shell من ARDUINO 1.6.5. لماذا؟ في البداية ، كان مشروع ARDUINO واحدًا ، والآن قام المطورون بتفريق ومواصلة تطوير نظام ARDUINO ، ولكن كل منها بطريقته الخاصة ، مع الفروق الدقيقة الصغيرة. لقد استخدمت الإصدار ARDUINO 1.6.5. يجب تثبيته واختباره للتعاون مع لوحة Arduino Uno باستخدام أبسط الأمثلة.
المرحلة الثانية. نتحقق من لوحة GY-BMP280-3.3 لقياس الضغط الجوي ودرجة الحرارة. نأخذ 4 أسلاك ، ونربطها GY-BMP280-3.3 و Arduino Uno ، كما هو موضح في الصورة والمخطط. الخطوط المنحنية الرفيعة متعددة الألوان هي موصلات.
لنبدأ بالتحقق من لوحة GY-BMP280-3.3. للقيام بذلك ، تحتاج إلى تثبيت المكتبة في Arduino IDE ، التي كتبها المبرمجون الذين يعملون على الموقع. كقاعدة ، بعد تثبيت المكتبة في Arduino IDE ، تظهر أمثلة (عينات) من التعليمات البرمجية. من خلال تغيير رمز العينة بشكل طفيف ، يمكننا تجميعه في بيانات يفهمها الميكروكونترولر ، ثم إرسالها إلى ذاكرة الميكروكونترولر. يمكنك العثور على مثال (نموذج) من خلال الانتباه إلى صورتي الشاشة أدناه.
بعد كتابة البيانات إلى وحدة التحكم الدقيقة في لوحة Arduino Uno ، يبدأ على الفور في تنفيذ البرنامج (الرمز) ويرسل البيانات عبر كابل USB إلى الكمبيوتر الذي تتصل به لوحة Arduino Uno.ويمكننا رؤية نتيجة القياس للوحة GY-BMP280-3.3 في نافذة Arduino IDE ، والتي تسمى "مراقبة المنفذ التسلسلي".
يمكننا رؤية نتيجة القياسات على لوحة GY-BMP280-3.3 في برنامج Windows Hyper Terminal القياسي ، بعد إغلاق غلاف Arduino Uno وإعداد جلسة في برنامج Hyper Terminal. أي أنه يمكننا الحصول على نتائج لوحة GY-BMP280-3.3 عن طريق توصيل Arduino Uno بأي كمبيوتر مزود بكبل USB مثبت عليه برنامج تشغيل لوحة Arduino Uno. هناك العديد من المكتبات للعمل مع GY-BMP280-3.3. كل شيء يعمل معي في المكتبة. سيبدو الملف الذي تقوم بتنزيله من هذا الموقع بالشكل التالي: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. يجب إعادة تسميته باسم: iarduino_Pressure_BMP.zip. نحتاج الآن إلى تثبيت مكتبة iarduino_Pressure_BMP في غلاف Arduino IDE.
قم بتشغيل Arduino IDE ، وانتقل إلى قائمة Sketch / Include Librari / Add.ZIP Library ... ثم حدد ملف iarduino_Pressure_BMP.zip وانقر فوق الزر Open. تحتاج أيضا إلى تثبيت المكتبات:. بعد تثبيت المكتبات ، نقوم بإعادة تشغيل غلاف Arduino IDE ، أي إغلاقه وإعادته مرة أخرى. ثم حدد القائمة File / Samples / iarduino Pressure BMP (مستشعرات الضغط) / المثال.
نرى الرمز في النافذة.
سيحتاج الرمز إلى تعديل طفيف.
في السطر الخامس ، قم بإزالة الخطين المائلين // // وأضف (0x76) أو (0x77) في السطر الحادي عشر. (0x76) هو عنوان لوحة المقياس. تبين أن لوحة GY-BMP280-3.3 المتصلة بناقل I2C لها نفس العنوان (0x76). كيف تعرف رقم الجهاز المتصل بناقل I2C؟ ستحصل على الإجابة على هذا السؤال من خلال قراءة المقالة الكاملة.
لذا ، قمنا بإصلاح الكود في النافذة ، والآن نبدأ في فحص وتجميع الكود في القائمة Sketch / Check / Compile. إذا نجح التحقق من الرمز وتجميعه ، فعندئذٍ في قائمة Sketch / Load ، نبدأ تسجيل البرنامج في Arduino Uno.
إذا كان التنزيل ناجحًا ، فعند فتح شاشة مراقبة المنفذ التسلسلي في القائمة: Tools / Serial Port Monitor ، سنرى البيانات المرسلة بواسطة لوحة GY-BMP280-3.3.
في لقطة الشاشة التالية ، نتيجة لوحة GY-BMP280-3.3 التي تعمل على جهاز كمبيوتر لم يتم تثبيت غلاف Arduino IDE عليه. يتم تلقي البيانات من قبل برنامج PuTTY.
في الوقت نفسه ، تم تصوير مقياس الضغط الجوي المختبري ، والذي يقع بجوار لوحة GY-BMP280-3.3. بمقارنة قراءات الأداة ، يمكنك بنفسك استخلاص استنتاجات حول دقة لوحة GY-BMP280-3.3. مقياس الضغط اللاسائلي مصدق من مختبر الدولة.
المرحلة الثالثة. فحص شاشة LCD باستخدام وحدة واجهة I2C. نجد شاشة LDC مع وحدة واجهة متصلة عبر ناقل I2C بـ Arduino UNO.
نتحقق من عملها باستخدام أمثلة من غلاف Arduino IDE. ولكن قبل ذلك ، نحدد عنوان وحدة الواجهة. تحتوي وحدة الواجهة الخاصة بي على عنوان 0x3F. أدخلت هذا العنوان في خط الرسم: LiquidCrystal_I2C lcd (0x3F ، 16.2) ؛
لقد حددت هذا العنوان باستخدام رسم "ماسح عنوان جهاز I2C" الموضح في.
لقد أطلقت قذيفة Arduino IDE ، من المقالة التي قمت بنسخ رمز البرنامج ولصقت فيها نافذة Arduino IDE.
لقد بدأت التجميع ، ثم كتبت الرمز إلى لوحة Arduino UNO ، التي تم توصيل لوحة GY-BMP280-3.3 وشاشة LDC بها وحدة واجهة I2C. ثم في شاشة المنفذ التسلسلي حصلت على النتيجة التالية. تحتوي وحدة الواجهة الخاصة بي على عنوان 0x3F.
المرحلة الرابعة. فحص جهاز استشعار درجة الحرارة DS18b20. نربطه على النحو التالي.
تم بالفعل تثبيت مكتبة OneWire Arduino للعمل مع مستشعر درجة الحرارة DS18b20.
افتح نموذج DS18x20_Temperature ، وقم بتجميعه ، وتحميله ، وشاهد نتيجة القياس في شاشة المنفذ التسلسلي. إذا كان كل شيء يعمل ، فانتقل إلى الخطوة التالية.
المرحلة الخامسة. التجمع المنزل محطات الطقس على GY-BMP280-3.3 و Ds18b20.
نقوم بتجميع الجهاز وفقًا للمخطط:
تلقيت رمز الجهاز عن طريق دمج جميع الأمثلة في واحد وتعيين الإخراج على شاشة عرض LDC. إليك ما حصلت عليه:
// Uncomment لتطبيق برنامج ناقل I2C: //
// #define pin_SW_SDA 3 // قم بتعيين أي دبوس Arduino للعمل كخط SDA لناقل برامج I2C.
// #define pin_SW_SCL 9 // قم بتعيين أي دبوس Arduino للعمل كخط SCL إلى ناقل برنامج I2C.
// Uncomment للتوافق مع معظم اللوحات: //
# تشمل
#include // ستستخدم مكتبة iarduino أساليب ووظائف مكتبة Wire.
#include // Library for LDC work type 1602 on the I2C bus
//
#include // قم بتوصيل مكتبة iarduino_Pressure_BMP للعمل مع BMP180 أو BMP280.
مستشعر iarduino_Pressure_BMP (0x76) ؛ // قم بتعريف كائن مستشعر للعمل مع مستشعر ضغط باستخدام وظائف وطرق مكتبة iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F ، 16.2) ؛
OneWire س (10) ؛
إعداد باطل () {
lcd.init () ؛
lcd.backlight () ؛
Serial.begin (9600) ؛ // الشروع في نقل البيانات إلى مراقب المنفذ التسلسلي على 9600 بود.
تأخير (1000) ؛ // نحن في انتظار استكمال العابرين عند تطبيق السلطة
مستشعر بداية (73) ؛ // ابدأ العمل مع المستشعر. سيأخذ الارتفاع الحالي إلى 73 م - ارتفاع مدينة بوزولوك فوق مستوى سطح البحر
} //
حلقة فارغة () {
// قراءة البيانات وعرض: درجة الحرارة في درجة مئوية ، والضغط في مم. rt. ، تغيير في الارتفاع بالنسبة إلى المحدد في وظيفة البدء (افتراضي 0 متر).
lcd.setCursor (0،0) ؛ // تحديد نقطة الإخراج "P =" في LDC
lcd.print ("P =") ؛
lcd.print (sensor.pressure / 1000.3) ؛ // قسمة قيمة P الصادرة عن BMP280 على 1000 وضبط ناتج 3 منازل عشرية
lcd.setCursor (12.0) ؛ // تحديد نقطة الإخراج "kPa" في LDC
lcd.print ("kPa") ؛
lcd.setCursor (0،1) ؛
lcd.print ("T =") ؛
lcd.print (sensor.temperature، 1) ؛ // ضبط مخرجات العلامة العشرية 1
lcd.setCursor (6.1) ؛
// lcd.print ("C") ؛
// lcd.setCursor (9،1) ؛
// lcd.print ("H =") ؛
// lcd.print (sensor.altitude، 1) ؛
if (sensor.read (1)) {Serial.println ((سلسلة) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT، \ t T = "+ sensor.temperature +" * C، \ t \ t B = "+ sensor.altitude +" M. ")؛}
آخر {Serial.println ("HET OTBETA OT CEHCOPA") ؛}
// قراءة البيانات وعرض: درجة الحرارة في درجة مئوية والضغط في باسكال ، والضغط في مم. rt. ، تغيير في الارتفاع بالنسبة إلى المحدد في وظيفة البدء (افتراضي 0 متر).
if (sensor.read (2)) {Serial.println ((سلسلة) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa، \ t \ t T =" + sensor.temperature + "* C، \ t \ t B =" + sensor.altitude + "M.")؛}
آخر {Serial.println ("HET OTBETA OT CEHCOPA") ؛}
بايت ط ؛
بايت بايت = 0 ؛
بايت type_s ؛
بيانات البايت [12] ؛
بايت addr [8] ؛
تعويم مئوية ، فهرنهايت.
if (! ds.search (addr)) {
Serial.println ("لا مزيد من العناوين") ؛
Serial.println () ؛
ds.reset_search () ؛
تأخير (250) ؛
العودة
}}
Serial.print ("ROM =") ؛
for (i = 0؛ i & lt؛ 8؛ i ++) {
Serial.write ('') ؛
Serial.print (addr [i]، HEX) ؛
}}
if (OneWire :: crc8 (addr، 7)! = addr [7]) {
Serial.println ("CRC غير صالح!") ؛
العودة
}}
Serial.println () ؛
// أول بايت ROM يشير إلى الشريحة
التبديل (addr [0]) {
الحالة 0x10:
Serial.println ("Chip = DS18S20") ؛ // أو DS1820 القديم
type_s = 1 ؛
استراحة
الحالة 0x28:
Serial.println ("Chip = DS18B20") ؛
type_s = 0 ؛
استراحة
الحالة 0x22:
Serial.println ("Chip = DS1822") ؛
type_s = 0 ؛
استراحة
افتراضي:
Serial.println ("الجهاز ليس جهاز عائلة DS18x20.") ؛
العودة
}}
ds.reset () ؛
ds.select (addr) ؛
ds.write (0x44 ، 1) ؛ // بدء التحويل ، مع تشغيل الطاقة الطفيلية في النهاية
تأخير (1000) ؛ // ربما 750 مللي ثانية كافية ، وربما لا
// قد نقوم بعمل ds.depower () هنا ، لكن إعادة الضبط ستتولى الأمر.
الحاضر = ds.reset () ؛
ds.select (addr) ؛
ds.write (0xBE) ؛ // اقرأ المسودة
Serial.print ("Data =") ؛
Serial.print (الحاضر ، HEX) ؛
Serial.print ("") ؛
for (i = 0؛ i & lt؛ 9؛ i ++) {// نحتاج إلى 9 بايت
البيانات [i] = ds.read () ؛
Serial.print (data [i]، HEX) ؛
Serial.print ("") ؛
}}
Serial.print ("CRC =") ؛
Serial.print (OneWire :: crc8 (data، 8)، HEX) ؛
Serial.println () ؛
// تحويل البيانات إلى درجة حرارة فعلية
// لأن النتيجة عبارة عن عدد صحيح بعلامة 16 بت ، يجب أن يكون
// يتم تخزينها في نوع "int16_t" ، وهو دائمًا 16 بت
// حتى عند التحويل البرمجي على معالج 32 بت.
int16_t raw = (data [1] & lt؛ & lt؛ 8) | البيانات [0] ؛
إذا (type_s) {
raw = raw & lt؛ & lt؛ 3 ؛ // 9 بت الدقة الافتراضية
if (data [7] == 0x10) {
// "عدد البقاء" يعطي دقة كاملة 12 بت
raw = (raw & amp؛ 0xFFF0) + 12 - بيانات [6] ؛
}}
} آخر {
byte cfg = (data [4] & amp؛ 0x60) ؛
// عند دقة أقل ، تكون البتات المنخفضة غير محددة ، لذا دعنا نصفرها
if (cfg == 0x00) raw = raw & amp؛ ~ 7 ؛ // دقة 9 بت ، 93.75 مللي ثانية
آخر إذا (cfg == 0x20) raw = raw & amp؛ ~ 3 ؛ // 10 بت الدقة ، 187.5 مللي ثانية
آخر إذا (cfg == 0x40) raw = raw & amp؛ ~ 1 ؛ // 11 بت الدقة ، 375 مللي ثانية
//// الافتراضي هو دقة 12 بت ووقت تحويل 750 مللي ثانية
}}
celsius = (float) raw / 16.0 ؛
فهرنهايت = مئوية * 1.8 + 32.0 ؛
Serial.print ("Temperature =") ؛
Serial.print (مئوية) ؛
Serial.print ("Celsius") ؛
Serial.print (فهرنهايت) ؛
Serial.println ("فهرنهايت") ؛
lcd.setCursor (8.1) ؛ // تحديد نقطة الإخراج "Tds =" في LDC
lcd.print ("Tds =") ؛
lcd.print (celsius، 1) ؛
تأخير (3000) ؛
}}
إليك ما حصلت عليه:
تعطي لوحة GY-BMP280-3.3 ضغطًا في باسكال ، وهو أمر غير مريح للغاية. لم أستطع حل مشكلة كيفية جعل بيانات ضغط إخراج لوحة GY-BMP280-3.3 بالكيلو باسكال. لقد قمت بحل هذه المشكلة في خط الإخراج لشاشة LDC.
lcd.print (sensor.pressure / 1000.3) ؛ // قسمة قيمة P الصادرة عن BMP280 على 1000 وضبط ناتج 3 منازل عشرية
توفر لوحة GY-BMP280-3.3 أيضًا قيم الارتفاع.
مستشعر بداية (73) ؛ // ابدأ العمل مع المستشعر. سيأخذ الارتفاع الحالي إلى 73 م - ارتفاع مدينة بوزولوك فوق مستوى سطح البحر
إذا كنت ستسترخي في البحر وتغير "sensor.begin (73)؛" على "sensor.begin (0)؛" في الكود ، ثم قم بتجميع البرنامج وحفظه في محطة الطقس الرئيسية على GY-BMP280-3.3 و Ds18b20 ، وقم بعمل خرج ارتفاع لعرض LDC ، وستحصل أيضًا على مقياس الارتفاع.
// lcd.setCursor (9،1) ؛
// lcd.print ("H =") ؛
// lcd.print (sensor.altitude، 1) ؛ // اطبع قيم الارتفاع بالأمتار بمكان عشري واحد
يتم توفير الطاقة للدائرة في إصداري عبر كابل USB. يمكنك استخدام محول نبض تعزيز منخفض الجهد 5 فولت / 600 مللي أمبير وستصبح محطة الطقس الخاصة بك محمولة. يتم وصف هذا النوع من إمدادات الطاقة بشكل جيد في المقالة.
تجميع ناجح!