Страница 1 из 5

ESP8266 wifi gate

Добавлено: Вс окт 09, 2016 12:42 pm
sergejey
Небольшой эксперимент в области программирования ESP8266. ESP-шка сама по себе неплохой контроллер, но мне захотелось сделать из неё шилд, который может быть подключен к другому контроллеру для мониторинга того, что на нём происходит и для отсылки команд на него.

Итак, сделал такой шлюз. После прошивки (в среде 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);
}
В скетче прописана реакция на команду "blink;"

Re: ESP8266 wifi gate

Добавлено: Вс окт 09, 2016 1:39 pm
serghei
Здравствуйте. То есть насколько я понял ESP подключаем к любой ардуине ( в том числе с АМС ) и по Wi-Fi передаем данные в МД, которые сыплются в сериал порт? Вообще шикарно получается. Надо только разобраться со скетчем и знать ,что необходимо дописать для отправки.

Re: ESP8266 wifi gate

Добавлено: Вс окт 09, 2016 1:42 pm
Alex
Отличное решение.

Мне в этой связи было бы интересно узнать три вещи:

1. Какие ещё интерфейсы (и как) можно использовать для связи Arduino-ESP
2. Как из ESP сделать прозрачный Wi-Fi шилд для любой Ардуины
3. Как можно связать 2 Ардуины, чтобы получить контроллер 2 в 1

Re: ESP8266 wifi gate

Добавлено: Вс окт 09, 2016 7:32 pm
Lans
Отличная идея!
Еще можно добавить прошивку Ардуины по сети, подобное реализовано здесь: http://samopal.pro/arduino-esp8266/

Alex, кстати про пункт 2 - как раз оно, UART через Telnet с организацией виртуального порта на компьютере.

Re: ESP8266 wifi gate

Добавлено: Пн окт 10, 2016 1:05 pm
sergejey
serghei писал(а):Здравствуйте. То есть насколько я понял ESP подключаем к любой ардуине ( в том числе с АМС ) и по Wi-Fi передаем данные в МД, которые сыплются в сериал порт? Вообще шикарно получается. Надо только разобраться со скетчем и знать ,что необходимо дописать для отправки.
Да, всё что сыплется в сериал порт можно отправить по http на любой сервер. Только желательно установить фильтр, чтобы на самом деле не всё отправлять.

Для отправки ничего дописывать не нужно (на стороне скетча по крайней мере), всё уже там есть.

Re: ESP8266 wifi gate

Добавлено: Пн окт 10, 2016 1:09 pm
sergejey
Alex писал(а):Отличное решение.
Мне в этой связи было бы интересно узнать три вещи:
1. Какие ещё интерфейсы (и как) можно использовать для связи Arduino-ESP
Я использовал serial на стандартных пинах, чтобы скетчи ардуиновские не нужно было править при подключении этого устройства. Можно использовать SoftSerial на нестандартных портах. Возможно, ещё какие-то интерфейсы, но я не пробовал.
Alex писал(а):2. Как из ESP сделать прозрачный Wi-Fi шилд для любой Ардуины
Именно для этого и задумано устройство. К любой ардуине подключаем указанный девайс на ESP и получаем трансляцию по http всего, что ардуина выводит через Serial.println. Ну и возможность отправки обратных команд.
Alex писал(а):3. Как можно связать 2 Ардуины, чтобы получить контроллер 2 в 1
По Serial самое простое. А через SoftSerial можно хоть целую кучу их связать для обмена сообщениями.

Re: ESP8266 wifi gate

Добавлено: Пн окт 10, 2016 7:31 pm
Pooh
sergejey писал(а): ...* Настройка пересылки данных http-запросом (адрес посылки, фильтр)
* Отправка данных в подключенный контроллер с помощью HTTP API (запрос на http://шлюз/send?data=даные)..
А почему не MQTT?

Re: ESP8266 wifi gate

Добавлено: Пн окт 10, 2016 8:41 pm
sergejey
Pooh писал(а):
sergejey писал(а): ...* Настройка пересылки данных http-запросом (адрес посылки, фильтр)
* Отправка данных в подключенный контроллер с помощью HTTP API (запрос на http://шлюз/send?data=даные)..
А почему не MQTT?
Можно и MQTT, это не принципиально. Лично мне проще с http, т.к. не надо дополнительно устанавливать брокер.

Re: ESP8266 wifi gate

Добавлено: Пн окт 10, 2016 10:21 pm
Alex
2. Как из ESP сделать прозрачный Wi-Fi шилд для любой Ардуины

Именно для этого и задумано устройство. К любой ардуине подключаем указанный девайс на ESP и получаем трансляцию по http всего, что ардуина выводит через Serial.println. Ну и возможность отправки обратных команд.
Тут не очень понятно. АМС работает на Меге и использует Езернет в качестве транспорта. Он же работает и на ESP и использует Wi-Fi в качестве транспорта.

Что нужно сделать, чтобы сервер работал на Меге, но в качестве транспорта использовал Wi-Fi ?

Тупо поменять

Код: Выделить всё

void sendErrorAnswer(char mess[], EthernetClient cl) {
  cl.print(mess);
  cl.println(F(" ERROR"));
  cl.println(F("Connnection: close"));
  cl.println();
} 
на

Код: Выделить всё

void sendErrorAnswer(char mess[]) {
  Serial.print(mess);
  Serial.println(F(" ERROR"));
  Serial.println(F("Connnection: close"));
  Serial.println();
} 
Или такой фокус не пройдёт?

Re: ESP8266 wifi gate

Добавлено: Вт окт 11, 2016 10:48 am
sergejey
Alex писал(а):
2. Как из ESP сделать прозрачный Wi-Fi шилд для любой Ардуины
Именно для этого и задумано устройство. К любой ардуине подключаем указанный девайс на ESP и получаем трансляцию по http всего, что ардуина выводит через Serial.println. Ну и возможность отправки обратных команд.
Тут не очень понятно. АМС работает на Меге и использует Езернет в качестве транспорта. Он же работает и на ESP и использует Wi-Fi в качестве транспорта.
Что нужно сделать, чтобы сервер работал на Меге, но в качестве транспорта использовал Wi-Fi ?

Тупо поменять

Код: Выделить всё

void sendErrorAnswer(char mess[], EthernetClient cl) {
  cl.print(mess);
  cl.println(F(" ERROR"));
  cl.println(F("Connnection: close"));
  cl.println();
}
на

Код: Выделить всё

void sendErrorAnswer(char mess[]) {
  Serial.print(mess);
  Serial.println(F(" ERROR"));
  Serial.println(F("Connnection: close"));
  Serial.println();
}
Или такой фокус не пройдёт?
Честно говоря, не очень понимаю, вопроса. Это устройство не замена оборудованию, которое уже имеет свой стек работы с сетью. Назначение шлюза лишь в том, чтобы пересылать вывод с подключенного контроллера (через Serial.println с учётом фильтра) на указанный в настройках шлюза URL в качестве http-уведомления (а не в браузер пользователя). Просто замена cl.println на Serial.println не подойдёт, т.к. у вас организован свой веб-интерфейс со своей логикой ответов в браузер мользователя. Шлюз предназначен для устройств у которых нет веб-интерфейса, а есть только обмен через Serial, как в примере в первом сообщении.