• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Зависает esp8266-01 + arduino mega2560

Всем привет! Сегодня столкнулся с такой проблемой:
Думаю кто-нибудь знает о такой среде разработки мобильных приложений, как app inventor 2.
В ней есть компонент "web". C помощью него я отправляю GET запрос на esp. Казалось-бы: что тут такого? Дело в том, что когда я захожу на интерфейс esp с компьютера- все работает! Кнопки нажимаются, реле включаются)) Но когда я отправляю GET запрос с телефона, через свое приложение написанное на app inventor - ESP`шка зависает т.е, я не могу попасть в ее веб-интерфейс, пока не перезагружу ардуину, но что самое интересное, GEt запросы проходят и реле щелкают, но веб-интерфейс не работает, а он мне нужен, для получения данных с датчика температуры.

Скетч такой:
P.s не обращайте внимание на строку, в которой не заполнено имя точки доступа и пароль.

Код:
HardwareSerial & ESPport = Serial;

const int ledPin =  13;
const int ledPin12 =  12;
const int ledPin9 =  9;
int ledState = HIGH;
int ledState12 = HIGH;
int ledState9 = HIGH;          
#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];
String vklotkl;
String vklotkl12;
String vklotkl9;
int temp = 22; // переменная, которой будет присваиваться значения например с датчика температуры
void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin9, OUTPUT);  
  ESPport.begin(115200); // ESP8266 
  clearSerialBuffer();
  GetResponse("AT+RST",3400); // перезагрузка ESP
  GetResponse("AT+CWMODE=1",300); // режим клиента  
  GetResponse("AT+CSYSWDTENABLE",300); // сторож
  connectWiFi("myrouter","parolparol"); // подключаемся к домашнему роутеру (имя точки, пароль)
  GetResponse("AT+CIPMODE=0",300); // сквозной режим передачи данных.
  GetResponse("AT+CIPMUX=1",300); // multiple connection.
  GetResponse("AT+CIPSERVER=1,88", 300); // запускаем ТСР-сервер на 88-ом порту
  GetResponse("AT+CIPSTO=3", 300); // таймаут сервера 3 сек
  GetResponse("AT+CIFSR", 300); // узнаём адрес
  digitalWrite(ledPin,ledState); 
  digitalWrite(ledPin12,ledState12);
  digitalWrite(ledPin9,ledState9);
}
///////////////////основной цикл, принимает запрос от клиента///////////////////
void loop()
{
int ch_id, packet_len;
char *pb; 
ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
 
if(strncmp(buffer, "+IPD,", 5)==0)
  {
   sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
   if (packet_len > 0)
    {
      pb = buffer+5;
      while(*pb!=':') pb++;
      pb++;
     
      if(strncmp(pb, "GET / ", 6) == 0)
       {
        clearSerialBuffer();
        otvet_klienty(ch_id);
       }     
     
      //D13
      if(strncmp(pb, "GET /a", 6) == 0)
       {
        clearSerialBuffer();
       
        if(ledState == LOW)
          {
            ledState = HIGH;
            vklotkl = "VKL";
          }
       
        else
          {
            ledState = LOW;
            vklotkl = "OTKL";
          }
       
        digitalWrite(ledPin, ledState);
        otvet_klienty(ch_id);
       }
      
      //D12
      if(strncmp(pb, "GET /b", 6) == 0)
       {
        clearSerialBuffer();
       
        if(ledState12 == LOW)
          {
            ledState12 = HIGH;
            vklotkl12 = "VKL";
          }
       
        else
          {
            ledState12 = LOW;
            vklotkl12 = "OTKL";
          }
       
        digitalWrite(ledPin12, ledState12);
        otvet_klienty(ch_id);
       }  
 
      //D9
      if(strncmp(pb, "GET /c", 6) == 0)
       {
        clearSerialBuffer();
       
        if(ledState9 == LOW)
          {
            ledState9 = HIGH;
            vklotkl9 = "VKL";
          }
       
        else
          {
            ledState9 = LOW;
            vklotkl9 = "OTKL";
          }
       
        digitalWrite(ledPin9, ledState9);
        otvet_klienty(ch_id);
       }      
      
    }
  }
  clearBuffer();
}
//////////////////////формирование ответа клиенту////////////////////
void otvet_klienty(int ch_id)
{
  String Header;

  Header =  "HTTP/1.1 200 OK\r\n";
  Header += "Content-Type: text/html\r\n";
  Header += "Connection: close\r\n"; 
 
  String Content;
 
  Content = "<html><body>";
  Content += "<form action='a' method='GET'>D13 <input type='submit' value='VKL/OTKL'> " + vklotkl + "</form>";
  Content += "<form action='b' method='GET'>D12 <input type='submit' value='VKL/OTKL'> " + vklotkl12 + "</form>";
  Content += "<form action='c' method='GET'>D9   <input type='submit' value='VKL/OTKL'> " + vklotkl9 + "</form>";
  Content += "<br />Temp: " + String(temp) + " C";
  Content += "</body></html>";
 
  Header += "Content-Length: ";
  Header += (int)(Content.length());
  Header += "\r\n\r\n";
 
  ESPport.print("AT+CIPSEND="); // ответ клиенту
  ESPport.print(ch_id);
  ESPport.print(",");
  ESPport.println(Header.length()+Content.length());
  delay(20);

  if(ESPport.find(">"))
    {
      ESPport.print(Header);
      ESPport.print(Content);
      delay(200);
    }
}
/////////////////////отправка АТ-команд/////////////////////
String GetResponse(String AT_Command, int wait)
{
  String tmpData;
 
  ESPport.println(AT_Command);
  delay(wait);
  while (ESPport.available() >0 ) 
   {
    char c = ESPport.read();
    tmpData += c;
   
    if ( tmpData.indexOf(AT_Command) > -1 )        
      tmpData = "";
    else
      tmpData.trim();      
         
   }
  return tmpData;
}
//////////////////////очистка ESPport////////////////////
void clearSerialBuffer(void)
{
       while ( ESPport.available() > 0 )
       {
         ESPport.read();
       }
}
////////////////////очистка буфера////////////////////////
void clearBuffer(void) {
       for (int i =0;i<BUFFER_SIZE;i++ )
       {
         buffer[i]=0;
       }
}
////////////////////подключение к wifi/////////////////////       
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
{
  String cmd = "AT+CWJAP=\"";
  cmd += NetworkSSID;
  cmd += "\",\"";
  cmd += NetworkPASS;
  cmd += "\"";
 
  ESPport.println(cmd);
  delay(6500);
}

Подскажите, почему программа так работает)
 
Сверху Снизу