• Interfacing ESP8266 with PIC16F877A Microcontroller

QC

Interfacing ESP8266 with PIC16F877A Microcontroller

 

Trong bài viết này, chúng ta hãy thảo luận về cách giao tiếp mô-đun WIFI ESP8266 với vi điều khiển PIC. Cho đến nay, bạn có thể đang sử dụng mô-đun ESP8266 như một bộ vi điều khiển độc lập hoặc có thể đã sử dụng nó với thư viện Arduino. Tuy nhiên, khi nói đến các dự án hệ thống nhúng nặng, chúng ta cũng nên biết cách sử dụng nó với vi điều khiển PIC. Điều này sẽ giúp bạn tùy chỉnh các dự án của mình trong quan điểm thiết kế và đồng thời cũng làm cho nó rẻ.


Các mô-đun ESP8266 đi kèm với một phần sụn mặc định được tải vào nó, do đó chúng tôi có thể lập trình mô-đun bằng các lệnh AT. Các lệnh này phải được gửi qua một kênh liên lạc nối tiếp. Kênh này được thiết lập giữa PIC và mô-đun ESP8266 bằng cách sử dụng mô-đun USART trong vi điều khiển PIC. Toàn bộ quá trình làm việc sẽ được theo dõi và báo cáo cho người dùng bằng màn hình LCD 16x2. Do đó, hướng dẫn này giả định rằng bạn có một số kiến ​​thức cơ bản về mô-đun USART trong PIC, Giao diện LCD với PIC và sử dụng lệnh AT trong ESP8266. Nếu không, bạn có thể quay lại các hướng dẫn được liên kết để tìm hiểu chúng trước.

Materials Required:

You would need the following hardware to complete this tutorial

  1. PIC16F877A
  2. 20MHz crystal oscillator
  3. 7805
  4. LM317
  5. ESP8266
  6. 16*2 LCD display
  7. PicKit3 programmer
  8. Resistors (1K,220ohm,360ohm)
  9. Capacitors (1uF, 0.1uF, 33pF)
  10. Jumper wires
  11. 12V Adapter to power the PIC and ESP module

Hardware:

Sơ đồ hoàn chỉnh của dự án được hiển thị ở đây bên dưới



Các sơ đồ bao gồm hai mạch điều chỉnh điện áp, một là mạch điều chỉnh + 5V được sử dụng để cấp nguồn cho vi điều khiển PIC và mạch còn lại là mạch điều chỉnh 3.3V cấp nguồn cho mô-đun ESP8266. + 5V được điều chỉnh bằng cách sử dụng 7805 (IC điều chỉnh điện áp tuyến tính). 3.3V được điều chỉnh bằng cách sử dụng LM317 (Bộ điều chỉnh điện áp biến đổi). Mô-đun ESP8266 tiêu thụ rất nhiều dòng điện (~ 800mA) do đó nếu bạn đang thiết kế bộ nguồn của riêng mình, hãy đảm bảo rằng nó có thể tạo ra dòng điện cao như vậy. Đồng thời đảm bảo rằng các chân nối đất của PIC và mô-đun ESP8266 được kết nối với nhau.


Vì vậy, bây giờ chúng ta biết rằng PIC hoạt động trên + 5V và ESP8266 hoạt động ở 3,3V volt. Để thiết lập giao tiếp USART giữa hai module này, chúng ta cần có một mạch chuyển đổi logic 5V - 3.3V như hình trên. Mạch này không có gì khác ngoài một bộ chia tiềm năng chỉ đơn giản là chuyển đổi nguồn + 5V thành 3,3V. Điều này sẽ ngăn chân RX có thể chịu được 3.3V của ESP8266 nhận được + 5V.


Tôi đã tạo các mô-đun PIC và ESP trên hai bảng hiệu suất riêng biệt, như được hiển thị trong các hướng dẫn này. Bằng cách này, tôi có thể sử dụng chúng trên toàn cầu cho nhiều dự án tương tự hơn


Phần cứng LED sử dụng PIC

Bắt đầu với ESP8266

Bạn có thể làm theo cách tương tự, hoặc xây dựng bảng mạch của riêng bạn theo phong cách của bạn hoặc chỉ cần kết nối mạch trên với bảng mạch.

Lập trình vi điều khiển PIC:

Để lập trình vi điều khiển PIC gửi “lệnh AT” nối tiếp bằng USART đến mô-đun ESP8266, chúng ta phải sử dụng một thư viện. Thư viện này sẽ giúp bạn tiết kiệm rất nhiều rắc rối, chẳng hạn như sử dụng mô-đun lệnh ESP8266 để kiểm tra từng lệnh AT và sau đó tìm cách truyền chúng đến mô-đun ESP. Thư viện này là phần mềm miễn phí ban đầu được phát triển bởi Camil Staps và sau đó nó đã được Circuit Digest cải tiến và sửa đổi để có thể sử dụng với Vi điều khiển PIC16F877A của chúng tôi. Bạn có thể tải về tại đây


Thư viện vẫn đang được phát triển, nhưng bạn có thể sử dụng hầu hết các lệnh AT quan trọng trong phần sụn ESP8266. Nếu bạn thấy thiếu bất kỳ lệnh nào bạn cần, hãy cho tôi biết trong phần bình luận và tôi sẽ cố gắng bổ sung cho bạn. Hướng dẫn này sẽ giải thích cho bạn tất cả các lệnh (cho đến nay) có thể được sử dụng thông qua thư viện này. Hơn nữa cũng sẽ hướng dẫn bạn thêm các chức năng của riêng bạn vào thư viện.


Các chức năng trong Thư viện ESP8266:

Initialize_ESP8266 (): Hàm này sẽ Khởi tạo mô-đun USART của PIC để giao tiếp với mô-đun ESP8266. Nó đặt tốc độ truyền ở 115200 và chuẩn bị chân Rx và Tx của PIC cho giao tiếp USART.

_esp8266_putch (): Hàm này được sử dụng để gửi một ký tự nối tiếp đến mô-đun ESP8266. Ví dụ: _esp8266_putch (‘a’) sẽ gửi một ký tự nối tiếp tới ESPmodule.

_esp8266_getch (): Hàm này được sử dụng để lấy một ký tự từ mô-đun ESP. Ví dụ: nếu ESP đang in “OK” và chúng tôi sử dụng char a = _esp8266_getch (). Khi đó char ‘o’ sẽ được lưu trong biến a.

ESP8266_send_string (): Hàm này là phiên bản chuỗi của _esp8266_putch (). Nó có thể gửi một chuỗi hoàn chỉnh đến mô-đun ESP8266. Ví dụ: ESP8266_send_string (“AT / r / n”) sẽ gửi lệnh “AT” đến mô-đun ESP8266.

esp8266_isStarted (): Nó được sử dụng để kiểm tra xem PIC có thể giao tiếp với mô-đun ESP hay không. Nó gửi lệnh “AT” và đợi “OK” nếu nhận được nó trả về true, nếu không nó sẽ trả về false.

esp8266_restart (): Đặt lại mô-đun ESP8266 và trả về true là đặt lại thành công và trả về false nếu không thành công.

esp8266_mode (): Được sử dụng để đặt chế độ làm việc của mô-đun ESP8266. Như chúng ta biết, nó có thể hoạt động ở ba chế độ khác nhau.

esp8266_mode(1):Station mode
esp8266_mode(2):Soft AP mode
esp8266_mode(3):Both Station and AP mode


esp8266_connect (): Cho phép bạn kết nối với tín hiệu wifi. Ví dụ: esp8266_connect (“home”, ”12345678”), sẽ cho phép mô-đun của bạn kết nối với tín hiệu wifi có tên home có mật khẩu là 12345678.

esp8266_disconnect (): Chức năng này ngắt kết nối mô-đun của bạn khỏi bất kỳ kết nối wifi nào đã được kết nối trước đó

esp8266_ip (): Lấy địa chỉ IP và trả về. Sử dụng chức năng này nếu bạn muốn biết địa chỉ IP của mô-đun ESP8266.

esp8266_start (): Hàm này được sử dụng để bắt đầu giao tiếp TCP hoặc UDP. Ví dụ esp8266_start ("TCP", "192.168.101.110", 80). Sẽ khởi động mạng TCP trong IP và cổng 80 đó.

esp8266_send (): Hàm này được sử dụng để gửi thông tin đến mạng TCP / UDP. Tập lệnh HTML sẽ được gửi bằng lệnh này. Sau đó, tập lệnh này sẽ xuất hiện trong địa chỉ IP mà giao tiếp đã được thiết lập trước đó.

esp8266_config_softAP (): Hàm này được sử dụng để cấu hình softAP. Ví dụ esp8266_config_softAP (“office”, ”12345678”); sẽ tạo tín hiệu Wifi có tên office và mật khẩu 12345678 sẽ được sử dụng để truy cập.

esp8266_get_stationIP (): Hàm này sẽ trả về cho bạn địa chỉ IP / MAC của các máy khách được kết nối với softAP của bạn.

Sample Program:

Bây giờ chúng ta đã hiểu các chức năng của từng lệnh trong thư viện, chúng ta hãy xem xét một chương trình mẫu nhỏ. Trong chương trình này, chúng tôi sẽ kiểm tra xem kết nối giữa ESP8266 và PIC có thành công hay không và sau đó tạo mạng WIFI (SoftAP) với tên và mật khẩu ưa thích. Chương trình hoàn chỉnh và mô phỏng tương tự sẽ được giải thích cho bạn hiểu.


Một lần nữa nếu bạn chưa đọc hướng dẫn về giao diện PIC với LCD và PIC USART của chúng tôi, vui lòng đọc trước khi tiếp tục vì chỉ khi đó nó mới có ý nghĩa đối với bạn.


Vì chúng tôi chỉ mới bắt đầu giao tiếp PIC với ESP8266, tôi đã sử dụng màn hình LCD để đảm bảo mọi thứ hoạt động bình thường.


do

    {

    Lcd_Set_Cursor(1,1);

    Lcd_Print_String("ESP not found");

    }while (!esp8266_isStarted()); //wait till the ESP send back "OK"

    Lcd_Set_Cursor(1,1);

    Lcd_Print_String("ESP is connected");

    __delay_ms(1500);

    Lcd_Clear();

Khi chúng tôi gửi “AT” đến mô-đun ESP8266, nó sẽ trả lời lại bằng “OK”. Điều này đảm bảo rằng mô-đun ESP8266 được kết nối thành công. Hàm esp8266_isStarted () được sử dụng tương tự. Chúng tôi gửi tín hiệu AT từ PIC và chúng tôi đợi cho đến khi mô-đun ESP hoạt động trở lại và gửi cho chúng tôi một đồng ý. Nếu chúng tôi nhận được đồng ý, chúng tôi hiển thị rằng "ESP đã được kết nối" trên màn hình LCD.


esp8266_mode(2);

    Lcd_Set_Cursor(1,1);

    Lcd_Print_String("ESP set as AP");

    __delay_ms(1500);

    Lcd_Clear();


Các dòng mã trên được sử dụng để đặt mô-đun ESP hoạt động ở chế độ “AP mềm”. Hàm esp8266_mode (2); gửi lệnh AT “AT + CWMODE = 3” đến mô-đun và đợi mô-đun phản hồi bằng “OK”


/*Configure the AP name and Password*/

    esp8266_config_softAP("CircuitDigest","619007123");

    Lcd_Set_Cursor(1,1);

    Lcd_Print_String("AP configured");

    __delay_ms(1500);

    Lcd_Clear();

    /*AP configured*/



Đoạn mã này được sử dụng để định cấu hình softAP. Ở đây chúng tôi đã đặt tên SSID là “CircuitDigest” và mật khẩu là “619007123”. Để cho biết rằng quá trình đã hoàn tất, chúng tôi sẽ đợi mô-đun phản hồi bằng “OK” và sau đó in AP được cấu hình lên màn hình LCD.


Đó là bây giờ chúng tôi đã giao tiếp mô-đun ESP8266 với PIC MCU và đã cấu hình softAP với tên và mật khẩu mà chúng tôi chọn. Như thường lệ, hãy mô phỏng mã này và xem nó hoạt động như thế nào.


Simulation output:


Chúng tôi đang sử dụng phần mềm Proteus để mô phỏng kết quả đầu ra. Bạn có thể tìm thấy tệp thiết kế tương tự trong tệp đính kèm.

Vì chúng tôi không có mô-đun ESP8266 trong thư viện Proteus, chúng tôi đã sử dụng thiết bị đầu cuối Nối tiếp và phản hồi lại với tư cách là người dùng đối với mô-đun PIC. Màn hình mô phỏng sau khi hoàn thành sẽ giống như bên dưới


Đầu ra của mã của chúng tôi được hiển thị trong thiết bị đầu cuối Ảo. Quá trình hoạt động hoàn chỉnh của mô phỏng sẽ được giải thích trong video dưới đây.

Xác minh đầu ra:
Sau khi chương trình được xác minh bằng cách sử dụng mô phỏng, hãy kết xuất nó vào bộ vi điều khiển PIC của bạn. Thực hiện các kết nối như thể hiện trong sơ đồ trên (Phần phần cứng). Bạn có thể theo dõi tiến trình của mình thông qua màn hình LCD.

Khi màn hình LCD thông báo rằng AP đã được định cấu hình, chúng ta có thể kiểm tra điều đó bằng cách sử dụng cài đặt WIFI trong Điện thoại hoặc Máy tính xách tay. Máy tính xách tay của tôi hiển thị tín hiệu sau theo chương trình của chúng tôi.





Đó là chúng ta đã giao tiếp thành công mô-đun ESP8266 với Vi điều khiển PIC. Đây là một giao diện rất cơ bản và nếu bạn muốn thực hiện bất kỳ dự án phức tạp nào bằng cách sử dụng ESP8266, bạn có thể phải thêm các thư viện của riêng mình hoặc ít nhất là thêm các chức năng của riêng bạn. Hãy tin tôi rằng nó rất dễ dàng để làm như vậy, tôi sẽ cung cấp một cái nhìn sâu sắc ngắn gọn cho những điều tương tự.

Adding functions to the ESP8266 Library:

Thêm chức năng của riêng bạn sẽ giúp bạn gửi bất kỳ lệnh “AT” nào đến mô-đun ESP8266. Để tiếp tục, bạn cần đọc tài liệu hướng dẫn của mô-đun ESP8266. Bạn có thể gửi trực tiếp bất kỳ lệnh AT nào mà bạn tìm thấy trong sách hướng dẫn tập hợp hướng dẫn đó. Nhưng hãy luôn nhớ thêm “/ r / n” vào cuối mỗi lệnh AT. Ví dụ: nếu bạn muốn thiết lập nhiều kết nối với mô-đun ESP của mình. Sau đó, mở tài liệu hướng dẫn và tìm lệnh AT của chúng tôi sẽ thực hiện công việc này cho bạn. Tại đây, lệnh “AT + CIPMUX = 1” sẽ cho phép bạn thiết lập nhiều kết nối với mô-đun ESP của mình.

Bây giờ tất cả những gì bạn phải làm là gửi “AP + CIPMUX = 1” này tới mô-đun ESP8266 của bạn bằng cổng nối tiếp. Cách khó thực hiện việc này là chỉ cần sử dụng lệnh

 _esp8266_print ("AT + CIPMUX = 1 \ r \ n" ")

Điều này sẽ hiệu quả nhưng không phải là cách tốt nhất. Bạn phải đọc lại những gì ESP8266 phản hồi với lệnh của bạn. Trong trường hợp của chúng tôi, nó sẽ trả lời là “OK”. Vì vậy, bạn phải đọc dữ liệu đến từ mô-đun ESP8266 và xác nhận rằng nó là "OK". Ngoài ra, bạn có thể thực hiện hàm này trong đó “1” hoặc “0” có thể được chuyển làm đối số.

Hãy tiếp tục và cố gắng tạo các chức năng của riêng bạn cho thư viện. Nhưng nếu bạn cần trợ giúp, vui lòng sử dụng phần bình luận và tôi sẽ giúp bạn.

#define _XTAL_FREQ 20000000

#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>
#include "esp8266_functions.h"

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

//****LCD Functions Developed by Circuit Digest.***///
void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines
{
    if(data_bit& 1) 
        D4 = 1;
    else
        D4 = 0;

    if(data_bit& 2)
        D5 = 1;
    else
        D5 = 0;

    if(data_bit& 4)
        D6 = 1;
    else
        D6 = 0;

    if(data_bit& 8) 
        D7 = 1;
    else
        D7 = 0;
}

void Lcd_Cmd(char a)
{
    RS = 0;           
    Lcd_SetBit(a); //Incoming Hex value
    EN  = 1;         
        __delay_ms(4);
        EN  = 0;         
}

Lcd_Clear()
{
    Lcd_Cmd(0); //Clear the LCD
    Lcd_Cmd(1); //Move the curser to first position
}

void Lcd_Set_Cursor(char a, char b)
{
    char temp,z,y;
    if(a== 1)
    {
      temp = 0x80 + b - 1; //80H is used to move the curser
        z = temp>>4; //Lower 8-bits
        y = temp & 0x0F; //Upper 8-bits
        Lcd_Cmd(z); //Set Row
        Lcd_Cmd(y); //Set Column
    }
    else if(a== 2)
    {
        temp = 0xC0 + b - 1;
        z = temp>>4; //Lower 8-bits
        y = temp & 0x0F; //Upper 8-bits
        Lcd_Cmd(z); //Set Row
        Lcd_Cmd(y); //Set Column
    }
}

void Lcd_Start()
{
  Lcd_SetBit(0x00);
  for(int i=1065244; i<=0; i--)  NOP();  
  Lcd_Cmd(0x03);
    __delay_ms(5);
  Lcd_Cmd(0x03);
    __delay_ms(11);
  Lcd_Cmd(0x03); 
  Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
  Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
  Lcd_Cmd(0x08); //Select Row 1
  Lcd_Cmd(0x00); //Clear Row 1 Display
  Lcd_Cmd(0x0C); //Select Row 2
  Lcd_Cmd(0x00); //Clear Row 2 Display
  Lcd_Cmd(0x06);
}

void Lcd_Print_Char(char data)  //Send 8-bits through 4-bit mode
{
   char Lower_Nibble,Upper_Nibble;
   Lower_Nibble = data&0x0F;
   Upper_Nibble = data&0xF0;
   RS = 1;             // => RS = 1
   Lcd_SetBit(Upper_Nibble>>4);             //Send upper half by shifting by 4
   EN = 1;
   for(int i=2130483; i<=0; i--)  NOP(); 
   EN = 0;
   Lcd_SetBit(Lower_Nibble); //Send Lower half
   EN = 1;
   for(int i=2130483; i<=0; i--)  NOP();
   EN = 0;
}

void Lcd_Print_String(char *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
       Lcd_Print_Char(a[i]);  //Split the string using pointers and call the Char function 
}
//***End of LCD functions***//

void main()
{
    TRISD = 0x00;
    Lcd_Start();
    Initialize_ESP8266() ; 
    Lcd_Set_Cursor(1,1);
    Lcd_Print_String("Circuit Digest");
    Lcd_Set_Cursor(2,1);
    Lcd_Print_String("ESP5266 with PIC");
    __delay_ms(1500);
    Lcd_Clear();
    
    /*Check if the ESP_PIC communication is successful*/
    do
    {
    Lcd_Set_Cursor(1,1);
    Lcd_Print_String("ESP not found");
    }while (!esp8266_isStarted()); //wait till the ESP send back "OK"
    Lcd_Set_Cursor(1,1);
    Lcd_Print_String("ESP is connected");
    __delay_ms(1500);
    Lcd_Clear();
    /*Yes ESP communication successful*/
    
    /*Put the module in Soft AP  mode*/
    esp8266_mode(2);
    Lcd_Set_Cursor(1,1);
    Lcd_Print_String("ESP set as AP");
    __delay_ms(1500);
    Lcd_Clear();
    /*Module set as AP */
    
    /*Configure the AP name and Password*/
    esp8266_config_softAP("CircuitDigest","619007123");
    Lcd_Set_Cursor(1,1);
    Lcd_Print_String("AP configured");
    __delay_ms(1500);
    /*AP configured*/
    
   
            
    while(1)
    {
        //do nothing 
    }

}
















Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...