В одной из предыдущих статей на нашем сайте мы рассматривали подключение WiFi модуля ESP8266 к микроконтроллеру PIC, в этой же статье мы рассмотрим передачу E-mail (электронной почты) с помощью данных устройств. Для программирования микроконтроллера PIC мы будем использовать программы MPLABX и XC8, более подробно об их использовании вы можете прочитать в этой статье.
Также ранее на нашем сайте мы рассматривали передачу E-mail с помощью микроконтроллера AVR и платы Arduino.
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Держатель микросхем на 40 контактов (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Регулятор напряжения LM317 (купить на AliExpress).
- Модуль ESP8266 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Резисторы 1 кОм, 220 Ом, 360 Ом (купить на AliExpress).
- Конденсаторы 1 мкФ, 0,1 мкФ, 33 пФ (купить на AliExpress).
- Перфорированная плата и соединительные провода.
- Адаптер 12V для питания микроконтроллера PIC и модуля ESP8266.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Подготовка к передаче E-mail
Прежде чем приступать к сборке схемы и загрузке программы в микроконтроллер PIC, выполните ряд предварительных операций.
Шаг 1. Зайдите на сайт https://www.smtp2go.com/ и зарегистрируйтесь там в качестве нового пользователя. Введите ваше имя, адрес E-mail и пароль от адреса почтового ящика, с которого вы планируете отправлять электронные письма (E-mail).
В данном проекте мы в качестве адреса электронной почты будем использовать aswinthcd@ gmail.com, а в качестве пароля – circuitdigest.
Шаг 2. После нажатия на кнопку sign up сервис пошлет проверочное письмо на ваш введенный E-mail. В нашем случае это адрес aswinthcd@ gmail.com. Откройте это письмо и нажмите в нем на ссылку “ACTIVATE ACCOUNT” (активировать аккаунт).
Шаг 3. После этого произойдет переход на адрес сервиса smtp2go.com, где вам будет необходимо ввести указанный при регистрации пароль. После этого вы войдете в свой аккаунт на сервисе smtp2go.com. С указанного вами E-mail мы будем отправлять письма с помощью модуля ESP8266.
Шаг 4. Теперь необходимо декодировать ваш E-mail и пароль к нем в формат base 64. Это можно сделать с помощью сайта https://www.base64encode.org/.
Декодированные таким образом значения для нашего проекта представлены в следующей таблице.
Параметр | Обычный формат | Формат base 64 |
Адрес E-mail | aswinthcd@ gmail.com | YXN3aW50aGNkQGdtYWlsLmNvbQ== |
Пароль | circuitdigest | Y2lyY3VpdGRpZ2VzdA== |
Теперь перейдем к аппаратной реализации нашего проекта.
Схема проекта
Схема подключения WiFi модуля ESP8266 к микроконтроллеру PIC представлена на следующем рисунке.
ЖК дисплей включен в схему для целей отладки, его использование в данном проекте не является обязательным. Более подробно о его подключении к микроконтроллеру PIC вы можете прочитать в данной статье.
Схему проекта мы можете собрать на перфорированной или макетной плате.
Объяснение программы для микроконтроллера PIC
Полный текст программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Для передачи E-mail с помощью модуля ESP8266 мы будем использовать AT команды. Для этого нам будет необходимо выполнить следующую последовательность шагов:
- Установить режим работы модуля AP+STA (точка доступа и станция).
- Подключиться к точке доступа чтобы обеспечить соединение с сетью интернет.
- Разрешить множественные соединения (multiple connections).
- Запустить работу сервера на определенном порту.
- Установить TCP соединение с веб-сайтом SMPT2GO.
- Войти в раздел Login на веб-сайте.
- Ввести адрес E-mail и пароль к нему в формате base64.
- Войти в раздел From в E-mail.
- Войти в раздел To в E-mail.
- Ввести тему письма.
- Ввести тело письма.
- Обозначить конец письма.
- Передать E-mail.
- Завершить TCP соединение.
На первый взгляд выполнение всех этих операций может показаться очень утомительным процессом, но мы для упрощения этих процессов будем использовать специальную библиотеку для работы с модулем ESP8266. Скачать ее можно по этой ссылке, а описание ряда ее функций приведено в этой статье. Чтобы использовать функции из данной библиотеки не забудьте подключить ее заголовочный файл в начале кода программы.
В следующем фрагменте кода мы проверим установлена ли связь между микроконтроллером PIC и модулем ESP8266.
1 2 3 4 5 6 7 8 9 10 11 |
/*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*/ |
После этого установим на модуле ESP8266 режим 3. В этом режиме модуль сможет работать в качестве точки доступа и сервера.
1 |
esp8266_mode(3); |
Далее подключим модуль ESP8266 к Wifi роутеру используя имя пользователя и пароль (вам необходимо будет поменять эти параметры на значения для своего роутера).
1 |
esp8266_connect("BPAS home","cracksun"); |
Следующие две функции используются для разрешения множественных соединений и создания сервера на порту 80.
1 2 3 |
_esp8266_enale_MUX(); //Enable multiple connections _esp8266_create_server(); //Create a server on port 80 |
Далее установим TCP соединение с сервером SMPT2GO.
1 |
_esp8266_connect_SMPT2GO(); |
После того как соединение будет установлено перейдем на страницу входа (Login page) сервиса. Используем значения Email и пароля нему в формате base 64 (вам необходимо будет изменить эти значения на свои).
1 |
_esp8266_login_mail("YXN3aW50aGNkQGdtYWlsLmNvbQ==","Y2lyY3VpdGRpZ2VzdA=="); |
Затем укажем адрес электронной почты, с которого будет производиться отправка Email.
1 |
_esp8266_mail_sendID("aswinthcd@ gmail.com"); |
Далее укажем адрес электронной почты, на который будем отправлять Email.
1 |
_esp8266_mail_recID("mailtoaswinth@ gmail.com"); |
С помощью следующей функции мы укажем серверу SMPT2GO что далее мы будем вводить тему и тело письма.
1 |
_esp8266_start_mail(); |
Затем укажем тему письма.
1 |
_esp8266_mail_subject("Mail from ESP8266"); |
Далее укажем содержание (тело) письма.
1 |
_esp8266_mail_body("Testing Success -CircuitDigest"); |
После этого сообщим серверу SMPT2GO что мы закончили заполнение реквизитов (тема и содержание) письма. Это можно сделать с помощью функции:
1 |
_esp8266_End_mail(); |
И, наконец, завершим TCP соединение с сервером SMPT2GO с помощью функции:
1 |
_esp8266_disconnect_SMPT2GO(); |
Тестирование работы проекта
После того как схема проекта будет готова и программа загружена в микроконтроллер вы можете приступить к тестированию работы проекта. Если все работает так, как надо, то на ЖК дисплее должны отображаться происходящие в проекте процессы, после чего на нем должно появиться сообщение “Mail sent”, что будет свидетельствовать о том, что электронное письмо успешно отправлено. После этого проверьте папку "Входящие" (также не забудьте проверить и папку со спамом) электронного ящика, на который вы отправляли Email. Вы должны увидеть в ней письмо следующего содержания.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
#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); //очищаем экран ЖК дисплея Lcd_Cmd(1); //перемещаем курсор на 1-ю позицию } 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); //выбираем строку 1 Lcd_Cmd(0x00); //очищаем строку 1 Lcd_Cmd(0x0C); // выбираем строку 2 Lcd_Cmd(0x00); // очищаем строку 2 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]); //разделяем строку на отдельные символы с помощью указателей и по очереди передаем каждый символ } //***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()); // ждем пока модуль ESP не передаст нам в ответ "OK" Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP is connected"); __delay_ms(1500); Lcd_Clear(); /*Yes ESP communication successful -Proceed*/ /*переводим модуль в режим 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"); //введите здесь имя и пароль для своей WiFi сети 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(); //создаем сервер на порту 80 _esp8266_connect_SMPT2GO(); //устанавливаем TCP соединение с сервисом 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"); //адрес с которого будет отправляться Email _esp8266_mail_recID("mailtoaswinth@ gmail.com"); // адрес на который будет отправляться Email _esp8266_start_mail(); _esp8266_mail_subject("Mail from ESP8266"); //вводим тему письма _esp8266_mail_body("Testing Success -CircuitDigest"); //вводим содержание письма _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 } } |