- Тестирование платы esp8266-12 прошивкой от Arduino IDE

Тестирование платы esp8266-12 прошивкой от Arduino IDE с загруженной программой esp8266

Практика для студентов. Мясищев А.А.

В настоящее время китайцы продают тестовые платы с напаянными контроллерами esp8266-12(esp8266-12E) и светодиодами, подключенными к выводам GPIO. Эти платы идут также с прошивкой AI-THINKER и с Интернета можно скачать Андроид приложение для управления светодиодами платы (рисунок 1).

Рис.1. Плата с esp8266-12 и смартфон на Андроиде с загруженным приложением IOT.apk для управления платой

Прошивка работает в режиме точки доступа и выполняет функцию web - сервера, а приложение на Андроид - работает как клиентская часть. После того, как я приобрел эту плату с прошивкой на aliexpress.com, решил проверить ее работоспособность с точки зрения надежности. Примерно через 2-3 мин. интенсивного перемещения ползунков и переключения светодиодов кнопками, прошивка либо зависала, или полностью становилась не работоспособной. Приходилось перепрошивать esp8266-12 заново скаченной с Интернета прошивкой. Решил написать новую прошивку с помощью Arduino IDE с загруженной программой esp8266 и приложение для Андроид на Appinventor(видео демонстрация):

Новая прошивка с клиентской частью работали достаточно устойчиво. Так в чем же дело? В прошивке или в прошивке и в аппаратной части. Ниже привожу программу прошивки в среде Ардуино и клиентскую часть для Андроид на App inventor.

Ниже представлена программа для среды Ардуино:

/* Создание WiFi точки доступа и запуск на ней Web - сервера. */

#include <ESP8266WiFi.h>

#include <WiFiClient.h>

#include <ESP8266WebServer.h>

/* Установка имени точки доступа и пароля входа в неё */

const char *ssi = "ESP_ksm_890m";

const char *passw = "ksm890mcom";

ESP8266WebServer server(80);

const int led0 = 0; // led0 - это GPIO0

const int led2 = 2;

const int led4 = 4;

const int led5 = 5;

const int led12 = 12;

const int led13 = 13; // led13 - это GPIO13

const int led14 = 14;

const int led15 = 15;

const int led16 = 16;

/* Web - сервер из браузера виден по адресу http://192.168.4.1 */

/* Определения функций, при обращении к которым сервер будет пересылать браузеру соответствующие сообщения */

void led0_on() {

digitalWrite(led0, 0);

server.send(200, "text/html","gpio0 on");

}

void led0_off() {

digitalWrite(led0, 1);

server.send(200, "text/html","gpio0 of");

}

void led2_on() {

digitalWrite(led2, 0);

server.send(200, "text/html","gpio2 on");

}

void led2_off() {

digitalWrite(led2, 1);

server.send(200, "text/html","gpio2 of");

}

void led4_on() {

digitalWrite(led4, 0);

server.send(200, "text/html","gpio4 on");

}

void led4_off() {

digitalWrite(led4, 1);

server.send(200, "text/html","gpio4 of");

}

void led5_on() {

digitalWrite(led5, 0);

server.send(200, "text/html","gpio5 on");

}

void led5_off() {

digitalWrite(led5, 1);

server.send(200, "text/html","gpio5 of");

}

void led12_on() {

digitalWrite(led12, 1);

server.send(200, "text/html","gpio12 on");

}

void led12_off() {

digitalWrite(led12, 0);

server.send(200, "text/html","gpio12 of");

}

void led13_on() {

digitalWrite(led13, 1);

server.send(200, "text/html","gpio13 on");

}

void led13_off() {

digitalWrite(led13, 0);

server.send(200, "text/html","gpio13 of");

}

void led14_on() {

digitalWrite(led14, 0);

server.send(200, "text/html","gpio14 on");

}

void led14_off() {

digitalWrite(led14, 1);

server.send(200, "text/html","gpio14 of");

}

void led15_on() {

digitalWrite(led15, 1);

server.send(200, "text/html","gpio15 on");

}

void led15_off() {

digitalWrite(led15, 0);

server.send(200, "text/html","gpio15 of");

}

void led16_on() {

digitalWrite(led16, 0);

server.send(200, "text/html","gpio16 on");

}

void led16_off() {

digitalWrite(led16, 1);

server.send(200, "text/html","gpio16 of");

}

void pwm120() {

analogWrite(12, 0);

server.send(200, "text/html","Slider12 0");

}

void pwm121() {

analogWrite(12, 5);

server.send(200, "text/html","Slider12 1");

}

void pwm122() {

analogWrite(12, 15);

server.send(200, "text/html","Slider12 2");

}

void pwm123() {

analogWrite(12, 60);

server.send(200, "text/html","Slider12 3");

}

void pwm124() {

analogWrite(12, 100);

server.send(200, "text/html","Slider12 4");

}

void pwm125() {

analogWrite(12, 150);

server.send(200, "text/html","Slider12 5");

}

void pwm126() {

analogWrite(12, 255);

server.send(200, "text/html","Slider12 6");

}

void pwm130() {

analogWrite(13, 0);

server.send(200, "text/html","Slider13 0");

}

void pwm131() {

analogWrite(13, 5);

server.send(200, "text/html","Slider13 1");

}

void pwm132() {

analogWrite(13, 15);

server.send(200, "text/html","Slider13 2");

}

void pwm133() {

analogWrite(13, 60);

server.send(200, "text/html","Slider13 3");

}

void pwm134() {

analogWrite(13, 100);

server.send(200, "text/html","Slider13 4");

}

void pwm135() {

analogWrite(13, 150);

server.send(200, "text/html","Slider13 5");

}

void pwm136() {

analogWrite(13, 255);

server.send(200, "text/html","Slider13 6");

}

void pwm150() {

analogWrite(15, 0);

server.send(200, "text/html","Slider15 0");

}

void pwm151() {

analogWrite(15, 5);

server.send(200, "text/html","Slider15 1");

}

void pwm152() {

analogWrite(15, 15);

server.send(200, "text/html","Slider15 2");

}

void pwm153() {

analogWrite(15, 60);

server.send(200, "text/html","Slider15 3");

}

void pwm154() {

analogWrite(15, 100);

server.send(200, "text/html","Slider15 4");

}

void pwm155() {

analogWrite(15, 150);

server.send(200, "text/html","Slider15 5");

}

void pwm156() {

analogWrite(15, 255);

server.send(200, "text/html","Slider15 6");

}

void root(){

server.send(200, "text/html","<h1>This is web-server on Wifi-esp-12.<br>He controls GPIO.<br>Command:/gpioxxon /gpioxxoff</h1>");

}

void setup() {

// GPIO работают на выход

pinMode(led0, OUTPUT);

pinMode(led2, OUTPUT);

pinMode(led4, OUTPUT);

pinMode(led5, OUTPUT);

pinMode(led12, OUTPUT);

pinMode(led13, OUTPUT);

pinMode(led14, OUTPUT);

pinMode(led15, OUTPUT);

pinMode(led16, OUTPUT);

// Чтобы после включения платы светодиоды не горели, на GPIO устанавливаются следующие уровни

// Так распаяна плата

digitalWrite(led0, 1);

digitalWrite(led2, 1);

digitalWrite(led4, 1);

digitalWrite(led5, 1);

digitalWrite(led12, 0);

digitalWrite(led13, 0);

digitalWrite(led14, 1);

digitalWrite(led15, 0);

digitalWrite(led16, 1);

delay(1000);

Serial.begin(115200);

Serial.println();

Serial.print("Configuring access point...");

/* You can remove the password parameter if you want the AP to be open. */

WiFi.softAP(ssi, passw);

IPAddress myIP = WiFi.softAPIP();

Serial.print("AP IP address: ");

Serial.println(myIP);

server.on("/gpio0on", led0_on); // Если набрать адрес http://192.168.4.1/gpio0on

// то браузер получит ответ gpio0 on

server.on("/gpio0off", led0_off);

server.on("/gpio2on", led2_on);

server.on("/gpio2off", led2_off);

server.on("/gpio4on", led4_on);

server.on("/gpio4off", led4_off);

server.on("/gpio5on", led5_on);

server.on("/gpio5off", led5_off);

server.on("/gpio12on", led12_on);

server.on("/gpio12off",led12_off);

server.on("/gpio13on", led13_on);

server.on("/gpio13off",led13_off);

server.on("/gpio14on", led14_on);

server.on("/gpio14off",led14_off);

server.on("/gpio15on", led15_on);

server.on("/gpio15off",led15_off);

server.on("/gpio16on", led16_on);

server.on("/gpio16off",led16_off);

server.on("/", root);

server.on("/pwm120", pwm120);

server.on("/pwm121", pwm121);

server.on("/pwm122", pwm122);

server.on("/pwm123", pwm123);

server.on("/pwm124", pwm124);

server.on("/pwm125", pwm125);

server.on("/pwm126", pwm126);

server.on("/pwm130", pwm130);

server.on("/pwm131", pwm131);

server.on("/pwm132", pwm132);

server.on("/pwm133", pwm133);

server.on("/pwm134", pwm134);

server.on("/pwm135", pwm135);

server.on("/pwm136", pwm136);

server.on("/pwm150", pwm150);

server.on("/pwm151", pwm151);

server.on("/pwm152", pwm152);

server.on("/pwm153", pwm153);

server.on("/pwm154", pwm154);

server.on("/pwm155", pwm155);

server.on("/pwm156", pwm156);

server.begin();

Serial.println("HTTP server started");

}

// Цикл по получению пакетов от браузера

void loop() {

server.handleClient();

}

Программа на App inventor в картинках(подробнее об App inventor):

1-й экран. Ползунки (Slider)

2-й экран. Кнопки.

Очень важными являются переменные aa и bb в 1-м и во 2-м экранах. Изначально при запуске приложения они равны единице. Только при их значении, равном единице, возможна отправка запроса на сервер. Например, при нажатии на кнопку во втором экране, если bb=1 выполняется запрос по адресу (например http://192.168.4.1/gpio12on) и устанавливается bb=0. Если ответ от сервера пришел, bb устанавливается опять в 1 и возможно дальнейшее обращение к серверу. Если ответ от сервера не пришел, то bb остается равным 0 и нажатие на любую кнопку не приведет к посылке данных и следовательно, к срабатыванию светодиода. Если не предусмотреть эти переменные, то при быстром нажатии на кнопки, интенсивном перемещении ползунков сервер не успевает обрабатывать приходящие пакеты и полностью сбрасывается. Например, если у Вас какое-то оборудование было включено к GPIO, то в результате сброса все выключается.

Аналогичная ситуация возникает с контроллером W5100, который широко используется для подключения плат Ардуино к сети. При интенсивных запросах через Интернет он повисает. Как показал опыт при составлении программ с его использованием необходимо следить за приходящими пакетами нулевой длины и если их больше, например 50, необходимо срочно сбрасывать контроллер W5100, иначе сервер на Ардуино повиснет. Достоинством сетевого решения на W5100 является то, что Ардуино не сбрасывается при сбросе W5100 и, следовательно включенное оборудование сохраняет свое состояние. Контроллер Ethernet enc28j60 работает устойчивее однако он не имеет стека TCP/IP. Если создавать системы удаленного управления на базе мини компьютера Raspberry Pi, то эта система работает значительно надежнее предыдущих.

Таким образом, как показывают мои наблюдения, надежное управление удаленным оборудованием с помощью esp8266 может быть проблематичным при использовании текущего программного обеспечения и может быть даже аппаратных средств?

Прошивка для esp8266-12 (пароль ksm890mcom):

http://webstm32.sytes.net/esp8266_12_ap_pwm.cpp.bin

Программа для Андроида:

http://webstm32.sytes.net/esp_pwm_led.apk

Написано 01.02.2016 г.