Беспроводная связь между современными электронными устройствами с каждым годом становится все более актуальной с учетом все большего доминирования концепции интернета вещей (Internet of Things). Протокол HTTP и язык HTML делают возможным передачу данных в любое место на Земле где есть сеть интернет. Ранее на нашем сайте мы уже рассматривали похожие проекты:
- передача Email с использованием Arduino и WiFi модуля ESP8266;
- робот на Arduino, управляемый по WiFi;
- управление трехцветным светодиодом с помощью Arduino и WiFi.
В этой же статье мы рассмотрим передачу данных от платы Arduino Uno на веб-страницу (Webpage) с помощью технологии WiFi. Для демонстрации возможностей этого проекта нам будет необходим IP адрес и сервер (локальный или глобальный). В целях упрощения демонстрации мы будем использовать локальный сервер.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Wi-Fi модуль ESP8266 (купить на AliExpress).
- USB кабель.
- Соединительные провода.
- Ноутбук (или персональный компьютер).
- Источник питания.
Внешний вид Wi-Fi модуля ESP8266 показан на следующем рисунке.
Работа схемы
Схема устройства представлена на следующем рисунке.
Основными элементами схемы являются плата Arduino и Wi-Fi модуль ESP8266. Контакты Vcc и GND Wi-Fi модуля ESP8266 непосредственно подключены к контактам 3.3V и GND платы Arduino, а контакт CH_PD Wi-Fi модуля также подключен к 3.3V. Контакты Tx и Rx модуля ESP8266 подключены к контактам 2 и 3 платы Arduino. Software Serial Library (библиотека последовательной связи) используется для осуществления последовательной связи на контактах 2 и 3 платы Arduino (вместо контактов 0 и 1, которые используются для последовательной связи в плате Arduino по умолчанию). В статье про передачу Email с использованием Arduino мы достаточно подробно останавливались на подключении WiFi модуля ESP8266 к плате Arduino, поэтому здесь эти вопросы рассматривать не будем.
Примечание: чтобы видеть ответы модуля ESP8266 на поступающие команды откройте монитор последовательного порта (Serial Monitor) в программной среде Arduino IDE.
В программе первым делом нам необходимо будет соединить наш Wi-Fi модуль с Wi-Fi роутером чтобы подключить Wi-Fi модуль к сети интернет. Затем мы должны сконфигурировать локальный сервер, передать данные на веб-страницу и закрыть соединение. Для этого нам необходимо выполнить следующую последовательность действий:
1. Сначала нам необходимо произвести тест Wi-Fi модуля при помощи передачи ему AT команды, он должен ответить OK.
2. После этого мы должны выбрать необходимый режим работы с помощью команды AT+CWMODE=mode_id , мы будем использовать Mode id =3. Полный же список доступных режимов выглядит следующим образом:
1 = Station mode (client) (режим станции, клиента)
2 = AP mode (host) (режим базовой станции, хоста)
3 = AP + Station mode (Yes, ESP8266 has a dual mode!) (режим станции + хоста – модуль ESP8266 поддерживает этот двойной режим).
3. Затем мы должны отсоединить наш Wi-Fi модуль от прежней Wi-Fi сети с помощью команды AT+CWQAP поскольку модуль ESP8266 по умолчанию автоматически соединяется с предыдущей использованной сетью Wi-Fi.
4. После этого можно сбросить модуль командой AT+RST – это необязательный шаг.
5. После этого мы должны соединить модуль ESP8266 с Wi-Fi роутером с помощью команды:
AT+CWJAP=”wifi_username”,”wifi_password”.
6. После этого мы должны получить IP адрес с помощью команды AT+CIFSR, которая вернет нам IP адрес.
7. После этого нам необходимо задействовать режим мультиплексирования с помощью команды AT+CIPMUX=1 (1 для соединения с мультиплексированием и 0 для одиночного соединения).
8. Теперь сконфигурируем ESP8266 как сервер с помощью команды AT+CIPSERVER=1,port_no (port может быть 80). Теперь наш Wi-Fi готов. В представленной команде ‘1’ используется для создания сервера и ‘0’ для удаления сервера.
9. Теперь с помощью соответствующих команд можно передавать данные на созданный локальный сервер:
AT+CIPSEND =id, length of data
Id = ID no. of transmit connection (номер соединения)
Length = Max length of data is 2 kb (максимальная длина данный 2 Кбайта).
10. После передачи ID (номера, идентификатора) и Length (длины данных) на сервер мы можем передавать данные, к примеру: Serial.println(“circuitdigest@gmail.com”);
11. После передачи данных нам необходимо закрыть соединение с помощью команды:
AT+CIPCLOSE=0
После этого данные будет переданы на локальный сервер.
12. Теперь вы можете набрать IP адрес в строке адреса вашего браузера и нажать Enter. После этого вы увидите переданные данные на веб-странице.
Все описанные шаги можно более наглядно посмотреть в видео в конце статьи.
Исходный код программы
1. В программе нам сначала необходимо подключить SoftwareSerial Library чтобы задействовать последовательную связь на контактах PIN 2 и 3 и объявить некоторые переменные и строки.
#include<SoftwareSerial.h>
SoftwareSerial client(2,3); //RX, TX
String webpage="";
int i=0,k=0;
String readString;
int x=0;
boolean No_IP=false;
String IP="";
char temp1='0';
2. После этого мы должны определить ряд функций, необходимых для решения наших задач.
В функции Setup() мы инициализируем встроенный последовательный приемопередатчик для подключения модуля ESP8266 с помощью команды client.begin(9600) – для бодовой скорости 9600 бод/с.
void setup()
{
Serial.begin(9600);
client.begin(9600);
wifi_init();
Serial.println("System Ready..");
}
3. В функции wifi_init() мы инициализируем wifi модуль при помощи передачи ему ряда команд, например, reset, set mode, connect to router, configure connection и т.д. Эти команды были объяснены в предыдущей части статьи.
void wifi_init()
{
connect_wifi("AT",100);
connect_wifi("AT+CWMODE=3",100);
connect_wifi("AT+CWQAP",100);
connect_wifi("AT+RST",5000);
...... .....
..... .....
- В функции connect_wifi() мы передаем команды и данные модулю ESP8266 и получаем (считываем) на них ответы.
void connect_wifi(String cmd, int t)
{
int temp=0,i=0;
while(1)
{
Serial.println(cmd);
...... .....
..... .....
5. Функция sendwebdata( ) используется для передачи данных на локальный сервер или веб-страницу.
void sendwebdata(String webPage)
{
int ii=0;
while(1)
{
unsigned int l=webPage.length();
Serial.print("AT+CIPSEND=0,");
client.print("AT+CIPSEND=0,");
...... .....
..... .....
6. Функция void send() используется для передачи строк в функцию sendwebdata(), которые затем передаются на веб-страницу.
void Send()
{
webpage = "<h1>Welcome to Circuit Digest</h1><body bgcolor=f0f0f0>";
sendwebdata(webpage);
webpage=name;
webpage+=dat;
...... .....
..... .....
7. Функция get_ip() используется для получения IP адреса от созданного локального сервера.
8. В функции void loop() мы передаем инструкции пользователю обновить страницу и проверить соединен ли сервер или нет. Когда пользователь обновляет или запрашивает веб-страницу, данные автоматически передаются на тот же самый IP адрес.
void loop()
{
k=0;
Serial.println("Please Refresh your Page");
while(k<1000)
.... .....
.... .....
Аналогичным образом мы можем передавать на веб-страницу, получаемые платой Arduino от различных датчиков: влажность и температура в комнате, GPS время, GPS координаты, частоту сердечных сокращений и т.д.
Далее представлен полный текст программы.
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 |
#include<SoftwareSerial.h> SoftwareSerial client(2,3); //RX, TX String webpage=""; int i=0,k=0; String readString; int x=0; boolean No_IP=false; String IP=""; char temp1='0'; String name="<p>Circuit Digest</p>"; //22 String dat="<p>Data Received Successfully.....</p>"; //21 void check4IP(int t1) { int t2=millis(); while(t2+t1>millis()) { while(client.available()>0) { if(client.find("WIFI GOT IP")) { No_IP=true; } } } } void get_ip() { IP=""; char ch=0; while(1) { client.println("AT+CIFSR"); while(client.available()>0) { if(client.find("STAIP,")) { delay(1000); Serial.print("IP Address:"); while(client.available()>0) { ch=client.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) { Serial.println(cmd); client.println(cmd); while(client.available()) { if(client.find("OK")) i=8; } delay(t); if(i>5) break; i++; } if(i==8) Serial.println("OK"); else Serial.println("Error"); } void wifi_init() { connect_wifi("AT",100); connect_wifi("AT+CWMODE=3",100); connect_wifi("AT+CWQAP",100); connect_wifi("AT+RST",5000); check4IP(5000); if(!No_IP) { Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",7000); //provide your WiFi username and password here // connect_wifi("AT+CWJAP=\"vpn address\",\"wireless network\"",7000); } else { } Serial.println("Wifi Connected"); get_ip(); connect_wifi("AT+CIPMUX=1",100); connect_wifi("AT+CIPSERVER=1,80",100); } void sendwebdata(String webPage) { int ii=0; while(1) { unsigned int l=webPage.length(); Serial.print("AT+CIPSEND=0,"); client.print("AT+CIPSEND=0,"); Serial.println(l+2); client.println(l+2); delay(100); Serial.println(webPage); client.println(webPage); while(client.available()) { //Serial.print(Serial.read()); if(client.find("OK")) { ii=11; break; } } if(ii==11) break; delay(100); } } void setup() { Serial.begin(9600); client.begin(9600); wifi_init(); Serial.println("System Ready.."); } void loop() { k=0; Serial.println("Please Refresh your Page"); while(k<1000) { k++; while(client.available()) { if(client.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; webpage+=dat; sendwebdata(webpage); delay(1000); webpage = "<a href="http://circuitdigest.com/"; webpage+="\">Click Here for More projects</a>"; sendwebdata(webpage); client.println("AT+CIPCLOSE=0"); } |
Крутые статьи. Спасибо, почитал. Одно замечание - не стоит питать ESP от 3,3в с Ардуино. Там ток то 50мА максимум! Ну и линию к ESP Тx лучше через делитель сделать (1к и 2к например). Скорее всего все и так будет нормально, но лучше согласовать 5в и 3,3в...
Да, в других аналогичных статьях как раз подобное согласование есть с помощью делителя напряжения.
У меня плата arduino uno d1 с встроенным моделем wifi. Попытка компиляции вашей программы привела к ошибке // unable to find string literal operator 'operator""http' with 'const char [9]', 'unsigned int' arguments
Что надо изменить, чтобы пользоваться встроенным модулем ввайфай, или ошибка не связана с этой особенностью платы?
С встроенным модулем wifi будет все намного проще - вам надо всего лишь найти библиотеку для работы с данным модулем и не будет необходимости в использовании громоздких АТ команд, использованных в данном проекте
Здравствуйте! А как получать данные из сервера? У меня есть свой сервер, зайдя по айпи и порту на который есть строка букв, хотелось бы как то эту строку получить, как это возможно?
Добрый вечер. К сожалению это тема отдельной статьи, сразу так не могу подсказать что нужно сделать. И вам это нужно сделать именно с помощью Ардуино? Просто если использовать модуль ESP8266 или ESP32, то эта задача бы упростилась. И в этом случае, скорее всего, я бы мог подсказать вам статью на моем сайте, которая была бы наиболее близкой к вашей проблеме
Если есть автор в теме, мне требуется командами подключить esp01 к роутеру и получить Ip адрес и статус подключения, и вывести их на дисплей 1306 OLED 128x32. спасибо.
Добавлю свой код в него нужно дописать подключение ESP01 через пину 2,3 ардуино посылает команды AT модулю esp01 чтоб тот подконектился к роутеру моему, и все это поочередно вывести на дисплей после чего выводим на дисплей
Добрый вечер. А вам нужно чтобы всеми этими процессами управлял модуль ESP01 или чтобы этими процессами управляла плата Arduino, а модуль ESP01 использовался только для ее подключения к сети WiFi? Можете посмотреть на нашем сайте проекты с использованием модуля ESP8266 (он же, по сути ESP01), готового решения для вашей задачи нет, но по отдельности все эти вопросы на нашем сайте рассмотрены
все соединил как на схеме, но выдает
AT
AT
AT
AT
AT
AT
AT
Error
AT+CWMODE=3
AT+CWMODE=3
AT+CWMODE=3
AT+CWMODE=3
AT+CWMODE=3
AT+CWMODE=3
AT+CWMODE=3
Error
AT+CWQAP
AT+CWQAP
AT+CWQAP
AT+CWQAP
AT+CWQAP
AT+CWQAP
AT+CWQAP
Error
AT+RST
AT+RST
AT+RST
AT+RST
AT+RST
AT+RST
AT+RST
Error
Добрый вечер. Программа достаточно объемная, поэтому сразу сказать из-за чего у вас возникает такая ошибка, я не могу. В этих случаях универсальным решением является отладка кода программы по частям - начать с самой простой части и убедившись в том, что эта часть работает, подключать к программе новый фрагмент и т.д. Если есть желание, то мы можем вместе за несколько дней попробовать разобраться в чем у вас возникает проблема. Я отвечаю на комментарии на сайте один раз в день
Если есть возможность, я бы хотел связаться с вами в личном порядке
Я могу написать вам на почту, которую вы ввели при добавлении данного комментария. Она корректная?
У меня всё то-же самое. Удалось победить проблему?
Какую именно проблему вы имеете ввиду?
ХОТЬ БЫ КОМЕНТАРИИ ПОД КОДОМ ОСТАВЛЯЛ
Ну так в тексте статьи программа достаточно подробно объяснена же. Если у вас есть конкретный вопрос по каким-нибудь строкам программы я могу сделать попытку вам их объяснить