• Система автоматизации с открытым исходным кодом на базе 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 :)
Возьмите название прошлого скрина и в поиск по форуму... Найдете пояснения с картинками и с видео.. :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу