Сфера интернета вещей (Internet of Things, IoT) является одной из активно развивающихся в современном мире. В этой сфере важную роль играют модули ESP8266, которые отличаются широким набором функциональных возможностей при относительно низкой цене. Ранее на нашем сайте мы уже рассматривали следующие проекты тематики интернета вещей на основе модуля ESP8266:
- система мониторинга загрязнения воздуха;
- отслеживание местоположения автомобиля на Google картах;
- управление умным домом с помощью голосовых команд.
В этой же статье мы рассмотрим подключение модуля ESP8266 к плате STM32F103C8 и осуществим выход в сеть в интернет. Также мы будем передавать данные на веб-страницу, расположенную на веб-сервере, организованном на основе модуле ESP8266.
Необходимые компоненты
- Модуль ESP8266 (купить на AliExpress).
- Blue Pill STM32F103C8 board (отладочная плата STM32, "синяя таблетка") (купить на AliExpress).
- Ноутбук и точка доступа Wi-Fi.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Общие принципы работы модуля ESP8266
Большинство людей называют ESP8266 модулем Wi-Fi, но на самом деле это микроконтроллер. ESP8266 - это название микроконтроллера, разработанного компанией Espressif Systems, базирующейся в Шанхае. Данный микроконтроллер имеет возможность работы с технологией Wi-Fi, поэтому он широко используется в качестве модуля Wi-Fi. Существует множество типов модулей ESP8266, доступных в диапазоне от ESP8266-01 до ESP8266-12. В данной статье мы будем использовать модуль ESP8266-01. Однако все модули ESP имеют только один тип процессора ESP и отличаются только типом используемого интерфейсного модуля. Интерфейсный модуль микроконтроллера ESP8266-01 имеет только 2 вывода GPIO, а другие модули ESP могут иметь большее количество выводов.
Модуль ESP8266 имеет 8 контактов. Его внешний вид и распиновка показаны на следующих рисунках.
Назначение контактов модуля ESP8266:
- 1 – земля, 8 – питание. По документации напряжение подается до 3,6 В – это важно учесть при работе с Ардуино, на которую обычно подают 5 В.
- 6 – RST, нужна для перезагрузки микроконтроллера при подаче на него низкого логического уровня.
- 4 – CP_PD, также используется для перевода устройства в энергосберегающий режим.
- 7 и 0 – RXD0 и TXD0, это аппаратный UART (последовательный порт), необходимый для перепрошивки модуля.
- 2 – TXD0, к этому контакту подключается светодиод, который загорается при низком логическом уровне на GPIO1 и при передаче данных по UART.
- 5 – GPIO0, порт ввода и вывода, также позволяет перевести устройство в режим программирования (при подключении порта к низкому логическому уровню и подачи напряжения).
- 3 – GPIO2, порт ввода и вывода.
К сожалению, модуль ESP8266 не является "дружественным" к макетной плате (breadboard friendly) и поэтому его нельзя на ней непосредственно закрепить.
Для управления работой модуля ESP8266 могут использоваться AT команды. Список AT команд, наиболее часто используемых при работе с модулем ESP8266, приведен в следующей таблице.
Полный же список AT команд, применимых для работы с модулем ESP8266, можно посмотреть по этой ссылке.
Схема проекта
Схема подключения модуля ESP8266 к плате STM32F103C8 представлена на следующем рисунке.
Схема соединений между модулем ESP8266 и платой STM32F103C8 представлена в следующей таблице.
ESP8266 | STM32F103C8 |
VCC | 3.3V |
GND | G |
CH_PD | 3.3V |
TX | PA3 |
RX | PA2 |
Плата SMT32F103C8 имеет три набора портов последовательной связи (UART), их местоположение и рабочее напряжение показаны в следующей таблице.
Последовательный порт | Контакты | Рабочее напряжение |
Serial1 (TX1,RX1) | PA9, PA10, PB6,PB7 | 5V |
Serial2 (TX2,RX2) | PA2, PA3 | 3.3V |
Serial3 (TX3,RX3) | PB10, PB11 | 5V |
Полная распиновка платы SMT32F103C8 представлена на следующем рисунке.
Для взаимодействия между модулем ESP8266 и платой STM32F103C8 используется последовательная связь. С этой целью контакты TX & RX модуля ESP8266 подключены ко второму последовательному порту (serial2 port, контакты PA2 & PA3) платы STM32.
Объяснение программы для платы STM32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Мы будем использовать среду Arduino IDE для написания программы и ее загрузки в плату STM32.
После загрузки кода программы в плату откройте в Arduino IDE монитор последовательного порта связи (Tools>>Serial Monitor). В этом окне вы увидите IP адрес, скопируйте его и вставьте его в строку браузера, в результате этого вы увидите в браузере сформированную модулем ESP8266 веб-страницу. Помните, что ваш компьютер и модуль ESP8266 при этом должны быть подключены к одной и той же Wi-Fi сети.
Первым делом в программе мы инициализируем последовательную связь с монитором последовательного порта и последовательную связь с модулем ESP8266.
1 2 |
Serial.println(cmd); Serial2.println(cmd); |
Примечание: мы использовали контакты PA2, PA3 2-го последовательного порта (Serial2 port) платы STM32 поскольку они могут работать с уровнями напряжений 3.3V.
Далее нам необходимо произвести сброс модуля ESP8266 чтобы прекратить использованием им прежних соединений и установить на нем режим работы AP & STA (точка доступа + станция).
1 2 3 4 |
connect_wifi("AT",100); //Sends AT command with time(Command for Acknowledgement) connect_wifi("AT+CWMODE=3",100); //Sends AT command with time (For setting mode of Wi-Fi) connect_wifi("AT+CWQAP",100); //Sends AT command with time (for Quit AP) connect_wifi("AT+RST",5000); //Sends AT command with time (For RESETTING WIFI) |
Затем подключим модуль ESP8266 к Wi-Fi сети. В представленной ниже команде вам необходимо использовать имя пользователя и пароль для своей Wi-Fi сети.
1 |
connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000); //provide your WiFi username and password here |
Далее мы получаем IP адрес для модуля ESP8266 и выводим его в окно монитора последовательного порта с помощью следующих строчек кода.
1 2 3 |
Serial2.println("AT+CIFSR"); //GET IP AT COMMAND if(Serial2.find("STAIP,")) //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266 Serial.print(IP); //prints IP address in Serial monitor |
Затем мы запрограммируем HTML код для нашей веб-страницы. Чтобы конвертировать HTML код в код Arduino можно, к примеру, использовать эту ссылку.
1 2 3 4 5 |
webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; //This is the heading line with black font colour String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>"; String data="<p>Data Received Successfully.....</p>"; //These two lines are of two paragraph webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; //At last we insert the hyperlink to link the website address |
Далее в функции void send() мы выводим HTML код с помощью функции sendwebdata и закрываем соединение сервера с помощью команды AT+CIPCLOSE=0.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void Send() //This function contains data to be sent to local server { webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; sendwebdata(webpage); webpage=name; sendwebdata(webpage); delay(1000); webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; webpage+=data; sendwebdata(webpage); Serial2.println("AT+CIPCLOSE=0"); //Closes the server connection } |
Для тестирования работы проекта скопируйте IP адрес модуля ESP8266 в строку любого браузера и нажмите на открывшейся веб-странице на ссылку для получения данных с сайта circuitdigest.com. После нажатия на ссылку вы увидите на веб-странице сообщение о том, что данные были получены успешно (“Data Received Successfully.....”).
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
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 |
//Interfacing ESP8266 Wi-Fi with STM32F103C8 //CIRCUIT DIGEST //NOTE: Serial is serial monitor with baud rate(9600) //NOTE: Serial2 (TX2, RX2)is connected with ESP8266(RX,TX)respectively with baud rate (9600) String webpage=""; //переменная типа String для хранения символов int i=0,k=0,x=0; // переменные целого типа String readString; // переменная для считывания символов boolean No_IP=false; //логическая переменная String IP=""; //строковая переменная для хранения данных char temp1='0'; // переменная символьного типа String name="<p>Circuit Digest</p><p>A community of electrical and electronics students, engineers and makers</p>"; //String with html notations String data="<p>Data Received Successfully.....</p>"; //String with html void check4IP(int t1) // функция для проверки ip адреса ESP8266 { int t2=millis(); while(t2+t1>millis()) { while(Serial2.available()>0) { if(Serial2.find("WIFI GOT IP")) { No_IP=true; } } } } void get_ip() // функция для получения IP адреса { IP=""; char ch=0; while(1) { Serial2.println("AT+CIFSR"); //GET IP AT COMMAND while(Serial2.available()>0) { if(Serial2.find("STAIP,")) //This finds the STAIP that is the STATIC IP ADDRESS of ESP8266 { delay(1000); Serial.print("IP Address:"); while(Serial2.available()>0) { ch=Serial2.read(); //Serial2 reads from ESP8266 (чтение с последовательного порта from ESP8266) if(ch=='+') break; IP+=ch; } } if(ch=='+') break; } if(ch=='+') break; delay(1000); } Serial.print(IP); // выводим IP адрес в окно монитора последовательной связи Serial.print("Port:"); Serial.println(80); } void connect_wifi(String cmd, int t) // функция для подключения ESP8266 к сети wifi с помощью AT команд { int temp=0,i=0; while(1) { Serial.println(cmd); //Sends to serial monitor Serial2.println(cmd); //sends to ESP8266 via serial communication while(Serial2.available()) { if(Serial2.find("OK")) i=8; } delay(t); if(i>5) break; i++; } if(i==8) Serial.println("OK"); else Serial.println("Error"); } void wifi_init() //This function contains AT commands that passes to connect_wifi() { connect_wifi("AT",100); //Sends AT command with time(Command for Achknowledgement) (команда подтверждения) connect_wifi("AT+CWMODE=3",100); //Sends AT command with time (For setting mode of Wifi) (команда для установки режима Wifi) connect_wifi("AT+CWQAP",100); //Sends AT command with time (for Quit AP) connect_wifi("AT+RST",5000); //Sends AT command with time (For RESETTING WIFI) (команда для сброса настроек Wifi) check4IP(5000); if(!No_IP) { Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"Pramo\",\"pokemon08\"",7000); //provide your WiFi username and password here (используйте в этой команде имя пользователя и пароль для своей WiFi сети) } else { } Serial.println("Wifi Connected"); get_ip(); connect_wifi("AT+CIPMUX=1",100); //Sends AT command with time (For creating multiple connections) (команда для создания нескольких соединений) connect_wifi("AT+CIPSERVER=1,80",100); //Sends AT command with time (For setting up server with port 80) (команда для установки номера порта 80) } void sendwebdata(String webPage) // функция для передачи данных веб-страницы на локальный сервер { int ii=0; while(1) { unsigned int l=webPage.length(); Serial.print("AT+CIPSEND=0,"); Serial2.print("AT+CIPSEND=0,"); Serial.println(l+2); Serial2.println(l+2); delay(100); Serial.println(webPage); // передаем данные веб-страницы в окно монитора последовательной связи Serial2.println(webPage); //передаем данные веб-страницы на ESP8266 while(Serial2.available()) { if(Serial2.find("OK")) { ii=11; break; } } if(ii==11) break; delay(100); } } void setup() { Serial.begin(9600); //begins serial monitor with baud rate 9600 (для целей отладки) Serial2.begin(9600); //begins serial communication with esp8266 with baud rate 9600 (Change according to your esp8266 module) (для связи с модулем esp8266) wifi_init(); Serial.println("System Ready.."); } void loop() { k=0; Serial.println("Please Refresh your Page"); while(k<1000) { k++; while(Serial2.available()) { if(Serial2.find("0,CONNECT")) { Serial.println("Start Printing"); Send(); Serial.println("Done Printing"); delay(1000); } } delay(1); } } void Send() // функция, содержащая данные для передачи на локальный сервер { webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>"; sendwebdata(webpage); webpage=name; sendwebdata(webpage); delay(1000); webpage = "<a href=\"http://circuitdigest.com/\""; webpage+="\">Click Here to get into circuitdigest.com</a>"; webpage+=data; sendwebdata(webpage); Serial2.println("AT+CIPCLOSE=0"); // закрываем соединение сервера } |
При повторении проекта столкнулся с непреодолимой ошибкой компиляции для платы ESP32F1 в среде Arduino IDE 1.8.15. Ошибка возникала из-за порта Serial2. Проблема была решена путём добавления в самое начало программного кода строки HardwareSerial Serial2(PA3,PA2);
Выражаю благодарность и желаю удачи в разработках!
Хорошо, спасибо за конструктивный комментарий, Илья.