Как подключить ESP8266-01 (AT-команды) к его серверу с помощью AJAX

Я новичок в использовании AJAX на веб-сервере, у меня возникла ошибка при объявлении «сервера». Меня это смущает, потому что я только что использовал только AT-команды для использования ESP8266-01 (модуль Wi-Fi). Надеюсь, вы Может мне помочь, я хочу получить данные (расстояние) для печати на веб-сервере (странице) в режиме реального времени (без обновления). Поэтому я использовал для этого AJAX, но этот код по-прежнему является ошибкой. Заранее спасибо за любую помощь :)

 #include "NewPing.h"
 #include <SoftwareSerial.h>
 #define DEBUG true

 SoftwareSerial esp8266(10,11);
 #define TRIGGER_PIN 4
 #define ECHO_PIN 3
 #define MAX_DISTANCE 400

 NewPing sonar(TRIGGER_PIN,ECHO_PIN,MAX_DISTANCE);

 void setup() {
 Serial.begin (9600);
 Serial.println("START");
 esp8266.begin(9600);

 server.on("/",WebsiteContent);
 server.on("/xml",XMLcontent);
 server.begin();

 pinMode(TRIGGER_PIN, OUTPUT);
 pinMode(ECHO_PIN, INPUT);

 sendData("AT+RST\r\n",2000,DEBUG);
 sendData("AT+CWMODE=2\r\n",1000,DEBUG);
 sendData("AT+CIFSR\r\n",1000,DEBUG);
 sendData("AT+CIPMUX=1\r\n",1000,DEBUG);       
 sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG);


}

void javascriptContent(){
Javascript ="<SCRIPT>\n";
Javascript+="var xmlHttp=createXmlHttpObject();\n";
Javascript+="function createXmlHttpObject(){\n";
Javascript+="if(window.XMLHttpRequest){\n";
Javascript+="xmlHttp=new XMLHttpRequest();\n";
Javascript+="}else{\n";
Javascript+="xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');\n";
Javascript+="}\n";
Javascript+="return xmlHttp;\n";
Javascript+="}\n";
Javascript+="\n";
Javascript+="function response(){\n";
Javascript+="xmlResponse=xmlHttp.responseXML;\n";
Javascript+="xmldoc = xmlResponse.getElementsByTagName('data');\n";
Javascript+="message = xmldoc[0].firstChild.nodeValue;\n";
Javascript+="document.getElementById('div1').innerHTML=message;\n";
Javascript+="}\n";

Javascript+="function process(){\n";
Javascript+="xmlHttp.open('PUT','xml',true);\n";
Javascript+="xmlHttp.onreadystatechange=response;\n";
Javascript+="xmlHttp.send(null);\n";
Javascript+="setTimeout('process()',200);\n";
Javascript+="}\n";

Javascript+="</SCRIPT>\n";


}
void WebsiteContent(){
javascriptContent();

 Website="<html>\n";
 Website+="<style>\n";
 Website+="#div1{\n";
 Website+="width:400px;\n";
 Website+="margin:0 auto;\n";
 Website+="margin-top:130px;\n";
 Website+="font-size:900%;\n";
 Website+="color:powderblue;\n";
 Website+="}\n";
 Website+="</style>\n";
 Website+="<body onload='process()'>";
 Website+="<div id='div1'>"+data+"</div></body></html>";
 Website+=Javascript;
 server.send(200,"text/html",Website);
 }
 void XMLcontent(){

 XML ="<?xml version='1.0'?>";
 XML+="<data>";
 XML+=data;
 XML+="</data>";

 server.send(200,"text/xml",XML);

 }
 void loop()
 {

 delay(2000);  
 digitalWrite(TRIGGER_PIN, LOW);
 delayMicroseconds(2);
 digitalWrite(TRIGGER_PIN, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIGGER_PIN, LOW);

 long duration,distance;
 duration= pulseIn(ECHO_PIN,HIGH);

 distance = duration/58.2;

 data=(String)distance;
 delay(500); 

 server.handleClient();


 if(esp8266.available()) 
 {    
 if(esp8266.find("+IPD,"))
 {
 delay(1000);
 int connectionId = esp8266.read()-48;


 String cipSend = "AT+CIPSEND=";
 cipSend += connectionId;
 cipSend += ",";
 cipSend +=webpage.length();
 cipSend +="\r\n";
 sendData(cipSend,1000,DEBUG);
 sendData(webpage,1000,DEBUG);    
 String closeCommand = "AT+CIPCLOSE="; 
 closeCommand+=connectionId; 
 closeCommand+="\r\n";
 sendData(closeCommand,3000,DEBUG);

}
}
}
String sendData(String command, const int timeout, boolean debug)
{
String response = "";   
esp8266.print(command); 
long int time = millis();
while( (time+timeout) > millis())
{
  while(esp8266.available())
  {
    char c = esp8266.read(); 
    response+=c;
  }  
}
if(debug)
{
  Serial.print(command);
  Serial.print("> ");
  Serial.print(response);
}
return response;
}

, 👍0

Обсуждение

У вас действительно есть вопрос? И связано ли это с Arduino, а не с Javascript или HTML?, @Majenko

Я уже отредактировал это, сэр :) сэр, у вас есть какие-нибудь идеи по этому поводу?, @Xiaomy

Похоже, вы путаете собственный код ESP8266 с кодом Arduino., @Majenko

попробуйте добавить ESP8266WebServer server(80);, @abu-ahmed al-khatiri

@abu-ahmedal-khatiri Я тоже добавляю это раньше, но все равно ошибка., @Xiaomy

я не вижу вашего кода. вам нужно создать index.h для хранения данных в AJAX [см. мой заголовок](http://paste.ubuntu.com/p/48NvckZPQg/) и включить его в свой скетч [см. мой скетч](http: //paste.ubuntu.com/p/6SGvsDF29T/), @abu-ahmed al-khatiri

@Majko Я использовал AT-команды, потому что, когда я программирую ESP8266 (напрямую), он не работает и всегда появляется ошибка, поэтому я включаю AT-команды., @Xiaomy

как уже упомянутый @Majko ответил: «Чтобы использовать подобные конструкции, вам нужно запрограммировать ESP8266, а не Arduino, и тогда у вас не будет доступных AT-команд». Зачем вам нужны AT-команды, если вы можете напрямую хранить данные в сценарии AJAX?, @abu-ahmed al-khatiri

ах, так ваш пример @abu-ahmedal-khatiri подойдет, сэр?, @Xiaomy

@abu-ahmedal-khatiri, вы можете мне помочь, сэр? https://chat.stackexchange.com/rooms/85432/discussion-on-question-by-xiaomy-arduino-uno-with-esp8266-01-with-at, @Xiaomy

кто-нибудь может мне помочь с этим сервером ESP8266WebServer(80); это ошибка, потому что я использую AT-команды? потому что как только я удалю его, «серверные» методы тоже станут ошибкой. Есть ли здесь альтернативы?, @Xiaomy

как упоминалось в вашем вопросе: «Я хочу, чтобы данные (расстояние) печатались на веб-сервере (странице) в режиме реального времени (без обновления)». Я ДУМАЮ, что вы отобразите данные на веб-странице, и МОЙ ajaxcreated.h будет работать! если вы используете APP INVENTOR, AJAX не будет работать!, @abu-ahmed al-khatiri


1 ответ


1

Вы пытаетесь смешать код, предназначенный для запуска непосредственно на ESP8266, с использованием специфичных для ESP8266 библиотек на Arduino. Это никогда не сработает.

Нравится:

server.on("/",WebsiteContent);
server.on("/xml",XMLcontent);
server.begin();

предназначены для использования с библиотекой ESP8266WebServer ESP8266, которая не работает на Arduino. Чтобы использовать конструкции такого типа, вам нужно запрограммировать ESP8266, а не Arduino, и тогда у вас не будет доступных AT-команд.

Итак, либо:

  • Делайте это все только с помощью AT-команд или
  • Откажитесь от Arduino и вместо этого запрограммируйте ESP8266 напрямую.
,

Можете ли вы прислать мне ссылку на это в AT-командах?, @Xiaomy

Вы уже используете их в своем коде., @Majenko

Я думал там будет для AJAX или что, @Xiaomy

вы можете мне помочь, сэр?, @Xiaomy

Знаете ли вы, что на самом деле делают AT-команды, которые есть в вашем эскизе?, @Majenko

я могу использовать его как альтернативу для непосредственного кодирования esp8266., @Xiaomy

Да, но знаешь, что они **делают**? Что они имеют в виду**?, @Majenko

Удалите весь «сервер» и другой мусор, который вы случайно добавили, а затем решите, как вы можете использовать то, что ESP8266 отправляет вам, когда вы запрашиваете веб-страницу, чтобы решить, что вам следует отправлять и когда вам следует это отправлять., @Majenko