Search code examples
tcparduinoesp8266at-commandarduino-esp8266

I am having trouble sending data to website from ESP8266 (ESP-01) via Arduino with AT commands


I am sending GET request to my website via the ESP8266 through Arduino AT commands. I have searched a lot on Google but couldn't come up with a good solution.

For the first loop the code works fine but for next loop the code gives errors. Different type Here is my code:

#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());
    }

  }

}

Solution

  • This code here in this instructable works for me quiet efficiently.

    #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");
    
    }
    
    }}