• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Как сделать reset esp8266-1

Статус
В этой теме нельзя размещать новые ответы.

Denisww

New member
По моему я переигрался командой AT+CIOBAUD

Не могу вспомнить какую скорость установил. Не могу подобрать

Уже перебирал +100. Не могу найти

Может есть ресет ? Не шил.
 

JustACat

Moderator
Команда форума
Denisww, есть - перепрошивка :-Р Перепрошейте ту же AT, если вы на ней сидите, и всего делов.
 

JustACat

Moderator
Команда форума
Denisww, извините, имелось ввиду, что используете в данный момент AT прошивку.
 

Denisww

New member
Правильно ли я понимаю, что управлять с помощью ардуино через АТ команды не есть гут?
Эффективней писать "скетчи"непосредственно в esp8266, в обход АТ команд? К примеру , если требуется большая скорость.
Или есть другие причины, почему быстрее 100ms я не могу формировать ответ HTTP?

я посылаю с помощью Ардуино в ESP8266 АТ команды:
+++++скорость порта 57600++++++
_SS_MAX_RX_BUFF=256

# reset module> AT+RST>
[HASHTAG]#1220[/HASHTAG] 0\0:Яo-'ю…Ж„EЈШ )ДҐЏ9хМ
[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready

# test esp8266>AT OK
# speed baud>
[HASHTAG]#1538[/HASHTAG] 0\0:AT+CIOBAUD=?

+CIOBAUD:(9600-921600)
OK

# test esp8266>AT OK
# configure for multiple connections 1>AT+CIPMUX=1 OK
# configure as access point to 2(1=Station, 2=AP, 3=All)>
[HASHTAG]#2008[/HASHTAG] 0\0:AT+CWMODE=2

no change

# turn on server on port 80>AT+CIPSERVER=1,80 OK
# version flash>
[HASHTAG]#2325[/HASHTAG] 0\0:AT+GMR

0018000902-AI03
OK

# get ip address>
[HASHTAG]#2484[/HASHTAG] 0\0:AT+CIFSR

192.168.4.1
OK

# timeout 5>AT+CIPSTO=5 OK
# AT esp8266>AT OK
# AT esp8266>AT OK
[HASHTAG]#2951[/HASHTAG] 0\0:# flush()
# init end -----150-------------------------------------
# main loop ---------------------------------

Далее, если получаю запрос "+IPD", формирую ответ командой AT+CIPSEND, посылая:
AT+CIPSEND=0,144
HTTP/1.1 200 OK
Content-Type: text/html
Access-Control-Allow-Origin: *
Content-Length: 48

ARDUINO UNO
pin11=0
pin12=0
pin13=0
time=62
9may

Вот лог (формат # millis() available()\overflow()):
скорость ответа минимум 120 микросекунд!!!

[HASHTAG]#15285[/HASHTAG] 5\0:Link

# 11 99\0:..
Start loop [3]
# 31 203\0:++++++++++++++++++++++++ +IPD0
# 50 255\1: формирование ответа
# 58 244\0:ClearBuffer# 60 0\0:
# 63 0\0:send.>AT+CIPSEND=0,144 HTTP/1.1 200 OK......
# 142 155\0:send.. ok
# 143 155\0:++++++++++++++++++++++++
# 144 155\0:loop iteration end

# 147 154\0:ATIPSEND=0,144

> HTTP/1.1 200 OK
Content-Type: text/html
Access-Control-Allow-Origin: *
Content-Length: 48

ARDUINO UNOpin11=0pin12=0pin13=0time=629may
# 168 10\0:
SEND OK

[HASHTAG]#9876[/HASHTAG] 7\0:Unlink
 

Victor

Administrator
Команда форума
управлять с помощью ардуино через АТ команды не есть гут
именно так считают многие, но не все.
а вот с этой стоковой прошивкой точно нет смыла время тратить - только намаетесь, шейте новую
 

JustACat

Moderator
Команда форума
Denisww, хоть бы в спойлеры что ли закинули бы... Все одной простыней, даже читать не хочется... =/
 

Denisww

New member
Сделаю, завтра утром

Дайте пожалуйста ссылку на последнюю прошивку!!!!!
 

Victor

Administrator
Команда форума
Дайте пожалуйста ссылку на последнюю прошивку!!!!!
AT v0.23 SDK 1.0.1 остальные прошивки http://esp8266.ru/downloads/esp8266-firmware/#wpfb-cat-2

только некоторые AT команды работать не будут
Описание новых (v0.22) здесь. Для v0.23 на русском пока нет, но там добавлена только буферизация отправки данных, остальное без изменений.
 

Denisww

New member
В архиве +arduino_test_primer.html
Клиент PC для посылки сообщений в Arduino

как выкладывать скетчи?
 

Вложения

Victor

Administrator
Команда форума
как выкладывать скетчи?

4. Фото, видео, длинные тексты (код, логи и т.п.) прячьте под спойлер: [SPOILER]много текста или большая картинка[/SPOILER]
5. Код дополнительно помещайте в тег CODE с указанием языка программирования. Например, [SPOILER][CODE=C++]ваш код на С[/CODE][/SPOILER]
 

Denisww

New member
Основная проблема :):
Работа точки доступа ESP8266 не выдерживает нагрузочного тестирования!

Код:
#include <SoftwareSerial.h>

#include <avr/wdt.h>

#define DEBUG true
#define REQUEST_FASTTIME 150
#define CIPMUX 1// configure for multiple connections
#define CWMODE 2// режим configure as access point (1=Station, 2=AP, 3=All)
#define CIPSERVER_PORT 80
#define CIPSTO_TIMEOUT 5
#define BOUDFirst 57600 // скорость обмена по умолчанию 9600 или 38400 или 57600 или макс 921600
#define BOUD 57600 // моя максимальная скорость ESP with Arduino 57600
#define REQUEST_START "ARDUINO UNO"
#define REQUEST_END "9may"
#define CONNECTION ""
//#define CONNECTION "Connection: close\r\n"
//#define CONNECTION "Connection: keep-alive\r\n"
#define TEG_SERVER "";
//#define TEG_SERVER "Server: WebSevice\r\n";
#define TEG_REFRESH ""
//#define TEG_REFRESH "Refresh: 1\r\n"

long int time = millis(), time_1, time_2, time_3;
int loopIterat = 3;
boolean firstStop  = false;
SoftwareSerial esp8266(2, 3);


void setup()
{
  Serial.begin(57600);
  Serial.println("_SS_MAX_RX_BUFF="+String(_SS_MAX_RX_BUFF,DEC));

  if (BOUDFirst != BOUD){
    long b= BOUDFirst;
    String s  = "AT+CIOBAUD=" + String(BOUD, DEC);
    String r  = "";
    while(true){
      esp8266.begin(b);
      Serial.print("esp8266.begin = ");
      Serial.println(b, DEC);
      while(true){
        Serial.println(s);
        esp8266.println(s);
        Serial.println(esp8266.readString());
        if(b!=BOUDFirst)break;
      }
      esp8266.end();
    }   
  }
  esp8266.begin(BOUD);

  pinMode(11, OUTPUT);
  digitalWrite(11, LOW);

  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);

  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

  sendData("AT+RST", "reset module", 0);
  sendData("AT", "test esp8266", REQUEST_FASTTIME);
  sendData("AT+CIOBAUD=?", "speed baud", REQUEST_FASTTIME);

  if (DEBUG)sendData("AT", "test esp8266", REQUEST_FASTTIME);
  sendData("AT+CIPMUX=" + String(CIPMUX), "configure for multiple connections " + String(CIPMUX), REQUEST_FASTTIME);
  sendData("AT+CWMODE=" + String(CWMODE), "configure as access point to " + String(CWMODE) + "(1=Station, 2=AP, 3=All)", REQUEST_FASTTIME);
  sendData("AT+CIPSERVER=1," + String(CIPSERVER_PORT), "turn on server on port " + String(CIPSERVER_PORT), REQUEST_FASTTIME);
  sendData("AT+GMR", "version flash", REQUEST_FASTTIME);
  sendData("AT+CIFSR", "get ip address", REQUEST_FASTTIME);
  sendData("AT+CIPSTO=" + String(CIPSTO_TIMEOUT), "timeout " + String(CIPSTO_TIMEOUT), REQUEST_FASTTIME);
  if (DEBUG)sendData("AT", "AT esp8266", REQUEST_FASTTIME);
  //if(DEBUG)sendData("AT+CWLAP","View access point", 5000); //1 раз сработало
  //Serial.println("# delay(2000)");delay(2000);
  sendData("AT", "AT esp8266", REQUEST_FASTTIME);
  Serial.println(""); printTime();
  Serial.println("# flush()"); esp8266.flush();
  Serial.println("# init end -----"+String(REQUEST_FASTTIME,DEC)+"-------------------------------------");
  time_1 = millis(); time_2 = millis();
}

// Основной цикл- Ждем +IPD и выталкиваем буфер
void loop()
{
  Serial.println("# main loop ---------------------------------\n");
  //while(!esp8266.overflow()){
  while (true) {
    if (DEBUG) if (millis() - time_1 > 1000)Serial.println(printTime(time_1) + "second 1"); time_1 = millis();
    time = millis();
    char c = 0; long conId = 0;
    while (esp8266.available()) {
      time = millis();
      if ( ( c = esp8266.read() ) == '+' ) {
        while (esp8266.available()<64)delay(1);
        //if (!DEBUG) delay(10);
        //if(millis()-time_2>2000) Serial.println(printTime(time_2)+"available------second 2---------");time_2 = millis();
        if ( (c = esp8266.read()) == 'I' && (c = esp8266.read()) == 'P' && (c = esp8266.read()) == 'D' && (c = esp8266.read()) == ',')
        //if(esp8266.find("IPD,"))
        {
          //while(!esp8266.overflow()) delay(1);
          printTime();Serial.println("..");
          if (!firstStop) {
            Serial.println("Start loop [" + String(loopIterat++) + "]");
            firstStop = true;
          } else Serial.println("loop [" + String(loopIterat++) + "]");
          if (CIPMUX == 1)conId = esp8266.parseInt();
          if (DEBUG) {
            Serial.print(printTime() + "++++++++++++++++++++++++");
            Serial.print(" +IPD");
            Serial.println(conId);
          }
          //printTime();Serial.println(">");
          retriveOk(conId);
          //printTime();Serial.println(">>\n");
          if (DEBUG)Serial.println(printTime() + "loop iteration end");
        }
      } else if (DEBUG)if (c != 0)
        {
          if (millis() - time_3 > 10) {
            Serial.println("");
            printTime(time_3);
            Serial.print(c);
          }
          else Serial.print(c);
          time_3 = millis();
        }
    }
    //delay(50);
  }
}

void retriveOk(long connId)
{
  if (DEBUG)Serial.println(printTime() + "retriveOk");

  // ищем команду /set и номер pin=
  if ( esp8266.find(" /") && esp8266.read() == 's' && esp8266.find("pin=") )
  {
    int pin = esp8266.parseInt();
    if (DEBUG)Serial.print(printTime() + "Setup pin=");
    if (DEBUG)Serial.println(pin);
    digitalWrite(pin, digitalRead(pin) == LOW ? HIGH : LOW);
  }
  // чистим буфер
  if (DEBUG)printTime(); while (esp8266.available()) esp8266.read();
  if (DEBUG)Serial.print("ClearBuffer");
  if (DEBUG)Serial.println(printTime());

  String requestText = REQUEST_START;
  // собираем инфо для ответа
  for (int pin = 11; pin <= 13; pin++) {
    requestText += "\npin" + String(pin, DEC) + "=";
    requestText += digitalRead(pin) == HIGH;
  }
  requestText += "\ntime=" + String(millis() - time, DEC) + "\n";
  requestText += REQUEST_END;

  String request  = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nAccess-Control-Allow-Origin: *\r\n";
  request += TEG_SERVER;
  request += CONNECTION;
  request += TEG_REFRESH;
  request += "Content-Length: "; request += String(requestText.length(), DEC) + "\r\n";
  request += "\r\n" + requestText;
  // стартуем обмен данными
  String sSend = "AT+CIPSEND";
  if (CIPMUX == 1)sSend += "=" + String(connId, DEC) + ",";
  sSend += request.length();

  if (DEBUG)Serial.print(printTime() + "send.>");
  if (DEBUG)Serial.println(sSend+"\r\n"+request);
  esp8266.print(sSend+"\r\n"+request);
  if (DEBUG)Serial.println(printTime() + "send..");

  // Очиста буфера произойдет в основном цикле
  if (DEBUG)Serial.println(printTime() + "++++++++++++++++++++++++");
}

// Отправка команды
void sendData(String command, String comment, long int delayTime)
{
  Serial.print("\n# " + comment);
  if(delayTime == 0)Serial.print("> ");
  esp8266.println(command);
  String response = delayTime != 0 ? esp8266readString(delayTime) : esp8266.readString();
  {
    String ss = response; ss.trim();
    if (response.indexOf(command) < 0) Serial.println(command+">");
    else {
      ss.replace("\r\n\r\n", "\n");
      String sss=command+"\r\nOK";
      if( sss.equals(ss)){
        Serial.print(command+" OK");
        return;
      }
      Serial.println("");
    }
    printTime();
    if (response.length() > 0)Serial.println(ss); else Serial.println("response = >null");
  }
  return;
}

String printTime() {
  return printTime(time);
}
String printTime(long int time) {
  Serial.print("#");
  Serial.print(LeftPad(String(millis() - time, DEC), 4, " "));
  Serial.print(LeftPad(String(esp8266.available(), DEC), 4, " "));
  Serial.print("\\");
  Serial.print(esp8266.overflow());
  Serial.print(":");
  return "";
}

String LeftPad(String st, int n, String s) {
  if(st.length()>=n)return st;
  String ss = ""; for (int i = 0; i < n - st.length(); i++)ss += s; return ss + st;
}

String RightPad(String st, int n, String s) {
  if(st.length()>=n)return st;
  String ss = ""; for (int i = 0; i < n - st.length(); i++)ss += s; return st + ss;
}

// примеры рестарта Arduino
void(* resetFunc) (void) = 0;
void reboot() {
  wdt_disable();
  wdt_enable(WDTO_15MS);
  while (1) {}
}

void restart(String meesage) {
  Serial.println(printTime() + "Error!!!!Error!!!!Error!!!!Error!!!!");
  Serial.println(meesage);
  Serial.println(esp8266.readString());
  return;
  while (true) {
    String s = esp8266.readString();
    if (s.length() > 0)Serial.println(s);
  }
  reboot();
}

String esp8266readString(long int delayTime) {
  //Serial.print(", fast(" + String(delayTime) + ")>");
  Serial.print(">");
  String result = "";
  long int delayT = delayTime + millis();
  while (result.length()==0 || millis() <= delayT)
    while (esp8266.available()) {
      char c = esp8266.read();
      result += c;
    }
  return result;
}

String esp8266readString() {
  return esp8266readString(0);
}

void loop1() {
  if (esp8266.available()) Serial.print(esp8266.readString());
}
 

Вложения

Denisww

New member

 

Victor

Administrator
Команда форума
@Denisww, немного инфы (правда это не очень поможет преодолеть нагрузочные тесты, но все же)
[inline]SoftwareSerial esp8266(2, 3);[/inline]
попробуйте терминал на SoftwareSerial посадить, вывод в него подсократить, а esp8266 на UART. Попробуйте 115200 и выше
ну и парсинг для ардуины тяжел
[inline]if ( esp8266.find(" /") && esp8266.read() == 's' && esp8266.find("pin=") )[/inline]
 

Denisww

New member
Соглашусь, что на скорость ответа линейно влияет скорость обмена с ESP8266 и количество передаваемых данных.
по SoftwareSerial уже на 2-ух ESP8266 выставляю максимальную скорость 57600.
Стоит пробовать по UART ставить выше 115200 ?
Я боюсь, что получится аналогично теме поста. Переключится в более быстрый режим получится, а вернуться нет....
парсинг для ардуины тяжел
if ( esp8266.find(" /") && esp8266.read() == 's' && esp8266.find("pin=") )
Специальная конструкция...
" /" - есть всегда и ищется быстро,
наличие 's' проверяется быстро,
если 's' найдено , то ищется "pin=", которое тоже всегда есть и работает быстро..
 

JustACat

Moderator
Команда форума
Denisww, что-то вроде у вас сходится с этой вот темой. Может объединиться в поисках решений?
Стоит пробовать по UART ставить выше 115200 ?
С ESP работать только через HardwareSerial! SoftwareSerial для него слишком слабый и медленный. И на 115200.
Если при этом нужен дебаг на ПК - то его выводить уже через SoftwareSerial. Неудобно, но по-другому - никак.
Хотя еще вариант: взять другую дуину, с несколькими аппаратными UART для тестов.
 

pvvx

Активный участник сообщества
Основная проблема :):
Работа точки доступа ESP8266 не выдерживает нагрузочного тестирования!
Я правильно воспроизвел ваше незнание?
TIME_WAIT.gif
Советую почитать, как должно работать TCP соединение в любой из тем на форуме. Я у же устал объяснять эту фичу в TCP...
Для "демонстрации" вашей фичи, как не следует делать в TCP сервере, специально вставил баг в исходники, странслировал и снял скриншот...
 
Последнее редактирование:

Denisww

New member
Я правильно воспроизвел ваше незнание?
Посмотреть вложение 518
Советую почитать, как должно работать TCP соединение в любой из тем на форуме. Я у же устал объяснять эту фичу в TCP...
Для "демонстрации" вашей фичи, как не следует делать в TCP сервере, специально вставил баг в исходники, странслировал и снял скриншот...
Не понял, что за фичу Вы описываете. Прошу, точнее.
 

pvvx

Активный участник сообщества
Не понял, что за фичу Вы описываете. Прошу, точнее.
Разбиралась в каждой теме, где кто писал Web.
Вот правильная работа сервера, без нарушений спецификаций TCP:
TCP_ok.gif
Больше времени и счетчиков соединений с запросом-ответом ждать надоело - переполниться отладчик в Google Chrome :)
Возьмите название прошлого скрина и в поиск по форуму... Найдете пояснения с картинками и с видео.. :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу