Arduino

Easily Update ESP8266 Devices OTA With The Arduino IDE

ESP8266 WiFi devices can be conveniently flashed over the air (OTA) using the Arduino IDE. All that is required is a little additional code in the sketch in order to make the WiFi serial port appear in the Arduino IDE.

This is very handy if you wish to install a device such as the Wemos D1 Mini in a remote location and still need to make firmware updates. It can also save having to keep connecting a device to the USB if it sources power by another method.

This tutorial we will cover the necessary additions required to make a sketch compatible with OTA flashing.

Prerequisite

You will need to have the Arduino IDE installed and running. I would recommend heading over to the website and getting the latest version. You will also need an ESP8266 board, I would recommend the Wemos D1 Mini used in this series of tutorials.

This tutorial will follow on from the previous tutorial detailing how to add the Wemos D1 Mini to the Arduino IDE. Although this was written for the D1 Mini, I would recommend you first try the code from this tutorial on your ESP8266 device.

Writing the code

We will assume that you already have a project running on your ESP8266 board that has been connected to you WiFi network. For this tutorial we shall use the example code from the previous tutorial, I would recommend checking it out if you have not yet connected your device to WiFi.

Connecting to WiFi

If you don’t yet have a project connected to WiFi, copy the sample code below into a new project and save it. Upload the sketch to your board and check that the IP address is reported back in the serial monitor window.

#include <ESP8266WiFi.h>
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
void setup() {
  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  //Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  // Loop continuously while WiFi is not connected
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}

Add basicOTA.h

Next we need to add the basicOTA.h file to the project. Simply download and clone the repository and extract it from the .zip file. Alternatively you can create a new file and paste it from the raw file available here.

Add the includes

Once you have the file, move it to the same directory as your project. We can then add an include for this file. Speech marks indicate to the IDE that the file is located in the project directory and not the library folder. We also need to include the ArduinoOTA.h library.

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "basicOTA.h"
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
void setup() {
  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  //Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  // Loop continuously while WiFi is not connected
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}

Call the setup OTA function

Next we need to call the setup_OTA function from the setup function in our project. This will execute all of necessary steps from basicOTA.h needed to setup OTA flashing in our project.

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "basicOTA.h"
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
void setup() {
  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  //Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  // Loop continuously while WiFi is not connected
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

  // Setup Firmware update over the air (OTA)
  setup_OTA();
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}

Poll ArduinoOTA.handle

We also need to poll ArduinoOTA.handle in our main program loop to check for OTA firmware updates. This should be added somewhere in the loop function.

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "basicOTA.h"
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
void setup() {
  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  //Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  // Loop continuously while WiFi is not connected
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

  // Setup Firmware update over the air (OTA)
  setup_OTA();
 
}
 
void loop() {

  // Check for OTA updates
  ArduinoOTA.handle();
 
}

Flash the LED to debug

As we will be connecting the Arduino IDE to WiFi and not the standard serial port, we will not be able to receive information in the serial console.

In order to confirm that we have updated the firmware from the previous tutorial, we will add some code to blink the LED.

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "basicOTA.h"
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
void setup() {

  // Setup LED
  pinMode(LED_BUILTIN, OUTPUT);

  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  //Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  // Loop continuously while WiFi is not connected
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

  // Setup Firmware update over the air (OTA)
  setup_OTA();
 
}
 
void loop() {

  // Check for OTA updates
  ArduinoOTA.handle();

  // Blink LED
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
 
}

Alternatively you could use a seperate serial terminal to read the data from the serial port if you have your device connected to USB for debugging.

However blinking the LED provides visual feedback regardless of whether the device is connected to the USB port.

Flashing

That’s it! Our application is now ready to be flashed over the air. However we first need to flash the new code to our device over the serial connection in order to enable OTA flashing.

Go ahead and flash the code onto the device over the serial connection. Once the new sketch has been uploaded you will be able to select the WiFi serial port from tools > Port > your_device_ip_address.

Conclusion

Adding the ability to flash your application over the air is both convenient and necessary in certain circumstances. The Arduino ESP Core has built-in OTA functionality that is easy to leverage with some simple code.

Why not check out some more awesome ESP device articles here on my website to get some ideas for your next project!

back to top