ميزان حرارة اردوينو مع حساس درجة الحرارة LM35. صنع غلاف لجهاز الاستشعار

23.04.2019

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

الوحدة DS18B20

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

دبوس ds18b20

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

مخطط تجميع ميزان الحرارة


ربط العناصر باللوحة

الدائرة نفسها بسيطة جدًا بحيث لا فائدة من رسمها - جميع التوصيلات مرئية في الصورة. أولاً، قم بتوصيل ds18b20 بالطرف (-) لتأريض Arduino، والطرف (+) لـ 5V وخرج الإشارة إلى الطرف الرقمي 2. من أجل التحكم في الفولتميتر، نقوم بتوصيل سلكه الموجب بالطرف 9 (أحد الأطراف). PWM) وقم بتوصيل الطرح بـ GND. بعد ذلك، لتغيير مقياس الفولتميتر إلى مقياس حرارة، ما عليك سوى طباعة الصورة المرفقة بالمقال. الفولتميتر هنا هو 5 فولت، ولكن يمكنك أن تأخذ أي مؤشر آخر، بما في ذلك مقياس ميكرومتر عادي، مضيفا المقاوم المطلوب على التوالي (حوالي 10-100 كيلو أوم).


اطلب مقياس الحرارة والفولتميتر

قائمة الأجزاء المطلوبة

  • اردوينو أونو
  • الاستشعار ds18b20
  • مؤشر الفولتميتر
  • أسلاك متعددة
  • مصدر الطاقة (البطارية ممكنة)

أجزاء ميزان الحرارة

مبدأ التشغيل

يعد تعديل عرض النبض، أو PWM، تقنية لإنتاج نتائج تناظرية باستخدام الوسائل الرقمية.


تعديل عرض النبض للتحكم في التبديل

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

يتكون الكود من ثلاثة أجزاء رئيسية:

  1. قراءة درجة الحرارة من جهاز الاستشعار
  2. تحويل درجة الحرارة إلى PWM
  3. إظهار القيمة على المقياس

إعداد مقياس الحرارة

في الإعدادات سوف نقرأ درجة الحرارة من المستشعر. ثم نقوم بتحويل هذه القيمة إلى دالة PWM تتراوح من 0 إلى 255. ويمكن القيام بذلك داخل دالة البرنامج. بعد ذلك، سوف نرسل إشارة إلى الطرف 9، المتصل بمؤشر الفولتميتر.

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

فيديو تشغيل الجهاز

تعرف على كيفية استخدام وحدة التردد اللاسلكي بتردد 433 ميجاهرتز مع ATMega328P-PU. في هذه المقالة سنقوم بتجميع دائرة من مستشعر DHT11 وجهاز إرسال التردد اللاسلكي. سنقوم أيضًا بتجميع جهاز استقبال مزود بجهاز استقبال لاسلكي بتردد 433 ميجاهرتز وشاشة LCD.

ماذا نحتاج

  • جهاز كمبيوتر مثبت عليه Arduino IDE (أنا أستخدم الإصدار 1.6.5)؛
  • مكتبة VirtualWire (الرابط أدناه)؛
  • ATMega328P;
  • مبرمج AVR MKII ISP؛
  • مستشعر درجة الحرارة والرطوبة النسبية DHT11؛
  • المكونات من قائمة العناصر أدناه.

مقدمة

سأوضح لك في هذه المقالة كيفية بناء جهاز يقيس درجة الحرارة والرطوبة النسبية ويرسل القيم المقاسة باستخدام وحدة RF القياسية بتردد 433 ميجاهرتز. مستشعر درجة الحرارة والرطوبة المستخدم في الجهاز هو DHT11.

هناك العديد من الطرق لنقل كميات صغيرة من البيانات باستخدام وحدات تحكم Arduino أو ATMega. يستخدم أحدهم مكتبة جاهزة مثل RCSwitch أو Radiohead أو VirtualWire. من الممكن أيضًا إرسال البيانات الأولية باستخدام وحدة UART المدمجة في وحدة التحكم الدقيقة. لكن لا يُنصح باستخدام وحدة UART المدمجة، نظرًا لأن جهاز الاستقبال سيجمع كل الضوضاء ولن يعمل المتحكم الدقيق على النحو المنشود. في هذه المقالة، أستخدم مكتبة VirtualWire لإرسال البيانات واستقبالها. تعمل هذه المكتبة مع Arduino IDE 1.6.2 و 1.6.5.

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

المعدات

نحن بحاجة إلى اثنين من المخططات الهيكلية. واحد لجهاز الإرسال والثاني لجهاز الاستقبال.

الارسال

نحن نحتاج:

  • طريقة البرامج الثابتة لوحدة التحكم الدقيقة → ​​ISP ؛
  • جهاز استشعار لقياس درجة الحرارة والرطوبة → DHT11؛
  • متحكم لمعالجة البيانات → ATMega32p؛
  • طريقة نقل البيانات اللاسلكية → وحدة تردد الراديو 433 ميجا هرتز.

المتلقي

نحن نحتاج:

  • طريقة استقبال إشارة الراديو → وحدة تردد الراديو 433 ميجا هرتز ؛
  • طريقة معالجة البيانات المستلمة → Arduino Mega؛
  • طريقة لعرض درجة الحرارة والرطوبة → 16x2 LCD.

الرسوم التخطيطية

الارسال


نقل جزء من مقياس الحرارة اللاسلكي على ATMega328p
()

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

المتلقي



(للتكبير، يمكنك النقر بزر الماوس الأيمن على الصورة وتحديد "فتح الرابط/الصورة في علامة تبويب جديدة/نافذة جديدة")

يرجى ملاحظة أن جهاز الاستقبال يعتمد على لوحة Arduino Mega، والتي لا تظهر في الرسم التخطيطي. لتوصيل لوحة Arduino Mega، قم بتوصيل وحدة RF وشاشة LCD بها وفقًا للعلامة الموجودة في الرسم التخطيطي.

قائمة العناصر

الارسال


قائمة عناصر جزء الإرسال من مقياس الحرارة اللاسلكي على ATMega328p
(للتكبير، يمكنك النقر بزر الماوس الأيمن على الصورة وتحديد "فتح الرابط/الصورة في علامة تبويب جديدة/نافذة جديدة")

المتلقي



(للتكبير، يمكنك النقر بزر الماوس الأيمن على الصورة وتحديد "فتح الرابط/الصورة في علامة تبويب جديدة/نافذة جديدة")

برنامج

برنامج الارسال

أولاً، دعونا نلقي نظرة على برنامج جزء الإرسال:

#يشمل // تعريف #define dhtPin 4 #define dhtType DHT11 #define txPowerPin 8 // استخدام مكتبة DHT DHT dht(dhtPin, dhtType); // المتغيرات char msg0; شار msg1؛ إنت تيم = 0؛ همهمة كثافة العمليات = 0; // وظيفة الإعداد الأولي - يتم تنفيذها مرة واحدة فقط عند بدء التشغيل void setup() ( pinMode(txPowerPin, OUTPUT); pinMode(txPowerPin, LOW); vw_setup(4800); // سرعة اتصال VirtualWire vw_set_tx_pin(9); // إخراج الإرسال VirtualWire ) // وظيفة الحلقة - يتم تنفيذها دائمًا حلقة باطلة() ( digitalWrite(txPowerPin, HIGH); hum = dht.readHumidity(); // متغير مخازن الرطوبة tem = dht.readTemperature(); // درجة حرارة المخازن المتغيرة itoa(hum , msg1, 10); // تحويل الرطوبة إلى مصفوفة char itoa(tem, msg0, 10); // تحويل درجة الحرارة إلى مصفوفة char strcat(msg0, msg1); // إضافة/دمج صفيفتين vw_send((uint8_t *) msg0 , strlen(msg0)); // إرسال الرسالة vw_wait_tx(); // انتظر حتى يكتمل الإرسال الرقمي (txPowerPin, LOW);

ولإيصال الرطوبة ودرجة الحرارة في رسالة واحدة، أجمعهما معًا. أولاً، تتم قراءة البيانات إلى متغير كأعداد صحيحة، ثم يتم تحويل الأعداد الصحيحة إلى مصفوفة أحرف، ثم يتم ربطها مع بعضها البعض. في الطرف المتلقي، سيتم تقسيم البيانات إلى أحرف فردية. ومن خلال القيام بذلك، أقتصر على درجتين من رقمين. إذا كان المستشعر في بيئة بدرجة حرارة أقل من 10 درجات مئوية، فسوف أتلقى رموزًا غير مرغوب فيها على الشاشة. على سبيل المثال، إذا كانت درجة الحرارة 20 درجة مئوية والرطوبة 45%، فسيتم إرسال الرسالة 2045 وكل شيء على ما يرام. إذا كانت درجة الحرارة 9 درجات مئوية والرطوبة 78%، فسيتم إرسال الرسالة 978x، حيث "x" هو حرف عشوائي. لذلك، إذا قمت ببناء مقياس الحرارة اللاسلكي هذا، أنصحك بتغيير البرنامج لنقل البيانات الصحيحة عندما تكون درجة الحرارة أقل من 10 درجات مئوية.

برنامج الاستقبال

// قم بتضمين المكتبات الضرورية #include #يشمل // تحديد اتصال LCD #define RS 9 #define E 10 #define D4 5 #define D5 6 #define D6 7 #define D7 8 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // رسم رمز الدرجة بايت Degreesymbol = ( B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 ); // المتغيرات int tem = 0; كثافة العمليات أنا؛ // وظيفة الإعداد الأولي - يتم تنفيذها مرة واحدة فقط عند التمكين void setup() (lcd.begin(16,2); // تهيئة شاشة LCD LCD.createChar(1, Degreesymbol); // أنشئ رمز درجات في الموقع 1 Serial. ابدأ (9600)؛ // لتصحيح الأخطاء vw_setup(4800)؛ // سرعة اتصال VirtualWire vw_rx_start(); // جاهز للاستقبال vw_set_rx_pin(2); // تلقي الإخراج VirtualWiore lcd.clear(); / وظيفة الحلقة - يتم تنفيذها دائمًا حلقة باطلة() ( uint8_t buf; // متغير لتخزين البيانات المستلمة uint8_t buflen = VW_MAX_MESSAGE_LEN; // متغير لتخزين طول البيانات المستلمة lcd.setCursor(0,0); lcd.print(" Temp: " ); if (vw_get_message(buf, &buflen)) // إذا تم استلام البيانات ( for (i=0;i<2;i++) // Получить два первых байта { Serial.write(buf[i]); // Для отладки lcd.write(buf[i]); // Вывести первые байты на LCD } Serial.println(); // Для отладки lcd.write(1); // Вывести символ градусов на LCD lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Hum: "); for (i=2;i<4;i++) // Получаем последние два байта { Serial.write(buf[i]); // Отладка lcd.write(buf[i]); // Вывести последние байты на LCD } lcd.print("% RH"); } }

إحدى الطرق المثيرة للاهتمام لاستخدام مكتبة LiquidCrystal هي إنشاء رموز مخصصة. باستخدام createChar قمت بإنشاء رمز الدرجة. يمكنك إنشاء الرموز الخاصة بك بنفس الطريقة. لإنشاء رمز أو رمز مخصص، يتعين عليك الإعلان عنه كمصفوفة مكونة من ثمانية بايت و"رسم" وحدات البكسل التي سيتم تشغيلها (1 قيد التشغيل، و0 معطل).

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

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

يحتوي مستشعر درجة الحرارة DS18B20 على مجموعة متنوعة من أنواع المساكن. يمكنك الاختيار من بين ثلاثة - 8-Pin SO (150 مل)، و8-Pin μSOP، و3-Pin TO-92. هذا الأخير هو الأكثر شيوعًا ويتم تصنيعه في علبة خاصة مقاومة للماء بحيث يمكن استخدامه بأمان تحت الماء. يحتوي كل مستشعر على 3 جهات اتصال. بالنسبة لحالة TO-92، عليك أن تنظر إلى لون الأسلاك: أسود - أرضي، أحمر - طاقة وأبيض/أصفر/أزرق - إشارة. يمكنك شراء وحدة DS18B20 الجاهزة من المتاجر عبر الإنترنت.

حيث لشراء جهاز الاستشعار

بطبيعة الحال، DS18B20 هو أرخص للشراء على Aliexpress، على الرغم من أنه يباع أيضًا في أي متاجر روسية متخصصة عبر الإنترنت مع Arduino. فيما يلي بعض الروابط كمثال:

تتكون ذاكرة المستشعر من نوعين: تشغيلية وغير متطايرة - SRAM وEEPROM. يحتوي الأخير على سجلات التكوين وسجلات TH، TL، والتي يمكن استخدامها كسجلات للأغراض العامة إذا لم يتم استخدامها للإشارة إلى نطاق قيم درجة الحرارة المسموح بها.

تتمثل المهمة الرئيسية لجهاز DS18B20 في تحديد درجة الحرارة وتحويل النتيجة الناتجة إلى شكل رقمي. يمكننا ضبط الدقة المطلوبة بشكل مستقل عن طريق تحديد عدد البتات الدقيقة - 9 و10 و11 و12. وفي هذه الحالات، ستكون الدقة 0.5C و0.25C و0.125C و0.0625C، على التوالي.

يتم تخزين قياسات درجة الحرارة الناتجة في ذاكرة SRAM الخاصة بالمستشعر. البايتات 1 و 2 تخزن قيمة درجة الحرارة المستلمة، 3 و 4 تخزن حدود القياس، 5 و 6 محجوزة، 7 و 8 تستخدم لتحديد درجة الحرارة عالية الدقة، آخر 9 بايت تخزن رمز CRC المقاوم للتداخل.

ربط DS18B20 بالاردوينو

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

يتم تبادل المعلومات في 1-Wire من خلال العمليات التالية:

  • التهيئة – تحديد تسلسل الإشارات التي يبدأ منها القياس والعمليات الأخرى. يصدر الجهاز الرئيسي نبضة إعادة ضبط، وبعدها يجب أن يصدر المستشعر نبضة حضور، تشير إلى أنه جاهز لإجراء العملية.
  • تسجيل البيانات – يتم نقل بايت من البيانات إلى المستشعر.
  • قراءة البيانات – يتم استلام بايت من المستشعر.

للعمل مع المستشعر نحتاج إلى برنامج:

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

المعدات التي سوف تحتاجها:

  • واحد أو أكثر من أجهزة الاستشعار DS18B20؛
  • اردوينو متحكم.
  • موصلات
  • مقاومة تبلغ 4.7 ​​كيلو أوم (في حالة توصيل مستشعر واحد، سيتم استخدام مقاومة تتراوح قيمتها من 4 إلى 10 كيلو أوم)؛
  • لوحة دائرة كهربائية؛
  • كابل USB للتوصيل بالكمبيوتر.

يتم توصيل المستشعر بلوحة Arduino UNO ببساطة: يتم توصيل GND من مستشعر درجة الحرارة بـ GND الخاص بـ Arduino، ويتم توصيل Vdd بـ 5V، ويتم توصيل البيانات بأي دبوس رقمي.

يظهر في الشكل أبسط مخطط اتصال للمستشعر الرقمي DS18B20.

تتكون خوارزمية الحصول على معلومات درجة الحرارة في الرسم من الخطوات التالية:

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

مثال على رسم بسيط لـ DS18B20

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

#يشمل /* * وصف التفاعل مع المستشعر الرقمي ds18b20 * توصيل ds18b20 إلى Arduino عبر المنفذ 8 */ OneWire ds(8); // أنشئ كائن OneWire للحافلة ذات السلك الواحد، والذي سيتم استخدامه للعمل مع المستشعر void setup())( Serial.begin(9600); ) void loop())( // تحديد درجة الحرارة من المستشعر بيانات البايت DS18b20؛ // موقع قيمة درجة الحرارة ds.reset(); // نبدأ التفاعل عن طريق إعادة تعيين جميع الأوامر والمعلمات السابقة ds.write(0xCC); // نعطي مستشعر DS18b20 أمرًا لتخطي البحث العنوان في حالتنا، جهاز واحد فقط ds.write(0x44) ؛ // نعطي مستشعر DS18b20 أمرًا لقياس درجة الحرارة، ولم نتلقى قيمة درجة الحرارة بعد - سيضعها المستشعر في تأخير الذاكرة الداخلية. 1000)؛ // تقيس الدائرة الدقيقة درجة الحرارة، وننتظر ds.reset(); قيمة درجة الحرارة المقاسة ds.write(0xCC); ds.write(0xBE); قيمة درجة الحرارة // تلقي وقراءة بيانات الاستجابة = ds.read(); // اقرأ البايت المنخفض لبيانات قيمة درجة الحرارة = ds.read(); // والآن الكبير // قم بتكوين القيمة النهائية: / / - أولاً "نلصق" القيمة معًا، // - ثم نضربها في المعامل المطابق للدقة (بالنسبة لـ 12 بت، القيمة الافتراضية هي 0.0625) درجة حرارة الطفو = ((البيانات<< 8) | data) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println(temperature); }

رسم تخطيطي للعمل مع مستشعر ds18b20 دون تأخير

يمكنك تعقيد البرنامج الخاص بـ ds18b20 قليلاً للتخلص منه، مما يؤدي إلى إبطاء تنفيذ الرسم.

#يشمل OneWire ds(8); // كائن OneWire درجة حرارة int = 0; // المتغير العام لتخزين قيمة درجة الحرارة من مستشعر DS18B20 long lastUpdateTime = 0; // متغير لتخزين وقت آخر قراءة من المستشعر const int TEMP_UPDATE_TIME = 1000; // تحديد تكرار عمليات التحقق من الإعداد الفارغ ()) (Serial.begin (9600)؛) حلقة باطلة ()) (detectTemperature ()؛ // تحديد درجة الحرارة من مستشعر DS18b20 Serial.println (درجة الحرارة)؛ // الإخراج قيمة درجة الحرارة الناتجة // Т .نظرًا لأن متغير درجة الحرارة من النوع int، فسيتم ببساطة تجاهل الجزء الكسري) int DetectTemperature())( byte data; ds.reset(); ds.write(0xCC); ds.write (0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) ( lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); البيانات = ds.read(); البيانات = ds.read(); // قم بتكوين قيمة درجة الحرارة = (data<< 8) + data; temperature = temperature >> 4; } }

مكتبة دالاس تيمبيراتور وDS18b20

في رسوماتنا، يمكننا استخدام مكتبة DallasTemperature، التي تعمل على تبسيط بعض جوانب العمل باستخدام مستشعر ds18b20 عبر سلك واحد. مثال للرسم:

#يشمل // رقم طرف Arduino مع المستشعر المتصل #define PIN_DS18B20 8 // إنشاء كائن OneWire OneWire oneWire(PIN_DS18B20); // قم بإنشاء كائن DallasTemperature للعمل مع أجهزة الاستشعار، وتمرير رابط إلى كائن للعمل مع 1-Wire. DallasTemperature dallasSensors(&oneWire); // كائن خاص لتخزين عنوان الجهاز DeviceAddress SensorAddress; حلقة باطلة (باطلة) (// طلب قياسات بواسطة جهاز استشعار درجة الحرارة Serial.print("قياس درجة الحرارة..."); dallasSensors.requestTemperatures(); // اطلب من ds18b20 جمع البيانات Serial.println("Completed") // طلب استلام قيمة درجة الحرارة المخزنة printTemperature(sensorAddress); // تأخير حتى يمكن تحليل شيء ما على الشاشة تأخير(1000) // وظيفة مساعدة لطباعة قيمة درجة الحرارة للجهاز void printTemperature(DeviceAddress devicesAddress)( float tempC = dallasSensors.getTempC(deviceAddress); 0؛< 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

مكتبة OneWire للعمل مع DS18B20

يستخدم DS18B20 بروتوكول 1-Wire لتبادل المعلومات مع Arduino، والذي تم بالفعل إنشاء مكتبة ممتازة له. يمكنك ويجب عليك استخدامه حتى لا يتم تنفيذ جميع الوظائف يدويًا. . لتثبيت المكتبة، قم بتنزيل الأرشيف وفك ضغطه في مجلد المكتبة في دليل Arduino الخاص بك. يتم تضمين المكتبة باستخدام الأمر #include

يتم توصيل جميع أجهزة الاستشعار DS18B20 على التوازي، ويكفي مقاوم واحد لها جميعًا. باستخدام مكتبة OneWire، يمكنك قراءة جميع البيانات من جميع أجهزة الاستشعار في وقت واحد. إذا كان عدد أجهزة الاستشعار المتصلة أكثر من 10، فأنت بحاجة إلى تحديد المقاوم بمقاومة لا تزيد عن 1.6 كيلو أوم. أيضًا، لقياس درجة الحرارة بشكل أكثر دقة، تحتاج إلى تثبيت مقاومة إضافية تبلغ 100...120 أوم بين مخرجات البيانات على لوحة Arduino ومخرجات البيانات على كل مستشعر. يمكنك معرفة المستشعر الذي تم استلام قيمة معينة منه باستخدام رمز تسلسلي فريد 64 بت سيتم إصداره نتيجة لتنفيذ البرنامج.

لتوصيل أجهزة استشعار درجة الحرارة في الوضع العادي، تحتاج إلى استخدام الدائرة الموضحة في الشكل.

الاستنتاجات

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

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

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

ماذا نحتاج:
  • اردوينو دويميلانوف (فريدوينو 2009)
  • إيثرنت شيلد v2
  • مستشعر درجة الحرارة الرقمي - DS18B20
  • مروحة الهيكل (120 ملم)
  • علبة مستحلب الماء أو غراء PVA (2 لتر)
  • الصمام الثنائي الباعث للضوء
  • الزوج الملتوي
مهام
قم باستقصاء مستشعر درجة الحرارة عبر الناقل ذو السلك الواحد، ثم أرسل النتائج كل 3 ثوانٍ بشكل مستقل إلى خادم الويب حيث سيتم تخزينها.
خوارزمية تشغيل الجهاز:
  1. قم بتعيين عنوان Ethernet وعنوان IP الخاص بنا
  2. تهيئة الاتصال بالخادم على المنفذ 80
  3. نتلقى البيانات من مستشعر درجة الحرارة الرقمي عبر ناقل ذو سلك واحد
  4. تشكيل طلب GET
  5. أرسل طلب GET
  6. قطع الاتصال
رسم كود المصدر:
يجب أن توفر التعليقات الموجودة على الكود الوضوح.
يشمل
// المكتبة أدناه غير مضمنة في بيئة تطوير Arduino القياسية.
// سيكون عليك نسخه.
يشمل

// عنوان MAC لجهازنا
بايت ماك = ( 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC );
// عنوان IP للجهاز
بايت IP = (192, 168, 1, 156);
// عنوان IP للخادم البعيد
خادم البايت = (79, 140, 28, 20); // التغيير لك
درجة الحرارة شار؛
بايت isdata=0;

عميل العميل (الخادم، 80)؛ // 80 منفذ.
دالاس درجة الحرارة درجة الحرارة الاستشعار؛

الإعداد باطل()
{
Ethernet.begin(mac, ip); // تهيئة درع إيثرنت
tempSensor.begin(7); // مستشعر درجة الحرارة على الدبوس السابع
Serial.begin(9600); // سرعة منفذ وحدة التحكم 9600 (مفيدة لتصحيح الأخطاء)
}

حلقة فارغة()
{
تأخير (3000)؛ // تأخير 3 ثواني.
// يتصل
إذا (client.connect()) (
Serial.println("الاتصال..."); // Serial.println لتصحيح الأخطاء. من الأفضل تركها، فقط في حالة، سيكون من الأسهل فهم ما هي المشكلة.
// معالج خطأ الاستشعار
التبديل (tempSensor.isValid())
{
حالة 1:
Serial.println("اتفاقية حقوق الطفل غير صالحة"); // خطأ أختباري
tempSensor.reset(); // إعادة ضبط الجهاز
يعود ؛
الحالة 2:
Serial.println("جهاز غير صالح"); // نوع من أجهزة الاستشعار "الأيسر" :)
tempSensor.reset(); // إعادة ضبط الجهاز
يعود ؛
}

Serial.println("متصلة");
شار بوف؛
float f=tempSensor.getTemperature(); // الحصول على درجة الحرارة

Serial.println(tempSensor.getTemperature());

// أسفل الانحراف مع فصل الجزء الكسري والعدد الصحيح. لسبب ما، لا يريد Arduino العمل مع العوامة.
// إدراج سؤال بدلاً من رقم. ربما يكون هذا بسبب نقص دعم الأجهزة للعمل معه
// أرقام الفاصلة العائمة في اردوينو سأكون سعيدًا برؤية حل أكثر جمالًا في التعليقات.
int temp1 = (f - (int )f) * 100; // حدد الجزء الكسري
// إنشاء طلب الحصول على. هناك حاجة إلى متغير الكود لمنع مقياس حرارة العدو من إرسال قيم عشوائية.
// تم التحقق منه من جانب خادم الويب.
سبرينتف (بوف، "الحصول على /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0", (int )f, abs(temp1));

Serial.println(buf);
println(buf); // أرسل طلب الحصول على
client.println("المضيف: opck.info" ); // نشير إلى المضيف المحدد الذي نهتم به على عنوان IP هذا.
println();

) آخر (
Serial.println("فشل الاتصال");
}

بينما (client.available()) (
isdata=1;
شار ج = العميل. قراءة ()؛ // اقرأ ما أجابنا عليه خادم الويب
Serial.print (ج)؛

إذا (!client.connected()) (
isdata=0;
println();
Serial.println("قطع الاتصال.");
client.stop(); // إنهاء الاتصال
}
}


تجميع الجهاز:
  1. نقوم بربط "الساق" الأولى للمستشعر بـ GND "ناقص".
  2. "الساق" الثانية (DQ) على الدبوس السابع
  3. الثالث إلى "زائد"
  4. يجب توصيل الثاني والثالث بمقاوم ~ 4.7 K. لكنني استبدلت المقاوم بمصباح LED وحصلت على مؤشر للوصول إلى ناقل المستشعر (تنبيه! بدون مقاوم أو LED، لن يعمل أي شيء. لا تنس!)

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

ولأول مرة، تم تجميع علبة القهوة المغلفة بورق الألمنيوم لهذا الغرض. لكن هذا لم يساعد.

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

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

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

لا نحتاج إلى غطاء من الجرة، بل نحتاج إلى مظلة، بحيث يمكن للهواء أن يمر عبرها ولا يدخل هطول الأمطار إلى الداخل (سيكون المستشعر موجودًا في الشارع).

لقد صنعت علبة Arduino من صندوق بلاستيكي من مشغل mp3 Explay C360.

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

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

عيوب:
دقة المستشعر هي 0.5*C، وهي ليست كافية بالنسبة لي. ولكن هناك طريقة لتحسين أدائها. ستحتاج إلى مستشعر واحد أو أكثر (يفضل أن يكون من دفعات مختلفة). نتلقى البيانات من جميع أجهزة الاستشعار ونحسب المتوسط ​​الحسابي. بهذه الطريقة يمكنك تحقيق الدقة حتى أجزاء من المئات من الدرجة.
خطط مستقبلية:
  • جهاز استشعار الرطوبة
  • مقياس الضغط
  • مستشعر سرعة الرياح
  • مستشعر الضوء
  • ضع العديد منها في المدينة وقم بعمل تنبؤات الطقس الخاصة بك
  • قم بتشغيل Arduino عبر الطاقة عبر الإيثرنت
  • تشغيل المروحة تلقائيًا وسرعتها حسب الإضاءة
  • جهاز التحكم
  • إعادة ضبط البيانات في حالة عدم وجود اتصال (وهذا أمر بالغ الأهمية بالنسبة لي)
السلبيات التي أعرفها:
- سعر مرتفع - 2180 فرك. (Freeduino 2009 (800 RUR) + Ethernet Shield v2 (1300 RUR) + مستشعر واحد (80 RUR))
- إذا تم تشغيل المروحة بسرعة كبيرة، فإنها تسبب خطأً في درجة الحرارة عن طريق النفخ على المستشعر. لا ينبغي أن تنفجر، ولكن فقط دفع الهواء من خلالها.

في هذا البرنامج التعليمي سوف نستخدم مستشعر درجة الحرارة DS18B20 مع Arduino UNO لإنشاء مقياس حرارة. يعد مستشعر DS18B20 خيارًا جيدًا عندما يتطلب المشروع عالي الدقة استجابة جيدة. سنوضح لك كيفية توصيل DS18B20 بجهازك وعرض بيانات درجة الحرارة على شاشة LCD مقاس 16 × 2.

يتواصل مستشعر DS18B20 مع Arduino عبر ناقل ذو سلك واحد. بحكم التعريف، يلزم وجود خط بيانات (وأرضي) واحد فقط للتواصل مع Arduino.

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

مميزات DS18B20

  • مطلوب واجهة سلك واحد فقط للاتصال بين وحدة التحكم الدقيقة والمستشعر.
  • مطلوب مكون خارجي واحد فقط: مقاومة 4.7 كيلو أوم.
  • يمكن تشغيله من خط البيانات مباشرة، ويتطلب جهدًا يتراوح من 3.0 إلى 5.5 فولت.
  • يحتوي كل جهاز على رمز تسلسلي فريد 64 بت مخزن على ذاكرة القراءة فقط (ROM) المدمجة.
  • يمكن قياس درجات الحرارة من -55 درجة مئوية إلى +125 درجة مئوية (-67 درجة فهرنهايت إلى +257 درجة فهرنهايت).
  • الدقة ± 0.5 درجة مئوية في النطاق -10 درجة مئوية إلى +85 درجة مئوية.

يستخدم هذا المشروع جهاز DS18B20، الذي يأتي على شكل مسبار درجة حرارة مقاوم للماء. يؤدي استخدام مستشعر مقاوم للماء إلى توسيع الإمكانيات - حيث سيكون مستشعر درجة الحرارة قادرًا على قياس درجة حرارة السوائل مثل الماء والمواد الكيميائية والشاي والقهوة.

متطلبات المكونات

تعد متطلبات المعدات الخاصة بمقياس الحرارة الخاص بك قياسية تمامًا، وسنحتاج إلى:

  • شاشة LCD مقاس 16×2
  • مستشعر درجة الحرارة DS18B20
  • أسلاك العبور
  • المقاوم 1K
  • لوح الخبز

مخطط الاتصال

قم بإجراء الاتصالات وفقًا للرسم البياني أدناه.

توصيل الحساس والاردوينو

  • VCC -> Arduino 5V، بالإضافة إلى مقاومة 4.7K تنتقل من VCC إلى Data
  • البيانات -> دبوس 7 اردوينو
  • جي إن دي -> جي إن دي اردوينو

اتصالات لشاشات الكريستال السائل واردوينو UNO

  • الدبوس 1 -> GND
  • الدبوس 2 -> VCC
  • دبوس 3 -> اردوينو دبوس 3
  • دبوس 4 -> اردوينو دبوس 33
  • الدبوس 5 -> GND
  • دبوس 6 -> اردوينو دبوس 31
  • الدبوس 7-10 -> GND
  • دبوس 11 -> اردوينو دبوس 22
  • دبوس 12 -> اردوينو دبوس 24
  • دبوس 13 -> اردوينو دبوس 26
  • دبوس 14 -> اردوينو دبوس 28
  • الدبوس 15 -> VCC عبر مقاومة 220 أوم
  • الدبوس 16 -> GND

قم بتوصيل مقياس الجهد كما هو موضح أعلاه بالدبوس 3 على شاشة LCD للتحكم في التباين.

يعمل هذا المشروع في درجات حرارة تصل إلى 125 درجة مئوية. إذا كان هناك أي اختلاف في قراءة درجة الحرارة، تحقق مرة أخرى من التوصيلات بالمقاوم المتصل بـ DS18B20. بعد ربط كل ما هو موضح أعلاه، يمكننا الانتقال إلى البرمجة.

كود المصدر لمقياس الحرارة

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

  • المكتبة الأولى تسمى - OneWire ().
  • المكتبة الثانية تسمى DallasTemperature().

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

// يبدأ الكود #include #يشمل #يشمل #define ONE_WIRE_BUS 7 OneWire oneWire(ONE_WIRE_BUS); أجهزة استشعار درجة الحرارة في دالاس (&oneWire)؛ تعويم درجة الحرارة = 0؛ تعويم درجة الحرارة = 0؛ شاشات الكريستال السائل السائل (12,11,5,4,3,2); إعداد الفراغ () (sensors.begin ()؛ LCD.begin (16،2)؛ LCD.clear ()؛ pinMode (3، OUTPUT)؛ AnalogWrite (3، 0)؛ Serial.begin (9600)؛) حلقة باطلة () ( Sensors.requestTemperatures(); tempC = Sensors.getTempCByIndex(0); tempF = Sensors.toFahrenheit(tempC); تأخير(1000); Serial.println(tempC); LCD.setCursor(0,0); LCD. print("C: ");lcd.print("درجة");lcd.setCursor(0,1);

يبدو شيء من هذا القبيل:

تمكنا من قياس درجات حرارة تصل إلى 100 درجة مئوية باستخدام هذا المستشعر! إنه مستجيب للغاية.

بمجرد إنشاء مشروعك، اختبر الجهاز عن طريق غمر المستشعر في الماء الساخن والبارد.