Направление такое.
Нужно иметь статический IP-адрес (у меня он за 100 рублей в месяц) или доменное имя.
ESP01 должен работать в режиме станции. Для него должен быть выделен IP-адрес в локальной сети и порт. Это прописывается на роутере. В моем случае команды, поступившие из интернета (с телефона) на ESP01, передаются на ARDUINO-UNO, которая делает свои дела и передает результаты в ESP01, а тот, в свою очередь, обратно - в интернет.
Телефон должен выдать GET-запрос такого вида: http://xx.xxx.x.xx:10200/s?s=V1V2SlRTtTempGis.
xx.xxx.x.xx - статический IP-адрес (или доменное имя).
V1V2SlRTtTempGis - примерный набор команд, который передается в ARDUINO-UNO и там обрабатывается.
Скетч для ESP01 (ESP01S)
//Вставляем ссылку в поле «Дополнительные ссылки для Менеджера плат:» и жмём «OK».
//
//http://arduino.esp8266.com/stable/package_esp8266com_index.json
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "ABRAKADABRA";
const char* password = "19661117";
// const int period = 500;
const int period = 125;
unsigned long moment;
unsigned long avral;
bool flag;
ESP8266WebServer server(10200);
IPAddress ip(192, 168, 0, 62);
IPAddress dns(8, 8, 8, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
void setup()
{
WiFi.config(ip, dns, gateway, subnet);
Serial.begin(9600);
delay(100);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}
server.on("/s", razborki);
server.begin();
}
void loop()
{
server.handleClient();
if (millis() - moment >= period)
{
if (flag == true) // зафиксирован прием GET-запроса ####
{
avral = millis();
String stroka = "w"; // просто так
Serial.println(server.arg(0)); // аргумент отправляется в Arduino
// delay(250); // ожидание ответа от Arduino
delay(125); // ожидание ответа от Arduino
while (true)
{
if (millis() - avral >= 5000)
{
server.send(200, "text/plain", "Oblom"); // а если ответа от Arduino не получено, то это - облом.
break;
}
if (Serial.available() > 0)
{
char sim = Serial.read();
byte simb = (byte) sim;
if (sim == '\n') // конец пакета
{
server.send(200, "text/plain", stroka); // stroka отправляется в интернет
break;
}
else
{
if (simb != 13) stroka += sim; // накапливается символ в stroka
}
}
}
Serial.flush();
flag = false;
}
moment = moment + period;
}
}
void razborki()
{
flag = true;
}
У меня всегда по одному шаблону сделано. Заряжаю таймер на 10 мс и в прерывании таймера для каждой кнопки вставляю код
В случае нажатия кнопок значение передаю глобальной переменной, которую анализирую в основном цикле программы. Если переменная отлична от нуля, то обнуляю переменную и выполняю действия, привязанные к полученному значению.
В любом случае что бы всё это поддерживать надо использовать какой то протокол обмена, что бы не запутаться в получаемых данных. Можно самому правила протокола писать и использовать, можно взять стандартный, например MQTT и не париться. Тем более что то что ты описал никак не отличается от схемы MQTT. Твоя ESP01 тот же брокер.
Ну так и у меня мой личный MQTT брокер висящий на крохотной малинке zero w.
И работающий в связке с mojordomo выдаёт красивые графики параметров через http.
А как с масштабированием? Я вот по осени новую железку поставил на мониторинг параметров 3х-фазной сети на PZEMах. Мониторит аж 18 параметров, которые MQTT брокер скушал и не пришлось ничего перепрограммировать.
Зависите от ПО на вышей малинке, которое подчинено и легко закрывается производителем серверного ПО MQTT. Если запад с амерами залупятся, то не видать вам на территории России управления через MQTT, который будет хоть ваш личный брокер, хоть общественный. Живой пример с Ccleaner . Хоть ты 10 VPNов включи, не работает он у нас (.
Как это? В чём не совместимость? Вроде как MQTT предназначен для обмена короткими сообщениями с информацией. Получая информацию я могу следить за устройствами, т.е. мониторить?
Вот не надо путать тёплое с мягким. Пока у меня брокер стоит на моей малинке нет способа заблокировать мне обмен с ним. А Ccleaner при запуске проверяет страну компа. Это есть в коде. Отключи интернет, поставь Казахстан и чисти. Потом вернёшь Россию.
Стоящий у меня mosquitto это “An open source MQTT broker” т.е. всё в наших руках.
Но, если подумать, то ценность мониторинга состоит в том, что пользователь должен понимать к какому моменту времени привязано изменение метрики. Однако проблема в том, что MQTT не сопровождает мессейдж таймштампом. Т.е. подключившись к брокеру можно получить не срез из Voltage / Current / Power Factor, а напряжение сегодняшнее, ток - вчерашний, а PF - от рандомного дня.
Пока цепочка паблишер-брокер-клиент не испытывают проблем связности, всё выглядит прилично… Но, когда начинаются проблемы передачи/приема - хрен поймешь, что все пошло вразнос.
Проводи не проводи, только производитель знает эту дыру как остановить сервер. Если что, то не будет работать, то сразу у всех в данном регионе. Хуже, если это сделают какие нибудь хакеры. Я уже давно использую нечто подобное описанное @Optron -ом. JS и PHP нам в помощь. Понимаю, что с таким подходом можно и на серверное ПО замахнуться Билли мать его Гейца. Который постоянно закрывает свои дыры кбэшками. Но тот хоть честно об этом говорит. Обновитесь, нето вас порюхают жестко. А с телефонами нашими что творится? Производители даже в последнее время вообще не спрашивают пользователей хочет он обновить систему или нет. Тупо летит ПО когда мы спим. Это я говорю на полном серьёзе, потому как вижу это на практике у не менее 500 пользователей андроида и айос. Буквально яблоко пару недель назад обновило систему, что некоторые пользователи не узнали свои айфоны. Вот такие дела творятся. А вы говорите это моё и ни кто не сможет. Всё они смогут если захотят.