Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

(The Troubles of) Connecting Your ESP8266 to a Network

DZone's Guide to

(The Troubles of) Connecting Your ESP8266 to a Network

Want to use the ESP8266 chip for a project? Not a problem. Unless you want to connect to it. See the trials, tribulations, and pitfalls of getting the chip set up.

· IoT Zone
Free Resource

Learn how Bluetooth mesh helps you create industrial-grade networks. Download the mesh overview.

I’m working on a project to automate our chicken coop (see my article Getting over myself and doing things the easy way for more details on the project). Right now, the lights turn on and off by themselves: It needed to be done now since the chickens had trouble laying eggs with our short autumn days. The current system uses an Arduino Uno, a real-time clock module with the DS1307 chip and an analog dimmer. You can see the code for this version on GitHub.

I’m working on the second phase: being able to change the schedule directly from our phones and gather weather data from inside and outside the coop. My plan is to use the Arduino I already have to gather data and control the dimmer, and add an ESP8266 chip to connect this system to our home network.

Another server inside the house, probably a Raspberry Pi, will be used to host a small web application in Node.js that will save the schedule and weather data. This is also in progress on GitHub.

To get started, I had to figure out how to connect to the network using the ESP8266. I purchased a cheap, poorly documented board (the ESP13 by doit.am) that mounts the chip as an Arduino shield so they can be stacked:

esp8266

Here are where the problems started. Because of the form factor, I thought I could make HTTP requests from the Arduino, and the ESP8266 would be a dumb chip that transmitted the request.

That’s far from the truth: the ESP8266 is also a microcontroller, and it also has to be programmed. It comes preloaded with some strange Chinese firmware that I could use to see if the board works, but not much else. Fortunately, it can also be programmed using the Arduino IDE, and there are some nice examples, so I could start from there.

Unfortunately, it’s not that easy to program the chip directly, as it doesn’t have its own USB port. There are all kinds of suggestions online on how to bypass the Arduino and use its USB port to program the chip, but it never worked and I would always get the following errors:

warning: espcomm_sync failed
error: espcomm_open failed

TL;DR The only way I found to program the ESP8266 easily was to use a 3.3V FTDI cable I bought on eBay for a few dollars, pull the digital pin 0 to ground (as stated in the documentation for the ESP8266), reboot, and then I was good to go. Don’t waste time like I did.

Good to go for a few minutes, that is. After connecting just fine to the network for the first time and congratulating myself on my success, I never could connect a second time using the same code. After much experimentation, I found that the best way to make sure it always worked was to disconnect from the network and then reconnect while the chip is booting. Here is what my setup looks like for the ESP8266:

void setup() {
    Serial.begin(115200);

    WiFi.disconnect();  // Required or it won't always reconnect to wifi
    WiFi.persistent(false);

    Serial.print("Connecting");
    WiFi.begin(/*username*/,/*password*/);
    while (WiFi.status() != WL_CONNECTED) {
        delay(5500);
        Serial.print("status");
        Serial.println(WiFi.status());
    }
    Serial.println(" connected");
    Serial.println(WiFi.localIP());
}

So, I’m finally ready to get started coding now that I’ve proved that I can connect to my network. To be more precise, I want to use the I2C bus to connect the Arduino and the ESP8266 together using the Wire library. The ESP8266 will send all the HTTP requests and parse the responses. This will leave the standard serial ports free so I can debug and program both chips without unplugging everything each time.

Seems logical to me, but the shield doesn’t wire the I2C bus for the Arduino and the ESP8266 together — only the serial port. I can’t just wire them myself since the ESP8266 works with 3.3V logic levels while the Arduino works with 5V. I need to have a logic level shifter, like what they did on the shield with the serial ports (the blue dip switches are used to toggle between programming the chip and linking the chips together). It can work for a little while if I cheat and connect them anyway, but it will eventually fry the ESP8266.

Since I really want to keep the serial ports for debugging and because the shield doesn’t really add much to the project after all, I ordered a new ESP8266 off eBay that’s only the chip mounted on a board with the I2C port exposed, along with an order for a few level shifters. It took a while to find a good board: many of the cheap models only expose the serial ports, whereas I wanted a bit more. I’m still waiting for the new chips to show up in the mail, so stay tuned!

For a deeper look into Bluetooth mesh, check out this technical insight for developers.

Topics:
home automation ,iot ,arduino ,esp8266

Published at DZone with permission of Cindy Potvin, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}