Post topics, source code that relate to the Arduino Platform

User avatar
By blacai
#13531 I am testing the wifi module esp8266 with my arduino uno. I made it work with direct connection RX/TX and through softwareserial.
This is my code:
Code: Select all#include <SoftwareSerial.h>
SoftwareSerial esp8266(3, 2); // RX | TX

#define DEBUG true

int ERROR_PIN = 7;
int OK_PIN = 6;

char serialbuffer[400];//serial buffer for request url
const String ssid = "XXX";
const String pw = "XXX";

int state = 0;

void setup()
{
    delay(1000);
    /**
    // init leds
    pinMode(ERROR_PIN, OUTPUT);
    pinMode(OK_PIN, OUTPUT);

    state = 0;

    digitalWrite(ERROR_PIN, HIGH);
    digitalWrite(OK_PIN, LOW);
    /**/
    // init ports
    Serial.begin(19200);
    Serial.println("initializing esp8266 port...");
    esp8266.begin(19200);
    delay(400);
    // init WIFI
    /**/
    while(!esp8266.available())
    {
        Serial.print("...");
        delay(300);
    }
    Serial.println();
    Serial.println("FINISH esp8266 initializing!");
    //
    /**
    digitalWrite(ERROR_PIN, LOW);
    digitalWrite(OK_PIN, HIGH);
    state = 1;
    /**/
    /**/
    // Setup connection
    sendData("AT+RST\r\n",2000,DEBUG);
    sendData("AT+CWMODE?\r\n",1000,DEBUG);
    //sendData("AT+CWMODE=1\r\n",2000,DEBUG);
    //sendData("AT+RST\r\n",3000,DEBUG);
    //sendData("AT+CWLAP\r\n",6000,DEBUG);
    sendData("AT+CWJAP=\"" + ssid + "\",\""+ pw +"\"\r\n",12000,DEBUG);
    sendData("AT+CIFSR\r\n",8000,DEBUG);
    sendData("AT+CIPMUX=1\r\n", 6000, DEBUG);
    webRequest("");
    /**/
    /**/
}

void loop()
{
    if (esp8266.available())
    {
        char c = esp8266.read() ;
        Serial.print(c);
        /**
        if(state == 0)
        {
            state = 1;
            digitalWrite(ERROR_PIN, LOW);
            digitalWrite(OK_PIN, HIGH);
        }
        /**/
    }
    else
    {
        /**
        if(state > 0)
        {
            state = 0;
            digitalWrite(ERROR_PIN, HIGH);
            digitalWrite(OK_PIN, LOW);
        }
        /**/
    }   
    if (Serial.available())
    { 
        char c = Serial.read();
        esp8266.print(c);
    }
}

//////////////////////////////////////////////////////////////////////////////
String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis();
    while( (time+timeout) > millis())
    {
        while(esp8266.available())
        {
            // The esp has data so display its output to the serial window
            char c = esp8266.read(); // read the next character.
            response+=c;
        }
    }
    if(debug)
    {
        Serial.print(response);
    }
    return response;
}
//////////////////////////////////////////////////////////////////////////////////
String webRequest(String url)
{
    String response = "";
    url = "www.google.es";
    //String tmpCommand = "AT+CIPSTART=4," + "\"TCP\",\"" + url + "\",80";
    String tmpSTARTCommmand = "AT+CIPSTART=0,\"TCP\",\"retro.hackaday.com\",80\r\n\r\n";
    String tmpGETCommand = "GET / HTTP/1.1\r\nHost: ";
    tmpGETCommand += "retro.hackaday.com";
    tmpGETCommand += ":80\r\n\r\n";
    String tmpSENDCommand = "AT+CIPSEND=0," + String(tmpGETCommand.length()) + "\r\n";
    sendData(tmpSTARTCommmand, 8000, DEBUG);
    sendData(tmpSENDCommand, 8000, DEBUG);
    sendData(tmpGETCommand, 15000, DEBUG);
}


This works until the point where I do the webrequest. I receive a Bad request response.

initializing esp8266 port...
.........
FINISH esp8266 initializing!
BâÂúØÐPÊþ^X8Â�Ä^Âú[8ÐûÈâ·CâËØè[8Ð{Èâ·GâÃØRÈ蚉5˜‰0

ready
AT+CWMODE?
+CWMODE:3

OK
AV®)AB•«Ë--mX·et","XXX"

OK
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:9b:c3:83"
+CIFSR:STAIP,"192.168.1.89"
+CIFSR:STAMAC,"18:fe:34:9b:c3:83"

OK
AT+CIPMUX=1

OK
AV%AMEÕÕ*$'²troÐ…�'½µ‰,80
0,CONNECT

OK
AVCIPSEND=0,47
> GE@/!QQAŠrŠ%åõÑ: ÊÑɽB�……¹½µÂ‚%\n\r\nbusy s...

SEND OK

+IPD,0,323:HTTP/1.1 400 Bad Request
Server: nginx/1.6.2
Date: Sat, 04 Apr 2015 16:17:29 GMT
Content-Type: text/html
Content-Length: 172
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>

OK
"qXÑzÂC!É 1âø‚h[•�™cü Ð Q!}Ñfócú I]Ø÷ÃBj 1¤(ÑÃÖa"K!~CóbÕ
ready


I recognize a "busy s..." just after the get in the cipsend.
AVCIPSEND=0,47
> GE@/!QQAŠrŠ%åõÑ: ÊÑɽB�……¹½µÂ‚%\n\r\nbusy s...

I also tried different approaches with the cipsend lenght and \r\n ... but always the same.

Any idea?
User avatar
By Suxsem
#13626 Can you post the output of
Serial.println("AT+CWJAP=\"" + ssid + "\",\""+ pw +"\"\r\n")
?

And

Serial.println(String("AT+CWJAP=\"") + ssid + "\",\""+ pw +"\"\r\n")
?
User avatar
By blacai
#13631
pete_l wrote:Instead of the code
Code: Select allString response = "";

in your senddata() routine, I'd suggest declaring a global buffer with a fixed size and reading the 8266 replies into that.

Also done, but no changes in output...

Suxsem wrote:Can you post the output of
Serial.println("AT+CWJAP=\"" + ssid + "\",\""+ pw +"\"\r\n")
?

And

Serial.println(String("AT+CWJAP=\"") + ssid + "\",\""+ pw +"\"\r\n")
?


They both return the same:

AT+CWJAP="heimnetzlannet","77041084"

AT+CWJAP="heimnetzlannet","77041084"

This is the ouput if I just run the AT commands directly to RX TX:
Code: Select allOK
AT+CWJAP="heimnetzlannet","77041084"

OK
AT+CIPMUX=1

OK
AT+CIPSTART=1,"TCP","hurl.it",80
1,CONNECT

OK
AT+CIPSEND=1,18
> GET / HTTP/1.0\r\n\r\nbusy s...

SEND OK