ESP8266: HTTP GET Requests

The objective of this post is to explain how to perform GET Requests using the ESP8266.


Introduction

The objective of this post is to explain how to perform GET Requests using the ESP8266. If you prefer a video explanation, you can check my YouTube channel:

The tests were performed using a NodeMCU board, a very cheap and easy to use ESP8266 board.


Setup

First, we need do include some libraries. Naturally, we need the ESP8266WiFi library, which provides us the methods to connect to a WiFi network.

Then, we need the ESP8266HTTPClient library, which provides methods to send HTTP requests. The header file for the ESP8266HTTPClient library can be seen here.

#include <esp8266wifi.h>
#include <esp8266httpclient.h>

On the setup function, we connect to the WiFi Network. We also start a Serial connection for debugging. More details about how to connect to a WiFi network using the ESP8266 are explained in this previous post.

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup () {

Serial.begin(115200);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);
Serial.print("Connecting..");

}

}


The main code

The code for the request will be specified in the main loop function. First, we declare an object of class HTTPClient, which we will simply call http. This class provides the methods to create and send the HTTP request.

HTTPClient http;

After that, we call the begin method on the http object and pass the URL that we want to connect to and make the GET request. The destination website specified here implements a dummy REST API for testing and prototyping.

http.begin("http://jsonplaceholder.typicode.com/users/1");

Then, we send the request by calling the GET method on the http object. This method will return the status of the operation, which is important to store for error handling. If the value is greater than 0, then it’s a standard HTTP code. If the value is less than 0, then it’s a client error, related with the connection. All available error codes for this method are listed here.

int httpCode = http.GET();

So, if the code is greater than 0, we can get and print the response payload, by calling the getString method on the http object.

String payload = http.getString();
Serial.println(payload);

Finally, we call the end method. This is very important to close the TCP connection and thus free the resources.

http.end();

The final complete code is shown bellow. You just need to put your network name and network password.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup () {

Serial.begin(115200);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);
Serial.print("Connecting..");

}

}

void loop() {

if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status

HTTPClient http;  //Declare an object of class HTTPClient

http.begin("http://jsonplaceholder.typicode.com/users/1");  //Specify request destination
int httpCode = http.GET();                                                                  //Send the request

if (httpCode > 0) { //Check the returning code

String payload = http.getString();   //Get the request response payload
Serial.println(payload);                     //Print the response payload

}

http.end();   //Close connection

}

delay(30000);    //Send a request every 30 seconds

}

The output of the program is shown in figure 1. The response corresponds to a JSON payload.

ESP8266 GET Request

Figure 1 – Output of the GET Request.

Finally, it’s important to take in consideration that the microcontroller has a limited amount of resources and thus it is not able to handle very large results. So, it is not expected that it will be used to make and process requests to sites that return a lot of information, as a typical browser would do.


Technical details

ESP8266 libraries: v2.3.0

314 thoughts on “ESP8266: HTTP GET Requests”

  1. Hi, I tried your code, but my monitor show things like this:
    ———————————————————————————–
    Connecting..
    Connecting..
    Connecting..
    200 // httpCode

    ——————————————————————————————
    My payload is strange, do you know what’s the problem?

  2. Hi, I tried your code, but my monitor show things like this:
    ———————————————————————————–
    Connecting..
    Connecting..
    Connecting..
    200 // httpCode
    ——————————————————————————————
    My payload is strange, do you know what’s the problem?

  3. html
    head
    meta http-equiv=’refresh’ content=’1; url=http://jsonplaceholder.typicode.com/users/3&arubalp=91c4147b-74cb-4485-8af4-a79f9975fc’
    /head
    /html

        1. My browser can receive the payload correctly as shown in the tutorial.The problem is my ESP8266, My URL is correct but my ESP8266 still prints the HTML tags as payload(not the texts my browser shows). I don’t know why.

        2. After refreshing to the new URL, my httpCode change to 302(redirect), with no payload, I currently stuck at here, don’t know how to response to httpCode 302

          1. Hi! That’s really weird, I’ve just copied and pasted the code on my IDE and uploaded it to a ESP8266 NodeMCU board and it works just fine.

            Can you please tell me which version of the Arduino libraries are you using? Can you please also paste the main loop function here?

            Maybe there is a problem with the character encoding or something with the Arduino IDE. May I ask in what language is your IDE? I never faced a problem like this but if you are copying and pasting the code without success, there may be something with the URL characters.

            Can you send requests to other websites?

            1. I finally solve the problem… that all because I connected to a network that is not working, I change another available WiFi and everything just works perfectly. Thanks for helping me with this somehow silly problem πŸ™‚

              1. Hi! I’m glad the problem is solved πŸ™‚ Let me know if you need anything more.
                Good programming!

                Best regards,
                Nuno Santos

  4. html
    head
    meta http-equiv=’refresh’ content=’1; url=http://jsonplaceholder.typicode.com/users/3&arubalp=91c4147b-74cb-4485-8af4-a79f9975fc’
    /head
    /html

        1. My browser can receive the payload correctly as shown in the tutorial.The problem is my ESP8266, My URL is correct but my ESP8266 still prints the HTML tags as payload(not the texts my browser shows). I don’t know why.

        2. After refreshing to the new URL, my httpCode change to 302(redirect), with no payload, I currently stuck at here, don’t know how to response to httpCode 302

          1. Hi! That’s really weird, I’ve just copied and pasted the code on my IDE and uploaded it to a ESP8266 NodeMCU board and it works just fine.
            Can you please tell me which version of the Arduino libraries are you using? Can you please also paste the main loop function here?
            Maybe there is a problem with the character encoding or something with the Arduino IDE. May I ask in what language is your IDE? I never faced a problem like this but if you are copying and pasting the code without success, there may be something with the URL characters.
            Can you send requests to other websites?

            1. I finally solve the problem… that all because I connected to a network that is not working, I change another available WiFi and everything just works perfectly. Thanks for helping me with this somehow silly problem πŸ™‚

              1. Hi! I’m glad the problem is solved πŸ™‚ Let me know if you need anything more.
                Good programming!
                Best regards,
                Nuno Santos

  5. Hi, I would like to control a LED based on the contents of a google document. I need to read that file- which is basically a single line file. I tried your code and it is working fine. Now the problem is how to get that json parsing line (“http://jsonplaceholder.typicode.com/users/1”). I searched a lot, but in vain. Can you please help me..

    1. Hi! Awesome, never tried to make a request to a google document!

      As for the parsing of JSON, check here in another post how to do it with the ESP8266 and a very easy to use library:
      https://techtutorialsx.com/2016/07/30/esp8266-parsing-json/

      If you need more complex parsing, such as arrays:
      https://techtutorialsx.com/2016/08/06/esp8266-parse-json-arrays/

      If you need the other way around, check here how to encode JSON with the ESP8266:
      https://techtutorialsx.com/2016/08/10/esp8266-encoding-json-messages/

      Hope it helps!

  6. Hi, I would like to control a LED based on the contents of a google document. I need to read that file- which is basically a single line file. I tried your code and it is working fine. Now the problem is how to get that json parsing line (“http://jsonplaceholder.typicode.com/users/1”). I searched a lot, but in vain. Can you please help me..

    1. Hi! Awesome, never tried to make a request to a google document!
      As for the parsing of JSON, check here in another post how to do it with the ESP8266 and a very easy to use library:
      https://techtutorialsx.com/2016/07/30/esp8266-parsing-json/
      If you need more complex parsing, such as arrays:
      https://techtutorialsx.com/2016/08/06/esp8266-parse-json-arrays/
      If you need the other way around, check here how to encode JSON with the ESP8266:
      https://techtutorialsx.com/2016/08/10/esp8266-encoding-json-messages/
      Hope it helps!

  7. Hello
    I just have a small question. How will the code identify the connected pins of the ESP8266 to the Arduino board?

    1. Hi!

      I’m sorry I’m not sure if I understood your question. In this code we don’t use any digital pins of the board.

      If you are asking about using the ESP8266 in the Arduino IDE, then it is done for us in the background, we don’t need to worry about the details. Basically, the Arduino IDE will know that the code is being compiled for the ESP8266, and use the correct compiler / set of tools needed.

      This code was designed to work in a ESP8266 board, not in a Arduino one.

      Hope it answers your question. If not, please let me know.

      1. Yes it did thank you a lot. I mixed it up for I am using the ESP8266 WiFi module connected to an Arduino UNO board. Speaking of which, I stumbled trying to send a GET request but I’m out of luck. It doesn’t seem to work and I’ve tried and searched through many links.
        I successfully connected to a website using “AT+CIPSTART” command but after that I can’t figure out exactly what needs to be done. I used the “AT+CIPSEND=” but I can’t really tell the exact structure of the GET request string before getting its length. I am really sorry I know my problem became off topic with respect to your post but I’m desperate for help and would highly appreciate it.

        1. No problem, let me see if I can help πŸ™‚

          First of all, what you are seeing here is code for the ESP8266 and not for the Arduino boards, as I’ve mentioned.

          Nevertheless, we are using the Arduino development environment because Ivan Grokhotkov started a project to support the ESP8266 development on the Arduino IDE that has grown a lot with the support of the community. So, we don’t need to worry about setting complicated toolchains and we can use the Arduino language / development environment we are used to, in order to program the ESP8266.

          So, if you want to start programming your ESP8266 from scratch instead of using the pre-loaded AT commands firmware you are using, please consult the tutorial bellow. Just take in consideration that if you upload a program to the ESP8266, the AT commands firmware will be erased.
          https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

          I really recommend that approach since you will have much more control of your programs and you can develop them to suit your needs.

          I used the AT commands firmware a couple of years ago, when the ESP8266 was still being sold as a Arduino serial to Wifi adapter and we didn’t now it was a fully programmable microcontroller. At that time, the firmware was considerably unstable and so I moved to the Arduino environment, as many others did.

          I only recently used the firmware again to do some tests on a board and I think its much more stable, but I still prefer to develop under the Arduino environment or other, such as mycropython.

          Hope I have convinced you to change to another environment πŸ™‚ but if not, I think the best way is that you build the HTTP request string in a variable and simply get the size with the function bellow:
          https://www.arduino.cc/en/Reference/StringLength

          You will need to figure out the structure of the whole HTTP request for the site you are trying to reach, put it into a string and then getting the length. If your request is dynamic, you will need to build the string with the different parts and then get the size in the end.

          Note that what the firmware is doing with the AT commands is establishing a socket connection with the server, and you are going to need to send the whole HTTP request on top of that.

          Also, take in consideration that we cannot connect to HTTPS websites, because of the encryption.

          1. Hello again and thanks for your effort in replying.
            I am actually trying to send the http GET request manually through writing the AT commands directly onto the serial monitor before moving to code. Testing wise I found it better this way before
            the implementation of the code. All respective commands for ESP8266-01 – Website communication are done successfully except for the GET request part.
            The first link you put is good in case I am using the ESP8266-01 module as a generic board, but I am not. Actually it’s connected to the RX TX of the Arduino UNO board along with other sensors and components.
            I took the length of the GET request now what remains is actually sending it but once I receive the “>” sign on the serial monitor, I enter the request but it disappears (it doesn’t appear on the monitor when I hit enter) and though it shows “SEND OK” it still did not send anything (the path of the link is a tested PHP script that adds a value to a database).
            Thanks for your advice but unfortunately I’m still out of luck. The website I’m trying to the send the request to is also not encrypted.

            1. Hi! As for the link, as long as you can program the ESP8266, you can develop the architecture of the system as you want. The only difference is that instead of using a pre-built firmware, you develop your own program for the ESP. You can still develop a program to receive data from an Arduino Uno, connect to a website, send the data, receive the response and send it back to the Arduino, I did something similar in a smart medication dispenser I built some time ago, where the Arduino Mega was running all the sensors and the ESP was just dealing with the communication. Nevertheless, I developed a custom program from the ESP, for more control.

              As for your problem with the AT command, maybe it is related with the delay between you sending the CIPSEND command, receive the “>” and then sending the actual data. I used the firmware a long ago for socket connections, but I have a slight idea of facing some problems with the command on the serial monitor.

              Other thing, are you sending the \r\n at the end of the actual data? It may be also needed and also accounted in the size of the content passed to the CIPSEND.

              Also, just for debugging, have you tried to send the command to other website, just for checking if something happens?

              I’ve been also searching for some libraries for the Arduino and I think you can use one similar to the shown bellow to interact with the ESP8266. It hides some of the AT commands details and probably guarantees the synchronization of the send command.
              https://github.com/itead/ITEADLIB_Arduino_WeeESP8266

  8. Hello
    I just have a small question. How will the code identify the connected pins of the ESP8266 to the Arduino board?

    1. Hi!
      I’m sorry I’m not sure if I understood your question. In this code we don’t use any digital pins of the board.
      If you are asking about using the ESP8266 in the Arduino IDE, then it is done for us in the background, we don’t need to worry about the details. Basically, the Arduino IDE will know that the code is being compiled for the ESP8266, and use the correct compiler / set of tools needed.
      This code was designed to work in a ESP8266 board, not in a Arduino one.
      Hope it answers your question. If not, please let me know.

      1. Yes it did thank you a lot. I mixed it up for I am using the ESP8266 WiFi module connected to an Arduino UNO board. Speaking of which, I stumbled trying to send a GET request but I’m out of luck. It doesn’t seem to work and I’ve tried and searched through many links.
        I successfully connected to a website using “AT+CIPSTART” command but after that I can’t figure out exactly what needs to be done. I used the “AT+CIPSEND=” but I can’t really tell the exact structure of the GET request string before getting its length. I am really sorry I know my problem became off topic with respect to your post but I’m desperate for help and would highly appreciate it.

        1. No problem, let me see if I can help πŸ™‚
          First of all, what you are seeing here is code for the ESP8266 and not for the Arduino boards, as I’ve mentioned.
          Nevertheless, we are using the Arduino development environment because Ivan Grokhotkov started a project to support the ESP8266 development on the Arduino IDE that has grown a lot with the support of the community. So, we don’t need to worry about setting complicated toolchains and we can use the Arduino language / development environment we are used to, in order to program the ESP8266.
          So, if you want to start programming your ESP8266 from scratch instead of using the pre-loaded AT commands firmware you are using, please consult the tutorial bellow. Just take in consideration that if you upload a program to the ESP8266, the AT commands firmware will be erased.
          https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/
          I really recommend that approach since you will have much more control of your programs and you can develop them to suit your needs.
          I used the AT commands firmware a couple of years ago, when the ESP8266 was still being sold as a Arduino serial to Wifi adapter and we didn’t now it was a fully programmable microcontroller. At that time, the firmware was considerably unstable and so I moved to the Arduino environment, as many others did.
          I only recently used the firmware again to do some tests on a board and I think its much more stable, but I still prefer to develop under the Arduino environment or other, such as mycropython.
          Hope I have convinced you to change to another environment πŸ™‚ but if not, I think the best way is that you build the HTTP request string in a variable and simply get the size with the function bellow:
          https://www.arduino.cc/en/Reference/StringLength
          You will need to figure out the structure of the whole HTTP request for the site you are trying to reach, put it into a string and then getting the length. If your request is dynamic, you will need to build the string with the different parts and then get the size in the end.
          Note that what the firmware is doing with the AT commands is establishing a socket connection with the server, and you are going to need to send the whole HTTP request on top of that.
          Also, take in consideration that we cannot connect to HTTPS websites, because of the encryption.

          1. Hello again and thanks for your effort in replying.
            I am actually trying to send the http GET request manually through writing the AT commands directly onto the serial monitor before moving to code. Testing wise I found it better this way before
            the implementation of the code. All respective commands for ESP8266-01 – Website communication are done successfully except for the GET request part.
            The first link you put is good in case I am using the ESP8266-01 module as a generic board, but I am not. Actually it’s connected to the RX TX of the Arduino UNO board along with other sensors and components.
            I took the length of the GET request now what remains is actually sending it but once I receive the “>” sign on the serial monitor, I enter the request but it disappears (it doesn’t appear on the monitor when I hit enter) and though it shows “SEND OK” it still did not send anything (the path of the link is a tested PHP script that adds a value to a database).
            Thanks for your advice but unfortunately I’m still out of luck. The website I’m trying to the send the request to is also not encrypted.

            1. Hi! As for the link, as long as you can program the ESP8266, you can develop the architecture of the system as you want. The only difference is that instead of using a pre-built firmware, you develop your own program for the ESP. You can still develop a program to receive data from an Arduino Uno, connect to a website, send the data, receive the response and send it back to the Arduino, I did something similar in a smart medication dispenser I built some time ago, where the Arduino Mega was running all the sensors and the ESP was just dealing with the communication. Nevertheless, I developed a custom program from the ESP, for more control.
              As for your problem with the AT command, maybe it is related with the delay between you sending the CIPSEND command, receive the “>” and then sending the actual data. I used the firmware a long ago for socket connections, but I have a slight idea of facing some problems with the command on the serial monitor.
              Other thing, are you sending the \r\n at the end of the actual data? It may be also needed and also accounted in the size of the content passed to the CIPSEND.
              Also, just for debugging, have you tried to send the command to other website, just for checking if something happens?
              I’ve been also searching for some libraries for the Arduino and I think you can use one similar to the shown bellow to interact with the ESP8266. It hides some of the AT commands details and probably guarantees the synchronization of the send command.
              https://github.com/itead/ITEADLIB_Arduino_WeeESP8266

  9. I think my problem is with the ESP8266-01 module itself. I bought 2 so far and couldn’t get them to work. I tried literally everything but the modules I have aren’t of good quality they started lagging and not always they were able to recognize the DNS. My friends are working with the ESP8266 NodeMCU board and I’m thinking of getting one. What’s your opinion? And also does this post should (if not must) work with that latter board right?

    Thank you for your time and help. I am probably switching hardware and thanks for convincing me! (if that’s what you meant earlier by changing to another environment).

    1. Just to clarify a thing, both the ESP8266-01 and the NodeMCU use the same microcontroller, the ESP8266. Those are just different boards built around the same microcontroller.

      So, all the code you see in my blog in the “ESP8266” category should work fine in any of them. Naturally, there may be a detail or another, but I try to leave a warning when we need to consider something additional specific to a certain board.

      The NodeMCU is a very good board and I have been using it for most of my posts on the ESP8266. The advantage is that it already has an USB header and you just need an USB cable to interact with it, which includes programming it.

      Besides that, it has all of the pins of the ESP8266 exposed, so you can use it as an “arduino”. Many people use the ESP8266 just as a Serial to WiFi converter, but the ESP8266 is actually much more powerful than most of the microcontrollers used in the Arduino boards. Most of the things you can do with an Arduino board you can do with an ESP8266 board, with the advantage of having WiFi built in.

      I think it is a very good option for you to move to the NodeMCU, but I also recommend you to program it with the Arduino IDE instead of using the AT commands. That’s what I meant when recommending you to change the environment πŸ™‚ The AT commands have always been a little unstable and you typically end up with a more complex program because you need to be parsing strings from the answers of the commands.

      The link I shared before with the tutorial to move to the Arduino IDE covers the ESP-01 as hardware because at the time I wrote it it was the most used board. Now with the NodeMCU boards, we really just need an USB cable to connect it to a computer.

      Nevertheless, from the Arduino IDE Configuration section bellow are the generic instructions for installing the ESP8266 support for the Arduino IDE. You will only need to choose the correct board on the boards manager (in your case it will be the NodeMCU) because the upload configurations may vary from board to board. But the IDE takes care of everything as long as we choose the correct board.
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

      I think it’s still working fine, but the latest instructions from the creators of the ESP8266 libraries for the Arduino IDE are bellow, if you prefer:
      https://github.com/esp8266/Arduino#installing-with-boards-manager

      Let me know if you succeed with the NodeMCU πŸ™‚

      1. Actually I’ve managed to solve my issue thanks to your advice (really this time). Approaching it by code, the http GET request was sent correctly. I thought it’s a ESP8266-01 since I followed several tutorials that used AT commands and successfully sent a request but mine did not. Eventhough I tried several Arduino IDE approaches (by code) I wasn’t successful at first until now

        Still, I will get a NodeMCU just as a backup plan and I will follow your instructions. Thanks a lot if it wasn’t for you I would’ve have gave it another try with the Arduino IDE.

        Here’s the link that I followed http://blog.huntgang.com/2015/01/20/arduino-esp8266-tutorial-web-server-monitor-example/#comment-5758

        Now that remains is that I need to get the response from the ESP-01 and type it again just to keep track in front of me of what’s happening. That link was great but it didn’t get back the responses.. I guess this is my next step. Thanks again for your assistance mate.

        1. You’re welcome, I’m glad it is working fine πŸ™‚ I think you will like the NodeMCU, it’s much more easy to use than the ESP-01.

          Also, if you like Internet of Things, keep an eye for the ESP32 boards, it’s the ESP8266 big brother and it’s much much more powerful. πŸ™‚

          Good luck with your project!

  10. I think my problem is with the ESP8266-01 module itself. I bought 2 so far and couldn’t get them to work. I tried literally everything but the modules I have aren’t of good quality they started lagging and not always they were able to recognize the DNS. My friends are working with the ESP8266 NodeMCU board and I’m thinking of getting one. What’s your opinion? And also does this post should (if not must) work with that latter board right?
    Thank you for your time and help. I am probably switching hardware and thanks for convincing me! (if that’s what you meant earlier by changing to another environment).

    1. Just to clarify a thing, both the ESP8266-01 and the NodeMCU use the same microcontroller, the ESP8266. Those are just different boards built around the same microcontroller.
      So, all the code you see in my blog in the “ESP8266” category should work fine in any of them. Naturally, there may be a detail or another, but I try to leave a warning when we need to consider something additional specific to a certain board.
      The NodeMCU is a very good board and I have been using it for most of my posts on the ESP8266. The advantage is that it already has an USB header and you just need an USB cable to interact with it, which includes programming it.
      Besides that, it has all of the pins of the ESP8266 exposed, so you can use it as an “arduino”. Many people use the ESP8266 just as a Serial to WiFi converter, but the ESP8266 is actually much more powerful than most of the microcontrollers used in the Arduino boards. Most of the things you can do with an Arduino board you can do with an ESP8266 board, with the advantage of having WiFi built in.
      I think it is a very good option for you to move to the NodeMCU, but I also recommend you to program it with the Arduino IDE instead of using the AT commands. That’s what I meant when recommending you to change the environment πŸ™‚ The AT commands have always been a little unstable and you typically end up with a more complex program because you need to be parsing strings from the answers of the commands.
      The link I shared before with the tutorial to move to the Arduino IDE covers the ESP-01 as hardware because at the time I wrote it it was the most used board. Now with the NodeMCU boards, we really just need an USB cable to connect it to a computer.
      Nevertheless, from the Arduino IDE Configuration section bellow are the generic instructions for installing the ESP8266 support for the Arduino IDE. You will only need to choose the correct board on the boards manager (in your case it will be the NodeMCU) because the upload configurations may vary from board to board. But the IDE takes care of everything as long as we choose the correct board.
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/
      I think it’s still working fine, but the latest instructions from the creators of the ESP8266 libraries for the Arduino IDE are bellow, if you prefer:
      https://github.com/esp8266/Arduino#installing-with-boards-manager
      Let me know if you succeed with the NodeMCU πŸ™‚

      1. Actually I’ve managed to solve my issue thanks to your advice (really this time). Approaching it by code, the http GET request was sent correctly. I thought it’s a ESP8266-01 since I followed several tutorials that used AT commands and successfully sent a request but mine did not. Eventhough I tried several Arduino IDE approaches (by code) I wasn’t successful at first until now
        Still, I will get a NodeMCU just as a backup plan and I will follow your instructions. Thanks a lot if it wasn’t for you I would’ve have gave it another try with the Arduino IDE.
        Here’s the link that I followed http://blog.huntgang.com/2015/01/20/arduino-esp8266-tutorial-web-server-monitor-example/#comment-5758
        Now that remains is that I need to get the response from the ESP-01 and type it again just to keep track in front of me of what’s happening. That link was great but it didn’t get back the responses.. I guess this is my next step. Thanks again for your assistance mate.

        1. You’re welcome, I’m glad it is working fine πŸ™‚ I think you will like the NodeMCU, it’s much more easy to use than the ESP-01.
          Also, if you like Internet of Things, keep an eye for the ESP32 boards, it’s the ESP8266 big brother and it’s much much more powerful. πŸ™‚
          Good luck with your project!

  11. Thank you so much. It helped me so much to understand this ESP8266 beast. πŸ™‚ Such blogs really help people like me who try to learn something without programming background and proceed with their enthusiasm.

    Once again. thanks a lot. much appreciated.

    1. Thank you very much for your feedback πŸ™‚ It’s important for me to know that you are finding the content useful and easy to understand.

      Best regards,
      Nuno Santos

  12. Thank you so much. It helped me so much to understand this ESP8266 beast. πŸ™‚ Such blogs really help people like me who try to learn something without programming background and proceed with their enthusiasm.
    Once again. thanks a lot. much appreciated.

    1. Thank you very much for your feedback πŸ™‚ It’s important for me to know that you are finding the content useful and easy to understand.
      Best regards,
      Nuno Santos

  13. Hi,
    Firstly, I wanna commend you on this great post. I’ve been working on something similar but not entirely. I’m using an arduino, esp8266 and some sensors. the aim is to send data from the sensors to a server (not to a jsoplaceholder). I got it right when I’M sending data to a thingspeak channel (through an example code of course!)

    SoftwareSerial SerialS(8, 9) ;
    #include "ESP8266.h"
    ESP8266 wifi(SerialS,9600);
    
    

    The library I used was from ITEAD, and not your prescribed library in your tutorial,

    #define SSID "AndroidAP"      //name of wireless access point to connect to
    #define PASSWORD "*******"  //wifi password
    #define IP "184.106.153.149"                  
    
    
    String GET_start = "GET /update?key=";
    String writeAPIKey = "D*************SJ";    
    String GET_end1 =  "&field1=";                 // field1 for the Celcius
    String GET_end2 =  "&field2=";                 // field2 for the fahrenheit
    String GET_end3 =  "&field3=";
    String GET_end4 =  "&field4=";
    String GET_end5 =  "&field5=";
    
    String GET = GET_start + writeAPIKey + GET_end1 ;
    
    

    Here is one challenge I will be facing, the write API key is what I can’t substitute because heroku doesn’t have one.
    below is the remainder of the code for the sending of strings to the thingspeak server

        char buffer1[10];
        char buffer2[10];
        char buffer3[10];
        char buffer4 [10];
        char buffer5 [10];
        String light = dtostrf(ldr, 4, 1, buffer1);
        String voltBatt = dtostrf(vin1, 4, 1, buffer2);
        String voltSolar = dtostrf(vin2, 4, 1, buffer3);
        String hum = dtostrf(h, 4, 1, buffer4);
        String temp = dtostrf(t, 4, 1, buffer5);
        updateTemp(light,voltBatt,voltSolar,hum,temp);
    }
    
    void updateTemp(String temp1, String temp2, String temp3, String temp4, String temp5 ){
    
       if (wifi.createTCP(IP, (80))) {
         //   Display.print("create tcp ok \r\n");
         //Display.print(field);
        } else {
         //   Display.print("create tcp err\r\n");
        }
    
      String cmd = GET;
      cmd += temp1;
      cmd += GET_end2;
      cmd += temp2;
      cmd += GET_end3;
      cmd += temp3;
      cmd += GET_end4;
      cmd += temp4;
      cmd += GET_end5;
      cmd += temp5;
      cmd += "\r\n";
    
      ESPserial.print("AT+CIPSEND=");
      ESPserial.println(cmd.length());
      if(ESPserial.find(">")){
        Serial.print(">");
        Serial.print(cmd);
        ESPserial.print(cmd);
      }
    
      if(ESPserial.find("OK")){
        Serial.println("RECEIVED: OK");
      }else{
        Serial.println("RECEIVED: Error");
      }
    
      if (wifi.releaseTCP()) {
        //Display.print("release tcp ok \r\n");
      } else {
        //Display.print("release tcp err\r\n");
      }
    }
    
    

    But now, I have deployed on heroku and used firebase as my database server, and I want to make this code send my sensor data to my deployed server. Do you have any solution you can help me with? I’ll be forever grateful. Thanks!

    Kay.

    1. Hi! Thanks for your feedback, I’m glad you found this post useful πŸ™‚

      As for your application, I haven’t yet worked with Heroku (although I definitely want to take a look as soon as I have some time), but I’m assuming you are deploying an application there with a endpoint that will receive your sensor data, right?

      First of all, you need to confirm that you are not using HTTPS on your application, if so you will not be able to send the data because of the encryption. So, you will need to be using just HTTP.

      I haven’t used ITEAD’s library, so I can’t be of much help in that part, but from what I’m seeing it is using AT commands.

      So, my suggestion is more of on how to approach the problem. Since you’re moving to a new platform, you should start by doing something really simple before sending the sensor data, in order to be able to debug.

      So, my recommendation is that you put a simple route in your Heroku app that just does something as simple as returning a “hello world” string. Thus, you can confirm that you can reach the server and send an HTTP request and get the answer.

      So, your command would be something like
      String GET = “GET /hello\r\n”;

      If you can reach the server like this, then you can build the remaining application on top of it. After that, you could do a route that receives your parameters as query strings, like you are doing in that code in the /update. First you can try if it works with your browser, and then move to the ESP/Arduino code.

      From my understanding of your code / application, if you set a /update route similar to the one you have on ThingsSpeak, you just need to remove the ?key= from the Get_start variable and in the following line of code remove the + writeAPIKey.

      String GET = GET_start + writeAPIKey + GET_end1 ;

      It would then be:
      String GET_start = “GET /update”;
      String GET_end1 = “?field1=”;
      (…)
      String GET = GET_start + GET_end1 ;
      (…)

      But you should test sending the request from a browser first to avoid having complicated debugging on the Arduino / ESP. If the problem is in the server, you need to solve it first.

      So, the bottom line is that if your backend doesn’t need an API key, you just don’t need to send one. Just send the remaining query parameters.

      Also, if you are not familiarized with why you are sending the ?field1=something&field2=something… do a quick search about how query parameters work. It’s very important to understand your code.

      Basically, it is a way for sending parameters to the server on the URL. In the code you are showing me, you can do the same request to ThingsSpeak from a web browser by typing the following on the search bar:

      http://184.106.153.149/update?key=YourAPIKey&field1=YourFieldValue&field2=YourFieldValue

      and so on for the remaining values (all in the same line).

      Hope it helps!

  14. Hi,
    Firstly, I wanna commend you on this great post. I’ve been working on something similar but not entirely. I’m using an arduino, esp8266 and some sensors. the aim is to send data from the sensors to a server (not to a jsoplaceholder). I got it right when I’M sending data to a thingspeak channel (through an example code of course!)

    SoftwareSerial SerialS(8, 9) ;
    #include "ESP8266.h"
    ESP8266 wifi(SerialS,9600);
    

    The library I used was from ITEAD, and not your prescribed library in your tutorial,

    #define SSID "AndroidAP"      //name of wireless access point to connect to
    #define PASSWORD "*******"  //wifi password
    #define IP "184.106.153.149"
    
    String GET_start = "GET /update?key=";
    String writeAPIKey = "D*************SJ";
    String GET_end1 =  "&field1=";                 // field1 for the Celcius
    String GET_end2 =  "&field2=";                 // field2 for the fahrenheit
    String GET_end3 =  "&field3=";
    String GET_end4 =  "&field4=";
    String GET_end5 =  "&field5=";
    String GET = GET_start + writeAPIKey + GET_end1 ;
    

    Here is one challenge I will be facing, the write API key is what I can’t substitute because heroku doesn’t have one.
    below is the remainder of the code for the sending of strings to the thingspeak server

        char buffer1[10];
        char buffer2[10];
        char buffer3[10];
        char buffer4 [10];
        char buffer5 [10];
        String light = dtostrf(ldr, 4, 1, buffer1);
        String voltBatt = dtostrf(vin1, 4, 1, buffer2);
        String voltSolar = dtostrf(vin2, 4, 1, buffer3);
        String hum = dtostrf(h, 4, 1, buffer4);
        String temp = dtostrf(t, 4, 1, buffer5);
        updateTemp(light,voltBatt,voltSolar,hum,temp);
    }
    void updateTemp(String temp1, String temp2, String temp3, String temp4, String temp5 ){
       if (wifi.createTCP(IP, (80))) {
         //   Display.print("create tcp ok \r\n");
         //Display.print(field);
        } else {
         //   Display.print("create tcp err\r\n");
        }
      String cmd = GET;
      cmd += temp1;
      cmd += GET_end2;
      cmd += temp2;
      cmd += GET_end3;
      cmd += temp3;
      cmd += GET_end4;
      cmd += temp4;
      cmd += GET_end5;
      cmd += temp5;
      cmd += "\r\n";
      ESPserial.print("AT+CIPSEND=");
      ESPserial.println(cmd.length());
      if(ESPserial.find(">")){
        Serial.print(">");
        Serial.print(cmd);
        ESPserial.print(cmd);
      }
      if(ESPserial.find("OK")){
        Serial.println("RECEIVED: OK");
      }else{
        Serial.println("RECEIVED: Error");
      }
      if (wifi.releaseTCP()) {
        //Display.print("release tcp ok \r\n");
      } else {
        //Display.print("release tcp err\r\n");
      }
    }
    

    But now, I have deployed on heroku and used firebase as my database server, and I want to make this code send my sensor data to my deployed server. Do you have any solution you can help me with? I’ll be forever grateful. Thanks!
    Kay.

    1. Hi! Thanks for your feedback, I’m glad you found this post useful πŸ™‚
      As for your application, I haven’t yet worked with Heroku (although I definitely want to take a look as soon as I have some time), but I’m assuming you are deploying an application there with a endpoint that will receive your sensor data, right?
      First of all, you need to confirm that you are not using HTTPS on your application, if so you will not be able to send the data because of the encryption. So, you will need to be using just HTTP.
      I haven’t used ITEAD’s library, so I can’t be of much help in that part, but from what I’m seeing it is using AT commands.
      So, my suggestion is more of on how to approach the problem. Since you’re moving to a new platform, you should start by doing something really simple before sending the sensor data, in order to be able to debug.
      So, my recommendation is that you put a simple route in your Heroku app that just does something as simple as returning a “hello world” string. Thus, you can confirm that you can reach the server and send an HTTP request and get the answer.
      So, your command would be something like
      String GET = “GET /hello\r\n”;
      If you can reach the server like this, then you can build the remaining application on top of it. After that, you could do a route that receives your parameters as query strings, like you are doing in that code in the /update. First you can try if it works with your browser, and then move to the ESP/Arduino code.
      From my understanding of your code / application, if you set a /update route similar to the one you have on ThingsSpeak, you just need to remove the ?key= from the Get_start variable and in the following line of code remove the + writeAPIKey.
      String GET = GET_start + writeAPIKey + GET_end1 ;
      It would then be:
      String GET_start = “GET /update”;
      String GET_end1 = “?field1=”;
      (…)
      String GET = GET_start + GET_end1 ;
      (…)
      But you should test sending the request from a browser first to avoid having complicated debugging on the Arduino / ESP. If the problem is in the server, you need to solve it first.
      So, the bottom line is that if your backend doesn’t need an API key, you just don’t need to send one. Just send the remaining query parameters.
      Also, if you are not familiarized with why you are sending the ?field1=something&field2=something… do a quick search about how query parameters work. It’s very important to understand your code.
      Basically, it is a way for sending parameters to the server on the URL. In the code you are showing me, you can do the same request to ThingsSpeak from a web browser by typing the following on the search bar:
      http://184.106.153.149/update?key=YourAPIKey&field1=YourFieldValue&field2=YourFieldValue
      and so on for the remaining values (all in the same line).
      Hope it helps!

  15. Guilherme Lionco

    Thank you so much. I didn’t find a solution for my problem in another site, but your post helped me. Best Regards.

    1. Hi! Thank you very much for your feedback πŸ™‚ I’m glad these posts are being useful, I will try to keep posting more content about the ESP8266.

      Best regards,
      Nuno Santos

  16. Guilherme Lionco

    Thank you so much. I didn’t find a solution for my problem in another site, but your post helped me. Best Regards.

    1. Hi! Thank you very much for your feedback πŸ™‚ I’m glad these posts are being useful, I will try to keep posting more content about the ESP8266.
      Best regards,
      Nuno Santos

  17. Hi Antepher, Your post is very useful for newcomers like me……….My problem is I don’t know whether I can use this library with ESP01 serial wifi transceiver SO I wanted to know can I use this library that you prescribed with ESP-01? If yes than How should I connect ESP01 to My arduino Mega? I am trying to send data to mySQL server it’s an RFID based logging system so I need to read the confirmation echo back from the server too….please guide me on that…..thank you

    1. Hi! Thanks for your feedback πŸ™‚ Yes, you should be able to use it with the ESP01.

      These tutorials are for the ESP8266 microcontroller, which is found at those ESPXX boards (and many others).

      So, in theory, it should work as long as the microcontroller is the ESP8266, as it is the case of the ESP01.

      Naturally, in other programs where we use specific pins of the ESP8266, they may not be exposed in some boards, so you need to be careful with that. In this case we don’t use any GPIO.

      For the ESP01, you can check the tutorial bellow on how to program it with the Arduino IDE:
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

      It’s a bit old, but I think it still applies to the ESP01. I can’t confirm since I’ve not been using the ESP01’s for a while. Due to the relatively complicated process of uploading code to the ESP01, I’ve started using other simpler to program ESP8266 boards.

      Let me know if it works.

      Best regards,
      Nuno Santos

  18. Hi Antepher, Your post is very useful for newcomers like me……….My problem is I don’t know whether I can use this library with ESP01 serial wifi transceiver SO I wanted to know can I use this library that you prescribed with ESP-01? If yes than How should I connect ESP01 to My arduino Mega? I am trying to send data to mySQL server it’s an RFID based logging system so I need to read the confirmation echo back from the server too….please guide me on that…..thank you

    1. Hi! Thanks for your feedback πŸ™‚ Yes, you should be able to use it with the ESP01.
      These tutorials are for the ESP8266 microcontroller, which is found at those ESPXX boards (and many others).
      So, in theory, it should work as long as the microcontroller is the ESP8266, as it is the case of the ESP01.
      Naturally, in other programs where we use specific pins of the ESP8266, they may not be exposed in some boards, so you need to be careful with that. In this case we don’t use any GPIO.
      For the ESP01, you can check the tutorial bellow on how to program it with the Arduino IDE:
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/
      It’s a bit old, but I think it still applies to the ESP01. I can’t confirm since I’ve not been using the ESP01’s for a while. Due to the relatively complicated process of uploading code to the ESP01, I’ve started using other simpler to program ESP8266 boards.
      Let me know if it works.
      Best regards,
      Nuno Santos

    1. Hi! It’s not a dumb question, many people have the same doubt πŸ™‚

      This is the ESP8266 on its own, you don’t need an Arduino uno board or any other board.

      Although in the beginning, the ESP8266 was sold as an Arduino WiFi to serial bridge, the community quickly discovered that it was actually a very powerful microcontroller with WiFi support that could be programmed and used without any additional board.

      So, one of the projects that was first initiated was adding support on the Arduino IDE to program it. This was an awesome initiative since the original set of tools was very complicated and the Arduino was a well known environment for the community.

      So, to sum up, you just need an ESP8266 board (there are plenty of them on the market with usb headers for programming without external hardware) and the Arduino IDE and you can follow this tutorial.

      Hope this clarifies your doubt.

      Best regards,
      Nuno Santos

    1. Hi! It’s not a dumb question, many people have the same doubt πŸ™‚
      This is the ESP8266 on its own, you don’t need an Arduino uno board or any other board.
      Although in the beginning, the ESP8266 was sold as an Arduino WiFi to serial bridge, the community quickly discovered that it was actually a very powerful microcontroller with WiFi support that could be programmed and used without any additional board.
      So, one of the projects that was first initiated was adding support on the Arduino IDE to program it. This was an awesome initiative since the original set of tools was very complicated and the Arduino was a well known environment for the community.
      So, to sum up, you just need an ESP8266 board (there are plenty of them on the market with usb headers for programming without external hardware) and the Arduino IDE and you can follow this tutorial.
      Hope this clarifies your doubt.
      Best regards,
      Nuno Santos

Leave a Reply

%d bloggers like this: