У меня проблемы с отправкой данных на веб-сайт с ESP8266 (ESP-01) через Arduino с помощью AT-команд

Я отправляю запрос GET на свой веб-сайт через ESP8266 через команды Arduino AT. Я много искал в Google, но не смог найти хорошего решения.

Для первого цикла код работает нормально, но для следующего цикла код выдает ошибки. Другой тип Вот мой код:

#include <SoftwareSerial.h>
SoftwareSerial esp(2, 3); // Arduino RX:2, TX:3

String WIFI_SSID = "wifi_ssid";   //your network SSID
String WIFI_PWD  = "wifi_pass";    //your network password
String Domain = "www.example.com";

void setup() {
  Serial.begin(9600);
  Serial.println("Started....");
  esp.begin(9600);
  //esp.setTimeout(500);
  espAT("AT\r\n", 1000);
  espAT("AT+CWMODE=1\r\n", 1000);
  espAT("AT+CWJAP=\"" + WIFI_SSID + "\",\"" + WIFI_PWD + "\"\r\n", 5000);
  espAT("AT+CIPSTATUS\r\n", 1000);
  espAT("AT+CIPSTART=\"TCP\",\"" + Domain + "\",80\r\n", 5000);
}

void loop() {
  int val = rand() % 255;

  String request = "GET /iot/ HTTP/1.1\r\nHost: " + Domain + "\r\n\r\n";
  espAT("AT\r\n", 1000);
  espAT("AT+CIPSEND=" + String(request.length()+2) + "\r\n", 500);
  espAT(request, 200);
  String response = "";
  while (esp.available()) {
    response = esp.readStringUntil('0');
  }

  Serial.println(response);
  espAT("AT+CIPCLOSE\r\n", 0);
  delay(5000);
}


void espAT(String command, int waitFor)
{
  esp.print(command);
  int timeMillis = millis() + waitFor;
  while (timeMillis > millis()) {
    if (esp.available()) {
      Serial.write(esp.read());
    }

  }

}

person Ohidur    schedule 14.04.2018    source источник


Ответы (2)


Этот код здесь в этой инструкции работает для меня тихо эффективно.

#include <SoftwareSerial.h>
String ssid ="yourSSID";

String password="yourPassword";

SoftwareSerial esp(6, 7);// RX, TX

String data;

String server = "yourServer"; // www.example.com

String uri = "yourURI";// our example is /esppost.php

int DHpin = 8;//sensor pin

byte dat [5];

String temp ,hum;

void setup() {

pinMode (DHpin, OUTPUT);

esp.begin(9600);

Serial.begin(9600);

reset();

connectWifi();

}

//reset the esp8266 module

void reset() {

esp.println("AT+RST");

delay(1000);

if(esp.find("OK") ) Serial.println("Module Reset");

}

//connect to your wifi network

void connectWifi() {

String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";

esp.println(cmd);

delay(4000);

if(esp.find("OK")) {

Serial.println("Connected!");

}

else {

connectWifi();

Serial.println("Cannot connect to wifi"); }

}

byte read_data () {

byte data;

for (int i = 0; i < 8; i ++) {

if (digitalRead (DHpin) == LOW) {

while (digitalRead (DHpin) == LOW); // wait for 50us

delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1'

if (digitalRead (DHpin) == HIGH)

data |= (1 << (7-i)); // high front and low in the post

while (digitalRead (DHpin) == HIGH);

// data '1 ', wait for the next one receiver

}

} return data; }

void start_test () {

digitalWrite (DHpin, LOW); // bus down, send start signal

delay (30); // delay greater than 18ms, so DHT11 start signal can be detected

digitalWrite (DHpin, HIGH);

delayMicroseconds (40); // Wait for DHT11 response

pinMode (DHpin, INPUT);

while (digitalRead (DHpin) == HIGH);

delayMicroseconds (80);

// DHT11 response, pulled the bus 80us

if (digitalRead (DHpin) == LOW);

delayMicroseconds (80);

// DHT11 80us after the bus pulled to start sending data

for (int i = 0; i < 4; i ++)

// receive temperature and humidity data, the parity bit is not considered

dat[i] = read_data ();

pinMode (DHpin, OUTPUT);

digitalWrite (DHpin, HIGH);

// send data once after releasing the bus, wait for the host to open the next Start signal

}

void loop () {

start_test ();

// convert the bit data to string form

hum = String(dat[0]);

temp= String(dat[2]);

data = "temperature=" + temp + "&humidity=" + hum;// data sent must be under this form //name1=value1&name2=value2.

httppost();

delay(1000);

}

void httppost () {

esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//start a TCP connection.

if( esp.find("OK")) {

Serial.println("TCP connection ready");

} delay(1000);

String postRequest =

"POST " + uri + " HTTP/1.0\r\n" +

"Host: " + server + "\r\n" +

"Accept: *" + "/" + "*\r\n" +

"Content-Length: " + data.length() + "\r\n" +

"Content-Type: application/x-www-form-urlencoded\r\n" +

"\r\n" + data;

String sendCmd = "AT+CIPSEND=";//determine the number of caracters to be sent.

esp.print(sendCmd);

esp.println(postRequest.length() );

delay(500);

if(esp.find(">")) { Serial.println("Sending.."); esp.print(postRequest);

if( esp.find("SEND OK")) { Serial.println("Packet sent");

while (esp.available()) {

String tmpResp = esp.readString();

Serial.println(tmpResp);

}

// close the connection

esp.println("AT+CIPCLOSE");

}

}}
person Ohidur    schedule 19.04.2018

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

Бест, Одиссей

person Odysseas Lamtzidis    schedule 14.04.2018
comment
Я пробовал это раньше. Хотя это работало нормально, но мне нужно очень часто менять логику кода. И загружать код в модуль ESP-01 проблематично, поэтому я предпочитаю использовать AT-команды, так как код Arduino легко изменить. - person Ohidur; 14.04.2018