Как подключить WiFi Модуль AI Thinker ESP82266MOD ?

Тема в разделе "Arduino & Shields", создана пользователем codingmonkey, 4 сен 2015.

  1. codingmonkey

    codingmonkey Нерд

    Кто-нибудь подключал такой в Arduino Uno?

    В видео в принципе тот же самый чип.
    https://www.youtube.com/watch?t=384&v=7BYdZ_24yg0
    Просто платка с внешней антенной и без каких либо ножек. походу их паять нужно самому по краям к контактам (
    И схем подключения я что-то так и не нашел.
     
  2. codingmonkey

    codingmonkey Нерд

    Сегодня решил продолжить разбираться этим модулем
    Обнаружил целое тайное сообщество посвященное этому чипу - esp8266 :confused: ))
    http://esp8266.ru

    Определился с тем что у меня 07 версия (с внешней большой антенной) а всего версий 12 вариантов.
    Подключил ее прозрачно через свою дурину уно по схеме из статьи ниже.
    http://esp8266.ru/esp8266-podkluchenie-obnovlenie-proshivki/#esp8266-setup
    правда пришлось смотреть на распиновку 01 версии и искать соответствующие пины(дыры) у 07 версии
    подключал проводами папа-папа прямо так без какой -либо пайки и установки куда либо на макет
    в добавок GPOI15 нужно "поднятуть" на землю(GND) иначе WiFi не стартует (в статье об этом написано)
    AT команды отправлял из Arduino IDE. CoolTerm - неасилил(
    Для правильной работы нужно выставить Both NL & CR и 115200 baud
    Ввести - AT
    Получить - OK
    ...

    И теперь самый важный (итог) вопрос: Как мне её использовать так же легко как и блютуз модуль ?
    На черта вся эта ересь с прозрачным подключением и конфигурирование? Я хочу писать код для дурины и там использовать Serial Read/Write чтобы принимать и отправлять данные с соединенным компом.
    Не ужели вообще никто еще не использовал wifi модули ?
     
  3. ИгорьК

    ИгорьК Гуру

    Я много использовал. Но не как АТ транслятор, а как самостоятельный модуль на Lua. На сайте есть про это.
     
  4. codingmonkey

    codingmonkey Нерд

    Я мельком глянул вашу тему где вы "вразумляете дом".
    Много чего интересного, но как мне кажется для моих простых начальных задач использовать столько middle-war'a и кастомные прошивки для wi-fi модуля это будет какой-то подвид оверинжинеринга.

    И так моя простая задача:
    Написать программу на C++/C# для настольконо ПК которая будет соединятся с wi-fi модулем через sockets
    и принимать / отправлять данные от / к арудуине т.е. ESP82266 тут нужна лишь для передачи данных.
    на ардуине для чтения/записи должен использовать serial.h

    Правильно ли понимаю что для начала мне нужно:
    1. сконфигурировать/настроить модуль использую команды AT. задать пароли/явки, скорости, флаги мульти подключения и т.д.

    2. подключить (уже с другой разводкой по схеме??) для работы на прием / передачу к RX пинам TX Arduin'ы.

    Кстати еще хотел поинтересоваться:
    А какой пароль идет по умолчанию к точке доступа?
    И почему некоторые AT-команды ничего не возвращают в консоли либо возвращают ошибку, хотя прошивка вроде достаточно свежая стоит version 0.25 + SDK 1.1.1 и весь набор AT по идее должен поддерживаться.
     
  5. ИгорьК

    ИгорьК Гуру

    Упс... Вопросов много. Что касается меня, то я никогда не использовал модуль в режиме АТ команд, хотя поначалу казалось, что вот оно - счастье.
    Поскольку модуль имеет свои мозги, он умеет делать, ИМХО, 80% того, что и Ардуино. Поэтому и зашёл к нему со стороны программирования, а не транслятора.
    Если Вы все таки имеете задачу, которую модуль сам сделать не может, то, полагаю, Вам надо подойти к решению вот как: стандартный GPRS модуль работает с Ардуино также через АТ команды. Попробуйте разобраться с его примерами, а потом по аналогии действовать.
    что касается молчания модуля на АТ команды - то проблема настройки терминала. Пользуйтесь Esplorer - будет хорошо.
     
    codingmonkey нравится это.
  6. codingmonkey

    codingmonkey Нерд

    точно захорошело )

    Получилось создать SoftAP поднять сервер на модуле на 80-й порт.
    Подключить ПК к этой точке. Немного поотправлял и попринимал всякие строчки текста.
    Для отправки со стороны ESP-07 использовал ESPlorer
    На стороне ПК для теста использовал SocketTest http://sockettest.sourceforge.net/
    В общем все по этой статье http://geektimes.ru/post/241054/
     
    Последнее редактирование: 27 сен 2015
  7. codingmonkey

    codingmonkey Нерд

    Я вот думаю если я его подключу чтобы WiFi точка работала в своем штатном режиме(заранее настроенном), а пины я повешаю на дуринины RT-TX. Дурина будет же получать все то что получает модуль? А то пока что модуль до сих пор сидит прозрачно на дурине (т.е. reset дурины на земле)
     
  8. codingmonkey

    codingmonkey Нерд

    посадил ESP-07 на 10 11 пины дурины для Serial read
    основные RX TX оставил для IDE Serial Monitor.
    Схема получилась такая:
    ESP ---> ARDUINO UNO
    TXD0 ---> 10 пин
    RXD0 ---> 11 пин

    EN(он же Enabled = CH_PW) ---> 3.3v
    VCC ---> 3.3v
    GND --> GND
    GPIO15 ---> GND

    Скетч написал такой:
    Код (C++):
    #include <SoftwareSerial.h>

    #define WFTX 10
    #define WFRX 11
    #define SERIAL_SPEED 115200

    SoftwareSerial wfSerial(WFTX, WFRX);

    void setup()
    {

        Serial.begin(SERIAL_SPEED);
        wfSerial.begin(SERIAL_SPEED);
        delay(500);
        wfSerial.println("AT+RST");
        delay(500);
        wfSerial.println("AT+CIPMUX=1");
        delay(500);
        wfSerial.println("AT+CIPSERVER=1,80");
        delay(200);
     
    }

    void loop()
    {
      wfSerial.listen();
      bool gotData = false;

      while (wfSerial.available() > 0) {
        char inByte = wfSerial.read();
        Serial.write(inByte);
        gotData = true;
      }

      if (gotData)
      {
        Serial.println(".........");
      //delay(100);
      }
    }
    По скетчу видно что дурина инициализирует сервер. т.к. после старта WiFi модуля он выключен.
    и помемуто он стартует только с AT+CIPMUX=1. Все это дело запускается, я подключаю ПК к точке. Запускаю SocketTest соединяюсь, посылаюсь строчки несколько одних и тех же строк подряд:

    выхлоп Arduino IDE Serial monitor
    Спрашивается откуда этот левый 0 (02345) взялся и иногда пробегает всякий мусор? но в основном все работает как надо.
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Ну, все гуд.
    Но вот смотрите, Вы грузите Ардуино созданием сервера или, наоборот, клиента. И клиента, и сервер, и MQTT клиента, и просто TCP клиента можно создать и на ESP8266 c прошивкой NodeMCU. Причем с этой прошивкой модуль сам подхватывает wifi если происходит разрыв соединения или потеря электричества.
    Данные для всего этого безобразия можно получать с Ардуино по UART. Ардуине, при этом остается больше ресурсов.
    ИМХО, ради этого стоит разобраться с ESP8266 поглубже, в том числе и для того, чтобы во многих случаях обходиться без Ардуино вообще.
     
  10. codingmonkey

    codingmonkey Нерд

    Скачал 4A-ESP8266__AT Instruction Set__EN_v0.25_copy.pdf
    http://esp8266.ru/download/esp8266-doc/4A-ESP8266__AT Instruction Set__EN_v0.25.pdf

    Т.к я уже говорил ранее у меня ESP-07 с версией

    AT version:0.25.0.0(Jun 5 2015 16:27:16)
    SDK version:1.1.1

    Внимание в ESPlorer забиваю после удачного подключения т.е AT - OK
    Команды:
    1. AT+UART_CUR=? -> ERROR
    2. AT+UART_DEF=? -> ERROR
    3. AT+UART_DEF=9600 -> ERROR
    плин, думаю была еще другая в примере из старых AT 0.2x > http://geektimes.ru/post/241054/
    4. Смотрим AT+CIOBAUD=? доступные скорости -> ERROR
    5. тогда насильно задаем AT+CIOBAUD=9600 ->OK (только после перезагрузки модуля это слетает, т.к. она не коннектится с ESPlorer на такой скорости после ребута, постоянно только с 115200 )
    Я все-таки надеялся на то что AT+UART_DEF прокатит, он должен по идее сохранять скорость UART (между выключениями).


    >обходиться без Ардуино вообще.
    Да я уже понял что это супер компьютер по сравнению с дуриной, но мне нужна пока именно работа на дурине.
     
  11. geher

    geher Гуру

    Суперкомпьютером там не пахнет. Относительно слабенький МК, большая часть мощи которого завязана на обслуживание WiFi.
    Но для простых вещей, вроде дергать пару датчиков и куда-нибудь посылать результаты более чем достаточно.
     
  12. codingmonkey

    codingmonkey Нерд

    Я читал что её еще и разгоняют. По умолчанию 40Мгц vs 16Мгц у дурины

    Кажется у меня сработала команда AT+CIOBAUD=9600,8,1,0,0
    и после чего благополучно отвалился сам ESPlorer т.к. он похоже не поддерживает такие низкие скорости и не может сконнектиться с модулем. Лол

    подключил прозрачно через дурину. Попробовал через её Arduino Serial Monitor покомандовать - все работает.

    AT+CIOBAUD=9600,8,1,0,0 -> OK - выше пока не хочу буду тестировать на наличие мусора в данных
     
    Последнее редактирование: 28 сен 2015
    ИгорьК нравится это.
  13. codingmonkey

    codingmonkey Нерд

    В общем листая мануал по командам AT я вычитал что посылать строчку нужно после особого приглашения ">". т.е. в сумме если результат команды "AT+CIPSEND=0" = "OK" и за ним ниже следует ">" - шлем данные. Теперь у меня в клиенте все пучком данные не рвутся чёрти как.

    Код (C++):

    #include <SoftwareSerial.h>

    #define WFTX 10
    #define WFRX 11

    //#define SERIAL_SPEED 115200
    //#define SERIAL_SPEED 57600
    #define SERIAL_SPEED 9600
    //#define SERIAL_SPEED 74880
    String cmdEnd ="\r\n";
    //

    SoftwareSerial wfSerial(WFTX, WFRX);
    bool gotData = false;
    unsigned long int l = 0;

    bool SendToClient(String s)
    {
      bool retOk = false;
      //bool retError = false;
      bool retBusy = false;

      wfSerial.print( "AT+CIPSEND=0," + String(s.length()) + cmdEnd );
      delay(10);
      retOk = wfSerial.find("OK");
      //retError = wfSerial.find("ERROR");

      if (retOk)
      {
        Serial.println("debug: find(OK) = true");

        if (wfSerial.find(">"))
        {
          Serial.println("debug: find(>) = true");

          wfSerial.print( s + cmdEnd );
          delay(10);
          return wfSerial.find("SEND OK");
        }
      }
      else
      {
        return false;
      }
    }

    void setup()
    {

        Serial.begin(SERIAL_SPEED);
        wfSerial.begin(SERIAL_SPEED);
        wfSerial.print("AT+RST" + cmdEnd);
        delay(1000);
        wfSerial.print("AT+CIPMUX=1" + cmdEnd);
        delay(200);
        wfSerial.print("AT+CIPSERVER=1,80" + cmdEnd);
        delay(200);
    }

    void loop()
    {
      wfSerial.listen();

      while (wfSerial.available() > 0) {
        char inByte = wfSerial.read();
        //if( inByte != '\r' && inByte != '\n')  // ignore trailing CR and LF
        //{
          Serial.write(inByte);
        //}
        gotData = true;
      }

      if (gotData)
      {
        Serial.println(".........");
        gotData = false;
      //delay(100);
      }

      if (l < millis())
      {
        l = millis() + 10000; //каждые 10 секунд отправляем клиенту строчку
        SendToClient(F("test string 123456789\r\n"));
      }
    }
    Однако, если отправлять с клиента на ESP то в Arduino IDE Serial Monitor видно что данные идут не целиком, а частями по 2-3 байта и между ними мои точки Serial.println(".........") - как определитель пакетов;
    Что за фигня такая пока не пойму(
     
    Последнее редактирование: 28 сен 2015
    ИгорьК нравится это.
  14. codingmonkey

    codingmonkey Нерд

    Все теперь все в норме. Там и там данные не рвутся.
    Текущий скетч.
    Код (C++):

    #include <SoftwareSerial.h>

    #define WFTX 10
    #define WFRX 11

    //#define SERIAL_SPEED 115200
    //#define SERIAL_SPEED 57600
    #define SERIAL_SPEED 9600
    #define MAX_BUFF_SIZE 128
    //#define SERIAL_SPEED 74880
    String cmdEnd ="\r\n";
    //

    SoftwareSerial wfSerial(WFTX, WFRX);
    bool gotData = false;
    unsigned long int l = 0;

    bool SendToClient(String s)
    {
      bool retOk = false;
      //bool retError = false;
      bool retBusy = false;
     
      wfSerial.print( "AT+CIPSEND=0," + String(s.length()) + cmdEnd );
      delay(50);
      retOk = wfSerial.find("OK");
      //retError = wfSerial.find("ERROR");
     
      if (retOk)
      {
        Serial.println("debug: find(OK) = true");

        if (wfSerial.find(">"))
        {
          Serial.println("debug: find(>) = true");

          wfSerial.print( s + cmdEnd );
          delay(50);
          return wfSerial.find("SEND OK");
        }
      }
      else
      {
        return false;
      }
    }

    void setup()
    {

        Serial.begin(SERIAL_SPEED);
        wfSerial.begin(SERIAL_SPEED);
        wfSerial.print("AT+RST" + cmdEnd);
        delay(1000);
        wfSerial.print("AT+CIPMUX=1" + cmdEnd);
        delay(200);
        wfSerial.print("AT+CIPSERVER=1,80" + cmdEnd);
        delay(200);
    }

    void loop()
    {
      wfSerial.listen();
       
      while (wfSerial.available() > 0)
      {
        if (wfSerial.find("+IPD"))
        {    
          char dataLen[8];
          int readed = wfSerial.readBytesUntil(':', dataLen, 8);
          String sData(dataLen);
          int lenBegin = sData.lastIndexOf(',');
          String sLen = sData.substring(lenBegin + 1);
          char clientIndex = sData[1];
         
          Serial.println("got +IPD");
          Serial.println("from client index: " + String(clientIndex));
          Serial.println("from client data len: " + String(sLen));
         
          char buff[MAX_BUFF_SIZE] = {0};
          int readed2 = wfSerial.readBytes(buff, sLen.toInt());
          Serial.println(String(buff));
          gotData = true;
        }
     
     
        char inByte = wfSerial.read();
      }
     
      if (gotData)
      {
        Serial.println(".........");
        gotData = false;
      //delay(100);
      }
     
      unsigned long int m = millis();
     
      if (l < m)
      {
        l = millis() + 2000; //каждые 10 секунд отправляем клиенту строчку
        if (SendToClient("test string"+ String(m) +"\r\n"))
        {
          Serial.println("SEND OK");
        }
        else
        {
          Serial.println("SEND ERROR");
        }
      }
    }
    Просто если что-то есть с вайфая ( wfSerial.available() > 0 ) нужно ловить "+IPD" и парсить её параметры.
    И читать только то что прислали для этой команды.

    В добавок разобрался то что "AT+CIOBAUD=9600,8,0,0" - изменяет скорость работы по Serial-UART до момента выключения модуля или его ресета.
    А команда "AT+UART=9600,8,0,0" - сохраняет дефолтный режим работы даже после выключения модуля.
     
    Последнее редактирование: 28 сен 2015
    ИгорьК нравится это.
  15. codingmonkey

    codingmonkey Нерд

    Хотел посадить получившийся макет на батарейку - крону и отнести подальше от ПК чтобы проверить дальность связи.
    Но что-то крона не вывозит этот макет гаснет через 5 сек. но фишка в том что если я отрубаю GPOI15 от земли вроде работает гораздо дольше. Но опять же, модуль без соединения этого GPIO15 c землей не работает (точки не видно).
    Что это за GPOI15 и почему он так садит схему? Может быть я что-то не так соединил? Тут куча этих GPIO-шек есть.
     
  16. ИгорьК

    ИгорьК Гуру

    А 10К резистор добавили в промежуток? Попробуйте.
     
    codingmonkey нравится это.
  17. codingmonkey

    codingmonkey Нерд

    Да он у меня уже стоял 10Ком между землей Arduino (GND) и GPIO15
    Просто с ним на 5 секунд дольше работает и медленно угасает.
     
  18. ИгорьК

    ИгорьК Гуру

    Чтобы модуль питать от батарейки, его надо отправлять в режим сна, и пробуждать периодически. Надо заметить, что хотя модуль и имеет такой режим - особой энергоэффективностью при этом не отличается. Создавался он все таки не для этого. А тем более, если Вы его спарили с Ардуино.
    Плюс, Вы же его не напрямую к батарейке подключили? Значит на каком-то линейном модуле происходит "сжигание" лишних 5 вольт в виде тепла. Крона сама по себе батарейка слабенькая. Мне кажется - все нормально. Так и должно быть.
     
    Последнее редактирование: 28 сен 2015
  19. codingmonkey

    codingmonkey Нерд

    Да, сон наверное как-то поможет сберечь заряд батарайки, но мне бы просто успеть сконнектиться с модулем на батарейке, а то у меня так и не вышло на ней сконнектиться она быстрее садиться чем происходит соединение ) К тому же я тестировал "Enter deep-sleep mode" AT+GSLP=5000 (спустя 5 сек уснуть) модуль перестает откликаться на AT команды, но красный индикатор постоянно горит, странная экономия однако.

    Чесно говоря я уже потом плюнул на батарейку и прокинул 2-е переноски метров на 20+ длиной в общем.
    Взял зарядку от телефона 5V - 1A воткнул в дурину, а ESP уже на её пине 3.3В сидит.
    И честно говоря дальность "никакущая" два уровня сигнала, раз на 2-й или 3-й соединяется с ПК SocketTest получает одну строчку с макета и тут же рвет соединение и так постоянно.

    Я тут подумал что используя встроенный слабый ноутбучный вайфай с esp-07 особой дальности связи не добьёшься, поэтому решил взять не используемый роутер(sagemcom slow@2804) и на базе него сделать общую точку доступа для обоих, уже к которой будет подключаться ESP-07 и ноут.
    Может быть в этом случае дальше будет "бить" сигнал ?
     
  20. ИгорьК

    ИгорьК Гуру

    Ну... Вы же должны "наиграться" :)
    Возможно Вы через некоторое время придете к следующему выводу: ESP8266 предназначена для работы в условиях хорошего сигнала wifi, через роутер. Дальность у нее не то чтобы никакущая, но сильно зависит от качества сети.