Пытается заставить ESP8266 на Arduino Uno надежно работать с AT-связью - PullRequest
1 голос
/ 16 марта 2020

Я изо всех сил пытаюсь подключить ESP8266 к Arduino Uno, надежно работающему в качестве веб-сервера. Прошивка моего ESP8266 - 1.1.1 - в данный момент у меня нет возможности (или знаний) обновить его. Ниже мой код. Это работает, только если я служу небольшой строке. Тем не менее, он обычно закрывает соединение или просто загружается навсегда (вылетает?), Если я пытаюсь загрузить страницу из браузера три или четыре раза. В конечном итоге мне нужно обслуживать веб-страницу со встроенным json, которая будет загружать вторую страницу, обслуживаемую файлом esp8266, json. У меня есть рабочая демонстрация этого, но он падает после нескольких поисков. Я понимаю, что моя страница html слишком длинна для строк, поэтому я пытался перейти на PROGMEM, сначала тестируя только с короткой строкой. Я храню и извлекаю это правильно (я думаю, по крайней мере, я могу Serial.print это), но как только я пытаюсь записать это в ESP8266, я получаю бесконечную загрузку в моем браузере.

Где я? Я здесь не так? Это - строка / PROGMEM, которая вызывает проблемы, или есть что-то еще, что я пропускаю в командах AT (как некоторый вид пинга, чтобы держать соединение открытым)?

//load softserial library
#include <SoftwareSerial.h>

#include <avr/pgmspace.h>


//set a boolean constant variable to true
//#define DEBUG true
const boolean DEBUG = true;

//RX (pin 2) goes to TX on esp8266, TX (pin 3) goes to RX on esp8266
SoftwareSerial esp8266(2, 3);

//input from the photoresistor
//int photoresistorpin = 0;

//create a PROGMEM variable
//String WEBPAGE = "hello";
static const char PROGMEM WEBPAGE[] = {"hello"};

/*
static const char WEBPAGE[] PROGMEM = R"rawliteral(
<html>
<head>
<meta name="viewport" content="width=device-width, minimumscale=1, maximum-scale=1, initial-scale=1">
</head>
  <h1>Light:</h1><div id="light"></div>
<script>
function loadDoc()
{
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) 
    {
      var obj = JSON.parse(this.responseText);
      document.getElementById('light').innerHTML = obj.data[0].datavalue;
    }
  };
xhttp.open('GET', 'data.json', true); xhttp.send();
}
var timedEvent = setInterval(function() { loadDoc(); }, 5000);
</script>
</body>
</html>
)rawliteral";
*/
//const int WEBPAGE_len = sizeof(WEBPAGE)/sizeof(WEBPAGE[0]);



void setup()
{
  //open the serial port
  Serial.begin(115200);

  //print setup started in the serial monitor
  Serial.println("Setup started");

  //start esp8266 module (note: your esp's baud rate might be different)
  esp8266.begin(115200);

  //reset esp8266 module
  senddata("AT+RST\r\n", 2000, DEBUG); 

  //set esp8266 as access point mode
  //1 = Station mode (client)
  //2 = Access point mode (host)
  //3 = Access point mode + Station mode
  senddata("AT+CWMODE=2\r\n", 1000, DEBUG); 

  //get ip address for esp8266
  senddata("AT+CIFSR\r\n", 2000, DEBUG);

  //configure esp8266 for multiple connections
  senddata("AT+CIPMUX=1\r\n", 1000, DEBUG);

  //turn on esp8266 server on port 80
  senddata("AT+CIPSERVER=1,80\r\n", 1000, DEBUG);

  //setup completed
  Serial.println("Setup done");
}


void loop()
{
  //take a reading from the photoresistor
  //int lightval = analogRead(photoresistorpin);
  int lightval = random(1000);

  //to test
  //Serial.println(lightval);

  //is the esp8266 sending a message 
  if (esp8266.available())
  {
    //if received data from esp8266
    if (esp8266.find("+IPD,"))
    {
      //subtract 48 because the read() function returns the ASCII decimal 
      //value and 0 (the first decimal number) starts at 48
      int connectionid = esp8266.read() - 48;

//Serial.println("");
//Serial.println("*****");
//Serial.print("string = ");

      //read the url sent by the client, look for the variable (/)
      String msg;
      esp8266.find("/");
      delay(100);
      msg = esp8266.readStringUntil(' ');
      String pathrequested = msg.substring(0);

Serial.println("*****");
Serial.println(pathrequested);
Serial.println("*****");


        //create a senddata string to send the webpage to the esp8266
        String cipsend = "AT+CIPSEND=" + String(connectionid) + ",";

        //cipsend += WEBPAGE.length();
        cipsend += strlen_P(WEBPAGE);
        cipsend += "\r\n";
        Serial.println(cipsend);

        char buffer[1000];
        strcpy_P(buffer, WEBPAGE);
        Serial.println(buffer);

        //senddata(cipsend, 500, DEBUG);
        //senddata(WEBPAGE, 500, DEBUG);
        senddata(buffer, 500, DEBUG);

        //create a string closecommand with the connection id and send it
        String closecommand = "AT+CIPCLOSE=" + String(connectionid) + "\r\n";
        senddata(closecommand, 500, DEBUG);

        //increment the count
        //count++;

    }
  }


}


void senddata(String command, const int timeout, boolean debug)
{
  //send the received command to the esp8266
  esp8266.print(command);

  //set int variable to the number of millisends since Arduino began
  long int time = millis();

  //while the time and the timeout is less than the number of millisends since Arduino began
  while((time + timeout) > millis())
  {
    //while the esp8266 is sending messages
    while(esp8266.available())
    {
      //display output in the serial window 
      Serial.write(esp8266.read());
    }  
  }
}

1 Ответ

1 голос
/ 17 марта 2020

Предполагая, что «получить бесконечную загрузку в моем браузере» означает отсутствие отображения в браузере - проверьте следующее:
1. Избавьтесь от конструкторов String amd String (+ =) в вашем коде и замените его на исправлен массив символов для построения сообщений. Подробнее: https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/
2. Мой опыт работы с интерфейсом AT был - более 9600 бод не надежны, и этого недостаточно для того, что вы хотите.
3. Если ваш Модуль Esp имеет минимум 512 КБ (скорее всего, до 4 МБ) для размещения вашего кода там и использует UNO только в качестве сигма-приемника / отправителя от подключенного оборудования / датчиков. Избавьте себя от многих неприятностей и проблем - большинство примеров с AT com на самом деле не работают, и больше боли в ***. Я отказался от интерфейса AT в течение 2 дней и ни разу за последние 4 года ничего не пропустил.
Благодаря прошивке кода для модуля Esp у вас также есть полный контроль и видимость того, что происходит благодаря возможности отладки ie И вы можете даже файл html / css / js в Файловой системе (LittleFS / SPIFFS)

...