اینترنت اشیا IOT برد Esp32 برد ESP8266 برد ویموس Wemos خانه هوشمند

پروژه انتقال اطلاعات سنسور DHT22 با برد ESP32 و پروتکل ESP-NOW

نوشته شده توسط CiferTech

در این پروژه قصد داریم با استفاده از برد ESP32  و برد Wemos با تراشه ESP8266 مقادیر دما را از مبدا برد ESp32 به برد Wemos ارسال کنیم با استفاده از پروتکل ESP-NOW، در آموزش های قبلی تنها صحت کارکرد پروتگل را تست کردیم اما در این آموزش و آموزش های پیش‌رو انتقال دیتا های مختلفی را تست خواهیم کرد. همچنین در این پروژه مقادیر دما و رطوبت را از سنسور DHT22 به مقصد ارسال خواهیم کرد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


پروتکل ESP-Now


ESP-NOW یک پروتکل ارتباطی بی سیم است که توسط Espressif ساخته شده و دارای قابلیت انتقال پکت است. این پروتکل چندین دستگاه را قادر می سازد تا به روشی آسان با یکدیگر صحبت کنند و اطلاعات را بصورت بهینه بین یکدیگر انتقال دهند. این  پروتکل مشابه اتصال بی سیم ۲٫۴GHz است، که اغلب در ماوس های بی سیم استفاده می شود. بنابراین، جفت شدن دستگاه ها قبل از برقراری ارتباط لازم است. این به این معنی است که پس از جفت شدن دستگاه ها با یکدیگر، اتصال پایدار است. به عبارت دیگر، اگر بطور ناگهانی یکی از ESP های شما قطع شود یا ریست شود، هنگام راه اندازی مجدد بطور خودکار اتصال برقرار می شود.

سنسور DHT22 برد ESP32 و انتقال با پروتکل ESP-Now - دیجی اسپارک

مزیت های پروتکل ESP-NOW

  • انتقال داده تا ۲۵۰ بایت.
  • بهره مندی از ارتباط رمزگذاره شده.
  • استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال داده.

 

محدودیت های پروتکل ESP-NOW:

  • حدکثر محدوده ۲۵۰payload بایت.
  • حداکثر پشتیبانی از ۱۰عدد SoftAP رمزگذاری شده.
  • حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده ۲۰ عدد.

 


برد وای فای Wemos


برد Wemos یکی از پرطرافدار ترین برد هایی است که در زمینه iot مورد استفاده قرار میگیرد، یکی از مزیت های این برد نسبت به برد هایی مانند Node MCU اندازه کوچک آن می باشد تراشه وای فای مورد استفاده در این برد ESP8266 می باشد. از دیگر مزیت های این برد وجود شیلد های مختلفی برای این برد می باشد، که انجام هر پروژه ای را برای کاربر بسیار آسان و لذت بخش می کند، شیلد هایی از جمله شیلد باتری، multi sensor ، DHT22 ، رله ، oled تعداد بسیار زیادی شیلد برای این برد توسعه داده شده که در نتیجه تجربه خوبی از iot برای شما به جا خواهد گذاشت.

برد ویموس با تراشه ESP8266 - دیجی اسپارک

 


انتقال اطلاعات سنسور DHT22


سنسورها متنوعی برای سنجش دما و رطوبت طراحی و تولید شده‌اند. هر کدام محدوده و حساسیت مختلفی دارند. سنسور DHT22 یکی از بهترین سنسورهای اندازه گیری دما و رطوبت هستند. این سنسورها از دو بخش رطوبت خازنی و یک مقاومت گرمایی تشکیل شده‌اند. همچنین یک واحد مبدل آنالوگ به دیجیتال در DHT22 وجود دارد، که خروجی دیجیتال تولید می‌کند. به کمک این مبدل کاربر می‌تواند از آن در میکروکنترلرها از آن برای خواندن مقادیر استفاده کند.

سنسور DHT22 با برد ESP32 - دیجی اسپارک

 


برد nodemcu با تراشه ESP32


ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوت‌های آن بلوتوث داخلی‌اش می‌باشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC می‌باشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی می‌باشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیق‌تر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته می‌شود.

برد nodemcu با تراشه ESP32 - دیجی اسپارک

 


روش کار این پروژه


در پروژه پروژه انتقال اطلاعات سنسور DHT22 یکی از برد ها فرستنده و دیگری دریافت کننده خواهد بود، برد ESP32 مقادیر دما و رطوبت را با سنسور DHT22 بدست آورده و به از طریق پروتکل ESP-NOW به برد Wemos ارسال خواهد کرد.

ارسال اطلاعات DHT22 با برد ESP32 - دیجی اسپارک

 


وسایل مورد نیاز


برد wemos

برد ESP برپایه تراشه ESP8266 یا ESP32

سنسور DHT22

۱۰k مقاومت

 


نصب کتابخانه مرجع


در صورت دریافت هرگونه ارور مبنی بر عدم وجود کتابخانه espnow.h طبق مراحل زیر پیش بروید.

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه espnow را جستجو کنید.
  3. کتابخانه را نصب کنید.

 

برای نصب و اضافه کردن کتابخانه سنسور DHT مراحل زیر را طی کنید.

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه DHT sensor را جستجو کنید.
  3. کتابخانه را نصب کنید.

وب سرور ESP32: مانیتورینگ دما با سنسور DHT22

 


بدست آوردن مک آدرس ESP32


قبل از اینکه یاد بگیریم چطور این مک آدرس ها را بدست بیاوریم، بهتر است معنی و مفهوم مک آدرس را یاد بگیریم و در کل اصلا چرا وجود دارند! خب اگر قرار باشد دستگاهی به شبکه اینترنت متصل شود در کل دو آدرس به آن اختصاص داده خواهد، اول ip، که در مقام یک آدرس منطقی قرار دارد و در ادامه MAC address که در مقام آدرس فیزیکی برای دستگاه ما می باشد و عملا اثر انگشت دیوایس های هوشمند امروزی می باشد. در ضمن حروف MAC مخفف شده جمله Media Access Control می باشند. مک آدرس ها از ۴۸ بیت با ارقام هگزادسیمال تشکیل شده اند و با ساختاری به این شکل یافت می شوند xx:xx:xx:xx:xx:xx و هر xx معادل ۸بیت یا یک بایت می باشد. به تصویر زیر توجه کنید! ۲۴ بیت اول توسط شرکت سازنده کارت سبکه مشخص می شود و در  ادامه ۲۴ بیت دوم تعداد دستگاه های قابل شماره گذاری را نشان می دهد.

بدست آوردن مک آدرس برد ESP32 - دیجی اسپارک

برای برقراری ارتباط بین برد های ESP32 باید مک آدرس آن ها را بدانیم، زیرا در پروسه انتقال اطلاعات و یا جفت شدن هر برد اقدام بررسی هویت برد دیگر می کند. و هر ESP32 دارای مک آدرس خاص خود می باشد تا با این صورت تایید هویت شود. برای بدست آوردن این مک آدرس کد زیر را در ESP32 خود آپلود کنید.

#include "WiFi.h"
 
void setup(){
  Serial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  Serial.println(WiFi.macAddress());
}
 
void loop(){
 
}

 پس از آپلود کد، در سریال مانیتور Arduino IDE می توانید مک آدرس خود را مشاهده کنید. مک آدرس را ذخیره کنید زیرا در پروژه اصلی به آن نیاز داریم.

 


کد مرجع و شماتیک برای تحلیل دما و ارسال


در کد فرستنده باید مک آدرس بدست آمده از ESP دریافت کننده را در بخش مربوط به صورت هگز مشخص کنیم.

uint8_t broadcastAddress1[] = {0xBC,0xDD,0xC2,0xB3,0xC4,0xC2};

 

کد و شماتیک کامل بخش تحلیل دما و ارسال دیتا

اتصالات سنسور DHT22 به برد ESP32 - دیجی اسپارک

 

اتصالات سنسور DHT22 به برد ESP32 - دیجی اسپارک

 

پروژه انتقال اطلاعات سنسور DHT22 با برد ESP32 و پروتکل ESP-NOW

#include <esp_now.h>
#include <WiFi.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 2
#define DHTTYPE    DHT22

DHT_Unified dht(DHTPIN, DHTTYPE);

uint8_t broadcastAddress1[] = {0xBC,0xDD,0xC2,0xB3,0xC4,0xC2};
.
typedef struct temp_struct {
  float x;
  float y;
} temp_struct;

temp_struct test;

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  Serial.print("Packet to: ");
  // Copies the sender mac address to a string
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print(macStr);
  Serial.print(" send status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
 
void setup() {
  Serial.begin(115200);

  dht.begin();
 
  WiFi.mode(WIFI_STA);

  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  dht.humidity().getSensor(&sensor);
 
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  esp_now_register_send_cb(OnDataSent);
   
  esp_now_peer_info_t peerInfo;
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 
void loop() {

  sensors_event_t event;
  
  dht.temperature().getEvent(&event);
    test.x = event.temperature;


    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));

  dht.humidity().getEvent(&event);
     test.y = event.relative_humidity;

    Serial.print(F("Humidity: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
   
  esp_err_t result = esp_now_send(0, (uint8_t *) &test, sizeof(temp_struct));
   
  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(2000);
}

 


کد مرجع برای برد ESP8266 و دریافت دیتا


از این کد برای تحلیل دیتای دریافتی استفاده خواهیم کرد، تنطیمات منوی Tools را بر روی برد مورد نظر خود قرار داده و کد را آپلود کنید.

#include <ESP8266WiFi.h>
#include <espnow.h>

typedef struct temp_struct {
  float x;
  float y;
} temp_struct;

temp_struct myData;

void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Temperature: ");
  Serial.println(myData.x);
  Serial.print("Humidity: ");
  Serial.println(myData.y);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {

}

 


 جمع بندی


در این آموزش شما یاد گرفته اید که چگونه داده ها را با استفاده از ESP NOW به چندین صفحه ESP32 یا ESP8266 از یک ESP32 ارسال کنید. در این پروژه دیتا ارسال شده مربوط به مقادیر دریافتی از یک سنسور DHT22 بود که تحلیل و از طریق برد ESP32 ارسال شد.

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۴ دیدگاه

  • با سلام ایا میشه ک ارسال کننده های دما رو زیاد کرد یعنی ما ۳ یا ۴ عدد esp با سنسور دما داشته باشیم و همه اطلاعات را به یک esp ارسال کنند

  • سلام
    ممنون از اطلاعات مفیدی که در اختیارمون قرار میدید
    میشه با همین پروتکل اطلاعات برای یک گوشی موبایل ارسال بشه؟؟
    یا کتابخانه مخصوص به خودش را میخواد؟؟

    • با سلام، ممنون از توجه شما.
      با استفاده از این پروتکل خیر، اما روش های مختلفی برای این مورد وجود دارد و امکان پذیر است.