روشهای مختلفی برای سنجش و نمایش و پایش دما و رطوبت محیط یا همان مانیتورینگ دما رطوبت وجود دارد. این مورد توسط سخت افزارهای مختلفی قابل پیاده سازی است. بسته به محیط مورد استفاده بایستی از سنسور مرتبط با آن استفاده کرد. در این آموزش قصد داریم با استفاده از برد ESP32 و همچنین سنسور DHT22، دما و رطوبت محیط را توسط یک وب سرور که با کمک ESP32 خواهیم ساخت، مانیتور کنیم. برد ESP32 دارای تراشه وای فای است و به خودی خود میتواند وب سرور را راه اندازی کند. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
برد ESP32 مدل NodeMCU
تراشه ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش است. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC است. این ماژول دارای بهترین پرفورمنس در مصرف انرژی بوده و با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم، یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپها System on a chip microcontrollers هم گفته میشود. دارای چندین پایه GPIO برای ارتباط با سخت افزارهای مختلف است. در زیر نمایی از این برد خارق العاده را مشاهده میکنید.
سنسور دما رطوبت DHT22
سنسورها متنوعی برای سنجش دما و رطوبت طراحی و تولید شدهاند. هر کدام محدوده و حساسیت مختلفی دارند. سنسور DHT22 یکی از بهترین سنسورهای اندازه گیری دما و رطوبت هستند. این سنسورها از دو بخش رطوبت خازنی و یک مقاومت گرمایی تشکیل شدهاند. همچنین یک واحد مبدل آنالوگ به دیجیتال در DHT22 وجود دارد، که خروجی دیجیتال تولید میکند. به کمک این مبدل کاربر میتواند از آن در میکروکنترلرها از آن برای خواندن مقادیر استفاده کند.
برخی از ویژگیهای سنسور دما رطوبت DHT22
- ولتاژ عملیاتی ۳ تا ۵ ولت
- مناسب برای رطوبت ۰ تا ۱۰۰% همچنین با دقت ۲ تا ۵%
- حداکثر جریان مصرفی ۲٫۵ میلی آمپر
- مناسب برای دمای ۴۰- تا ۱۲۵ درجه سانتی گراد
سنسور دما رطوبت DHT11
سنسور دما و رطوبت DHT11 سنسوری ارزان قیمت جهت اندازه گیری دما و رطوبت هوا است. اندازه، مصرف کم انرژی آن را به یکی از بهترین گزینهها جهت استفاده در پروژههای مختلف، تبدیل کرده است. با توجه به خروجی دیجیتال این سنسور، به راحتی می تواند به سایر میکروکنترلر ها متصل گردد. سنسور DHT11 کالیبره شده و دارای خروجی دیجیتال است. محدوده اندازه گیری رطوبت بین ۲۰ تا ۹۰% RH و محدودهی دما از ۰ تا ۵۰ درجه سانتی گراد میباشد. ولتاژ کاری ماژول DHT بین ۳٫۳ تا ۵ ولت DC است. فاصله انتقال سیگنال در ماژول DHT11 تا ۲۰ متر میباشد. ماژول دما و رطوبت DHT11 بسیار مقرون به صرفه، دارای کیفیت عالی و واکنش سریع نسبت به تغییر دمای محیط است. ماژول DHT11 به ترتیب دارای ۳ پایه GND, VCC, Signal میباشد.
قطعات و شماتیک
برای راه اندازی مانیتورینگ دما رطوبت با سنسور DHT بایستی اتصالاتی مانند شماتیک زیر بین برد و سنسور برقرار کنید. در این مدار از nodemcu ESP32 و همچنین از سنسور DHT22 استفاده می شود. لازم به ذکر است با تغییر کد می توانیم از DHT11 نیز در این آموزش استفاده کنیم. در ماژول DHT22 پایه Data به GPIO 27 در nodeMCU متصل می شود و همچنین پایه VCC به ۳V و GND به GND متصل می گردد.
پیش نیازهای مانیتورینگ دما رطوبت
در این آموزش از برد ESP32 استفاده می کنیم، در ادامه مراحل را برای نصب این برد در نرم افزار آردوینو دنبال کنید:
- ابتدا در نرم افزار Arduino IDE به مسیر File> Preferences بروید.
- لینک زیر را در بخش مشخص شده قرار دهید.
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
- سپس به مسیر Tools > Board > Boards Manager بروید.
- در بخش board manager کلمه ESP32 را سرچ کنید و بر روی install کلیک کنید.
کتابخانه های موردنیاز
ابتدا در نرم افزار Arduino IDE اقدام به نصب نرم افزار مرجع سنسور های DHT می پردازیم. مراحل زیر را دنبال کنید:
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه DHT sensor را جستجو کنید.
- کتابخانه را نصب کنید.
در ادامه از این لینک کتابخانه Adafruit Unified Sensor را دانلود، و طبق مراحل زیر پیش بروید.
- ابتدا به مسیر Sketch > Include Library > Add .zip Library بروید، و فایل .Zip که از لینک های زیر دانلود کرده اید را اضافه کنید.
در ادامه با استفاده از این لینک و این لینک، کتابخانه مربوط به ساخت وب سرور را نیز دانلود کرده و طبق مراحل بالا از آن استفاده کنید.
کد و تحلیل سنجش دما رطوبت
اول از همه یاد آوری کنم که یادتون باشه در این قسمت SSID و پسوور وای فای رو وارد کنید.
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD";
کتابخانه هایی که در این پروژه استفاده شده به شرح زیر می باشد که البته قبل تر با هم آن ها را نصب و به نرم افزار آردوینو اضافه کردیم.
#include "WiFi.h" #include "ESPAsyncWebServer.h" #include <ESPAsyncTCP.h> #include <Adafruit_Sensor.h> #include <DHT.h>
در این خط از کد پین مربوط به خواندن پایه دیتای سنسور DHT را معرفی و مشخص می کنیم، که همان GPIO 27 می باشد که در بخش شماتیک به آن اشاره شد.
#define DHTPIN 27
در این قسمت نوع سنسوری که استفاده میکنید را با uncomment کرد آن مشخص می کنید.
//#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
کد مرجع سنجش دما رطوبت با سنسور DHT و برد ESP32
#include "WiFi.h" #include "ESPAsyncWebServer.h" #include <Adafruit_Sensor.h> #include <DHT.h> // Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; #define DHTPIN 27 // Digital pin connected to the DHT sensor // Uncomment the type of sensor in use: //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); // Create AsyncWebServer object on port 80 AsyncWebServer server(80); String readDHTTemperature() { // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) //float t = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return "--"; } else { Serial.println(t); return String(t); } } String readDHTHumidity() { // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); if (isnan(h)) { Serial.println("Failed to read from DHT sensor!"); return "--"; } else { Serial.println(h); return String(h); } } const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; } h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } .dht-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } </style> </head> <body> <h2>ESP32 DHT Server</h2> <p> <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="dht-labels">Temperature</span> <span id="temperature">%TEMPERATURE%</span> <sup class="units">°C</sup> </p> <p> <i class="fas fa-tint" style="color:#00add6;"></i> <span class="dht-labels">Humidity</span> <span id="humidity">%HUMIDITY%</span> <sup class="units">%</sup> </p> </body> <script> setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("temperature").innerHTML = this.responseText; } }; xhttp.open("GET", "/temperature", true); xhttp.send(); }, ۱۰۰۰۰ ) ; setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("humidity").innerHTML = this.responseText; } }; xhttp.open("GET", "/humidity", true); xhttp.send(); }, ۱۰۰۰۰ ) ; </script> </html>)rawliteral"; // Replaces placeholder with DHT values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return readDHTTemperature(); } else if(var == "HUMIDITY"){ return readDHTHumidity(); } return String(); } void setup(){ // Serial port for debugging purposes Serial.begin(115200); dht.begin(); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } // Print ESP32 Local IP Address Serial.println(WiFi.localIP()); // Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", readDHTTemperature().c_str()); }); server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", readDHTHumidity().c_str()); }); // Start server server.begin(); } void loop(){ }
- تنظیمات منوی tools در نرم افزار آردوینو نیز مانند تصویر زیر می باشد.
وسایل مورد نیاز
جمع بندی
در نتیجه پس از آپلود کد در nodemcu یا تراشه ESP32؛ در نرم افزار آردوینو وارد Serial Monitor شوید، پس از ریست کردن، برد به وای فای مشخص شده متصل خواهد شد و ip مشخصی را در اختیار شما قرار خواهد داد، که با سرچ کردن آن در مرورگر می توانید به وب سرور دسترسی پیدا کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام استاد
ممنون از مطلب بسیار عالیتون
آیا این امکان وجود دارد که برنامه را روی خود آردوینو آپلود کنم و از esp برای ارسال داده استفاده کنم؟لطفاَ راهنمایی بفرمایید
باتشکر
سلام، ممنون از توجه شما، از آنجایی پروژه بر روی ESP32 اجرا میشود این کارد پیشنهاد نمیشود، برای مثال اگر از ESP8266 استفاده کرده بودیم منطقی بود که با یک ESP01 ارتباط شبکه را با برد آردوینو برقرار کنیم، البته مینوانیم کد زیر را بصورت کامل ویرایش کنید و بر روی ESP8266 اجرا و سناریویی که گفتم را اجرا کنید.
سلام و تشکر
چگونه میتونیم اطلاعات هر یک دقیقه اتومات رفرش کنیم
چون این کد بایستی دستی در مرورگر انجام بشه
با سلام
بایستی دستور مربوطه را در کدها بنویسید. چنین درخواستی توسط ما انجام نمیشود بایستی کدها را ویرایش کنید.