Технологии интернета вещей (Internet of Things, IoT) становятся все более популярными в современном мире, стимулируя развитие и других, смежных технологий. Одной из базовых задач, которые должны уметь делать устройства, функционирующие в сфере интернета вещей, является передача Email на заданный адрес электронной почты. Поэтому в данной статье мы рассмотрим обучающий проект, в котором при обнаружении огня будем отправлять Email с помощью модуля ESP8266 и макетной платы MSP430, предупреждающее об опасности.
Также на нашем сайте вы можете посмотреть другие проекты, в которых рассматривалась передача Email (электронной почты) с помощью микроконтроллеров (микроконтроллерных плат):
Необходимые компоненты
- Модуль ESP8266 (купить на AliExpress).
- Макетная плата (Launchpad) MSP430 (купить на AliExpress).
- Датчик огня (Fire Sensor) (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Источники питания 3.3v и 5v.
- Соединительные провода.
- Макетная или печатная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Создание аккаунта для передачи E-mail
Для передачи Email с помощью Wi-Fi модуля ESP8266 и макетной платы MSP430 нам необходимо создать себе аккаунт для передачи электронной почты (email account), который может быть создан с помощью такого сервиса как https://www.smtp2go.com/. После регистрации в данном сервисе запомните адрес электронной почты и пароль к ней – они нам понадобятся далее в программе для MSP430.
Также нам необходимо конвертировать адрес электронной почты (E-mail ID) и пароль в формат base 64 с помощью веб-сайта https://www.base64encode.org/.
Схема проекта
Схема проекта для передачи Email с помощью ESP8266 и макетной платы MSP430 представлена на следующем рисунке.
Основными элементами нашей схемы являются Wi-Fi модуль ESP8266 и макетная плата MSP430 (аналог платы Arduino, только с микроконтроллером MSP430). ЖК дисплей 16x2 (опционально, можно не использовать) применяется для отображения различных сообщений в процессе работы нашего проекта. Контакт CH_PD модуля ESP8266 подключен к 3.3V. Управляющий сигнал с датчика огня поступает на макетную плату MSP430, которая, в свою очередь, инициирует передачу Email при обнаружении огня.
Контакты Rx и Tx модуля ESP8266 непосредственно подключены к контактам P1_4 и P1_3 макетной платы MSP430. Контакты rs, RW и en ЖК дисплея подключены к контактам P2_4 и P2_3 макетной платы. Контакты данных ЖК дисплея D4-D7 подключены к контактам P1_5, P2_0, P2_1, P2_2 макетной платы. ЖК дисплей запитывается от напряжения 5v и его земля (ground) подключена к земле (GND) макетной платы MSP430. Датчик огня подключен к контакту P2_5 макетной платы.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Ниже показаны внешний вид и распиновка модуля ESP8266.
Если вы только начали изучение данного модуля, то советуем прочитать статью про начало работы с модулем ESP8266.
Объяснение программы для макетной платы MSP430
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе нам необходимо подключить библиотеки для работы с ЖК дисплеем и библиотеку SoftwareSerial для создания порта последовательной связи программным способом – этот порт будет нам необходим для обмена данными с модулем ESP8266. Также инициализируем контакт для работы с датчиком огня и объявил ряд необходимых нам массивов и переменных.
1 2 3 4 5 6 7 8 9 10 |
#include<LiquidCrystal.h> LiquidCrystal lcd(P2_4, P2_3, P1_5, P2_0, P2_1, P2_2); #include <SoftwareSerial.h> SoftwareSerial ESP(P1_3, P1_4); // RX, TX #define fireSensor P2_5 char str[40]; int i=0; |
Далее запрограммируем функцию connect_wifi, которая будет использоваться для подключения модуля ESP8266 к сети Wi-Fi. В эту функцию мы будем передавать три аргумента: команду, ответ и время для считывания ответа. Код программы внутри этой функции будет последовательно выполняться до тех пор пока модуль ESP8266 будет подключен к сети Wi-Fi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void connect_wifi(char *cmd, char *res, int t) { while (1) { for (int i = 0; i < 40; i++) str[i] = NULL; i = 0; ESP.println(cmd); Serial.print("-->"); Serial.println(cmd); Serial.print("<--"); delay(t); serialEvent1(); // Serial.println(str); if (strstr(str, res)) return; delay(1000); } } |
После этого в функции setup мы инициализируем последовательную связь для целей отладки и последовательную связь с модулем ESP8266 и зададим режим работы для контакта, к которому подключен датчик огня (на ввод данных). Далее мы инициализируем ЖК дисплей и выведем на него приветственное сообщение, затем инициализируем Wi-Fi и подключимся к роутеру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ESP.begin(9600); Serial.begin(9600); pinMode(fireSensor, INPUT); lcd.begin(16,2); lcd.print("Email Alert "); lcd.setCursor(0,1); lcd.print("By MSP430"); delay(2000); lcd.clear(); lcd.print("Circuit Digest"); delay(2000); lcd.clear(); lcd.print("Finding ESP8266"); lcd.setCursor(0,1); lcd.print("Please Wait..."); connect_wifi("AT", "OK", 1000); connect_wifi("ATE0", "OK", 1000); connect_wifi("AT+CWMODE=3", "OK", 1000); connect_wifi("AT+CWQAP", "OK", 1000); lcd.clear(); lcd.print("Connecting WiFi"); Serial.println("Connecting Wifi...."); |
После успешного подключения к роутеру Wi-Fi мы переходим в функцию loop, в которой будем ждать события (триггера) чтобы передать Email. Этим триггером будет сигнал с датчика огня при обнаружении им пламени.
Всегда, когда датчик огня будет обнаруживать огонь, MPS430 будет передавать Email. Перед его передачей он будет производить настройки передачи почты и соединяться с сервером 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 |
else { lcd.clear(); lcd.print("Fire Alert "); lcd.setCursor(0,1); lcd.print("Sending Email"); //lcd.print("Configuring Email.."); ESP.println("AT+CIPMUX=1"); delay(1000); ESP.println("AT+CIPSERVER=1,80"); delay(2000); ESP.println("AT+CIPSTART=4,\"TCP\",\"mail.smtp2go.com\",2525"); delay(2000); ESP.println("AT+CIPSEND=4,180"); delay(2000); ESP.println("EHLO 192.168.1.123"); ESP.println("AUTH LOGIN"); ESP.println("c2FkZGFtNDIwMUBnbWFpbC5jb20="); ESP.println(" tu934yt89ert83="); ESP.println("MAIL FROM:<saddam4201@gmail.com>"); ESP.println("RCPT To:<saddam4201@gmail.com>"); ESP.println("DATA"); // ESP.println("Testing Success saddam."); ESP.println("Fire Alert from Arduino"); ESP.println("."); |
Нам необходимо вводить адреса электронной почты отправителя и получателя в формате base64encoded, мы их ранее конвертировали в этот формат с помощью сервиса https://www.base64encode.org/.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Примечание: многие Email серверы не принимают электронные письма с IP адресов, выпущенных неизвестными серверами.
Исходный код программы
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 |
#include<LiquidCrystal.h> LiquidCrystal lcd(P2_4, P2_3, P1_5, P2_0, P2_1, P2_2); #include <SoftwareSerial.h> SoftwareSerial ESP(P1_3, P1_4); // RX, TX #define fireSensor P2_5 char str[40]; int i=0; void connect_wifi(char *cmd, char *res, int t) { while (1) { for (int i = 0; i < 40; i++) str[i] = NULL; i = 0; ESP.println(cmd); Serial.print("-->"); Serial.println(cmd); Serial.print("<--"); delay(t); serialEvent1(); // Serial.println(str); if (strstr(str, res)) return; delay(1000); } } void setup() { ESP.begin(9600); Serial.begin(9600); pinMode(fireSensor, INPUT); lcd.begin(16,2); lcd.print("Email Alert "); lcd.setCursor(0,1); lcd.print("By MSP430"); delay(2000); lcd.clear(); lcd.print("Circuit Digest"); delay(2000); lcd.clear(); lcd.print("Finding ESP8266"); lcd.setCursor(0,1); lcd.print("Please Wait..."); connect_wifi("AT", "OK", 1000); connect_wifi("ATE0", "OK", 1000); connect_wifi("AT+CWMODE=3", "OK", 1000); connect_wifi("AT+CWQAP", "OK", 1000); lcd.clear(); lcd.print("Connecting WiFi"); Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"Redmi\",\"arishkhan\"","CONNECTED", 7000); lcd.clear(); lcd.print("WIFI Connected..."); Serial.println("Wifi Connected"); ESP.println("AT+CIFSR"); delay(5000); } void loop() { if(digitalRead(fireSensor)) { lcd.setCursor(0,0); lcd.print("No Fire "); } else { lcd.clear(); lcd.print("Fire Alert "); lcd.setCursor(0,1); lcd.print("Sending Email"); //lcd.print("Configuring Email.."); ESP.println("AT+CIPMUX=1"); delay(1000); ESP.println("AT+CIPSERVER=1,80"); delay(2000); ESP.println("AT+CIPSTART=4,\"TCP\",\"mail.smtp2go.com\",2525"); delay(2000); ESP.println("AT+CIPSEND=4,180"); delay(2000); ESP.println("EHLO 192.168.1.123"); ESP.println("AUTH LOGIN"); ESP.println("c2FkZGFtNDIwMUBnbWFpbC5jb20="); ESP.println(" tu934yt89ert83="); ESP.println("MAIL FROM:<saddam4201@gmail.com>"); ESP.println("RCPT To:<saddam4201@gmail.com>"); ESP.println("DATA"); // ESP.println("Testing Success saddam."); ESP.println("Fire Alert from Arduino"); ESP.println("."); delay(2000); ESP.println("AT+CIPSEND=6"); delay(1000); ESP.println("QUIT"); delay(1000); lcd.clear(); lcd.print("Email Sent..."); delay(2000); lcd.clear(); } } void serialEvent1() { int ln=ESP.available(); if(ln>0) { for(int i=0;i<ln;i++) { char ch=ESP.read(); str[i]=ch; Serial.print(ch); delay(1); } } } |