DHT11 یک سنسور سنجش رطوبت و دما است که همان طور که از اسم آن برمیآید در اندازهگیری دمای اتمسفری یک محیط و سنجش میزان رطوبت آن استفاده میشود. محیط مورد نظر میتواند یک فضای باز و یا یک فضای بسته و محدود باشد. معمولا در کاربردهایی مانند کشاورزی، صنایع غذایی، بیمارستانها، ماشینها، ایستگاههای هواشناسی و امثال اینها از این نوع سنسور برای سنجش شرایط محیطی استفاده میشود.
این سنسور قادر است دماهای بین ۰ تا ۵۰ درجه سانتیگراد را با دقت ۱ درجه اندازهگیری کند. با اینکه گفتیم میتوان در محیطهای آزاد هم از آن استفاده کرد، اما معمولا بیشتر در فضاهای محدود و کنترل شده از آن استفاده میکنند تا شرایط آن محیط را تحت کنترل داشته و تصمیمهای درست برای آن بگیرند. مثلا در سیستمهای تهویه حرارتی، اتاقکهای کنترل دما و … .
محدودهی سنجش رطوبت هم از ۲۰ تا ۹۰ درصد و با دقت ۱ درصد است. (منظور از رطوبت هم میزان بخارآب موجود در هواست) اهمیت سنجش رطوبت در این است که در بسیاری از فرآیندها مهم است که در طول فرآیند میزان رطوبت در محدودهی ثابتی نگه داشته شود. برای مثال پروسهی تولید و بستهبندی چای کیسهای را در نظر بگیرید. اگر در طول این فرآیند میزان رطوبت از محدودهی مشخصی کمتر یا بیشتر شود، پودر چای به دست آمده طعم و عطر خود را از دست خواهد داد. یا حتی یک مثال ملموستر؛ در خانههای خود ما اگر میزان رطوبت از حدی بیشتر یا کمتر شود از میزان آسایش منزل کاسته خواهد شد. در بهترین و ایدهآلترین حالت رطوبت بین ۵۰ تا ۶۵ درصدی شرایط مطلوبی را برای ما ایجاد خواهد کرد.
در این آموزش میخواهیم با هم یاد بگیریم که چگونه سنسور DHT11 را به میکروی STM32 متصل کنیم. در آموزشهای قبلی دربارهی بورد این میکرو و اینکه چگونه با کمک Arduino IDE میتوانیم از آن استفاده کنیم، آموختهایم. اما برای کسانی که تازه وارد هستند و با بورد این میکرو آشنایی ندارند هم توضیح مختصری میدهیم، بورد توسعهی BluePill از یک میکروکنترلر STM32F103C8T6 که از خانوادهی میکروهای ST میباشد، تشکیل شده است. این میکرو در واقع یک کنترلر ۳۲ بیتی ARM Cortex M3 است که فرکانس کلاک بالایی دارد و برای کاربردهایی که محدودیت مصرف توان دارند اما به فرکانسهای بالا نیاز دارند، بسیار مناسب است.
آشنایی با سنسور DHT11
قبل از آنکه به سراغ مقولهی چند و چون ارتباط و اتصال این سنسور با میکروی STM32 برویم، بد نیست کمی در همین نقطه تعلل کنیم و با این سنسور بیشتر آشنا شویم. بسیار خب؛ گفتیم که این سنسور به منظور سنجش دما و رطوبت طراحی شده است. برای اندازهگیری دما، این سنسور دارای یک NTC داخلی است. یک میکروی ۸ بیتی هم دارد که به کمک آن مقادیر اندازهگیری شدهی دما و رطوبت را به عنوان دادهی سریال و از طریق پروتکل one-wire روی خروجی میفرستد. به عبارت دیگر؛ این سنسور تنها یک خروجی برای دادهها دارد که باید از طریق همان هم دما و هم رطوبت را نمایش دهد. همین امر موجب شده است که پینهای بیشتری از میکروکنترلر آن آزاد بمانند. نکتهی دیگر در مورد آن این است که در کارخانه و در حین ساخت کالیبره شده است پس میتوان به راحتی و با دردسر کمتری آن را به میکروهای دیگر متصل کرد.
ویژگیهای سنسور DHT11
- محدودهی ولتاژ کاری: ۳.۵ تا ۵.۵ ولت
- جریان کاری: ۰.۳ میلی آمپر در حالت اندازهگیری و 60uA در حالت استندبای
- خروجی به صورت serial data
- محدودهی دمای قابل اندازهگیری: ۰ تا ۵۰ درجه سانتیگراد
- محدودهی رطوبت قابل سنجش: از ۲۰ درصد تا ۹۰ درصد
- رزولوشن: هم دما و هم رطوبت ۱۶ بیتی
- دقت: ۱ درجه سانتیگراد و ۱ درصد
آنچه که برای انجام این پروژه نیاز داریم
- میکروکنترلر STM32F103C8
- سنسور DHT11
- LCD با ابعاد ۲*۱۶
- ماژول آداپتور IIC/I2C Serial Interface
- برد بورد
- سیم برد بوردی
طراحی مدار
مدار کامل برای اتصال میکرو و سنسور در تصویر زیر نشان داده شده است. (این شماتیک مدار با استفاده از نرمافزار Fritzing رسم شده است)
همان طور که در تصویر مشاهده میکنید، برای اتصال میان میکرو LCD از واسطهی یک ماژول I2C interface استفاده کردهایم. این کار باعث میشود که هم اتصال سادهتر شود و هم اینکه پینهای بیشتری در سمت میکرو آزاد بمانند. اما اگر این ماژول را در دسترس نداشتید هم چندان مهم نیست و میتوانید با آموزشهای موجود، آنها را مستقیما نیز به یکدیگر متصل کنید.
اگر ماژول interface را داشتید،نحوه ی اتصال میان پینهای آن (که خود به LCD متصل شده است) و پینها میکرو در جدول زیر آورده شده است.
به همین ترتیب بین میکرو و سنسور:
بعد از اینکه اتصالات را برقرار کنید؛ مدار چیزی شبیه این خواهد بود.
پاور کلیت این مدار از طریق پورت USB میکرو که به لپتاپ متصل میشود تامین شده است.
در این مرحله تنظیمات سختافزاری مدار آماده است و میتوانیم به مرحله بعد یعنی نوشتن کدها برویم.
آماده کردن Arduino IDE برای کار با میکرو STM32
میخواهیم برنامهای بنویسیم که مقادیر اندازهگیری شدهی دما و رطوبت توسط سنسور را از خروجی دیتای آن خوانده و بر روی LCD نشان بدهد. چون LCD را با واسطهی I2C adapter متصل کردهایم، ابتدا باید آدرس adapter را پیدا کنیم تا به کمک آن بتوانیم به LCD وصل شویم.
ارتباط ماژول interface با میکرو
از روی شماتیک مدار میتوانیم تشخیص دهیم که پایههای PB6 و PB7 میکرو به ترتیب به پایهی SCL و SDA ماژول متصل شدهاند. برای پیدا کردن آدرس ماژول interface باید آدرسهای موجود را اسکن کنیم.
اسکن آدرس ماژول interface
برای این کار گامهای زیر را به ترتیب انجام دهید:
- ابتدا بررسی کنید که در Arduino IDE، پکیج مربوط به STM32 نصب شده باشد. اگر نصب نبود براساس دستورالعملهای موجود آن را نصب کنید.
- در حین پروسهی نصب پکیجها میبینید که کتابخانهی wire به صورت دیفالت نصب میشود.
- پس از انجام مرحلهی فوق، در بخش Examples، برنامهی لازم برای اسکن کردن آدرس وجود دارد . کافیست به این مسیر بروید، Arduino IDE: Files ->Examples ->Wire ->I2C scanner wire. اما قبل از آن به آدرس Tools ->Board ->Generic STM32F103C8 بروید و مانند تصویر زیر نوع بورد را انتخاب کنید.
- پس از آن کد را بر روی میکرو آپلود کنید و serial monitor را باز کنید.
میبینید که I2C address نشان داده میشود.
نصب کتابخانههای لازم برای ماژول I2C و سنسور
حالا که آدرس I2C را میدانیم، کتابخانههای لازم برای ارتباط با LCD را نصب میکنیم. کتابخانهی مد نظر ما I2C LCD display است که اگر آن را نداشته باشید میتوانید از این لینک دانلود کنید. پس از دانلود آن، از مسیر sketch ->import library میتوانید آن را به IDE اضافه کنید. جالب است بدانید که بوردهای آردوینو هم اگر بخواهند با LCD ارتباط I2C داشته باشند از همین کتابخانه استفاده میکنند.
برای خواندن دادهی سریال از سنسور DHT11 نیز باید کتابخانهی DHT11 library را نصب کنیم. آن را دانلود و نصب کنید و از همان مسیری که در پاراگراف بالایی گفتیم، آن را به IDE اضافه کنید. این کتابخانه هم توسط بوردهای آردوینو قابل استفاده است.
توضیح بخشهای مختلف کد
در همین ابتدا ذکر کنیم که کد کامل این پروژه را در انتهای آموزش برایتان قرار دادهایم تا به راحتی با آن کار کنید. توضیحاتی که در ادامه داریم هم توضیح قسمتهای مهم همین کد است.
در بخش اول کد، کتابخانهها را اضافه میکنیم، wire.h برای ماژول LiquidCrystal_I2C.h ،I2C برای ارتباط I2C با LCD و DHT.h برای استفاده از سنسور.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <DHT.h>
حالا پین خروجی سنسور را که به پین PA1 میکرو متصل است تعریف میکنیم.
#define DHTPIN PA1
DHTTYPE را هم DHT11 قرار میدهیم.
#define DHTTYPE DHT11
سپس یک lcd object را برای کلاس LiquidCrystal_I2C با آدرس0x27 ،I2C و LCD از نوع ۲*۱۶ مقداردهی میکنیم.
LiquidCrystal_I2C lcd(0x27, 16, 2);
و به همان ترتیب یک dht object را برای کلاس DHT پین آن را اتصال به STM و نو ع آن را DHT11 میگذاریم.
DHT dht(DHTPIN, DHTTYPE);
سپس در بخش تابع ()void setup:
ابتدا با کد زیر LCD را مقداردهی اولیه میکنیم.
lcd.begin();
و با استفاده از کد زیر مقادیر دما و رطوبت را از سنسور میخوانیم.
dht.begin();
پیام شروع به کار LCD را برای مدت چند ثانیه نمایش میدهیم و سپس آن را پاک میکنیم.
lcd.backlight(); lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("DHT11 with STM32"); delay(3000); lcd.clear();
وارد بخش ()void loop میشویم، مقادیر دما و رطوبت اندازهگیری شده به صورت پیوسته از سنسور دریافت میشوند، برای اینکه بتوانیم میان دما و رطوبت تفکیک قائل شویم، باید متغیری برای نگهداری مقادیر داشته باشیم.
یک متغیر برای گرفتن مقدار رطوبت:
float h = dht.readHumidity();
و یک متغیر برای گرفتن مقدار دما:
float t = dht.readTemperature();
و در نهایت این مقادیر را بر روی LCD پرینت میکنیم.
lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(h); lcd.print(" %");
سنجش عملکرد ترمومتر متصل شده به میکروی STM32
در این مرحله مدار شما کاملا آماده است و کد هم بر روی بورد آپلود شده است. با شروع به کار مدار باید ببینید که ابتدا پیام شروع به کار و سپس دما و رطوبت واقعی محیط که در لحظه توسط سنسور اندازهگیری میشود، بر روی LCD نمایش داده میشوند. مانند تصویر زیر.
اگر احیانا چیزی بر روی LCD شما مشاهده نمیشود، پتانسیومتری که در پشت ماژول I2C interface قرار دارد را تنظیم کنید. یک راه خوب برای تست کردن صحت عملکرد مدار این است که دمای محیطی که مدار در آن قرار دارد را با خنککنندههایی مانند کولر یا … تغییر دهید و ببنیید که آیا دمای اندازهگیری شدهی سنسور نیز متناسب با آن تغییر میکند یا خیر. اگر مثلا کولر گازی در اختیار داشته باشید، میتوانید دمای نشان داده شده توسط آن را با دمای سنسور تطبیق دهید. مثلا در اینجا یکی ۲۷.۳ درجه را نشان میدهد و یکی ۲۷ درجه را که تقریبا برابر هستند.
ویدئویی که در پایان مطلب قرار دادهایم، کل عملکرد این پروژه را به شما نشان میدهد.امیدواریم که با این آموزش به خوبی همراهی کرده و از آن لدت برده باشید. اگر در مسیر انجام دادن آن مشکلی داشتید، حتما برای ما کامنت بگذارید.
کد
#include <Wire.h> //Library for using I2C #include <LiquidCrystal_I2C.h> //Library for using I2C type LCD display #include <DHT.h> //Library for using DHT sensor #define DHTPIN PA1 #define DHTTYPE DHT11 LiquidCrystal_I2C lcd(0x27, 16, 2); //initilize object lcd for class LiquidCrystal_I2C with I2C address of 0x27 and 16x2 type LCD display DHT dht(DHTPIN, DHTTYPE); //initilize object dht for class DHT with DHT pin with STM32 and DHT type as DHT11 void setup() { // initialize the LCD lcd.begin(); dht.begin(); //Begins to receive Temperature and humidity values. lcd.backlight(); // Turn on the blacklight and print a welcome message. lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("DHT11 with STM32"); delay(3000); lcd.clear(); } void loop() { float h = dht.readHumidity(); //Gets Humidity value float t = dht.readTemperature(); //Gets Temperature value lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(h); lcd.print(" %"); }
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم آموزش «اتصال سنسور دما و رطوبت DHT11 به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد میکنیم دیگر آموزشهای STM32 را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
البته خدمت دوستانی که میخواهند از این روش استفاده کنند بدونند که قبلش یک تبدیل USB به پورت سریال (pl2303 یا CH340) نیاز دارند که سیستم بتونه برد STM32 رو شناسایی کنه