Arduino подключение по usb wifi. NodeMCU на базе esp8266. Программирование ESP8266 в Arduino IDE

Совсем немного времени прошло с освоения новых микроконтроллеров Ардуино, как мне на глаза попадется информация о модуле ESP8266, и я решаюсь окунуться в новый для себя мир: новый микроконтроллер и беспроводная сеть Wifi. Радовало то, что программировать такие модули можно через уже освоенную программу Arduino IDE. Но каждый шаг надо проверять.

ESP8266 EX-12E :


 имеет 11 входов ввода-вывода (GPIO), что расширяет его возможности
 только в этой версии есть вход АЦП
 возможность SMD монтажа Подготовка к эксплуатации

Для работы модуля требуется:

 подать логическую единицу на вход EN (CH_PD)
 для входа в режим прошивки перед включением модуля надо замкнуть на землю GPIO0
 подать 3,3 v на VCC

Для первых шагов мне показалось несколько рискованным начинать работу с этим модулем, и я заказал комплект NodeMCU DevKit ESP8266 E-12 и макетную плату Motor shield ESP 8266 E-12 Я не собирался управлять двигателями, но меня привлекла возможность непосредственного подключения модуля к USB и согласование по питанию всех цепей.


Установил ARDUINO 1,6,6. Затем вписал в настройках программы http://arduino.esp8266.com/stable/package_esp8266com_index.json и в Инструментах отобразились платы, в том числе NodeMCU 1.0(ESP-12E Module) Загрузил пример WiFiClient и при компиляции получаю кучу сообщениий об ошибках. Обратился на форум ESP8266.ru , где мне посоветовали пользоваться предыдущей версией программы Arduino - 1.6.5. Для надежности я переустановил систему (восстановил с бэкапа) и установил Arduino 1.6.5. Проделал те же процедуры, чтобы подключить необходимые библиотеки. Делаю проверку, все отлично - ошибок нет!

Хватит лирики, теперь конкретно и с картинками, что я сделал.

1. Вписать путь к библиотекам (можно через запятую. На картинке один путь)


2. Выбрать в меню Boards Manadger


3. В самом низу открывшегося списка появится поле с новой библиотекой ESP8266 . (Открыть пришлось два раза, так как менеджер еще не подхватил библиотеки). Необходимо выбрать мышкой это поле, чтобы появилась кнопка Install


4. Снова заходим в меню Интсрументы и выбираем плату NodeMCU 1.0(ESP-12E module)

Если плата подключена к компьютеру, то сразу стоит установить порт. Если компьютер не распознает новое устройсто, что можно увидеть в диспетчере устройств компьютера, то следует установить необходимый драйвер. Для моего модуля потребовался драйвер CP2102 USB .

Пришло время сообщить, что я задумал сделать. Дома на стене висит большая карта мира, на которой подсвечены светодиодами разных цветов места, где я побывал. Так, синие светодиоды подсвечивают порты и точки в океане - работа в институте Океанологии; желтые - армия, и так далее. Светодиоды меняют свою яркость и иногда перемигиваются. Всем этим управляет Arduino Nano. Теперь же я хочу, чтобы всем управлял модуль ESP8266 и можно было менять режимы со смартфона через wifi. Задача не сложная, когда знаешь, как делать, а когда в первый раз?!

Первое, что потребовалось проверить - какие выводы у ESP8266 я смогу использовать для вывода ШИМ сигналов, чтобы управлять яркостью цветных светодиодных каналов. Всего на карте мира четыре цветовых канала. В каждом канале около 20 светодиодов. Тщетно проведя поиски в Интернете, я стал методом перебора, изменяя в программе активность выводов GPIO, определил 4 вывода. Позже я нашел таблицу, карту ножек, модуля ESP8266, которая подходила под мой вариант.

IO index ESP8266 pin IO index ESP8266 pin
0 GPIO16 7 GPIO13
1 GPIO5 8 GPIO15
2 GPIO4 9 GPIO3
3 GPIO0 10 GPIO1
4 GPIO2 11 GPIO9
5 GPIO14 12 GPIO10
6 GPIO12

Итак, первая часть программы работает. Я выбрал первые четыре вывода 0-3, то есть в программе это соответственно GPIO16, GPIO5, GPIO4, GPIO0, а на модуле DevKit ESP8266 E-12, это выводы D0-D3 соответсвенно.

Как задействовать wifi?

В поисках решения я вышел на сайт blynk.cc , с которого скачал и установил программу для смартфона (BLYNK FOR ANDROID) и библиотеку для Android IDE. Программа для смартфона устанавливается автоматом непосредственно с сайта blynk.cc без проблем.
Также без проблем я скачал библиотеку Blynk_v0.3.1.zip (275 Кб) и установил. Для этого следует запустить программу Arduino, выбрать в меню ADD .ZIP Library...


Библиотеки установились прямо из архива, это удобно.

Как правило, лучше программу перезапускать после нововведений.

Выбрал образец Blynk>BoardsAndShields>ESP8266_Standalone и на его базе написал свой скетч:

В смартфоне я подключил 4 больших слайдера, установив диапазон 0-1023 и одну кнопку переключающий режимы подсветки карты мира.

В правом нижнем углу карты размещен модуль DevKit ESP8266.

Схема достаточно простая. Единственно, что мне необходимо было сделать, это организовать питание и уровни управляющих сигналов. Основной блок питания на 12 вольт запитывает свтодиоды. На DevKit я подал 5 вольт через преобразователь


На рисунке показана одна группа светодиодов. Всего таких групп четыре и они отличаются цветом. Каждая группа может состоять из разного количества светодиодных линеек, соединенных параллельно, но в каждой линейке не больше 5 светодиодов, это определяется питающим напряжением 12 в. Если требуется меньшее количество светодиодов, то либо в цепь включается гасящее сопротивление, либо потенциометром канала добиваются необходимой яркости.

Итак будем управлять двумя реверсивными (вращение в обе стороны) двигателями: основным и рулевым. Питать их будем от аккумулятора 3,7 В, но можно и до 12 В в принципе подавать, если согласовать питание контроллера или организовать его отдельным аккумулятором.

В силовой части используем простейший миниатюрный драйвер шагового двигателя l9110s или же можно использовать сборку на L293\8 или любой не менее мощный, который вы найдёте. В общем я всё нарисовал на картинке.

Приобрести комплектующие для проекта можно на алиэкспресс:

WiFi контроллер использован мой любимый NodeMCU 0.9 ESP8266 , но можно использовать и меньший размером WeMos D1 mini.

Аккумулятор можно зарядить через микро-USB, после чего он питает драйвер двигателей напрямую и WiFi-контроллер через повышающий преобразователь до 5 В .

Код программы:

#include
const char* ssid = "имя вашей сети вайфай";
const char* password = "пароль вашей сети";
int up = 2; //номера дискретных выходов
int down = 14;
int left = 4;
int right = 12;
// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
void setup() {
Serial.begin(9600);
delay(10);
//подготовка выходов
pinMode(up, OUTPUT);
digitalWrite(up, 0);
pinMode(down, OUTPUT);
digitalWrite(down, 0);
pinMode(left, OUTPUT);
digitalWrite(left, 0);
pinMode(right, OUTPUT);
digitalWrite(right, 0);

// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

While (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");

//Запуск сервера
server.begin();
Serial.println("Server started");
//выводим IP адрес в монитор порта
Serial.println(WiFi.localIP());
}
void loop() {
//проверяем подключился ли клиент
WiFiClient client = server.available();
if (!client) {
return;
}

//Ожидаем пока клиент не пришлет какие-нибудь данные
Serial.println("new client");
while(!client.available()){
delay(1);
}

//Чтение первой строки запроса
String req = client.readStringUntil("\r");
Serial.println(req);
client.flush();

//обработка команды
if (req.indexOf("/gpio/up") != -1){
digitalWrite(up, 1);
digitalWrite(down, 0);
delay(1000);
digitalWrite(up, 0);
digitalWrite(down, 0);
}
else if (req.indexOf("/gpio/down") != -1){
digitalWrite(up, 0);
digitalWrite(down, 1);
delay(1000);
digitalWrite(up, 0);
digitalWrite(down, 0);
}
else if (req.indexOf("/gpio/left") != -1){
digitalWrite(up, 1);
digitalWrite(down, 0);
digitalWrite(left, 1);
digitalWrite(right, 0);
delay(1000);
digitalWrite(up, 0);
digitalWrite(down, 0);
digitalWrite(left, 0);
digitalWrite(right, 0);
}
else if (req.indexOf("/gpio/right") != -1){
digitalWrite(up, 1);
digitalWrite(down, 0);
digitalWrite(left, 0);
digitalWrite(right, 1);
delay(1000);
digitalWrite(up, 0);
digitalWrite(down, 0);
digitalWrite(left, 0);
digitalWrite(right, 0);
}
else {
Serial.println("invalid request");
}

Client.flush();
// подготовка к ответу
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n\r\n ";

S += "


UP
";
s += "
LEFT     ";
s += "RIGHT
";
s += "
DOWN";
s += "
\n";
// Send the response to the client
client.print(s);
delay(1);
Serial.println("Client disonnected");
} Программа написана в Arduino IDE. Как настроить Arduino IDE для работы с контроллером NodeMCU 0.9 ESP8266 посмотрите по ссылке. После загрузки программы в контроллер, монитором порта можно прочитать IP-адрес, который плата получит после соединения с вашим WiFi-роутером. В браузере компьютера необходимо в адресной строке прописать этот адрес и перейти на страницу, которую сгенерирует программа контроллера. Она будет выглядеть следующим образом:

DOWN

При нажатии на ссылку UP, машинка проедет вперед в течении 1сек и остановится. При нажатии на DOWN, машинка 1 секунду будет ехать назад. LEFT - двигатель поворота повернёт колёса влево и машинка проедет 1 сек влево. То же самое и вправо при нажатии на RIGHT.

Вся эта система будет работать только при настроенной WiFi-точке доступа (WiFi-роутере), но в будущем мне интересно поиграться с контроллером NodeMCU 0.9 ESP8266 , который сам будет организовывать точку доступа и выполнять функцию WEB-сервера, тоесть при заходе на его айпи из браузера, будем видеть web-страничку с элементами управления. Так же интересно организовать передачу данных с одного такого контроллера в другой посредством их автономной WiFi-сети.

В процессе изучения и проектирования всё более сложных проектов приходит время, когда возникает необходимость и желание научиться работать с таким распространенным видом связи как WiFi. Так как именно такой вид связи может позволить комфортно создать единую сеть для ваших умных домашних устройств и управлять ими, например, с мобильного телефона, планшета или компьютера, то есть другими словами создать самый настоящий умный дом, который обойдется вам в десятки раз дешевле, чем покупать готовые решения в магазине. Применение WiFi конечно не ограничивается на этом и примеров использования данного вида связи настолько много, что перечислять их нет смысла, и если Вы попали на эту страницу, значит, использование WiFi вам уже зачем-то понадобилось, осталось только разобраться, как правильно с ним работать.

Разбираться мы будем на основе самого дешевого и популярного WiFi модуля ESP8266-01 . Купить WiFi модуль ESP8266-01 можно у нас на сайте.

Один из главных плюсов такого модуля это наличие памяти и своего микроконтроллера на плате, что позволяет работать ему самостоятельно, загрузив скетч непосредственно в сам модуль.

Модификаций WiFi модуля ESP8266 на самом деле достаточно много и перечислять их здесь мы не будем, научившись работать с одним, Вы без проблем сможете начать работать и с другими. Хочется сразу отметить, что работа с WiFi может показаться довольно не простым занятием, и если в Вашем багаже мало законченных проектов, лучше пока отказаться от WiFi связи и использовать в своих проектах радиосвязь, работа с которой гораздо проще для понимания. По работе с WiFi модулями создают целые сообщества и тематические форумы, что лишний раз доказывает насколько большинству людей трудно сразу разобраться с данным видом связи, а перечитывая всю информацию, у большинства людей просто опускаются руки. Скорей всего и мне не удастся всю важную информацию вместить в рамках только одной этой статьи, да и нет в этом смысла, иначе получится очередная путаница. Я попытаюсь пойти по пути строгой последовательности самых важных моментов, чтобы Вы смогли начать понимать принцип работы данного вида связи и далее уже просто развивать самостоятельно свои навыки в этом направлении.

И так, давайте приступим и для начала разберем выводы WiFi модуля ESP8266-01 .

VCC - питание модуля от 3V до 3.6V

GND - земля.

RST - вывод Reset отвечающий за перезагрузку модуля.

CH_PD - "chip power-down" при подаче питания на него активизируется работа модуля.

TX - передача данных (UART интерфейс)

RX - прием данных (UART интерфейс)

GPIO0

GPIO2 - порт ввода/вывода общего назначения

Выводы GPIO0 и GPIO2 - это точно такие же цифровые выводы, с которыми мы работаем на платах Arduino для взаимосвязи с различными датчиками, и применяются они в случае реализации самостоятельной работы на внутреннем микроконтроллере WiFi модуля ESP8266-01.

Для надежного питания модуля ESP8266-01 используйте внешний стабилизированный источник питания на 3.3V и лучше не пытайтесь брать питание от своей платы Arduino, так как модуль потребляет ток до 215mA и это может плохо закончится для вашей отладочной платы. Где взять стабилизированный источник питания на 3.3V надеюсь для вас не проблема, в противном случае вам явно еще рано заниматься данным модулем. Мне, например, нравится использовать для быстрого сбора схем на макетных платах вот такой модуль питания 3.3V и 5.0V YWRobot , который позволяет быстро получить стабилизированное напряжение на 3.3V или 5V на соответствующих дорожках питания макетной платы.

Подключаем плюс (+) от нашего источника питания 3.3V к выводу VCC модуля ESP8266-01, а минус (-) источника питания подводим к выводу GND . В таком состоянии на модуле включится красный светодиод, сигнализирующий нам о правильном подключении питания. Для того чтобы модуль активизировался, необходимо также соединить плюс (+) источника питания с выводом CH_PD модуля ESP8266-01 и желательно это сделать сразу через резистор 10кОм. Теперь, когда мы включим питание, на модуле должен загореться красный светодиод и пару раз быстро мигнуть синий светодиод. Если у вас так все и происходит, значит все отлично, вы правильно все подсоединили и ваш модуль рабочий. В противном случае еще раз проверьте подключение, либо замените модуль, так как он скорей всего не рабочий.

Идем дальше. Для работы с WiFi модулем ESP8266 нам необходим переходник USB-UART. Переходники бывают разные, например: FT232RL , CP2102 , PL2303 . Но мы предположим, что у вас нет таких переходников, и будем в качестве переходника USB-UART использовать плату Arduino. Я буду использовать для этого плату Arduino NANO, а вы можете использовать любую другую имеющуюся в вашем распоряжении. Подключение на любой плате один в один идентично. Производим подключение согласно следующей схеме.

Давайте рассмотрим, что мы здесь сделали. Сразу обратите внимание на то, что мы замкнули перемычкой на плате Arduino выводы RST и GND . Такая манипуляция отключает микроконтроллер и позволяет сделать из нашей платы Arduino самый настоящий переходник USB-UART.

Так как WiFi модуль ESP8266-01 мы питаем от отдельного внешнего источника питания, незабываем, что мы должны всегда соединять между собой землю всех источников питания в наших проектах. Поэтому мы соединяем вывод GND платы Arduino c землей (-) нашего внешнего источника питания 3.3V, предназначенного для питания модуля ESP8266-01.

Вывод TX вашей платы Arduino соединяем с выводом TX модуля ESP8266-01. По этой линии будут передаваться данные от WiFi модуля к плате Arduino. Кто знаком с UART интерфейсом, может задуматься: "Но как же так? Везде учили, что TX должен соединяться с RX. TX передает информацию, а RX принимает". И Вы будете правы. Всё верно всегда TX соединяется с RX, но именно в случае, когда мы делаем из Arduino переходник UART, необходимо подключать устройства напрямую. Считайте это исключением из правил.

Линию RX вашей платы Arduino подключаем так же напрямую к линии RX модуля ESP8266-01. По этой линии будет передаваться информация от платы Arduino на плату WiFi модуля. Но делаем это соединение через так называемый делитель напряжения, состоящий из двух резисторов номиналами 1кОм и 2кОм. Уменьшить напряжение на этой линии с помощью двух резисторов (делителя напряжения) нам необходимо, так как плата Arduino передает логический сигнал напряжением 5V, а WiFi модуль работает с напряжением 3.3V. Для преобразования логического сигнала мы могли бы использовать специальную платку преобразователя логических уровней, что было бы конечно правильней, но опять же предположим, что у вас ее нет, и нам пришлось пойти более простым путем и сделать это с помощью делителя напряжения.

Всё необходимое для дальнейшей работы мы пока подключили, но у нас остаются не задействованные ещё 3 вывода (GPIO0 , GPIO2 и RST ) на WiFi модуле ESP8266-01 . Для стабильной работы WiFi модуля нам необходимо эти оставшиеся не задействованные выводы подтянуть к плюсовой (+) линии питания модуля через резисторы в 10кОм.

Это избавит нас от различных помех (наводок) и сделает работу модуля стабильной. Лучше это делать сразу. В противном случае не удивляйтесь, что ваш модуль постоянно перегружается, выдает не понятную информацию, либо вообще не хочет работать. Использовать подтягивающие резисторы на незадействованных выводах микроконтроллера должно быть, как правило, если хотите стабильной работы в ваших проектах.

И снова проверяем работоспособность модуля WiFi ESP8266-01. Включаем питание и смотрим, чтобы зажегся красный светодиод и пару раз мигнул синий. Если всё так происходит, значит отлично, идем дальше. В противном случае проверяем правильность соединений, а так же качество всех контактов. Может быть просто банальная ситуация, когда десять раз все перепроверили и убедились, что все правильно подключили, но включая модуль, видите, что синий светодиод ведет себя не адекватно, постоянно горит, постоянно мигает или вообще не на что не реагирует. Это может происходить из-за плохого контакта на какой-то линии. Например, собирая схему на макетной плате, какой-нибудь из резисторов неплотно сидит на своем месте и это вызывает помехи. Проверяйте качество соединений. Модуль очень чувствителен. Не пренебрегайте этим. Это частая причина не стабильной работы.

В общем, с подключением мы закончили. Сейчас нам необходимо подготовить программу Arduino IDE для работы с WiFi модулем ESP8266-01. Для этого нам надо скачать и установить в Arduino IDE необходимый архив с библиотеками, примерами и платами ESP, который впоследствии позволит нам заливать скетчи прямо в микроконтроллер модуля ESP8266-01, менять прошивку и т.д. В рамках этой статьи нам скорей всего эти настройки и не понадобятся, но мне кажется, что после того, как мы разобрались с подключением модуля, порядок действий будет правильным, если мы сразу скачаем все необходимое для работы с Arduino IDE. Тут все в принципе просто.

Запускаем программу Arduino IDE и переходим в меню "Файл" - "Настройки"

В появившемся окне в верхнем поле пишем "esp8266". В итоге в окне у нас останется только нужная прошивка. При нажатии на прошивку появится кнопка "Установка" . Нажимаем на кнопку "Установка" и ждем, пока все установится. Архив достаточно большой, около 150 мегабайт, так что придется подождать.

После окончания установки. Перезагружаем Arduino IDE и видим, как появились новые платы ESP в меню "Инструменты" - "Платы". На этом всё. С настройкой Arduino IDE мы закончили. Пока нам эти настройки не нужны, но в дальнейшей работе нам без них не обойтись.

Всё мы подключили и подготовились, теперь можем начать разбираться с управлением. На самом деле, сейчас будет продолжение проверки и настройки модуля с помощью AT команд и без этого ни как не обойтись. WiFi модули реализованы так, что всё общение с ними происходит с помощью так называемых AT команд, которые зашиты в прошивке модуля. Мы не будем здесь перечислять все AT команды, их достаточно много и если захотите все тщательно изучить, можете без труда их найти в интернете. А мы будем использовать сейчас только самые необходимые для начала работы.

И так, подключаем нашу плату Arduino через USB кабель к компьютеру. А внешний источник питания, который питает WiFi модуль ESP8266-01 пока включать не надо. Запускаем программу Arduino IDE, выбираем в меню "Инструменты" нашу плату Arduino, в моем случае это Arduino NANO, а вы выбираете свою. Так же не забываем выбрать порт к которому подключена наша Ардуинка. Надеюсь все это вы понимаете и делать умеете.

Открываем мониторинг порта "Инструменты" - "Монитор порта" . Выбираем скорость порта 74880 (на такой скорости происходит запуск модуля) и слева в списке выбираем "NL & CR"

Вот теперь подключаем внешний источник питания который питает наш WiFi модуль. После чего вы должны увидеть в мониторе порта примерно такую информацию.

Здесь мы видим некоторую информацию по нашему WiFi модулю (скорость, количество памяти на борту и т.д.). Полученная информация может отличаться в зависимости от версии прошивки WiFi модуля. Не будем на этом заострять внимание. Важно другое. Внизу мы видим набор бессмысленных символов, это означает, что скорость порта (74880 бод), которую мы выставили, подходит только для начальной загрузки модуля, чтобы увидеть нормально эту информацию, но эта скорость не подходит для нормального общения с WiFi модулем.

Чтобы подобрать правильную скорость порта, будем просто изменять скорость порта и посылать в порт (поле сверху и кнопка отправить) символы AT пока не получим ответ ОК . Если Вы попробуете прямо сейчас послать символы AT в порт на скорости 74880, то будете получать очередные один-два бессмысленных символа в ответ.

Попробуйте сразу выставить скорость 115200 бод и послать команду AT. Чаще всего модули прошиты на эту скорость.

Вот такую картину вы должны увидеть в вашем мониторе порта. Если все равно в ответ пришел непонятный набор символов, понижайте скорость и повторяйте отправку AT команды, пока в ответ не вернется ОК . Если вы перепробовали все скорости и не добились правильного ответа, значит вам не повезло и модуль прошит прошивкой с нестандартной скоростью. Тогда остается только перепрошить модуль нормальной прошивкой, но это тема отдельной статьи.

Надеюсь, что все хорошо и скорость правильную вы подобрали. Кстати если вы попробуете выключить и снова включить WiFi модуль, после того как подобрали правильную скорость, то уже вместо той самой первоначальной информации, которая корректно отображалась на скорости 74880 бод, вы наоборот, увидите беспорядочный набор символов, но в конце вы увидите слово "ready". Но у нас есть возможность посмотреть эту первоначальную информацию в нормальном виде на правильной скорости, для этого необходимо программно перезагрузить модуль с помощью AT-команды AT+RST .

Чтобы узнать версию прошивки вашего WiFi модуля ESP8266-01, необходимо в монитор порта отправить команду AT+GMR и в ответ вы получите примерно следующую информацию:

WiFi модуль ESP8266-01 может работать как в режиме точки доступа, так и в режиме клиента. Чтобы разрешить модулю работать сразу во всех режимах, отправьте в монитор порта команду AT+CWMODE=3 и в ответ вы должны получить ОК .

Команда AT+CWLAP позволит посмотреть все WiFi точки доступа, которые видит в данный момент ваш модуль. Мой модуль, например, видит на данный момент в зоне своего покрытия всего три WiFi точки доступа. Ответ должен быть примерно таким:

Например, мы знаем пароль к третьей точке доступа и чтобы подключиться к ней выполняем команду AT+CWJAP="имя","пароль" , в моем случае эта команда выглядит AT+CWJAP="dsl_unlim_512_home","11111111" , на что получаем успешный ответ:

Параметры команды записываются на флеш память WiFi модуля ESP8266-01, и если мы выключим модуль и опять его включим, он автоматически подключится к этой точке доступа. Смотрите случайно в команде не допустите пробел, иначе получите в ответ ERROR . Необходимо обратить внимание, что в последних версиях прошивки рекомендуют использовать команду AT+CWJAP_CUR , то есть команда будет выглядеть AT+CWJAP_CUR="имя","пароль". Если вдруг мы забыли, к какой точке доступа подключен наш модуль, необходимо послать команду AT+CWJAP? или AT+CWJAP_CUR? и в ответ получим ту точку доступа, к которой подключен WiFi модуль на данный момент.

С подключением и первоначальной настройкой WiFi модуля ESP8266-01 мы разобрались. Модуль работает и готов для реализации ваших дальнейших проектов. Разобрать все возможные примеры работы с данным модулем в рамках одной статьи просто не возможно и мы этим займемся в следующих статьях. А для тех, кто не очень дружит с программированием, но очень хочет побыстрей начать управлять своими проектами с помощью WiFi, рекомендую познакомить с конструктором WiFi проектов RemoteXY . Этот сайт поможет вам без особого труда создать интерфейс управления для вашего мобильника или планшета и с помощью него управлять своим устройством, к которому вы подключите WiFi модуль.

В этой статье вы узнаете, как создать систему, которая может включать и выключать нагрузки постоянного тока с помощью мобильного приложения. Вы также узнаете, как выполнить эту задачу мгновенно или по таймерам, заранее установленным для включения и выключения нагрузок.

Обзор проекта

Вы можете реализовать эту систему там, где вам нужно включать нагрузку постоянного тока на определенное время. В этом вам поможет наше Android приложение, не требуя аппаратного интерфейса, клавиатуры и LCD дисплея.

Комплектующие

Сборка макетной платы ESP8266

ESP8266 - недорогой SoC-чип со встроенным микроконтроллером и полным стеком протоколов TCP/IP, что означает, что он может напрямую обращаться к вашей Wi-Fi сети.

Поскольку у этого чипа есть свой микроконтроллер, вы можете поместить в него код своего приложения или можете использовать модуль просто как Wi-Fi приемопередатчик, что мы и собираемся сделать в данном проекте. Более эффективно было бы использовать этот модуль и как приемопередатчик, и как контроллер, но в целях обучения мы будем взаимодействовать с модулем, используя Arduino.

Чип ESP8266 поставляется в разных модулях. Мы будем использовать модуль ESP-01. Конечно, вы можете использовать любой другой модуль.

Во-первых, вы должны знать, что модуль работает с напряжением 3,3 В, и напряжение высокого логического уровня от Arduino должно быть таким же, чтобы не повредить наш модуль. Для этого требуется преобразователь уровня напряжения между платой Arduino (которая работает на 5 В) и модулем. Хорошей новостью является то, что в преобразователе будет нуждаться только вывод для передачи на Arduino, поскольку приемный вывод обычно распознает логические сигналы с напряжением 3,3 В от ESP8266.

Одним из простейших способов выполнения этого преобразования является схема от Sparkfun. Вы можете заказать готовый модуль .

Преобразователь уровня 5В → 3,3В

На рисунке ниже показана распиновка нашего модуля на ESP8266:

Вывод Назначение
UTXD Передача данных через UART
URXD Прием данных через UART. Выход, к которому он подключается, должен быть 3,3 В.
CH_PD Выключение: низкий уровень на входе выключает чип, высокий уровень на входе включает его; для нормальной работы модуля необходимо подтянуть его к линии питания.
GPIO0 При загрузке: должен быть высокий уровень, чтобы входить в нормальный режим загрузки; низкий уровень вводит в специальные режимы загрузки.
GPIO2 При загрузке: низкий уровень заставляет загрузчик войти в режим загрузки флеш-памяти; высокий уровень вызывает нормальный режим загрузки.
RST Сброс; активный уровень - низкий.
GND Земля.
VCC Питание/3,3В.

Я использовал LM317, настраиваемый линейный регулятор напряжения с выходным током до 1,5 А, для обеспечения модуля подходящим источником питания 3,3 В.

Примечание: Не используйте вывод 3,3 В от Arduino, так как стабилизатор напряжения 3,3 В на плате Arduino не может обеспечить необходимую для модуля величину тока, особенно при пиковом потреблении энергии во время передачи.

Я использовал BS170 (вместо BSS138) для преобразователя логических уровней; оба работают хорошо.

Теперь вы можете подключить свой модуль к компьютеру, используя USB-TTL преобразователь, и испытать его.

Сборка макетной платы реле

Для управления реле я использовал биполярный NPN транзистор BC337 с резистором 1 кОм на базе. Для защиты от обратного напряжения катушки я использовал диод 1n4007.

Нормально замкнутый (NC) контакт реле я решил подключить к земле.

Код Arduino

Теперь мы сталкиваемся с проблемой. ESP8266 использует UART в качестве интерфейса для AT-команд, а Arduino Uno (которая использует Atmega328) имеет только один порт UART. Этот порт уже подключен к мосту USB-TTL, а также к выводам 0 и 1.

В качестве решения вы можете использовать эмулятор для UART порта на другом цифровом выводе Arduino с помощью библиотек AltSoftSerial или SoftwareSerial. Это позволит вам по-прежнему иметь аппаратный порт UART для отладки и печати сообщений в консоли, а программный порт - для связи с модулем.

Многие люди (включая меня) сообщают о проблемах с программным последовательным портом при высоких скоростях передачи - как на тех, что мы будем использовать с esp8266, 115200 бит/с. Я могу сказать, что у вас 50% принятых от модуля данных будет повреждено, если вы используете программный UART, а из переданных от Arduino к модулю данных почти 100% будет корректно. Я получил эти результаты после отслеживания сигналов на линиях RX и TX.

В качестве решения я добавил в код несколько директив define , чтобы облегчить вам выбор между аппаратным и программным UART портами. Имейте в виду, что вы не можете использовать один и тот же порт для отладки и общения с модулем, поэтому вам нужно выбирать между ними.

//раскомментируйте Serial.*** , если хотите для связи с ESP использовать аппаратный последовательный порт (выводы 0,1) //раскомментируйте esp8266.*** , если хотите для связи с ESP использовать программный последовательный порт (выводы 2,3) #define esp8266_Available() Serial.available() //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read() //esp8266.read() #define esp8266_Write(ARG1,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print(ARG)

В исходнике вы найдете часть кода, которая устанавливает модуля с вашим роутером:

SendCommand("AT+RST\r\n", 2000, DEBUG); // перезапустить модуль sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); // настроить как точку доступа sendCommand("AT+CWJAP=\"tur\",\"341983#tur\"\r\n", 3000, DEBUG); //**** ИЗМЕНИТЬ SSID и ПАРОЛЬ В СООТВЕТСТВИИ С ВАШЕЙ СЕТЬЮ ******// delay(10000); sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // получить ip адрес sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // настроить для нескольких соединений sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); // включить сервер на порту 1337

Цикл скетча ожидает команды, которые должны прийти через Wi-Fi соединение. В настоящее время поддерживаются следующие команды:

  • ‘con’ для получения состояния выводов, высокий или низкий логический уровень;
  • ‘on=’ включить соответствующий вывод;
  • ‘of=’ выключить соответствующий вывод;
  • ‘Tm=n/fS’ установить таймер включения (n) или выключения (f) соответствующего вывода.

Все команды имеют отклик подтверждения.

Примечания:

  • некоторые части скетча основаны на ;
  • если вы используете модули со старым SDK, у вас могут быть такие же ошибки, как и у меня. Единственным решением в этом случае является обновление вашей прошивки до последней версии. Посмотрите , для получения помощи в обновлении прошивки модуля на ESP8266. Я обновил прошивку с версии 1.3 до 1.5.4.

Полный код программы:

#include #define DEBUG 0 // если вы для связи с ESP используете аппаратный последовательный порт, измените значение на 0 #define ESPBaudRate 115200 #define HWSBaudRate 115200 #define OUTPUT1 11 #define OUTPUT2 12 #define OUTPUT3 13 //раскомментируйте Serial.*** , если для связи с ESP хотите использовать аппаратный последовательный порт (выводы 0,1) //раскомментируйте esp8266.*** , если для связи с ESP хотите использовать программный последовательный порт (выводы 2,3) #define esp8266_Available() Serial.available() //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read() //esp8266.read() #define esp8266_Write(ARG1,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print(ARG) // Делает RX линию Arduino выводом 2, а TX линию Arduino выводом 3. // Это означает, что вам необходимо подключить TX линию от ESP к выводу 2 Arduino, // а RX линию от ESP к выводу 3 Arduino. SoftwareSerial esp8266(2, 3); /*************/ byte OUTPUTstate; byte OUTPUTTMRIsSet ; byte OUTPUTTMRState ; long OUTPUTTimer; /*************/ /***Commands**/ String GETSTATE = "con"; // Строка запроса от мобильного приложения, чтобы узнать состояние каждого выхода String SETON = "on="; // Строка запроса от мобильного приложения, чтобы включить выход String SETOFF = "of="; // Строка запроса от мобильного приложения, чтобы выключить выход String TIMER = "tm="; // Строка запроса от мобильного приложения, чтобы задать таймер для выхода /*************/ void setup() { Serial.begin(HWSBaudRate); // Последовательный порт для отправки сообщений от Arduino на компьютер esp8266.begin(ESPBaudRate); // Программный последовательный порт для отправки сообщений от Arduino на ESP8266 pinMode(OUTPUT1, OUTPUT); digitalWrite(OUTPUT1, LOW); pinMode(OUTPUT2, OUTPUT); digitalWrite(OUTPUT2, LOW); pinMode(OUTPUT3, OUTPUT); digitalWrite(OUTPUT3, LOW); // перезапустить модуль sendCommand("AT+RST\r\n", 2000, DEBUG); // настроить как точку доступа sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); //**** ИЗМЕНИТЬ SSID и ПАРОЛЬ В СООТВЕТСТВИИ С ВАШЕЙ СЕТЬЮ ******// sendCommand("AT+CWJAP=\"tur\",\"341983#tur\"\r\n", 3000, DEBUG); delay(10000); // получить ip адрес sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // настроить для нескольких соединений sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // включить сервер на порту 1337 sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); if (DEBUG == true) Serial.println("Server Ready"); } void loop() { if (esp8266_Available()) // проверить, послал ли esp сообщение { if (esp8266_Find("+IPD,")) { // ждать, когда последовательный буфер заполнится (прочитаются все последовательные данные) delay(1000); // получить id подключения, чтобы мы могли отключиться int connectionId = esp8266_Read() - 48; // вычитаем 48 потому, что функция read() возвращает // десятичное значение в ASCII, а 0 (первое десятичное число) начинается с 48 String closeCommand = "AT+CIPCLOSE="; // создание команды закрытия подключения closeCommand += connectionId; // добавить id подключения closeCommand += "\r\n"; esp8266_Find("?"); // Этот символ определяет начало команды теле нашего сообщения String InStream; InStream = (char) esp8266_Read(); InStream += (char) esp8266_Read(); InStream += (char) esp8266_Read(); if (DEBUG == true) Serial.println(InStream); if (InStream.equals(GETSTATE)) { // отклик на команду Status=<состояние_выхода_1><состояние_выхода_2><состояние_выхода_3> String response = "Status="; response += OUTPUTstate; response += OUTPUTstate; response += OUTPUTstate; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(SETON)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 1; else if (pinNumber == OUTPUT2) OUTPUTstate = 1; else if (pinNumber == OUTPUT3) OUTPUTstate = 1; digitalWrite(pinNumber, 1); String response = "Confg="; // Отклик на команду Confg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(SETOFF)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 0; else if (pinNumber == OUTPUT2) OUTPUTstate = 0; else if (pinNumber == OUTPUT3) OUTPUTstate = 0; digitalWrite(pinNumber, 0); // изменить состояние вывода String response = "Confg="; // Отклик на команду Confg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else if (InStream.equals(TIMER)) { int pinNumber = (esp8266_Read() - 48); // получить первую цифру, т.е., если вывод 13, то 1-ая цифра равна 1 int secondNumber = (esp8266_Read() - 48); if (secondNumber >= 0 && secondNumber <= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (esp8266_Read() == "n") { if (DEBUG == true) Serial.println("on"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 1; } else { if (DEBUG == true) Serial.println("off"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 0; } int j = 0; byte Atime; // Таймер может настроен на максимальное значение в 1 сутки // поэтому программа может принять 5 цифр, так как 1 сутки равны 86400 секундам long Time; // Прочитать секунды, значение имеет переменное количество цифр, поэтому читать, пока не получим "s", // что является символом завершения в теле моего сообщения от мобильного телефона while (1) { Time = esp8266_Read(); if (Time == "s") break; Atime[j] = Time - 48 ; j++; } switch (j) // секунды... { case 1: // одна цифра Time = Atime; break; case 2: // две цифры Time = Atime * 10 + Atime; break; case 3: // три цифры Time = Atime * 100 + Atime * 10 + Atime; break; case 4: // четыре цифры Time = Atime * 1000 + Atime * 100 + Atime * 10 + Atime; break; case 5: // пять цифр Time = Atime * 10000 + Atime * 1000 + Atime * 100 + Atime * 10 + Atime[j]; break; } if (DEBUG == true) { Serial.println("Timer:"); Serial.println(Time); } Time = Time * 1000 + millis(); if (DEBUG == true) { Serial.println("Pin:"); Serial.println(pinNumber); } if (pinNumber == OUTPUT1) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT2) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT3) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } String response = "tConfg="; // Отклик на команду tConfg=<номер_вывода> response += pinNumber; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } else // принята неподдерживаемая команда { String response = "ERROR"; sendHTTPResponse(connectionId, response); sendCommand(closeCommand, 1000, DEBUG); // закрыть подключение } } } /*****Проверить таймер для каждого выхода******/ if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT1, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT2, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT3, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } /***************************************/ } /* Name: sendData Description: Функция, используемая для отправки данных на ESP8266. Params: command - данные/команда для отправки; timeout - время ожидания отклика; debug - печатать в консоль?(true = да, false = нет) Returns: Отклик от esp8266 (если есть отклик) */ String sendData(String command, const int timeout, boolean debug) { String response = ""; int dataSize = command.length(); char data; command.toCharArray(data, dataSize); esp8266_Write(data, dataSize); // передача символов на esp8266 if (debug) { Serial.println("\r\n====== HTTP Response From Arduino ======"); Serial.write(data, dataSize); Serial.println("\r\n========================================"); } long int time = millis(); while ((time + timeout) > millis()) { while (esp8266_Available()) { // У esp есть данные, поэтому вывести их в консоль char c = esp8266_Read(); // прочитать следующий символ. response += c; } } if (debug) { Serial.print(response); } return response; } /* Name: sendHTTPResponse Description: Функция, которая посылает HTTP 200, HTML UTF-8 отклик */ void sendHTTPResponse(int connectionId, String content) { // создать HTTP отклик String httpResponse; String httpHeader; // HTTP заголовок httpHeader = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n"; httpHeader += "Content-Length: "; httpHeader += content.length(); httpHeader += "\r\n"; httpHeader += "Connection: close\r\n\r\n"; httpResponse = httpHeader + content + " "; // Здесь в коде баг: последний символ в "content" не посылается, поэтому я добавил дополнительный пробел sendCIPData(connectionId, httpResponse); } /* Name: sendCIPDATA Description: посылает команду CIPSEND=,<данные> */ void sendCIPData(int connectionId, String data) { String cipSend = "AT+CIPSEND="; cipSend += connectionId; cipSend += ","; cipSend += data.length(); cipSend += "\r\n"; sendCommand(cipSend, 1000, DEBUG); sendData(data, 1000, DEBUG); } /* Name: sendCommand Description: Функция, используемая для отправки данных на ESP8266. Params: command - данные/команда для отправки; timeout - время ожидания отклика; debug - печатать в консоль?(true = да, false = нет) Returns: Отклик от esp8266 (если есть отклик) */ String sendCommand(String command, const int timeout, boolean debug) { String response = ""; esp8266_Print(command); // передача символов на esp8266 long int time = millis(); while ((time + timeout) > millis()) { while (esp8266_Available()) { // У esp есть данные, поэтому вывести их в консоль char c = esp8266_Read(); // прочитать следующий символ. response += c; } } if (debug) { Serial.print(response); } return response; }

Android приложение

Чтобы управлять всеми выше перечисленными аппаратными компонентами, мы будем использовать простое приложение для Android. Это приложение позволит нам включать или выключать выход напрямую или через определенный период времени.

Примечание: Приложение требует Android 4.0 (IceCreamSandwich) или выше.

  • Прежде всего, вы должны знать IP адрес своего модуля. Если вы использовали программный последовательный порт, IP адрес будет напечатан в консоли. Если вы использовали аппаратный последовательный порт, то вы должны использовать кабель для отслеживания данных на линиях RX и TX, чтобы увидеть IP адрес. Вам также нужно знать номер порта, который был указан в скетче для Arduino. После этого нажмите "connect", чтобы получить состояние всех трех выходов. Вам нужно убедиться, что ваш Wi-Fi роутер включен, и вы подключены к локальной сети.
  • Теперь нажмите на любой переключатель, который вы хотите включить/выключить. Всякий раз, когда захотите, вы можете нажать "refresh", чтобы обновить состояние всех выходов.
  • На вкладке "Timers" вы можете установить любой из этих трех выходов для включения/выключения через определенный промежуток времени (от 0 до 24 часов).
  • После любого действия вы получите сообщение с подтверждением о том, выполнилась ли команда успешно, или возникла какая-то ошибка.

Демонстрационное видео

Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

Модуль ESP8266 будет сконфигурирован как самостоятельная точка доступа WiFi. Для такого режима работы не требуется привязка к существующей WiFi сети. Для соединения смартфон должен подключиться к созданной точке доступа.

Шаг 1. Создайте проект графического интерфейса

Шаг 4. Настройте ESP8266

Модуль ESP8266 нуждается в настройке. Возможно ваш модуль уже имеет необходимые настройки по умолчанию, но лучше это проверить.

Что необходимо проверить:

  • Модуль имеет прошивку с поддержкой AT команд версии не ниже v0.40;
  • Модуль настроен на скорость работы 115200.

Шаг 5. Подключите ESP8266 к Arduino Uno

Подключите ESP8266 к Arduino Uno по схеме приведенной ниже. Обратите внимание, что контакты RX-TX соединяются перекрестием.

Так как уровни сигналов модуля ESP8266 составляют 3.3В а у Arduino они 5В, необходимо использовать резистивный делитель напряжения для преобразования уровня сигнала.


Шаг 6. Загрузите скетч в Arduino.

Скетч загружается в Arduino обычным способом. Однако из за того что модуль ESP8266 подключен к контактам 0 и 1, программирование становится невозможным. Компилятор будет показывать ошибку.

Перед программированием отсоедините провода идущие к ESP8266 от контактов 0 и 1. Произведите программирование. Затем верните контакты на место. Нажмите кнопку сброса Arduino.

Примечание: Первый признак того, что программирование прошло успешно, это мерцание синего светодиода на модуле ESP8266 в течении полсекунды сразу после сброса. Мерцание синего светодиода означает обмен данными между Arduino и ESP8266. В эти полсекунды Arduino производит настройку ESP8266 для работы в качестве точки доступа.

Шаг 7. Подключитесь с мобильного приложения.

Если инициализация проходит успешно и вы видите последнюю команду AT+CIPSERVER=1,6377, но при попытке подключения с мобильного приложения возникает ошибка, возможно, что модуль ESP8266 имеет устаревшую прошивку.

Проверьте объем памяти вашего ESP8266. Это можно сделать так же посмотрев маркировку чипа памяти, который находится на плате рядом с чипом ESP8266. Если размер памяти составляет 4 Mbit и меньше (установлен чип 25Q40), скорее всего этот модуль не будет работать как точка доступа для RemoteXY.

Проверьте питание ESP8266

Так же возможно, что вашей ESP8266 не хватает мощности источника питания. Некоторые платы Arduino имеют слабый стабилизатор напряжения 3.3 В, который не способен выдавать 200-300 мА в пиковых режимах. В этом случае в Serial Monitor вы так же увидите обрыв последовательности команд.

Проверьте особенности вашего смартфона

Некоторые модели смартфонов на Android имеют особенности подключения точек доступа WiFi, и возможно точка доступа не включается автоматически. Попробуйте подключиться к точке доступа предварительно в ручную, используя системные настройки. После этого попробуйте соединиться с устройством из приложения RemoteXY. Если в этом случае соединение устанавливается, значит ваш смартфон имеет такую особенность. Сообщите нам об этом.