اتصال ماژول وای‌فای ESP8266 به STM32 (ایجاد یک وب‌سرور)

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

زمانی که به تکنولوژی‌های آینده فکر می‌کنیم، نام دو موضوع حتما در میان پیش‌بینی‌های ما وجود خواهد داشت، هوش مصنوعی (AI) و اینترنت اشیا (IoT).

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

پروژه‌های زیادی را می‌توان با استفاده از این ماژول راه‌اندازی کرد که ما تا قبل از این آموزش برخی از آنها را به شما ارائه کرده‌ایم. مثلا چگونگی اتصال این ماژول  به میکروکنترلرهایی مانند PIC ،AVR و Arduino. یا پروژه‌ی سیستم مبتنی بر IoT برای کنترل آلودگی هوا، سیستم IoT برای ردیابی ماشین‌ها بر روی گوگل مپ، خانه‌ی هوشمند و … .

در این جلسه به سراغ آموزش چگونگی اتصال این ماژول به میکروکنترلر STM32 رفته‌ایم تا بتوانیم این میکرو را هم به اینترنت متصل کنیم.

به طور دقیق‌تر؛ می‌خواهیم ماژول ESP8266 را به بورد میکروکنترلر STM32 (بورد Blue pill) وصل کنیم و از این طریق، داده‌هایی را از میکروکنترلر به وب‌سروری که ایجاد کرده‌ایم ارسال کنیم.

تجهیزات مورد نیاز برای اجرای پروژه

  • بورد Blue Pill
  • ماژول وای‌فای ESP8266
  • لپ‌تاپ و یک شبکه‌ی قابل اتصال اینترنت

آشنایی بیشتر با ماژول ESP8266

بسیاری از افراد فعال در این حوزه، ESP8266 را به اختصار همان ماژول وای‌فای می‌نامند. اما اگر بخواهیم خیلی دقیق باشیم، این ماژول در حقیقت نوعی میکروکنترلر است. ESP8266 در واقع نام میکروکنترلری است که شرکت Espressif Systems در شانگهای ارائه کرده است. نکته‌ای که وجود دارد این است که این میکروکنترلر قادر است کارهایی که برای انجام شدن نیاز به اتصال به شبکه‌ی اینترنت را دارند را نیز انجام دهد، از همین رو به ماژول وای‌فای معروف شده است.

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

  1. پایه‌ی 0V) Gnd)
  2. پایه‌ی Transmit data bit X) Tx)
  3. پایه‌ی GPIO شماره ۲ (General-purpose input/output)
  4. پایه‌ی Chip power-down) CH_PD)؛ برای خاموش کردن ماژول
  5. پایه‌ی GPIO شماره صفر
  6. پایه‌ی RST (ریست)
  7. پایه‌ی Receive data bit X) Rx)
  8. پایه‌ی VCC (ولتاژ 3V)

برای ارتباط برقرار کردن با این ماژول باید از AT commandها استفاده کنیم. در جدول زیر تعدادی از پرکاربردترین‌ دستورات AT را می‌بینید.

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

نقشه مدار و اتصالات

در شماتیک زیر نحوه‌ی اتصال ماژول وای‌فای و بورد STM32 را می‌توانید ببینید.

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

شرح اتصالات پین‌ها را در این جدول می‌توانید ببینید.

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

میکروکنترلر SMT32F103C8 دارای سه مجموعه‌ی ارتباط سریال UART است. در تصاویر زیر پین‌های مربوط به آنها را می‌بینید.

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

ماژول وای‌فای هم برای ارتباط با میکروکنترلر از ارتباط سریال استفاده می‌کند. بنابراین در اینجا پایه‌های TX و RX ماژول ESP8266، به پورت سریال شماره ۲ از میکروکنترلر STM32 (PA2 و PA3) متصل می‌شوند.

توضیحات مربوط به کد و عملکرد پروژه

چگونگی عملکرد مدار حاصل شده از اتصال این دو ماژول به ‌یکدیگر، روال ساده‌ای دارد. مراحل کامل آن را می‌توانید در ویدئویی که در انتهای مطلب قرار دارد، ببینید. همچنین کد کامل پروژه نیز در ادامه‌ی مطلب قرار داده شده است.

مطلب پیشنهادی:  وقفه GPIO در میکروکنترلر LPC1768

برای نوشتن کد و آپلود کردن آن برای روی STM32، از Arduino IDE استفاده می‌کنیم.

قبل از شروع کدنویسی، ابتدا مدار را مطابق توضیحات گفته شده در بخش قبل کامل می‌بندیم. سپس کد را می‌نویسیم و آن را روی میکرو آپلود می‌کنیم. سپس مانیتور سریال را از مسیر «Tools -> Serial Monitor» باز می‌کنیم تا بتوانیم اتفاقاتی که در ضمن اجرای پروژه می‌افتند را دنبال کنیم. مثلا می‌بینید که در مانیتور سریال یک آدرس IP نمایش داده می‌شود. آن را کپی کنید و در مرورگر اینترنت سیستم paste کنید و اینتر را بزنید تا صفحه‌ باز شود. دقت کنید که باید لپ‌تاپ و ماژول ESP8266، هر دو به یک شبکه وای‌فای وصل شده باشند.

اجازه دهید به بخش‌های مهم کد بپردازیم.

ابتدا با استفاده از دو دستور زیر، یک ارتباط سریال را بین میکرو و ماژول برقرار می‌کنیم.

Serial.println(cmd);
Serial2.println(cmd);

توجه: پین سریال‌هایی که استفاده کرده‌ایم در اینجا متعلق به پورت شماره دو هستند. (PA2 و PA3) چون این پین‌ها تحمل ولتاژ ۳.۳ ولت را دارند.

سپس باید ماژول ESP8266 را آماده کنیم. برای این کار باید APهایی که از قبل به آن متصل هستند را پاک کنیم (آن را ریست کنیم) و مود وای‌فای را روی AP & STA قرار ‌دهیم.

connect_wifi("AT",100);  //Sends AT command with time(Command for Acknowledgement)
connect_wifi("AT+CWMODE=3",100);   //Sends AT command with time (For setting mode of Wi-Fi)
connect_wifi("AT+CWQAP",100);  //Sends AT command with time (for Quit AP)
connect_wifi("AT+RST",5000);   //Sends AT command with time (For RESETTING WIFI)

در مرحله‌ی بعد ESP8266 را به شبکه وای‌فای وصل می‌کنیم. برای وارد کردن جزییات اتصال مانند دستور زیر عمل می‌کنیم.

connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000);  //provide your WiFi username and password here

در بخش بعد آدرس IP ماژول را به دست آورده و آن را به ترتیب زیر بر روی مانیتور سریال نمایش می‌دهیم.

Serial2.println("AT+CIFSR");           //GET IP AT COMMAND
if(Serial2.find("STAIP,"))                 //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266
Serial.print(IP);                                //prints IP address in Serial monitor

سپس باید یک کد HTML برای webpage که می‌خواهیم باز کنیم بنویسیم. برای تبدیل کد HTML به کد آردوینو، از این لینک می‌توانید کمک بگیرید.

webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; //This is the heading line with black font colour

String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>";
String data="<p>Data Received Successfully.....</p>";     //These two lines are of two paragraph
webpage = "<a href=\"http://circuitdigest.com/\"";
webpage+="\">Click Here to get into circuitdigest.com</a>"; //At last we insert the hyperlink to link the website address

در بخش تابع ()send، از sendwebdata استفاده می‌کنیم تا پیغامی را که می‌خواهیم به کمک آن نمایش دهیم و از دستور AT+CIPCLOSE=0 نیز برای پایان دادن به اتصال سرور استفاده می‌کنیم.

void Send()            //This function contains data to be sent to local server
{
      webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>";
      sendwebdata(webpage);
      webpage=name;
      sendwebdata(webpage);
      delay(1000);
      webpage = "<a href=\"http://circuitdigest.com/\"";
      webpage+="\">Click Here to get into circuitdigest.com</a>";
      webpage+=data;
      sendwebdata(webpage);
      Serial2.println("AT+CIPCLOSE=0");             //Closes the server connection
}

پس از انجام تمام مراحل و آپلود کردن کد بر روی میکرو، اگر IP ماژول را در هر مرورگری جستجو کنیم، می‌توانیم عملکرد پروژه را بررسی کنیم. کافیست بر روی لینک Click Here to get into circuitdigest.com در پنجره‌ای که مانند تصویر زیر باز می‌شود کلیک کنیم.

مطلب پیشنهادی:  معرفی معماری RISC در پردازنده های ARM

اتصال ماژول وای‌فای ESP8266 به میکروکنترلر STM32F103C8 (ایجاد یک وب‌سرور)

با کلیک بر روی لینک، این پیغام را خواهید دید. «….Data Received Successfully»

کد کامل پروژه و ویدئوی انجام پروژه را در ادامه می‌توانید ببینید.

کد

//Interfacing ESP8266 Wi-Fi with STM32F103C8
//CIRCUIT DIGEST
//NOTE: Serial is serial monitor with baud rate(9600)
//NOTE: Serial2 (TX2, RX2)is connected with ESP8266(RX,TX)respectively with baud rate (9600)

String webpage="";                                   //String variable to store characters
int i=0,k=0,x=0;                                         //integer variables
String readString;                                   //using readString feature to read characters                       

boolean No_IP=false;                                 //boolean variables 
String IP="";                                         //String variable to store data
char temp1='0';                                      //character variable

String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>";   //String with html notations
String data="<p>Data Received Successfully.....</p>";     //String with html 
     
void check4IP(int t1)                                     //A function to check ip of ESP8266 
{
  int t2=millis();
  while(t2+t1>millis())
  {
    while(Serial2.available()>0)
    {
      if(Serial2.find("WIFI GOT IP"))
      {
        No_IP=true;
      }
    }
  }
}

void get_ip()                                           //After cheacking ip ,this is a function to get IP address
{
  IP="";
  char ch=0;
  while(1)
  {
    Serial2.println("AT+CIFSR");                   //GET IP AT COMMAND
    while(Serial2.available()>0)        
    {
      if(Serial2.find("STAIP,"))                   //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266
      {
        delay(1000);
        Serial.print("IP Address:");
        while(Serial2.available()>0)
        {
          ch=Serial2.read();                      //Serial2 reads from ESP8266
          if(ch=='+')
          break;
          IP+=ch;
        }
      }
      if(ch=='+')
      break;
    }
    if(ch=='+')
    break;
    delay(1000);
  }
  Serial.print(IP);                                //prints IP address in Serial monitor
  Serial.print("Port:");
  Serial.println(80);
}

void connect_wifi(String cmd, int t)                  //This function is for connecting ESP8266 with wifi network by using AT commands
{
  int temp=0,i=0;
  while(1)
  {
    Serial.println(cmd);                  //Sends to serial monitor
    Serial2.println(cmd);                 //sends to ESP8266 via serial communication
    while(Serial2.available())
    {
      if(Serial2.find("OK"))
      i=8;
    }
    delay(t);
    if(i>5)
    break;
    i++;
  }
  if(i==8)
  Serial.println("OK");
  else
  Serial.println("Error");
}

void wifi_init()                                //This function contains AT commands that passes to connect_wifi()
{
      connect_wifi("AT",100);                   //Sends AT command with time(Command for Achknowledgement)
      connect_wifi("AT+CWMODE=3",100);          //Sends AT command with time (For setting mode of Wifi)
      connect_wifi("AT+CWQAP",100);            //Sends AT command with time (for Quit AP)
      connect_wifi("AT+RST",5000);             //Sends AT command with time (For RESETTING WIFI)
      check4IP(5000);
      if(!No_IP)
      {
        
        Serial.println("Connecting Wifi....");
        connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000);         //provide your WiFi username and password here
   
      }
      else
        {
        }
      Serial.println("Wifi Connected"); 
      get_ip();
      
      connect_wifi("AT+CIPMUX=1",100);                          //Sends AT command with time (For creating multiple connections)
      connect_wifi("AT+CIPSERVER=1,80",100);                    //Sends AT command with time (For setting up server with port 80)
}

void sendwebdata(String webPage)                          //This function is used to send webpage datas to the localserver
{
    int ii=0;
     while(1)
     {
      unsigned int l=webPage.length();
      Serial.print("AT+CIPSEND=0,");
      Serial2.print("AT+CIPSEND=0,");
      Serial.println(l+2);
      Serial2.println(l+2);
      delay(100);
      Serial.println(webPage);                        //sends webpage data to serial monitor
      Serial2.println(webPage);                       //sends webpage data to serial2 ESP8266
      while(Serial2.available())
      {
       
        if(Serial2.find("OK"))
        {
          ii=11;
          break;
        }
      }
      if(ii==11)
      break;
      delay(100);
     }
}

void setup() 
{
   Serial.begin(9600);                //begins serial monitor with baud rate 9600
   Serial2.begin(9600);               //begins serial communication with esp8266 with baud rate 9600 (Change according to your esp8266 module)
   wifi_init();
   Serial.println("System Ready..");
}

void loop() 
{
  k=0;
  Serial.println("Please Refresh your Page");
  while(k<1000)
  {
    k++;
   while(Serial2.available())
   {
    if(Serial2.find("0,CONNECT"))
    {
      Serial.println("Start Printing");
      Send();
      Serial.println("Done Printing");
      delay(1000);
    }
  }
  delay(1);
 }
}

void Send()                                        //This function contains data to be sent to local server
{
      webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>";
      sendwebdata(webpage);
      webpage=name;
      sendwebdata(webpage);
      delay(1000);
      webpage = "<a href=\"https://melec.ir/\"";
      webpage+="\">Click Here to get into circuitdigest.com</a>";
      webpage+=data;
      sendwebdata(webpage);
      Serial2.println("AT+CIPCLOSE=0");                  //Closes the server connection
}

ویدئو

مطلب پیشنهادی:  آموزش راه اندازی ADC در STM32 (اندازه‌گیری ولتاژ آنالوگ)

امیدواریم آموزش «اتصال ماژول وای‌فای ESP8266 به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد می‌کنیم دیگر آموزش‌های STM32 را نیز مطالعه کنید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

3 دیدگاه

  1. برای پروژه های صنعتی و تجاری هم از idleردوینو استفاده میکنید؟
    چه برای پروگرم استم و چه esp?

  2. سلام خسته نباشید واقعا از آموزش خوبتون ممنون و سپاسگزارم
    مهندس عزیز اگر به جای STM32 از ATMEGA 8 استفاده کنیم توی برنامه
    چه تغییراتی باید اعمال بشه ممنون از پاسختون

  3. محمود میرجانی

    سلام خسته نباشید بنده 58 سال سن دارم و عاشق سایتتون هستم دست مریزاد که بدون چشمداشت به جوونای این مرز و بوم خدمت میکنید موفق و تندرست باشید.