در این پروژه قصد داریم با استفاده از برد ESP32 و برد Wemos با تراشه ESP8266 مقادیر دما را از مبدا برد ESp32 به برد Wemos ارسال کنیم با استفاده از پروتکل ESP-NOW، در آموزش های قبلی تنها صحت کارکرد پروتگل را تست کردیم اما در این آموزش و آموزش های پیشرو انتقال دیتا های مختلفی را تست خواهیم کرد. همچنین در این پروژه مقادیر دما و رطوبت را از سنسور DHT22 به مقصد ارسال خواهیم کرد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
پروتکل ESP-Now
ESP-NOW یک پروتکل ارتباطی بی سیم است که توسط Espressif ساخته شده و دارای قابلیت انتقال پکت است. این پروتکل چندین دستگاه را قادر می سازد تا به روشی آسان با یکدیگر صحبت کنند و اطلاعات را بصورت بهینه بین یکدیگر انتقال دهند. این پروتکل مشابه اتصال بی سیم ۲٫۴GHz است، که اغلب در ماوس های بی سیم استفاده می شود. بنابراین، جفت شدن دستگاه ها قبل از برقراری ارتباط لازم است. این به این معنی است که پس از جفت شدن دستگاه ها با یکدیگر، اتصال پایدار است. به عبارت دیگر، اگر بطور ناگهانی یکی از ESP های شما قطع شود یا ریست شود، هنگام راه اندازی مجدد بطور خودکار اتصال برقرار می شود.
مزیت های پروتکل ESP-NOW
- انتقال داده تا ۲۵۰ بایت.
- بهره مندی از ارتباط رمزگذاره شده.
-
استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال داده.
محدودیت های پروتکل ESP-NOW:
- حدکثر محدوده ۲۵۰payload بایت.
- حداکثر پشتیبانی از ۱۰عدد SoftAP رمزگذاری شده.
- حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده ۲۰ عدد.
برد وای فای Wemos
برد Wemos یکی از پرطرافدار ترین برد هایی است که در زمینه iot مورد استفاده قرار میگیرد، یکی از مزیت های این برد نسبت به برد هایی مانند Node MCU اندازه کوچک آن می باشد تراشه وای فای مورد استفاده در این برد ESP8266 می باشد. از دیگر مزیت های این برد وجود شیلد های مختلفی برای این برد می باشد، که انجام هر پروژه ای را برای کاربر بسیار آسان و لذت بخش می کند، شیلد هایی از جمله شیلد باتری، multi sensor ، DHT22 ، رله ، oled تعداد بسیار زیادی شیلد برای این برد توسعه داده شده که در نتیجه تجربه خوبی از iot برای شما به جا خواهد گذاشت.
انتقال اطلاعات سنسور DHT22
سنسورها متنوعی برای سنجش دما و رطوبت طراحی و تولید شدهاند. هر کدام محدوده و حساسیت مختلفی دارند. سنسور DHT22 یکی از بهترین سنسورهای اندازه گیری دما و رطوبت هستند. این سنسورها از دو بخش رطوبت خازنی و یک مقاومت گرمایی تشکیل شدهاند. همچنین یک واحد مبدل آنالوگ به دیجیتال در DHT22 وجود دارد، که خروجی دیجیتال تولید میکند. به کمک این مبدل کاربر میتواند از آن در میکروکنترلرها از آن برای خواندن مقادیر استفاده کند.
برد nodemcu با تراشه ESP32
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
روش کار این پروژه
در پروژه پروژه انتقال اطلاعات سنسور DHT22 یکی از برد ها فرستنده و دیگری دریافت کننده خواهد بود، برد ESP32 مقادیر دما و رطوبت را با سنسور DHT22 بدست آورده و به از طریق پروتکل ESP-NOW به برد Wemos ارسال خواهد کرد.
وسایل مورد نیاز
برد ESP برپایه تراشه ESP8266 یا ESP32
نصب کتابخانه مرجع
در صورت دریافت هرگونه ارور مبنی بر عدم وجود کتابخانه espnow.h طبق مراحل زیر پیش بروید.
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه espnow را جستجو کنید.
- کتابخانه را نصب کنید.
برای نصب و اضافه کردن کتابخانه سنسور DHT مراحل زیر را طی کنید.
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه DHT sensor را جستجو کنید.
- کتابخانه را نصب کنید.
بدست آوردن مک آدرس ESP32
قبل از اینکه یاد بگیریم چطور این مک آدرس ها را بدست بیاوریم، بهتر است معنی و مفهوم مک آدرس را یاد بگیریم و در کل اصلا چرا وجود دارند! خب اگر قرار باشد دستگاهی به شبکه اینترنت متصل شود در کل دو آدرس به آن اختصاص داده خواهد، اول ip، که در مقام یک آدرس منطقی قرار دارد و در ادامه MAC address که در مقام آدرس فیزیکی برای دستگاه ما می باشد و عملا اثر انگشت دیوایس های هوشمند امروزی می باشد. در ضمن حروف MAC مخفف شده جمله Media Access Control می باشند. مک آدرس ها از ۴۸ بیت با ارقام هگزادسیمال تشکیل شده اند و با ساختاری به این شکل یافت می شوند xx:xx:xx:xx:xx:xx و هر xx معادل ۸بیت یا یک بایت می باشد. به تصویر زیر توجه کنید! ۲۴ بیت اول توسط شرکت سازنده کارت سبکه مشخص می شود و در ادامه ۲۴ بیت دوم تعداد دستگاه های قابل شماره گذاری را نشان می دهد.
برای برقراری ارتباط بین برد های 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 و پروتکل 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 با سنسور دما داشته باشیم و همه اطلاعات را به یک esp ارسال کنند
با سلام، بله امکان اجرای این مورد وجود دارد.
سلام
ممنون از اطلاعات مفیدی که در اختیارمون قرار میدید
میشه با همین پروتکل اطلاعات برای یک گوشی موبایل ارسال بشه؟؟
یا کتابخانه مخصوص به خودش را میخواد؟؟
با سلام، ممنون از توجه شما.
با استفاده از این پروتکل خیر، اما روش های مختلفی برای این مورد وجود دارد و امکان پذیر است.
سلام و وقت به خیر
آیا میتوان مثلا یک دستگاه پوز را به esp 32 با wifi متصل کرد , طوری که esp32 به دستگاه پوز به وصیله wifi اطلاعات بفرستد و بعد اطلاعاتی را دریافت کند؟
من از اعصای فعال سایت شما هستم و ممنون میشم پاسخ بدید
بسیار ممنون
با آرزوی موفقیت
با سلام
اطلاعی در این مورد نداریم.