Cheap Arduino WiFi Shield With ESP8266





Introduction: Cheap Arduino WiFi Shield With ESP8266

In my previous Instructable I have described how to plug the ESP-01 module into a breadboard.

This is just the first step to make a cheap Arduino WiFi shield using the ESP8266 module. With few more electronic components and the WiFiEsp library you can build it for less that 10 USD.

Step 1: Components

Here are the components you need

  • Arduino board - In this example I'm using an Arduino Uno board but I personally uprefer using an Arduino Mega because it has more memory and has a second serial port to communicate with the ESP module.
  • ESP-01 - This is the smallest and cheaper type of ESP8266.
  • AMS1117 5V to 3.3V Power Supply - Arduino boards are typically powered at 5V while ESP8266 needs a 3.3V power source. The Arduino 3.3V output pin cannot provide the power needed by the ESP (up to 250mA). This can be solved using a 3.3V voltage regulator like the LM1117/LD1117 or AMS1117.
  • Breadboard - A 170 holes mini breadboard is enough but you can use a bigger one if you need.
  • 10 uF Capacitor - A small electrolytic capacitor is needed to stabilize the voltage regulator. Any 10-100 uF should be ok.

  • 2 resistors (1K and 2.2K) - A simple voltage divider is needed to shift down the 5V output of the Arduino TX pin. You can use other resistors as long as they are in a 1/2 ratio approximately.
  • Jumper wires

Step 2: Wiring It Up

In the schematic I have described how to connect all the components using an Arduino Uno board and a mini breadboard.

  • The ESP's VCC pin is powered by the 3.3V output pin of the voltage regulator (AMS1117 in my example). The 10uF capacitor is connected to the output pins to stabilize the regulator. The CH_PD pin must also be connected to 3.3V. The GND pin is obviously connected to ground.
  • The ESP's TXD pin can be connected directly to the RX pin of Arduino (emulated on pin 6).
  • The ESP's RXD pin is connected to the TX pin of Arduino (emulated on pin 7) through the level shifter.

If you are using an Arduino Mega you need to change the wiring schema an connect the ESP TX/RX pins to the Arduino Serial1 pins. This allows to have a more fast and reliable communication link between the Arduino board and the ESP-01 module.

Step 3: Testing

To test the shield you can use the following Arduino sketch. Note that the sketch is emulating the Serial1 interface if it is not available.

// EspDebug - Test sketch for ESP8266 module
// emulate Serial1 if not present #ifndef HAVE_HWSERIAL1 #include "SoftwareSerial.h" SoftwareSerial Serial1(6, 7); // RX, TX #endif void setup() { Serial.begin(115200); // serial port used for debugging Serial1.begin(9600); // your ESP's baud rate might be different } void loop() { if(Serial1.available()) // check if the ESP is sending a message { while(Serial1.available()) { int c =; // read the next character Serial.write((char)c); // writes data to the serial monitor } } if(Serial.available()) { // wait to let all the input command in the serial buffer delay(10); // read the input command in a string String cmd = ""; while(Serial.available()) { cmd += (char); } // print the command and send it to the ESP Serial.println(); Serial.print(">>>> "); Serial.println(cmd); // send the read character to the ESP Serial1.print(cmd); } }

Now you can open the Arduino serial monitor (see the screenshot) and type few basic AT commands.

  • AT
  • AT+GMR

If you do not get any output you can try the following.

  • The serial monitor baud rate must match the one specified on line 7 of the sketch so it must be set to 115200.
  • Try different settings for the 'Line ending' option of the serial monitor. For my ESP module I have to set it to 'Both NL & CR' as you can see in the screenshot.
  • Adjust the serial baud rate of the ESP-01 module at line 8 of the above sketch. Typical baud rates are 9600 or 115200.

Try different combinations until you are able to correctly interact with the ESP module using the serial monitor.

Unfortunately if the ESP module is set to work at 115200 or higher baud rates you may not be able to make it work with an emulated serial interface. In such case you need to use an Arduino Mega board with a secondary hardware serial interface.

Step 4: Moving Forward

Implementing few enhancements will allow to have a pluggable and reliable WiFi shield for you Arduino to connect it to the Internet.

  • The ESP-01 can be hoked up directly into the breadboard using the technique described in this Instructable.
  • The wiring can be compacted to leave space for other components.
  • A ProtoShield can be used to have a reliable and pluggable WiFi shield.

The picture is quite clear about what I have achieved.

Now look at my blog about how to use the WiFiEsp library for Arduino to see how to use this cheap WiFi shield for your connected projects!



    • Casting Contest

      Casting Contest
    • Oil Contest

      Oil Contest
    • Make it Move Contest

      Make it Move Contest

    We have a be nice policy.
    Please be positive and constructive.




    If your ESP8266 is running at 115200 baud rate you can change it to 9600 by using this AT command via serial: AT+CIOBAUD=9600 worked for me

    I've been wondering how to breath life back into a bunch of old boring Arduino's by doing exactly this for about two years until I found this. It worked great. Sometimes you just need those analog pins, and a Node MCU won't cut it for your project because of the pin limitations.

    Thanks for your time on this Instructable.
    I had things working perfectly, but my module's Blue LED is on steady, after powering down & restart. Any suggestions?

    Hello together!

    For all people out there i have some news. I get my ESP01 with baudrate 115200. Arduino don't like this baudrate and you will get not supported firmware. You must change in debug script serial1 and serial. Then you can speak with your ESP01.

    If you typ AT you get some error and firmware read out is totally bad. Now send your ESP01 this command: AT+UART_DEF=9600,8,1,0,0

    Thereafter change serial and serial1 again and voilat your ESP01 work as aspected.

    It's totally recommand that you change the boudrate down to 9600 via AT Command. And then your ESP01 will work fine. :)

    6 replies

    Hi Wikibear,

    You seem to have the solution... what it is exactly that we should change?

    Look to my last entry. :) This will help you to solve this issue.

    Arduino Uno and all versions below can't handle high baut rates. The EPS01 must get an AT command to change this down to 9600 with an AT command i post this in my comment. There after communication with the chip and scripts are working. Only Arduino Mega work with 115000.

    I confirm this, tried yesterday with 9600 and it works like a charm. Thank you Wikibear for the clarification and Twim for the excellent work!

    In the meanwhile i have found why 115200 doesn't work, cause arduino can't simulate 115200 well. That's all.

    That's true! Software serial library supports speeds up to 115200 but for the UNO the maximum Rx speed is 57600. So, I suggest starting with 9600 and going up one step at a time to find the maximum working serial speed.

    Connect your WLAN ESP01 like to following points:

    3,3V -> 3,3V





    don't need electrical parts if you use uno. If you use mini 3,3V are
    not stable on current and will stop working. Then you need electrical
    parts with separate 5V to 3,3V step down. Please don't use 5V you can
    brick your ESP01 for ever.

    Load BareMinimum and save into arduino

    Open Serial Monitor and set down below right corner dropdown to Both NL & CR 115200 baud.

    type in command line AT you will get response OK. If you get OK your
    ESP01 is well and waits for next command. Now type AT+GMR you will get
    the software version and much more. If this is fine type


    will set your ESP01 to 9600 baud. You will get OK. Thereafter you get
    no response. Set baudrate from serial monitor to 9600 now.

    Type AT. If you get OK its all fine and you can use ESP01 on 9600 software serial now.

    More information i use WiFiesp lib. Via examples->WiFiesp->test->espdebug you can load a test script into your arduino for testing software AT commands. If this will work you have done the job!

    Hello all :) regarding the baudrate change , for esp-05 is the same command to be used? Also what should be the initial serial rate in the code section . your help will be appreciated . TIA :)

    ​Can plz look at this
    small help thanks

    Nice and useful.

    your tutorials are awesome dude, will you help me to work with ESP8266 i cant able to run a simple code as i have library errors...

    Hello The Twim

    Thank you so much for the upload, I've ordered the components so I can build one myself.

    One thing I am confused about, and please forgive me - I'm a bit of a newbie, is the use of the voltage divider between Tx (pin 7 on the Arduino) and Rx (on the ESP). I thought Rx was a data receive pin and as such wouldn't need to be voltage regulated at all. But actually, from what you are telling me, 5V is sent out from the Arduino on the Tx output, is that right?

    Any help on the subject is greatly appreciated so thank you in advance.


    2 replies

    You are right. The Arduino TX pin will output a 5V signal that could damage the ESP RX input.

    On the other side, the Arduino RX input pin reads the 3.3V output from the ESP without problems so you don't need to shift up this signal.

    Thank you so much for your speedy reply.

    Is this true to all pins on the arduino or only the Tx?

    Serial.print outputs to the serial port without any end of line characters. println does the same but adds a new line (the ln indicates this). Depending on your system that may be carriage return or with the new line character as well.