ESP8266
IoT Projects

Connect Your ESP8266 To Any Available Wi-Fi network

ESP8266

The ESP8266 is a microcontroller developed by Espressif Systems. Known as a WiFi module, this microcontroller can be used to perform various WiFi-related activities, with applications in home automation and beyond. Ranging in price and features, there are many types of ESP8266 modules available – but all are incredibly useful in the IoT world.

Regardless of the IoT application you’ve developed, there are two ways to connect your ESP8266 to the cloud. First, you can input your WiFi credentials in the ESP8266’s firmware to establish the required connection and start sending data. A second way – which we’ll cover step-by-step below – is by building your own access point into the board, creating a universal firmware that will establish a connection to any available network with just the press of a button.

Requirements 

Step 1. Hardware setup

Note: The Ubidots team made some modifications in the ConfigManager Library to implement a routine that launches the AP mode by simply pressing an external reset button.

Depending on the ESP8266 module you choose, you may need to assign the reset pin using this library version. The default button settings are assigned to PIN 5; if using a NodeMCU, you must connect the button into the D1 pin.

step one Ubidots

Step 2. Set up the Arduino IDE with your device

Before using any ESP8266 device, you’ll have to install the boards into the Arduino IDE. Follow the steps below to compile the board.

If you haven’t already, start by downloading the Arduino IDE.

1. Open the Arduino IDE. Select Files -> Preferences and enter the URL below the Additional Board Manager URLs field. You can add multiple URLs, separating them with commas.

http://arduino.esp8266.com/stable/package_esp8266com_index.json into

NOTE: If you’re a Mac user, Arduino and File contain different drop-down functions compared to Windows users. You’ll also need to install the following driver to upload your NodeMCU.

Ubidots and Macs

2. Open the Boards Manager from Tools -> Board -> Boards Manager and install the ESP8266 platform. To find the correct device, search for ESP8266 within the search bar.

board manager Ubidots

3. Select the ESP8266 module you’re using. In this case, we decided to use the NodeMCU 1.0 (ESP-12 Module). To select the board, go to Tools > Board > Select the board.

board Ubidots

Additionally, to communicate with the NodeMCU, we’ll also need to select the port com. Go to Tools -> Port and select the appropriate PORT for your device.

port Ubidots

And to keep everything running fast and smooth, let’s make sure the upload speed is optimized to 115200. Go to Tools -> Upload Speed -> 115200.

speed Ubidots

4. Head over to GitHub and download the ConfigManager library. Click the green button labeled “Clone or download” and select “Download ZIP“.

clone HTTPS

5. Now, go back in the Arduino IDE and click Sketch -> Include Library -> Add .ZIP Library.

6. Select the .ZIP file of ConfigManager and then “Accept” or “Choose”.

If successful you’ll see the following message in the Arduino IDE:

LIBRARY

7. Next, go to Sketch/Program -> Include Library -> Library Manager and install the PubSubClient library. To find the correct library, search PubSubClient within the search bar.

Library Manager

8. Now, reboot the Arduino IDE prior to upload.

9. Once you have the ESP8266 platform and required libraries installed, install the Arduino ESP8266 filesystem uploader. Follow all the repository’s installation steps and return to this guide.

10. After your uploader is installed, create a new sketch to work in and save it. Our example is called AP_ESP8266:

files and programs

11. Next, go to the sketch directory and create a new folder called data. 

new file

12. Once the directory is created, download this HTML file and attached it to the directory. This file will be used in the file system.

html file

13. Next, we need to upload the file to the ESP8266 flash file system. To begin, make sure you have selected a board port and closed Serial Monitor. 

14. Select Tools > ESP8266 Sketch Data Upload to start uploading files to the ESP8266 flash file system.

sketch data upload

When done, the IDE status bar should display SPIFFS Image Uploaded:

15.png

15. Now, paste the below code in the Arduino IDE. Once pasted, assign your desired device and variable labels, as well as your unique Ubidots TOKEN. If you don’t know your Ubidots TOKEN, find out how to get one here.

Copy and paste the below code into the Arduino IDE, including your specific device and variable parameters.

/*****************************************
 * Include Libraries
 ****************************************/
#include <ESP8266WiFi.h>
#include <ConfigManager.h>
#include <PubSubClient.h>

/****************************************
 * Define Constants
 ****************************************/
 
namespace{
  const char * AP_NAME = "Ubidots Access Point"; // Assigns your Access Point name
  const char * MQTT_SERVER = "things.ubidots.com"; 
  const char * TOKEN = "...."; // Assigns your Ubidots TOKEN
  const char * DEVICE_LABEL = "my-device"; // Assigns your Device Label
  const char * VARIABLE_LABEL = "my-variable"; // Assigns your Variable Label
  int SENSOR = A0;
}

char topic[150];
char payload[50];
String clientMac = "";
unsigned char mac[6];

struct Config {
  char name[20];
  bool enabled;
  int8 hour;
} config;

/****************************************
 * Initialize a global instance
 ****************************************/
WiFiClient espClient;
PubSubClient client(espClient);
ConfigManager configManager;


/****************************************
 * Auxiliar Functions
 ****************************************/

void callback(char* topic, byte* payload, unsigned int length){
  
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(clientMac.c_str(), TOKEN, NULL)) {
      Serial.println("connected");
      break;
      } else {
        configManager.reset();
        Serial.print("failed, rc=");
        Serial.print(client.state());
        Serial.println(" try again in 3 seconds");
        for(uint8_t Blink=0; Blink<=3; Blink++){
          digitalWrite(LED, LOW);
          delay(500);
          digitalWrite(LED, HIGH);
          delay(500);
        }
      }
  }
}

String macToStr(const uint8_t* mac) {
  String result;
  for (int i = 0; i < 6; ++i) {
    result += String(mac[i], 16);
    if (i < 5)result += ':';
  }
  return result;
}

/****************************************
 * Main Functions
 ****************************************/
void setup() {
  Serial.begin(115200);
  /* Declare PINs as input/outpu */
  pinMode(SENSOR, INPUT);
  pinMode(PIN_RESET, INPUT);
  pinMode(LED, OUTPUT);

  /* Assign WiFi MAC address as MQTT client name */
  WiFi.macAddress(mac);
  clientMac += macToStr(mac);

  /* Access Point configuration */
  configManager.setAPName(AP_NAME);
  configManager.addParameter("name", config.name, 20);
  configManager.addParameter("enabled", &config.enabled);
  configManager.addParameter("hour", &config.hour);
  configManager.begin(config);

  /* Set Sets the server details */
  client.setServer(MQTT_SERVER, 1883);
  client.setCallback(callback);
  
  /* Build the topic request */
  sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
}

void loop() {  
  configManager.reset();
  configManager.loop();    
  
  /* MQTT client reconnection */
  if (!client.connected()) {
      reconnect();
  }
  
  /* Sensor Reading */
  int value = analogRead(SENSOR);
  /* Build the payload request */
  sprintf(payload, "{\"%s\": %d}", VARIABLE_LABEL, value);
  /* Publish sensor value to Ubidots */ 
  client.publish(topic, payload);
  client.loop();
  delay(5000);
}

16. After inputting your parameters, verify the code within the Arduino IDE. To do this, click the checkmark icon in the top left corner of your Arduino IDE:

17.png

Once verified, you’ll see the following message in the Arduino IDE:

process completed

Now, upload your code into your NodeMCU. Choose the right-arrow icon beside the checkmark:

19.png

Once the code is uploaded, you’ll see the below message in the Arduino IDE:

done uploading

Your ESP8266 module is now ready to establish a connection with any available network by just pressing the button!

17. To verify the connection status, open the Serial monitor. Press the button connected to your ESP module and hold for 5 seconds until you see the message “Starting Access Point” in your serial monitor:

access point

18. Now that the Access Point is created, you can establish connection from your phone. Under Wi-Fi networks, select Ubidots Access Point:

wifi

When the connection is established, it will redirect you to the page below. Input your Wi-Fi parameters and click save.

Ubidots access point

19. To verify the connection is established, go to the Serial Monitor:

check connection

Now, return to your Ubidots accounts to visualize the data received from your new device:

devices Ubidots

Result

By following this guide, you’ll set up an Access Point that connects your device to any available network without setting the credentials into the firmware – thus creating a universal firmware that can be used anywhere!

Now it’s your turn to give it a try. Sign up with Ubidots for free today!

14 COMMENTS

  1. Update after 25min. It worked…my ESP had initially saved configuration and then gets automatically connected to my wifi. lol

    PS. Great tutorial:)

  2. Hello Shelendra,

    If you desire to used HTTP instead of MQTT, you just have to modify the sketch provided here with the one provided in the help center (http://help.ubidots.com/connect-your-devices/connect-an-esp8266-nodemcu-10-to-ubidots). Take in count that the section to be changed is the client configuration, the rest of the code like the network connectivity and sensor readings should be stay as is established in the code.

    If you have any additional question, you can post it in the Ubidots community(http://community.ubidots.com/)! 🙂

    All the best,
    Maria C.

  3. Hello, I have been trying to get this program to work. I need more information to help me understand what this is supposed to do. I assumed that the program would connect to a wifi router to connect to the internet. But when I connect to the “Ubidots Access Point“ I am told there is no internet access. If I then browse ubidots.com I get the UBIDOTS HTML page that asks for SSID and Password. What should I enter there?
    In the sketch there is a line; String clientMac = “”; Is this a variable I should fill out or a placeholder for the program? What MAC address should I use? I was thinking the Wifi router MAC address, maybe.
    I am able to program a Sparkfun ESP8266 Thing with this program, instead of the NodeMCU 1.0 (ESP-12 Module). I see the “pressed” and “starting access point” when I connect #5 to 3V3 on the Thing. Then nothing reliably happens. I am not getting internet access thru the access point, I can see it and select it with my cell phone. But it says internet is not available. I am new to this Arduino IDE but have been able to see a lot work. How does the program access the internet? More comments on the program lines may help me know where to look. Is there an article write up about this program that explains more? Thank you.

  4. Hi. thanks for the tutorial.
    I’m new to this, but how could I do to put other fields besides the ssid and password and use them in my sketch. Sorry for my english I’m from Colombia

  5. Hello Alejandro,

    Sorry but your question is not enough clear to me, which other fields would you like to add?

    All the best,
    Maria C.

  6. Dear Glen,

    The code provided in the blog post is used to establish a connection with any internet network available close to your device. Once you press the button and received the message “starting access point”, you will note that a browser is opened with a Ubidots page where do you have to assign the SSID (Network name) and password of the network. In that section, you have to add the parameters of the network desired to establish the connection, once the parameters are assgined your device should establish the connection without any issue and have to be updating data to Ubidots cloud.

    If you desire to burn the network parameters instead of using the device as AP, I highly recommend to this guide (http://help.ubidots.com/connect-your-devices/connect-an-esp8266-nodemcu-10-to-ubidots-using-mqtt).

    I hope this would help you.

    All the best,
    Maria C.

  7. Hi ,
    I have a problem with connecting my esp8266-01 to ubidots throught arduino uno , i tried many connections but nothing results

    Can you advice me please

  8. Hi,Maria how i can have a universal connection with Nodmcu and Blynk app which mean that if i open blynk app and it asks me to enter ssid and password of the router and connect with it.Its an home automation based project which currently working on it.

  9. Hey Sameer,

    Thanks for asking that.

    Indeed, the scope of this guide is to show how the ESP8266 can be used as an Access Point for provisioning purposes (i.e. set WiFi credentials); it’s not about how to connect a device with a blynk app. To gain additional insights into how you can connect devices to the cloud and deploy end-user friend App, check out the below resource to assist you in getting a device online and have a platform to build and launch your ideas.

    https://ubidots.com/docs/api/mqtt.html

Comments are closed.