Перезагрузка ESP8266 через переключение RX

Тема в разделе "Arduino & Shields", создана пользователем atoha, 13 фев 2019.

Метки:
  1. atoha

    atoha Нуб

    Доброго дня!
    Не первый день бьюсь над проблемой.
    Собрал на базе ардуино Мега и ESP8266 12E подобие умного дома с датчиками, реле и управлением через wifi.
    И все бы здорово, но иногда ESP творит очень непонятную мне штуку.

    При прошивке / перезагрузке модуль зависает и не реагирует вообще ни на какие действия. На AT команды не приходит никакого ответа.

    Перезагружал как только мог! Отключал все - модуль, все питание на 3.3В, ардуину. все вместе. Даже отдохнув на следующий день не работает )

    Опытным путем неожиданно выяснил что его можно оживить переткнув провод на ардуине с RX1 на RX0, а потом выкл/вкл питание ESP.
    Я, конечно, могу наколхозить. Но хотелось бы разобраться в чем может быть дело.


    Подключение к ардуине такое:
    vcc 3.3B
    gnd на землю
    CH_PD через 10кОм к 3.3B
    RST через 10кОм к 3.3B
    GPIO15 через 10кОм к земле

    RX на ESP через делитель(чтобы было 3.3) на RX ардуины
    TX на ESP на TX ардуины

    Питание для ESP от блока питания на 2А.



    Думаю что дело не в скетче. Перепробовал много простых примеров. На всех может зависнуть.
    Подозреваю что при внезапном обрыве связи по Serial происходит какая-то хрень. А как потом завести модуль я не знаю.

    Пример кода который вешает модуль:

    Код (C++):
    #define DEBUG true
    void setup()
    {
      Serial.begin(115200);    ///////For Serial monitor
      Serial1.begin(115200); ///////ESP Baud rate
     
      pinMode(11,OUTPUT);    /////used if connecting a LED to pin 11
      digitalWrite(11,LOW);

      sendData("AT+RST\r\n",2000,DEBUG); // reset module
      sendData("AT+CWMODE=2\r\n",1000,DEBUG); // configure as access point
      sendData("AT+CIFSR\r\n",1000,DEBUG); // get ip address
      sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
      sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // turn on server on port 80
    }


    float sensetemp() ///////function to sense temperature.
    {
      int val = analogRead(A0);
      float mv = ( val/1024.0)*5000;
      float celcius = mv/10;
      return(celcius);
    }
    int connectionId;
    void loop()
    {
      if(Serial1.available())
      {
        /////////////////////Recieving from web browser to toggle led
        if(Serial1.find("+IPD,"))
        {
         delay(300);
         connectionId = Serial1.read()-48;
         if(Serial1.find("pin="))
         {
         Serial.println("recieving data from web browser");
         int pinNumber = (Serial1.read()-48)*10;
         pinNumber += (Serial1.read()-48);
         digitalWrite(pinNumber, !digitalRead(pinNumber));
         }
     
        /////////////////////Sending data to browser
        else
        {
          String webpage = "<h1>Hello World</h1>";
          espsend(webpage);
         }
       
         if(sensetemp() != 0)
         {
           String add1="<h4>Temperature=</h4>";
          String two =  String(sensetemp(), 3);
          add1+= two;
          add1+="&#x2103";   //////////Hex code for degree celcius
          espsend(add1);
         }
       
         else
         {
          String c="sensor is not conneted";
          espsend(c);                                    
         }
       
         String closeCommand = "AT+CIPCLOSE=";  ////////////////close the socket connection////esp command
         closeCommand+=connectionId; // append connection id
         closeCommand+="\r\n";
         sendData(closeCommand,3000,DEBUG);
        }
      }
    }
      //////////////////////////////sends data from ESP to webpage///////////////////////////
    void espsend(String d)
             {
                 String cipSend = " AT+CIPSEND=";
                 cipSend += connectionId;
                 cipSend += ",";
                 cipSend +=d.length();
                 cipSend +="\r\n";
                 sendData(cipSend,1000,DEBUG);
                 sendData(d,1000,DEBUG);
             }

    //////////////gets the data from esp and displays in serial monitor///////////////////////        
    String sendData(String command, const int timeout, boolean debug)
                {
                    String response = "";
                    Serial1.print(command);
                    long int time = millis();
                    while( (time+timeout) > millis())
                    {
                       while(Serial1.available())
                          {
                             char c = Serial1.read(); // read the next character.
                             response+=c;
                          }
                    }
                   
                    if(debug)
                         {
                         Serial.print(response); //displays the esp response messages in arduino Serial monitor
                         }
                    return response;
                }
     

    Плиз хэлп! :eek:
     
  2. Daniil нравится это.
  3. Вы не подумайте, я написал это не просто так, в ранее предложенной мной теме Вам помогут больше, чем в этой.
    И.........Удачи;)
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Такое варварское использование esp 8266в качестве модема?Спорим код не Ваш?
    1Обновить прошивку esp8266
    2Переписать Говнокод в новом коде использовать аппаратный USART (Serial)
    3Убрать Ардуино Мега как лишнее звено.Если мало выводов можно использовать расширитель портов.
    4В разделе тем esp 8266 почитать ИгоряК. Тогда усе вопросы отпадут сами по себе.Этот пункт лучше сделать первым.
     
    Последнее редактирование: 14 фев 2019
  5. atoha

    atoha Нуб

    Код не мой. Он для примера. От моего кода у вас и кровь из глаз политься может :)
    Я не профи ни в програмировании, ни в микроэлектронике. С чего-то надо начинать.
    Спасибо за советы. Пойду читать ИгоряК.
    И попробую залить новую прошивку.
     
  6. atoha

    atoha Нуб

    Спасибо, так и сделаю!
    Только сначала выполню советы airbus.