
راه اندازی سنسور دمای DHT11 با آردوینو و نمایش دما بر روی LCD
یک راهنمای جامع برای اتصال سنسور DHT11، آردوینو و نمایشگر OLED I2C برای نمایش دما و رطوبت
راهاندازی سنسور DHT11 با آردوینو یکی از پروژههای ساده و کاربردی در الکترونیک است که به شما امکان میدهد دما و رطوبت محیط را بهصورت دیجیتال اندازهگیری کنید. این سنسور به دلیل قیمت مناسب و سادگی در استفاده، گزینهای عالی برای مبتدیان و حتی پروژههای نیمهحرفهای محسوب میشود. دادههای دریافتی از این سنسور میتوانند به راحتی توسط آردوینو پردازش شده و در نمایشگرهای مختلف به نمایش درآیند.
در این پروژه، خروجی سنسور دمای DHT11 را روی یک نمایشگر OLED نمایش میدهیم. استفاده از OLED به دلیل وضوح بالا، مصرف انرژی کم و طراحی جمعوجور، گزینهای بسیار جذاب برای پروژههای الکترونیکی است. نمایش لحظهای دما و رطوبت روی این نمایشگر باعث میشود کاربر بدون نیاز به اتصال به کامپیوتر، شرایط محیطی را بهصورت دقیق و خوانا مشاهده کند. این ترکیب (آردوینو + DHT11 + OLED) پایهای مناسب برای ساخت سیستمهای مانیتورینگ محیطی در خانههای هوشمند، گلخانهها یا پروژههای آموزشی است.
فهرست مطالب
- مقدمه و معرفی قطعات
- پروتکل ارتباطی I2C به زبان ساده
- آمادهسازی بستر برنامهنویسی (نصب کتابخانهها)
- شکلدادن مدار (نحوه اتصال قطعات)
- نوشتن کد: از دریافت داده تا نمایش گرافیکی
- کالیبراسیون و افزایش دقت
- عیبیابی مشکلات رایج
- ایدههایی برای توسعه و ارتقای پروژه
1. مقدمه و معرفی قطعات
برای انجام این پروژه به قطعات زیر نیاز دارید:
- برد آردوینو Uno (یا مشابه مانند Nano): این مغز متفکر پروژه است. داده را از سنسور میخواند، پردازش میکند و نمایشگر را کنترل میکند.
- سنسور دما و رطوبت DHT11: این سنسور مقرونبهصرفه و پرکاربرد، همزمان دما را بر حسب درجه سانتیگراد و رططوبت را بر حسب درصد اندازهگیری میکند. توجه: این سنسور یک پین داده دارد و برای ارتباط از پروتکل اختصاصی خود استفاده میکند (نه I2C).
- نمایشگر OLED دو رنگ با درایور SSD1306 (معمولاً 0.96 اینچی): این نمایشگر برای نمایش اطلاعات به صورت گرافیکی و متنی عالی است. وضوح رایج آن 128×64 پیکسل است. مهم: درایور رایج این نمایشگرها SSD1306 است، نه SSD1315 که در متن اصلی اشاره شد. این نمایشگرها از پروتکل I2C استفاده میکنند.
- برد بورد (Breadboard) و سیم جامپر (نر-ماد و نر-نر): برای ایجاد اتصالات بدون نیاز به لحیمکاری.
- کابل USB: برای اتصال آردوینو به کامپیوتر و برنامهریزی آن.
- مقاومت 10 کیلواهم (اختیاری اما توصیه شده): برای Pull-up کردن خط داده سنسور DHT11.
ماژول دما و رطوبت DHT11 |
برد آردوینو Arduino UNO R3 CH340 با ورودی USB Type-C |
ماژول OLED 0.96 SPI دو رنگ زرد-آبی |
2. پروتکل ارتباطی I2C به زبان ساده
I2C یک پروتکل ارتباطی سریال و دوطرفه است که تنها با دو سیم کار میکند: یکی برای کلاک (SCL) و دیگری برای داده (SDA). این سادگی باعث شده تا بتوان چندین وسیله مانند سنسورها، نمایشگرها و ماژولهای مختلف را تنها با همین دو خط به میکروکنترلر وصل کرد. هر دستگاه در شبکه I2C یک آدرس منحصر به فرد دارد، بنابراین آردوینو یا هر کنترلکننده دیگری میتواند مشخص کند که در لحظه با کدام وسیله ارتباط برقرار کند.
یکی از ویژگیهای مهم I2C این است که از ساختار مستر و اسلیو پیروی میکند. معمولاً میکروکنترلر نقش مستر را دارد و فرمان ارسال یا دریافت داده را صادر میکند، در حالی که سنسورها یا نمایشگرها نقش اسلیو را بازی میکنند. این پروتکل به دلیل سرعت مناسب و قابلیت اتصال چندین دستگاه با سیمکشی کم، در پروژههای الکترونیکی و رباتیک بسیار پرکاربرد است و یادگیری آن برای کار با آردوینو و ماژولهای جانبی ضروری محسوب میشود.
- SDA (Serial Data): خطی برای انتقال داده.
- SCL (Serial Clock): خطی برای همزمانی (ساعت) ارتباط.
آردوینو Uno پینهای اختصاصی I2C دارد:
- A4 نقش SDA را ایفا میکند.
- A5 نقش SCL را ایفا میکند.
نمایشگر OLED و بسیاری از سنسورها به همین دو پین متصل میشوند.
3. آمادهسازی بستر برنامهنویسی (نصب کتابخانهها)
قبل از نوشتن کد، باید کتابخانههای لازم را در محیط Arduino IDE نصب کنید:
- کتابخانه DHT Sensor Library: برای کار با سنسورهای DHT.
- به مسیر
Tools > Manage Libraries...
بروید. - عبارت “DHT sensor library” را جستجو و توسط Adafruit نصب کنید.
- به مسیر
- کتابخانه Adafruit SSD1306: برای کنترل نمایشگر.
- در پنجره Library Manager، عبارت “Adafruit SSD1306” را جستجو و نصب کنید.
- کتابخانه Adafruit GFX: این کتابخانه برای رسم اشکال و فونتها روی نمایشگر است و معمولاً به طور خودکار با کتابخانه SSD1306 نصب میشود.
4. نحوه اتصال قطعات
اتصال سنسور DHT11:
پین سنسور DHT11 | پین آردوینو Uno |
---|---|
VCC (پین ۱) | 5V |
Data (پین ۲) | Digital Pin 2 |
GND (پین ۴) | GND |
- یک مقاومت 10 کیلواهم بین پین VCC و Data سنسور وصل کنید (Pull-Up).
اتصال نمایشگر OLED I2C:
پین نمایشگر OLED | پین آردوینو Uno |
---|---|
VCC | 3.3V یا 5V * |
GND | GND |
SCL | A5 (SCL) |
SDA | A4 (SDA) |
- اگر نمایشگر شما منطق 5 ولتی دارد، به 5V متصل شود. اگر 3.3 ولتی است، به 3.3V متصل شود. بیشتر ماژولها با 5V نیز کار میکنند.
5. نوشتن کد: از دریافت داده تا نمایش گرافیکی
حالا نوبت به بخش جذاب پروژه، یعنی برنامهنویسی میرسد. کد زیر به طور کامل و با جزئیات نوشته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
// شامل کردن کتابخانه های لازم #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <DHT.h> // تعریف پین و نوع سنسور DHT #define DHTPIN 2 #define DHTTYPE DHT11 // ساخت شیء از سنسور DHT DHT dht(DHTPIN, DHTTYPE); // مشخصات نمایشگر (ابعاد بر حسب پیکسل) #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // اگر پین Reset نداریم، -1 بگذاریم // ساخت شیء از نمایشگر Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // آیکون های سفارشی (یک نماد ساده دماسنج) // با استفاده از سایت https://javl.github.io/image2cpp/ می توانید آیکون بسازید const unsigned char myThermometer [] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00 }; void setup() { // شروع ارتباط سریال برای دیباگ Serial.begin(9600); // شروع کار با سنسور dht.begin(); // مقداردهی اولیه نمایشگر if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // آدرس I2C معمولاً 0x3C یا 0x3D است Serial.println(F("SSD1306 allocation failed")); for(;;); // اگر نمایشگر پیدا نشد، برنامه متوقف شود } // پاک کردن بافر نمایشگر display.clearDisplay(); delay(2000); // نمایش یک اسلاش اسکرین ساده display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("System Starting..."); display.display(); delay(2000); } void loop() { // تاخیر بین هر بار خواندن (خواندن سریع DHT11 ممکن است باعث خطا شود) delay(2000); // خواندن دما و رطوبت float humidity = dht.readHumidity(); // خواندن رطوبت (%) float temperature = dht.readTemperature(); // خواندن دما (C) // بررسی خطا در خواندن سنسور if (isnan(humidity) || isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); display.clearDisplay(); display.setCursor(0,0); display.println("Sensor Error!"); display.display(); return; // اگر خطا داشت، از loop خارج شو و دوباره امتحان کن } // چاپ مقادیر در Serial Monitor برای دیباگ Serial.print("Humidity: "); Serial.print(humidity); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" *C "); // === رسم صفحه نمایش روی OLED === display.clearDisplay(); // پاک کردن صفحه برای رسم جدید // رسم مستطیل برای کادر اصلی display.drawRoundRect(0, 0, 128, 64, 3, SSD1306_WHITE); // نمایش دما display.drawBitmap(5, 5, myThermometer, 16, 24, SSD1306_WHITE); // رسم آیکون display.setTextSize(1); display.setCursor(25, 5); display.print("Temperature:"); display.setTextSize(2); // متن بزرگتر برای مقدار display.setCursor(25, 20); display.print(temperature, 1); // نمایش دما با یک رقم اعشار display.print(" C"); // نمایش رطوبت display.setTextSize(1); display.setCursor(25, 40); display.print("Humidity:"); display.setTextSize(2); display.setCursor(25, 50); display.print(humidity, 1); // نمایش رطوبت با یک رقم اعشار display.print(" %"); // ارسال همه چیز از بافر به نمایشگر display.display(); } |
توضیح بخشهای کلیدی کد:
- ساخت اشیاء: ما برای سنسور و نمایشگر، شیء (Object) ساختهایم تا به راحتی از توابع آنها استفاده کنیم.
- مدیریت خطا: تابع
isnan()
بررسی میکند که سنسور عدد معتبری برگردانده یا خیر. اگر خطایی رخ دهد، یک پیغام خطا روی نمایشگر نشان داده میشود. - Serial Monitor: مقادیر خوانده شده برای اهداف دیباگ و عیبیابی در Serial Monitor چاپ میشوند.
- گرافیک: به جای استفاده از
println
ساده، از توابع کتابخانه GFX برای رسم کادر، قرار دادن آیکون و تنظیم سایز و مکان متنها استفاده کردهایم تا خروجی زیباتر و خواناتری داشته باشیم.
6. کالیبراسیون و افزایش دقت
سنسور DHT11 دقت محدودی دارد (دما ±2°C و رطوبت ±5%). برای نتایج دقیقتر:
- مقایسه: خوانشهای سنسور خود را با یک دماسنج یا رطوبتسنج استاندارد و دقیق مقایسه کنید.
- افزایش/کاهش افست: میتوانید یک مقدار ثابت (Offset) در کد به مقادیر خوانده شده اضافه یا از آن کم کنید. برای مثال:
float calibratedTemp = temperature - 1.0; // اگر سنسور 1 درجه بیشتر نشان میدهد
- اجتناب از عوامل مخرب: سنسور را از منابع مستقیم گرما (مانند رگولاتور آردوینو) و رطوبت مستقیم دور نگه دارید.
7. عیبیابی مشکلات رایج
- نمایشگر روشن نمیشود:
- اتصالات VCC و GND را بررسی کنید.
- مطمئن شوید آدرس I2C در کد (
0x3C
) صحیح است. برای پیدا کردن آدرس ماژول خود میتوانید از اسکچI2C Scanner
استفاده کنید.
- مقادیر NaN (Not a Number) یا خطا نمایش داده میشود:
- اتصال پین داده سنسور DHT را بررسی کنید.
- از سالم بودن سنسور مطمئن شوید.
- مقاومت Pull-up را وصل کنید.
- بین هر بار خواندن سنسور حداقل 2 ثانیه تاخیر بگذارید.
- مقادیر خوانده شده کاملاً اشتباه است:
- پینهای VCC و GND سنسور را اشتباه وصل نکرده باشید.
- سنسور ممکن است خراب باشد.
8. ایده هایی برای توسعه و ارتقای پروژه
حالا که پایه پروژه کامل شد، میتوانید آن را گسترش دهید:
- افزودن ماژول SD Card: برای ذخیرهسازی دادهها و رسم نمودارهای تاریخی.
- ساخت Dashboard تحت وب: با استفاده از ماژول ESP8266 یا ESP32 میتوانید دادهها را به سرور ارسال کنید و از طریق موبایل یا لپتاپ آنها را رصد کنید.
- هشدار دهنده: با استفاده از یک بوزر (Buzzer) یا LED، زمانی که دما یا رطوبت از یک حد مجاز عبور کرد، هشدار ایجاد کنید.
- کنترل فعال: با اضافه کردن یک رله، میتوانید یک فن یا humidifier را بر اساس شرایط محیط روشن و خاموش کنید.
- نمایشگر پیشرفته: از قابلیتهای کتابخانه GFX برای رسم نمودارهای خطی واقعی از تغییرات دما استفاده کنید.
جمعبندی
در این پروژه یاد گرفتیم که چگونه با استفاده از آردوینو، دادههای فیزیکی محیط را sensed کنیم، پردازش کنیم و به زیباترین شکل ممکن به کاربر نمایش دهیم. این مبانی پایهای میتواند نقطه شروعی برای صدها پروژه IoT و هوشمندسازی دیگر باشد. سختافزار و کد را امتحان کنید، با آن بازی کنید و ایدههای خود را به آن اضافه کنید.