آموزش‌های کاربردیاینترنت اشیاء (IOT)بایگانی مطالبپروژه‌های ESP32

شروع کار با ESP-NOW

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


پروتکل ESP-NOW چیست و چه کاربردی دارد؟

ESP-NOW یک پروتکل ارتباطی بیسیم و کم مصرف است که قادر به برقراری ارتباط میان ماژول های ESP است. این پروتکل توسط Espressif ساخته و توسعه یافته است و می تواند بین چندین دستگاه بدون استفاده از شبکه Wi-Fi ساخته شده توسط روتر ارتباط برقرار کند. این پروتکل یک شبکه بسیار ویژه، با سرعت بالا و قابل اعتماد است که برای اتوماسیون مسکونی و صنعتی مناسب است. در این پروتکل ابتدا باید دستگاه ها با یکدیگر جفت شوند. پس از آن ارتباط به صورت پایدار برقرار خواهد شد.

ESP-NOW

سناریوهای مختلف توسط پروتکل ESP-NOW

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

  1. یک بورد اطلاعات را به بورد دیگر ارسال می کند. پیکربندی این سناریو بسیار آسان است و برای ارسال اطلاعات از یک بورد به بورد دیگر مانند خواندن مقادیر سنسورها یا دستورات ON و OFF برای کنترل GPIO بسیار عالی عمل می کند.ESP-NOW

  2. در این سناریو یک بورد ESP32 دستورات یکسان یا متفاوتی را به بوردهای مختلف ESP32 ارسال می کند. این پیکربندی برای مواردی چون کنترل از راه دور ایده آل است. شما می توانید چندین ماژول ESP32 در اطراف خانه داشته باشید که توسط یک بورد اصلی ESP32 کنترل می شوند.ESP-NOW

  3. اگر می خواهید داده ها را از چندین گره حسگر در یک بورد ESP32 جمع آوری کنید، این پیکربندی ایده آل است. این سناریو می تواند به عنوان یک وب سرور پیکربندی شود و داده های سایر بوردها را نمایش دهد.ESP-NOW

  4. با ESP-NOW ، هر بورد می تواند همزمان فرستنده و گیرنده باشد. بنابراین، می توان بین ماژول ها ارتباط دو طرفه برقرار کرد. به عنوان مثال، می توانید دو ماژول ارتباطی با یکدیگر داشته باشید.ESP-NOW

  5. می توان بورد های بیشتری به سناریو 4 اضافه کرد و چیزی شبیه شبکه داشت.
    (همه بوردهای ESP32 با یکدیگر ارتباط برقرار می کنند)ESP-NOW

مزیت ها 

  • انتقال داده تا 250 بایت.

  • بهره مندی از ارتباط رمزگذاره شده.

  • استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال اطلاعات.

محدودیت ها 

  • حداکثر محدوده 250 بایت.

  • پشتیبانی حداکثر از 10 عدد اکسس پوینت رمزگذاری شده.

  • حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده 20 عدد.

کنترل لوازم روشنایی از هر شبکه


شروع پروژه

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

#include "WiFi.h"

void setup(){
  Serial.begin(115200);
WiFi.mode(WIFI_MODE_STA);
Serial.println(WiFi.macAddress());
}

void loop(){

}

خروجی این کد به شکل زیر خواهد بود و خط آخر مک آدرس ماژول را نشان می دهد:


آپلود کد های مربوط به Master

برای شروع این پروژه، ابتدا بایدکتابخانه های لازم را در Arduino IDE نصب کنیم. کتابخانه های مورد نیاز در این آموزش <esp_now.h> و <WiFi.h> می باشند. در این مقاله سناریو اول پیاده سازی می شود. ماژول ESP32 اول در نقش Master می باشد. چنانچه بخواهیم سناریو دوم را اجرا کنیم، لازم است به تعداد دستگاه های Slave افزوده شود، بنابراین در قسمت مک آدرس دستگاه های دریافت کننده، مک آدرس هر تعداد Slave مورد استفاده را می افزاییم. همچنین در قسمت register peer و void loop برنامه را برای هر تعداد Slave ویرایش می کنیم. کد مربوط به این سناریو در سمت Master به صورت زیر می باشد.

#include <esp_now.h>
#include <WiFi.h>

// REPLACE WITH YOUR ESP RECEIVER'S MAC ADDRESS
uint8_t broadcastAddress1[] = {0xFC, 0xF5,0xC4,0x56,0x03,0xDC};

typedef struct test_struct {
int x;
int y;
} test_struct;

test_struct test;

// callback when data is sent
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);

WiFi.mode(WIFI_STA);

if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}

esp_now_register_send_cb(OnDataSent);

// register peer
esp_now_peer_info_t peerInfo;
peerInfo.channel = 0;
peerInfo.encrypt = false;
// register first peer
memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}

}


void loop() {
test.x = random(0,20);
test.y = random(0,20);
Serial.print("x: ");
Serial.println(test.x);
Serial.print("y: ");
Serial.println(test.y);
Serial.println();
esp_err_t result = esp_now_send(0, (uint8_t *) &test, sizeof(test_struct));

if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
delay(5000);
}

در این کد یک مقدار x و y تصادفی بین صفر و 20 به صورت رندوم به ماژول دریافت کننده ارسال می شود. همچنین این داده می تواند مقادیر خوانده شده توسط سنسورها باشد. پارامترهایی که باید در ESP32 ارسال کننده وجود داشته باشد:

  • مقدار دهی اولیه ESP-NOW.

  • ارسال اطلاعات به دریافت کننده.

  • اضافه کردن دستگاه دریافت کننده با استفاده از مک آدرس.

  • استفاده از تابع callback که به ما اطلاع می دهد پیام ارسال شده یا مشکلی در مسیر ارسال پیش آمده.


آپلود کد های مربوط به Slave

#include <esp_now.h>
#include <WiFi.h>

//Structure example to receive data
//Must match the sender structure
typedef struct test_struct {
int x;
int y;
} test_struct;

//Create a struct_message called myData
test_struct myData;

//callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("x: ");
Serial.println(myData.x);
Serial.print("y: ");
Serial.println(myData.y);
Serial.println();
}

void setup() {
//Initialize Serial Monitor
Serial.begin(115200);

//Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

//Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}

// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_register_recv_cb(OnDataRecv);
}

void loop() {

}

خروجی این کد بصورت شکل زیر است:


پارامتر هایی که باید در ESP32 دریافت کننده وجود داشته باشد:

  • مقدار دهی اولیه ESP-NOW.

  • ذخیره پیام های دریافتی با تابع callback.

  • استفاده از تابع callback برای ثبت پیام های دریافتی.

آموزش فوق العاده ساخت دوربین امنیتی با ماژول ESP32-CAM از دست ندهید. 

آموزش ساخت دوربین امنیتی با ESP32-CAM


این مقاله چطور بود ؟
+1
67
+1
90
+1
4
مشاهده بیشتر

پریسا اکبری

کارشناس برق- قدرت و کارشناس ارشد کنترل. علاقه مند به سیستم های هوشمند و اینترنت اشیا. به مدت بیش از 1 سال است که در تیم سخت افزار سازان نام آور مشغول به فعالیت هستم.

نوشته های مشابه

3 دیدگاه

    1. سلام محمدرضا عزیز .
      اصولا استفاده از ESP32-CAM برای عکس یا فیلم گرفتن و مشاهده آن در مرورگر به وسیله آی پی یا فرستادن به ایمیل و …. است اما اینکه شما بخواین عکس رو به یک ESP32 دیگه بفرستین مورد آزمایش ما قرار نگرفته اما چالشی که با اون قطعا مواجه میشید تبدیل نوع یا به عبارتی انجام عمل cast روی دیتا هست و ممکنه دیتا رو(عکس) به صورت واضح یا کامل دریافت نکنین و بایت هایی از دیتا از دست بره با این حال شاید لینک زیر به شما کمک کنه.
      https://forum.arduino.cc/t/transfer-pictures-from-esp32-cam-to-esp32-via-serial/647488/16

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

دکمه بازگشت به بالا