Сегодняшний мир активно движется к широкому внедрению технологии интернета вещей (IoT - Internet of Things). Эта технология уже сейчас играет значительную роль в электронике и встраиваемых системах (Embedded system). Передача Email от микроконтроллера или встраиваемой системы является одной из базовых функций, которая необходима в технологии интернета вещей, поэтому в данной статье мы рассмотрим подключение к плате Arduino WiFi модуля ESP8266 и передачу с его помощью Email. Также можете прочитать статью о передаче Email с использованием WiFi модуля ESP8266 и микроконтроллера AVR.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Wi-Fi модуль ESP8266 (купить на AliExpress).
- ЖК дисплей 16х2 (опционально) (купить на AliExpress).
- USB кабель.
- Источник питания.
- Лэптоп (персональный компьютер).
- Потенциометр 10 кОм (опционально).
- Соединительные провода.
Внешний вид Wi-Fi модуля ESP8266 показан на следующем рисунке.
Подготовка к работе
Для того, чтобы иметь возможность передавать Email с помощью платы Arduino и Wi-Fi модуля, нам необходимо получить Email. Это можно сделать на сайте на сайте smtp2go.com – после регистрации не забудьте запомнить (записать) свой email адрес и пароль. Внешний вид окна регистрации на сайте smtp2go.com представлен на следующем рисунке.
Далее нам будут необходимы для нашего аккаунта Email имя пользователя и пароль в закодированном формате base64. Для преобразования данных из формата utf-8 в формат base64 можно использовать сервис https://www.base64encode.org/. Внешний вид окна данного сервиса показан на следующем рисунке.
Подавать питание на Wi-Fi модуль ESP8266 мы будем с контакта 3.3v платы Arduino.
Работа схемы
Схема устройства представлена на следующем рисунке.
Как видите, схема достаточно проста – фактически для нее нам нужны только плата Arduino и Wi-Fi модуль ESP8266. Но мы добавили в схему еще ЖК дисплей 16x2 для отображения статусных сообщений (но можно обойтись и без нее). Контакты Vcc и GND модуля ESP8266 подключены к контактам 3.3V и GND платы Arduino, контакт CH_PD также подсоединен к 3.3V.
Контакты Tx и Rx модуля ESP8266 непосредственно подсоединены к контактам 2 и 3 платы Arduino. Контакт 2 платы Arduino также замкнут с контактом 1 платы Arduino. Это сделано с той целью чтобы отображать ответ с модуля ESP8266 на последовательном порту Arduino. Библиотека последовательного порта (Software Serial Library) используется чтобы осуществлять последовательную связь на контактах 2 и 3 Arduino
Примечание: чтобы видеть ответ с ESP8266 на последовательном порту не используйте функцию Serial.begin(9600).
Исходный код программы
В программе мы первым делом должны подключить библиотеку последовательной связи и библиотеку для работы с ЖК дсиплеем. По умолчанию, для последовательной связи используются контакты 0 и 1 платы Arduino, но с использованием библиотеки последовательной связи мы можем задействовать последовательную связь на любых других цифровых контактах платы Arduino.
После этого мы должны запрограммировать функцию void connect_wifi(String cmd, int t) чтобы соединить Wi-Fi модуль с сетью Internet.
void connect_wifi(String cmd, int t)
{
int temp=0,i=0;
while(1)
{
Serial1.println(cmd);
while(Serial1.available())
{
if(Serial1.find("OK"))
... .... ....
... .....
После этого необходимо соединить Wi-Fi модуль с SMTP сервером при помощи соответствующих команд.
lcd.print("Configuring Email..");
Serial1.println("AT+CIPSTART=4,\"TCP\",\"mail.smtp2go.com\",2525");
delay(2000);
Serial1.println("AT+CIPSEND=4,20");
delay(2000);
Serial1.println("EHLO 192.168.1.123");
delay(2000);
Serial1.println("AT+CIPSEND=4,12");
Примечание: некоторые email серверы не принимают email с некоммерческих, выпущенных с помощью dhcp ip адресов.
После этого мы будем пытаться залогиниться на smtp2go.co, используя имя пользователя и пароль в закодированном base64 формате, которые мы получили с помощью сервиса https://www.base64encode.org/.
lcd.print("Try To Login.....");
Serial1.println("AUTH LOGIN");
delay(2000);
Serial1.println("AT+CIPSEND=4,30");
delay(2000);
Serial1.println("c2FkZGFtNDIwMUBnbWFpbC5jb20="); //base64 encoded username
delay(2000);
Serial1.println("AT+CIPSEND=4,18");
delay(2000);
Serial1.println("Y2lyY3VpdDQyMDE="); //base64 encoded password
После этого вводите свое основное сообщение которое хотите передать. Передаем этот email с использованием заключительной строки (символа) ‘.’
Serial1.println("Testing Success");
delay(2000);
Serial1.println("AT+CIPSEND=4,3");
delay(2000);
Serial1.println('.');
delay(10000);
Serial1.println("AT+CIPSEND=4,6");
delay(2000);
Serial1.println("QUIT");
... .....
.......
Далее представлен полный текст программы.
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 |
#include<LiquidCrystal.h> LiquidCrystal lcd(14,15,16,17,18,19); #include <SoftwareSerial.h> SoftwareSerial Serial1(2, 3); // RX, TX boolean No_IP=false; String IP=""; void check4IP(int t1) { int t2=millis(); Serial1.flush(); while(t2+t1>millis()) { while(Serial1.available()>0) { if(Serial1.find("WIFI GOT IP")) { No_IP=true; } } } } void get_ip() { IP=""; char ch=0; while(1) { Serial1.println("AT+CIFSR"); while(Serial1.available()>0) { if(Serial1.find("STAIP,")) { delay(1000); Serial.print("IP Address:"); while(Serial1.available()>0) { ch=Serial1.read(); if(ch=='+') break; IP+=ch; } } if(ch=='+') break; } if(ch=='+') break; delay(1000); } Serial.print(IP); Serial.print("Port:"); Serial.println(80); } void connect_wifi(String cmd, int t) { int temp=0,i=0; while(1) { Serial1.println(cmd); while(Serial1.available()) { if(Serial1.find("OK")) i=8; } delay(t); if(i>5) break; i++; } if(i==8) Serial.println("OK"); else Serial.println("Error"); } void setup() { Serial1.begin(9600); // Serial.begin(9600); lcd.begin(16,2); lcd.print("Sending Email by"); lcd.setCursor(0,1); lcd.print(" Arduino & WIFI "); delay(2000); lcd.clear(); lcd.print(" Circuit Digest "); delay(2000); lcd.clear(); lcd.print("Finding ESP8266"); connect_wifi("AT",100); connect_wifi("ATE1",100); lcd.clear(); lcd.print("Connected"); delay(1000); connect_wifi("AT+CWMODE=3",100); connect_wifi("AT+CWQAP",100); connect_wifi("AT+RST",5000); lcd.clear(); lcd.print("Connecting WiFi"); check4IP(5000); if(!No_IP) { Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",7000); // здесь необходимо указать имя пользователя и пароль для своего WiFi подключения } else { } lcd.clear(); lcd.print("WIFI Connected..."); Serial.println("Wifi Connected"); delay(1000); lcd.clear(); lcd.print("Getting IP Add."); Serial.println("Getting IP Address...."); get_ip(); delay(1000); lcd.clear(); lcd.print("IP:"); lcd.print(IP); lcd.setCursor(0,1); lcd.print("PORT: 80"); connect_wifi("AT+CIPMUX=1",100); connect_wifi("AT+CIPSERVER=1,80",100); delay(2000); lcd.clear(); lcd.print("Configuring Email.."); Serial1.println("AT+CIPSTART=4,\"TCP\",\"mail.smtp2go.com\",2525"); delay(2000); Serial1.println("AT+CIPSEND=4,20"); delay(2000); Serial1.println("EHLO 192.168.1.123"); delay(2000); Serial1.println("AT+CIPSEND=4,12"); delay(2000); lcd.clear(); lcd.print("Try To Login....."); Serial1.println("AUTH LOGIN"); delay(2000); Serial1.println("AT+CIPSEND=4,30"); delay(2000); Serial1.println("c2FkZGFtNDIwMUBnbWFpbC5jb20="); //base64 encoded username (имя пользователя) delay(2000); Serial1.println("AT+CIPSEND=4,18"); delay(2000); Serial1.println("Y2lyY3VpdDQyMDE="); //base64 encoded password (пароль) lcd.clear(); lcd.print("Login Success"); delay(2000); Serial1.println("AT+CIPSEND=4,34"); delay(2000); Serial1.println("MAIL FROM:<saddam4201@ gmail.com>"); // здесь необходимо указать ваш email адрес delay(2000); Serial1.println("AT+CIPSEND=4,32"); delay(2000); lcd.clear(); lcd.print("Seniding Email 2"); lcd.setCursor(0,1); lcd.print("Saddam4201@ gmail"); Serial1.println("RCPT To:<saddam4201@ gmail.com>"); delay(2000); Serial1.println("AT+CIPSEND=4,6"); delay(2000); Serial1.println("DATA"); delay(2000); Serial1.println("AT+CIPSEND=4,24"); delay(2000); Serial1.println("Testing Success"); delay(2000); Serial1.println("AT+CIPSEND=4,3"); delay(2000); Serial1.println('.'); // заключительный символ (строка) в email delay(10000); Serial1.println("AT+CIPSEND=4,6"); delay(2000); Serial1.println("QUIT"); delay(2000); lcd.clear(); lcd.print("Email Sent..."); } |