وبلاگ شخصی آموزش IOT

مهران مظهر

توسعه دهنده نرم افزار
وبلاگ شخصی آموزش IOT

محمد مهدی محمدپور

توسعه دهنده سخت افزار

پیاده سازی وب سرور گزارش آب و هوا با استفاده از ماژول ESP8266 و سنسور DHT11

خلاصه

در این پروژه با استفاده از ماژول MCU Node که مجهز به چیپست ESP8266 است قادر خواهیم بود سنسور های بسازیم که به یک Point Access یا وای فای موجود وصل شوند و زمان در زمان اتصال با باال آوردن یک وب سرور بر روی این ماژول اطالعات دما و رطوبت خود را از سنسور DHT11 در محیط وب ارسال کنند .

1 )اتصاالت سخت افزاری– اتصال سنسور DHT11 به NodeMCU ESP8266 در این مرحله از یک بردبورد استفاده میکنیم و با اتصال ماژول NodeMCU روی آن از اتصال همه ی همه ی بخش ها به هم مطمئن می شویم .
در این مرحله سنسور DHT11 را بر روی بردبورد وصل میکنیم .سپس پین VCC را به پین V 3.3 ماژول NodeMCU وصل میکنیم و همین طور پین اتصال به زمین را به پین Ground NodeMCU وصل میکنیم . سپس پین DATA سنسور DHT11 را به پین D8 ماژول MCU NODE وصل میکنیم . در این مرحله نیاز به یک مقاومت UP-PULL بین پین VCC و پین دیتا برای نگه داشتن حالت HIGH بین سنسور و ماژول NodeMCU داریم .
پس از اتصال تمام مراحل باال شکل برد شما باید به صورت زیر باشد :

نرم افزار

استفاده از سنسور DHT11 نیاز به کد نویسی بسیاری دارد زیرا سنسور های مختلف نیاز به Timing  دقیقی دارند خوشبختانه نیازی به نگرانی در این مورد نیست چرا که کتابخانه استفاده از سنسور های  DHT توسط شرکت Adafruit تولید شده است و تقریبا تمام کارهایی که ما نیاز داریم را پوشش میدهد .
برای کد نویسی در NodeMCU نیاز به برنامه Ardunio داریم که از طریق لینک زیر میتوانیم اخرین ورژن این برنامه رو دریافت کنیم
https://www.arduino.cc/en/Main/Software 
پس از نصب برنامه به منوی زیر میرویم :
Sketch > Include Library > Manage Libraries
سپس از طریق سرچ "Sensor DHT "به دنبال کتابخانه ".Adafruit by library sensor DHT " بگردید سپس از طریق گزینه Install این کتابخانه را نصب کنید .
ساخت یک وب سرور با استفاده از NodeMCU :
همان طور که در تعریف پروژه توضیح داده شد در این قسمت نیاز به ساخت یک وب سرور درون ماژول NodeMCU داریم که از این طریق بتوانیم به NodeMCU خود وصل شده و اطالعات مورد نیاز ) دما و رطوبت( را دریافت کنیم .  قبل از کامپایل کردن کل برنامه شما نیاز دارید تا اطالعات وای فای ) PASSWORD,SSID )را در کد اصلاح کرده تا ماژول NodeMCU بتواند به Point Access شما متصل شد .

/*Put your SSID & Password*/
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password her

کد کامل برنامه :
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
define DHTTYPE DHT11
/*Put your SSID & Password*/
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password here
ESP8266WebServer server(80);
// DHT Sensor
uint8_t DHTPin = D8;

// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
void setup() {
 Serial.begin(115200);
 delay(100);

 pinMode(DHTPin, INPUT);
 dht.begin();
 Serial.println("Connecting to ");
 Serial.println(ssid);
 //connect to your local wi-fi network
 WiFi.begin(ssid, password);
6
 //check wi-fi is connected to wi-fi network
 while (WiFi.status() != WL_CONNECTED) {
 delay(1000);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected..!");
 Serial.print("Got IP: "); Serial.println(WiFi.localIP());
 server.on("/", handle_OnConnect);
 server.onNotFound(handle_NotFound);
 server.begin();
 Serial.println("HTTP server started");
}
void loop() {

 server.handleClient();

}
void handle_OnConnect() {
Temperature = dht.readTemperature(); // Gets the values of the temperature
 Humidity = dht.readHumidity(); // Gets the values of the humidity
 server.send(200, "text/html", SendHTML(Temperature,Humidity));
}
void handle_NotFound(){
 server.send(404, "text/plain", "Not found");
}
String SendHTML(float Temperaturestat,float Humiditystat){
 String ptr = "<!DOCTYPE html> <html>\n";
 ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initialscale=1.0, user-scalable=no\">\n";
7
 ptr +="<title>ESP8266 Weather Report</title>\n";
 ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px
auto; text-align: center;}\n";
 ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
 ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
 ptr +="</style>\n";
 ptr +="</head>\n";
 ptr +="<body>\n";
 ptr +="<div id=\"webpage\">\n";
 ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";

 ptr +="<p>Temperature: ";
 ptr +=(int)Temperaturestat;
 ptr +="°C</p>";
 ptr +="<p>Humidity: ";
 ptr +=(int)Humiditystat;
 ptr +="%</p>";

 ptr +="</div>\n";
 ptr +="</body>\n";
 ptr +="</html>\n";
 return ptr;
}

اتصال به وب سرور :

بعد از آپلود کردن کد برنامه Monitor Serial را باز کرده و rate baud را بر روی 115200 تنظیم کنید .اگر همه مراحل به درستی انجام شده باشد IP ماژول NodeMCU( که به Point Access شما وصل شما وصل شده است ( به همراه پیغام started server HTTP نمایش داده می شود . سپس مرورگر خود را باز کنید و به آدرس IP نمایش داده شده بروید ماژول ESP8266 NodeMCU دما و رطوبت محیط را اندازه گیری کرده و در وب سرور خود نمایش داده می شود . با بارگذاری دوباره این صفحه)REFRESH )متوجه می شوید که هر بار مقادیر جدید اندازه گیری می شود .

توضیحات کدها :
 در این قسمت کتابخانه هایی که برای راه اندازی وای فای با استفاده ESP8266 ، راه اندازی وب
سرور درون ماژول NodeMCU و همچنین راه اندازی DHT11 به کد اضافه شده است
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
معرفی نوع سنسور DHT که از نوع DHT11 می باشد.
define DHTTYPE DHT11
تعریف متغیر های ssid و password برای دریافت اطالعات وای فای :
/*Put your SSID & Password*/
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password here
تعریف وب سرور بر روی پرت 80 که پرت HTTP می باشد .
ESP8266WebServer server(80);
نشان دهنده کدام پین از ماژول NodeMCU به سنسور DHT11 وصل شده است .
uint8_t DHTPin = D8;
تعریف سنسور DHT11 از آدرس و نوع آن(DHT11,D8)
DHT dht(DHTPin, DHTTYPE);
تعریف متغیر هایی برای نگه داری مقادری دما و رطوبت
float Temperature;
10
float Humidity;
متد Setup که همیشه پس از روشن شدن ماژول این متد یک بار اجرا خواهد شد :
void setup() {
تنظیم خروجی برای بانس ریت 115200); // 115200(begin.Serial
// تاخیر 100 میلی ثانیه ای ;(100(delay

تنظیم سنسور بر روی حالت اینپوت // ;(INPUT, DHTPin(pinMode
یعنی میتوانیم مقادیری را دریافت کنیم //
شروع به کار سنسور// ;()begin.dht
 Serial.println("Connecting to ");
 Serial.println(ssid); // چاپ ssid
اتصال به وای فای با اطالعات ورودی // ;(password, ssid(begin.WiFi
اگر نتواند وصل شد این حلقه ادامه پیدا میکند //
 while (WiFi.status() != WL_CONNECTED) {
 delay(1000);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected..!");
در صورت اتصال موفق ای پی نمایش داده میشود//
 Serial.print("Got IP: "); Serial.println(WiFi.localIP());
وب سرور با استفاده این متد اجرا می شود//
 server.on("/", handle_OnConnect);
در صورتی که درخواست ارسالی به سمت وب سرور یافت نشود این متد اجرامیشود
 server.onNotFound(handle_NotFound);
 server.begin();

 Serial.println("HTTP server started");
}
در صورت ارسالی درخواستی به ادرس روت وب سرور به عنوان مثال وقتی شما بر روی مرور گر خود ادرس 105.1.168.192 که مربوط به ماژول ما می باشد را درخواست میکنید این متد اجرا می شود این متد اطالعات دما و رطوب را از سنسور دریافت و به متد SendHtml که وظیفه ی تولید صفحه  html دارد میفرستد.
void handle_OnConnect() {
Temperature = dht.readTemperature(); // Gets the values of the temperature
 Humidity = dht.readHumidity(); // Gets the values of the humidity
 server.send(200, "text/html", SendHTML(Temperature,Humidity));
}
درصورتی که آدرس درخواستی یافت نشود پیغام "Found Not "به کاربر برگردانده می شود :
void handle_NotFound(){
 server.send(404, "text/plain", "Not found");
}
متد SendHtml که با استفاده از ورودی های دما و رطوبت html صفحه ی خروجی را تولید میکند
String SendHTML(float Temperaturestat,float Humiditystat){
 String ptr = "<!DOCTYPE html> <html>\n";
 ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initialscale=1.0, user-scalable=no\">\n";
 ptr +="<title>ESP8266 Weather Report</title>\n";
 ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px
auto; text-align: center;}\n";
 ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
 ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
 ptr +="</style>\n";
 ptr +="</head>\n";
 ptr +="<body>\n";
12
 ptr +="<div id=\"webpage\">\n";
 ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";

 ptr +="<p>Temperature: ";
 ptr +=(int)Temperaturestat;
 ptr +="°C</p>";
 ptr +="<p>Humidity: ";
 ptr +=(int)Humiditystat;
 ptr +="%</p>";

 ptr +="</div>\n";
 ptr +="</body>\n";
 ptr +="</html>\n";
 return ptr;
}

نوشته شده توسط مهران مظهر

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.