Trong hướng dẫn này, chúng ta hãy tìm hiểu cách gửi E-mail từ Bộ vi điều khiển PIC bằng cách sử dụng mô-đun WiFi nổi tiếng ESP8266. Hướng dẫn này sử dụng IC PIC16F877A và trình biên dịch MPLABX và XC8 để lập trình.
Ở phần cuối của hướng dẫn này, bạn sẽ có thể gửi E-mail từ bất kỳ ID E-mail thông thường nào như Gmail, yahoo, v.v. đến bất kỳ ID E-mail nào khác. 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 ESP8266-01 và Bộ vi điều khiển PIC. Nếu chưa, các bài hướng dẫn sau sẽ giúp bạn
Chuẩn bị sẵn sàng với ID E-mail của bạn:
Khi bạn đã quyết định ID thư nào bạn muốn gửi email, hãy làm theo các bước dưới đây
Bước 1: Truy cập https://www.smtp2go.com/ và Đăng ký làm người dùng mới. Nhập tên, địa chỉ E-mail và mật khẩu của ID E-mail mà bạn muốn gửi thư từ đó.
Hướng dẫn này sử dụng ID thư: aswinthcd @ gmail.com và Mật khẩu: circuitdigest.
Bước 2: Nhấp vào đăng ký và bạn sẽ được gửi một thư xác minh đến ID thư đã nhập của bạn. Trong trường hợp này, nó là EMAIL@ gmail.com. Mở thư và nhấp vào “KÍCH HOẠT TÀI KHOẢN”
Bước 3: Nó có thể yêu cầu nhập lại mật khẩu, nếu được yêu cầu nhập mật khẩu trước đó. Trong trường hợp này, nó là 'chỉ số mạch'. Sau đó, bạn sẽ đăng nhập vào trang web SMPT2GO. Đó là bây giờ địa chỉ E-mail của bạn đã sẵn sàng để gửi thư bằng Mô-đun ESP8266.
Bước 4: Bước cuối cùng là mã hóa ID và mật khẩu E-mail thành định dạng cơ sở 64 bằng cách sử dụng trang web này https://www.base64encode.org/. Chúng tôi sẽ sử dụng điều này trong chương trình PIC của chúng tôi
In this case the encoded values will look as shown in table below.
Parameter | Normal format | Encoded in base 64 |
Mail ID | EMAIL@ gmail.com | YXN3aW50aGNkQGdtYWlsLmNvbQ== |
Password | PASS | Y2lyY3VpdGRpZ2VzdA== |
Getting your Hardware Ready:
Màn hình LCD được sử dụng ở đây cho mục đích gỡ lỗi. Bạn không bắt buộc phải kết nối cái này. Chương trình sẽ hoạt động tốt ngay cả khi không có màn hình LCD. Nếu bạn muốn biết thêm về các sơ đồ, bạn hãy truy cập hướng dẫn này. (Giao diện PIC với ESP).
Bạn có thể chỉ cần lắp ráp mạch này trên một breadboard và sau đó tiến hành lập trình.
Programming your PIC to send E-mail:
Để gửi một E-mail từ ESP8266, một chuỗi lệnh AT phải được gửi đến mô-đun ESP. Các bước sau phải được thực hiện để gửi E-mail từ ESP8266.
- Set the module in AP+STA (Access Point and station) mode
- Connect to an Access point to get internet connection
- Enable multiple connections
- Start a server on any specific port
- Establish a TCP connection with SMPT2GO website
- Navigate to the Login section of the website
- Enter the E-mail ID and Password in base64 format
- Enter From mail ID
- Enter To mail ID
- Enter the Subject of the mail
- Enter the body of the mail
- Indicate the end of mail
- Send the mail
- Quit the TCP connection
Nó là một quá trình hơi dài và tẻ nhạt nhưng đừng lo lắng. Tôi đã đơn giản hóa quy trình bằng cách tạo tệp tiêu đề và bạn có thể sử dụng trực tiếp nó bằng cách chỉ cần gọi một số hàm (giải thích bên dưới), điều này làm cho tác vụ này trở nên rất dễ dàng. Mã hoàn chỉnh cùng với tệp tiêu đề có thể được tải xuống từ đây.
Lưu ý: Nếu bạn đang sử dụng mã trong một dự án mới, hãy đảm bảo rằng bạn tải xuống tệp tiêu đề và thêm nó vào dự án của mình.
Tôi đã giải thích một số phần quan trọng của mã bên dưới, các phần khác tự giải thích. Nhưng nếu bạn có bất kỳ nghi ngờ nào hãy sử dụng phần bình luận.
/*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 -Proceed*/
Phần mã này được sử dụng để kiểm tra xem có kết nối thích hợp được thiết lập giữa PIC và ESP8266 hay không. Chỉ khi cả hai đều có thể gửi và nhận dữ liệu thông qua USART, chương trình sẽ tiến hành bước tiếp theo.
esp8266_mode(3);
Chức năng này sẽ đặt ESP8266 ở chế độ 3. Có nghĩa là giờ đây mô-đun có thể hoạt động như một Điểm truy cập và cũng như một máy chủ.
esp8266_connect("BPAS home","cracksun");
Chức năng này được sử dụng để kết nối mô-đun ESP8266 với Bộ định tuyến Wifi của bạn. Trong trường hợp này “BPAS home” là tên tín hiệu Wifi của tôi và “crackun” là mật khẩu của tôi. Bạn phải sử dụng chi tiết tín hiệu Wifi của riêng mình.
_esp8266_enale_MUX(); //Enable multiple connections _esp8266_create_server(); //Create a server on port 80
Hai chức năng này được sử dụng để kích hoạt nhiều kết nối và tạo một máy chủ trên cổng 80.
_esp8266_connect_SMPT2GO();
Bây giờ, bằng cách sử dụng chức năng này, chúng ta có thể thiết lập kết nối TCP với SMPT2GO. Khi kết nối được thiết lập, chức năng này cũng sẽ chuyển đến trang Đăng nhập của trang web.
_esp8266_login_mail("YXN3aW50aGNkQGdtYWlsLmNvbQ==","Y2lyY3VpdGRpZ2VzdA==");
Working:
CODE :
#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("Mail using ESP");
__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 -Proceed*/
/*Put the module in AP+STA*/
esp8266_mode(3);
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ESP set AP+STA");
__delay_ms(1500);
Lcd_Clear();
/*Module set as AP+STA*/
/*Connect to a AccesPoint*/
esp8266_connect("BPAS home","cracksun"); //Enter you WiFi name and password here, here BPAS home is the name and cracksun is the pas
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Connected 2 WIFI"); //Print on LCD for debugging.
__delay_ms(1500);
Lcd_Clear();
/*Connected to WiFi*/
_esp8266_enale_MUX(); //Enable multiple connections
_esp8266_create_server(); //Create a server on port 80
_esp8266_connect_SMPT2GO(); //Establish TCP connection with SMPT2GO
/*LOG IN with your SMPT2GO approved mail ID*/
/*Visit the page https://www.smtp2go.com/ and sign up using any Gmail ID
* Once you gmail ID is SMPT2GO approved convert your mail ID and password in 64 base format
* visit https://www.base64encode.org/ for converting 64 base format online
* FORMAT -> _esp8266_login_mail("mailID in base 64","Password in base 64");
* This program uses the ID-> aswinthcd@ gmail.com and password -> circuitdigest as an example
*/
_esp8266_login_mail("YXN3aW50aGNkQGdtYWlsLmNvbQ==","Y2lyY3VpdGRpZ2VzdA==");
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Login Successful"); //display on LCD for debugging
__delay_ms(1500);
Lcd_Clear();
/*End of Login*/
_esp8266_mail_sendID("aswinthcd@ gmail.com"); //The sender mail ID
_esp8266_mail_recID("mailtoaswinth@ gmail.com"); //The Receiver mail ID
_esp8266_start_mail();
_esp8266_mail_subject("Mail from ESP8266"); //Enter the subject of your mail
_esp8266_mail_body("Testing Success -CircuitDigest"); //Enter the body of your mail
_esp8266_End_mail();
_esp8266_disconnect_SMPT2GO();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Mail Sent"); //Print on LCD for debugging
while(1)
{
//do nothing
}
}