Итак, сделал такой шлюз. После прошивки (в среде Arduino IDE) подключается к любой ардуине по принципу RX-TX, TX-RX, GND-GND, Power. Т.е. в классической Arduino пины 0 и 1 подключаются к соответствующим serial-пинам ESP-шки. Если ESP-шка идёт в виде платы NodeMCU, то даже не нужен преобразователь питания и можно подключить +5V из arduino сразу к VIN NodeMCU, иначе понадобится стабилизатор питания на 3.3V.
ESP-шка мониторит всё, что Ардуина выводит через Serial.println и по фильтру отсылает строки по WiFi через HTTP-запрос на указанный сервер. Таким образом, любой проект на Arduino можно интегрировать в MajorDoMo без перепрошивки, а только через настройку веб-интерфейса шлюза, а сами устройства с прошитым шлюзом можно "пачкой" заготовить заранее, т.к. их перепрошивать нет необходимости даже при использовании в разных проектах.
Особенности:
* Простая настройка wifi-сети без перепрошивки (используется библиотека WiFiManager)
* Подключение к любому arduino-контроллеру через serial-интерфейс
* Мониторинг входящих данных в веб интерфейсе
* Настройка пересылки данных http-запросом (адрес посылки, фильтр)
* Отправка данных в подключенный контроллер с помощью HTTP API (запрос на http://шлюз/send?data=даные)
TO-DO:
* Настройка скорости общения по serial-порту в веб-интерфейсе (сейчас прошита фиксированная скорость 9600)
* Возможность исопльзования с бинарными данными (чтобы подключить к любому UART-устройству)
* Настройка признака окончания сообщения (сейчас это символ перевода строки "\n")
ссылка на исходник: https://github.com/sergejey/esp8266_wifigate
Интерфейс:
Пример скетча на Arduino, с которым тестировалась связка:
Код: Выделить всё
#define PIN_LED (13) // INDICATOR
long int uptime = 0;
long int old_uptime = 0;
String inData;
void setup()
{
pinMode(PIN_LED,OUTPUT);
Serial.begin(9600);
}
void blinking(int count) {
for(int i=0;i<count;i++) {
digitalWrite(PIN_LED, HIGH);
delay(200);
digitalWrite(PIN_LED, LOW);
delay(200);
}
}
void loop() {
uptime=round(millis()/1000);
if (uptime!=old_uptime) {
Serial.print("Up: ");
Serial.println(uptime);
old_uptime=uptime;
}
if (Serial.available()) {
char c=Serial.read();
if (c == '\n' || c == ';')
{
Serial.println(inData);
int commandProcessed=0;
if (inData.equals("blink")) {
Serial.println("BLINKING!");
blinking(3);
commandProcessed=1;
}
if (commandProcessed==0) {
Serial.print("Unknown command: ");
Serial.println(inData);
}
inData="";
Serial.flush();
} else {
inData += (c);
}
}
delay(100);
}