اینترنت اشیا IOT برد Esp32 برد ESP8266

پروژه ESP-NOW با سناریو اتصال چند به یک توسط تراشه ESP8266

esonow-toway
نوشته شده توسط CiferTech

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

پروژه ESP-Now با دو عدد ماژول ESP8266 - دیجی اسپارک

 


پروتکل ESP-Now


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

پروتکل ESP-Now با برد ESP8266 - دیجی اسپارک

 

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

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

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

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

 


سناریو این پروژه


در پروژه ESP-Now از سناریوی یک Master و چند Slave استفاده خواهیم کرد. در این مورد یک ESP فرمان های مختلف یا یکسانی را برای دیگر ESP ها ارسال می کند، ایده به این صورت است که با این سناریو شما می توانید چند وسیله مختلف که در آن ESP وجود دارد را با یک ESP32 کنترل کنید.

 


پیش نیاز ها


برای راه‌اندازی این پروژه از ۰ تا ۱۰۰ نیاز به نصب کتابخانه و پیش نیاز هایی داریم، از جمله نصب کتابخانه مرجع برای پروتکل ESP-NOW نصب برد ESP در نرم‌افزار آردوینو و موارد دیگر که تمام این موارد در آموزش شروع کار و راه اندازی پروتکل ESP-NOW تبادل داده بین بردهای ESP32 ذکر شده است، برای مشاهده این موارد به آموزش ذکر شده مراجعه کنید.

 


شرح پروژه ESP-Now


در این پروژه ESP-Now در دو برد ESP8266 ورژن ۰۱ استفاده خواخیم کرد که در یک PCB شخصی سازی شده مونتاژ شده است، در یکی برد ها یا به عبارتی node های ما، یم نمایشگر oled نصب شده تا موارد دریافت شده را نمایش دهد و در برد دیگر یک سنسور DHT11 برای اندازه گیری دما و رطوبت قرار داده شده. به این ترتیب قادر خواهیم بود افزایش node ها دیتای بیشتری جمع آوری کنیم.

پروژه ESP-Now با بردهای ESP8266 اتصال چند به یک - دیجی اسپارک

 


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


  1. برد ESP برپایه تراشه ESP8266
  2. سنسور DHT11
  3. ۱۰k مقاومت
  4. نمایشگر Oled

 


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


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

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

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

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

 


PCB و اتصالات پروژه


به منظور برقراری اتصالات در این پروژه ESP-Now از یک PCB طراحی شده به کمک آلتیوم دیزاینر استفاده می‌کنیم. این مدار شامل اتصالات مورد نیاز برای ماژول های Oled و سنسور DHT11 همچنین ورودی تغذیه و خروجی سریال به منظور پروگرام کردن برد است. همچنین یک قطعه رله هم در این مدار وجود دارد که بدلیل ایرادی که در این ورژن PCB وجود دارد کارایی نخواهد داشت.

 


کد ESP ارسال کننده


گیرنده در پروژه ESP-Now می تواند هر فرستنده را با آدرس MAC منحصر به فرد خود شناسایی کند. با این حال، پردازش آدرس‌های MAC مختلف در سمت گیرنده برای تشخیص اینکه کدام برد کدام پیام را ارسال کرده می‌تواند کمی مشکل باشد. بنابراین، برای آسان‌تر کردن این فرآیند، هر برد ESP را با یک شماره یا id منحصر به فرد شناسایی می‌کنیم. برای مثال اگر در این پروژه از یک برد ارسال کننده استفاده می‌کنیم، که شماره آن ۱ خواهد بود و اگر برد دیگری اضافه شد به همین ترتیب به عدد شناسه اضافه می‌کنیم.
#include <ESP8266WiFi.h>
#include <espnow.h>

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

#define DHTPIN 1
DHT dht(DHTPIN, DHT11);

uint8_t broadcastAddress[] = {0xFC, 0xF5, 0xC4, 0x82, 0xCD, 0x49};
)
#define BOARD_ID 1

typedef struct struct_message {
    int id;
    int x;
    int y;
} struct_message;

struct_message myData;

unsigned long lastTime = 0;
unsigned long timerDelay = 10000;

void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("\r\nLast Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success");
  }
  else{
    Serial.println("Delivery fail");
  }
}
 
void setup() {
  Serial.begin(115200);

  dht.begin();
  
  //sensor_t sensor;
  //dht.temperature().getSensor(&sensor);
  //dht.humidity().getSensor(&sensor);
 
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  } 
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);

}
 
void loop() {

  //sensors_event_t event;
  //dht.temperature().getEvent(&event);
  //dht.humidity().getEvent(&event);

   float h = dht.readHumidity();    
   float t = dht.readTemperature();

  
  if ((millis() - lastTime) > timerDelay) {
    myData.id = BOARD_ID;
    myData.x = t;
    myData.y = h;

    esp_now_send(0, (uint8_t *) &myData, sizeof(myData));
    lastTime = millis();
  }
}

 

  • این بخش از کد مربوط به مک آدرس برد Master است که در تمام برد های Slave وارد شود.
uint8_t broadcastAddress[] = {0xFC, 0xF5, 0xC4, 0x82, 0xCD, 0x49};

 

  • در توضیحات به این مورد اشاره کردیم که در صورت افزایش برد های Slave یک ID برای هر برد مشخص می‌شود، در این خط از کد باید تغییرات مربوط را اعمال کنید. در واقع هربرد Slave یک ID مختص به خود داشته باشد.
#define BOARD_ID 1

 

  • این بخش مربوط به ساختار دیتا در شبکه ESP-NOW مورد استفاده ما است، گزینه اول مربوط به id مشخص برای هربرد و دو مورد دیگر برای ذخیر اطلاعات ما در پروژه ESP-Now است که در سناریو ما مربوط به مقادیر دما و رطوبت است.
typedef struct struct_message {
    int id;
    int x;
    int y;
}

 


کد ESP دریافت کننده


کد زیر را در برد ESP8266 خود آپلود کنید. کد برای دریافت داده ها از برد های مختلف آماده شده است. شما به راحتی می توانید کد را تغییر دهید تا داده ها را از تعداد دیگری از بردها دریافت کنید. در کد دریافت کننده یا Master نیازی به تعریف مک آدرس ها نداریم، در واقع مک آدرس این برد برای برد های ارسال کننده تنها معرفی می‌شود به دیگر نیازی به انجام فرآینده مشابه در این سمت نخواهیم داشت.

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

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);

typedef struct struct_message {
    int id;
    int x;
    int y;
} struct_message;

struct_message myData;

struct_message board1;
struct_message board2;

struct_message boardsStruct[2] = {board1, board2};

void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) {
  char macStr[18];
  Serial.print("Packet received from: ");
  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.println(macStr);
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
  // Update the structures with the new incoming data
  boardsStruct[myData.id-1].x = myData.x;
  boardsStruct[myData.id-1].y = myData.y;
  Serial.printf("x value: %d \n", boardsStruct[myData.id-1].x);
  Serial.printf("y value: %d \n", boardsStruct[myData.id-1].y);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);

  Wire.pins(0, 2);
  Wire.begin(0, 2);
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.clearDisplay();
  display.display();


  display.clearDisplay();
  display.setTextSize(1); 
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("CiferTech");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("IoT Node");
  display.display();     
  delay(100);

  display.startscrollright(0x00, 0x0F);
  delay(1000);
  display.stopscroll();
  delay(2000);
  
    
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  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(){
  
  int board1X = boardsStruct[0].x;
  int board1Y = boardsStruct[0].y;
  int board2X = boardsStruct[1].x;
  int board2Y = boardsStruct[1].y;
 
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,10);
  display.print("Temp: ");
  display.print(board1X);
  display.println(" C");

  
  display.print("Humi: ");
  display.print(board1Y);
  display.println(" %");
  display.setCursor(0,30);
  display.display();


  delay(500);
  
}

 


نتیجه نهایی


در نهایت پس آپلود هر دو کد معرفی شده در برد های ESP8266 اگر تمام موارد ذکر شده مربوط به تنظیمات پیش نیاز رعایت شده باشد. شاهد این خواهید بود که مقادیر در نمایشگر Oled نمایش داده می‌شود و یا در صورت نیاز می‌توانید مقادیر را در سریال مانیتور نرم‌افزار آردوینو چاپ کنید. در نهایت مقادیر توسط برد های Slave برای برد Master ما ارسال خواهند شد.

 

 


کلام آخر با سایفر


از پروژه هایی با محوریت ESP-NOW که به ما امکان ارسال دیتا بین برد های ESP را بدون دغدغه قرار می‌دهد، می‌توانیم در پروژه های مختلفی استفاده کنیم، مانند مانیتورینگ دما در محیط یک اتاق سرور یا در خانه های هوشمند و در هر سناریویی که قابلیت های ESP-NOW برای ما مفید باشد، امکان راه‌اندازی آن در کمترین زمان وجود دارد.
پروژه ESP-Now طراحی PCB انتقال اطلاعات - دیجی اسپارک

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

 

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

 

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

CiferTech

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

۵ دیدگاه

  • سلام خسته نباشید
    من چه تغییری در کدها بدهم که بشه چندین فرستنده با ماژول DHT11 به یک گیرنده متصل بشه و روی یک نمایشگر مقادیر را نمایش بده
    ( به مثال من چند سنسور حرارتی در یک موتورخانه دارم میخواهم از طریق اتصال به اکسس پونت که داخل موتورخانه نصب شده به یک گیرنده که داخل دفتر مدیریت مجموعه که به اکسس پونت که در یک شبکه هستند متصل شده و مقادیر لایو نمایش بده )

    • با سلام ممنونم، از کد های همین پروژه برای موردی که ذکر کردید می‌تونید استفاده کنید. فقط نیاز به تغییر کد ها در بعضی از قسمت ها دارید تا موارد مورد نظر را نمایش دهد.

  • با سلام و خسته نباشین خدمت اساتید محترم
    با توجه به اینکه بنده اشتراک یک ساله دیچی اسپارک رو تهیه کردم، پست زیر برام غیر فعال هستش و پیرو تماس هایی که خدمت پشتیبانی مجموعه داشتم. خواهشمندم در صورت امکان پست آموزشی مربوطه رو به ایمیل بنده ارسال بفرمایید

    پست مورد نظر:
    https://digispark.ir/create-cctv-camera-with-esp32-cam-record/

    با تشکر

  • سلام و خسته نباشید
    سپاس از آموزش هاتون یک سوالی که داشتم این بود که میشه یک ماژول رو به اینترنت متصل کرد و سایر ماژولها به این برد متصل شوند و دستورات رو از طریق اینترنت مثلا به ماژول شماره ۴ یا ۳ رسوند؟

    باز هم از وقتی که برای پاسخگویی میزارید ممنونم