OTA programování ESP8266

calendar_month2.1.2019

Zajímavým způsobem programování ESP8266 je tzv. OTA update. To znamená, že upload softwaru nemusí probíhat přes kabel, ale bude se tak dít jednoduše "vzduchem" přes WiFi (over-the-air).

Když budu chtít například upravit software v meteostanici umístěné na zahradě, nemusím vůbec vstát od počítače v pracovně. Vše proběhne bezdrátově. Podmínkou je, že tento způsob update musí sketch v meteostanici podporovat. Jde o několik částí kódu, které musíme vložit na správná místa programu. Předpokladem je také nainstalovaný Python. Arduino IDE ho pro OTA vyžaduje.

Jak přizpůsobit program

Na začátku je nutné naimportovat potřebné knihovny, poté spustit OTA a nakonec zajistit pravidelnou obsluhu této funkce. Cyklickému dotazování na požadavek updatu musí být běh programu přizpůsoben.

Nejprve tedy importujeme knihovy:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

Dále nastavíme hostname. Tento název se nám bude zobrazovat v Arduino prostředí:

const char* OTAhostname = "ESP-zahrada";

A spustíme OTA. Zde jsou stěžejní dva řádky, ArduinoOTA.setHostname(OTAhostname), kterým přiřadíme název OTA a ArduinoOTA.begin(), jenž OTA spustí. Ostatní jsou jen texty vypisované na sériový port při různých událostech:

void setup()
{
	ArduinoOTA.setHostname(OTAhostname);
	ArduinoOTA.onStart([]()
	{
		Serial.println("Start");
	});
	ArduinoOTA.onEnd([]()
	{
		Serial.println("\nEnd");
	});
	ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
	{
		Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
	});
	ArduinoOTA.onError([](ota_error_t error)
	{
		Serial.printf("Error[%u]: ", error);
		if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
		else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
		else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
		else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
		else if (error == OTA_END_ERROR) Serial.println("End Failed");
	});
	ArduinoOTA.begin();
}

Důležité je cyklické dotazování. Vlákno programu se musí pravidelně vracet k dotazu ArduinoOTA.handle(), zde umístěném v bloku loop():

void loop()
{
	ArduinoOTA.handle();
}

OTA Port v Arduino IDE:

Nevýhody OTA

Při OTA se pochopitelně připravujeme o možnost sledování dění na sériovém portu. Případná chyba v programu se pak těžko odhaluje. Existuje zde možnost zobrazení ladících informací v prohlížeči, ale ta není předmětem tohoto článku.

Chyba může také způsobit zablokování OTA a znemožnit tak další upload touto cestou. Pak nezbývá, než připojit ESP přímo k počítači.

OTA nelze využít u aplikací využívajících funkci deep sleep. V tomto stavu běží v ESP pouze interní časovač s minimální spotřebou a OTA tak není obsluhováno. Obvykle to řeším dvojicí tlačítek. Prvním z nich resetuji ESP a druhým ho poté přepnu do OTA režimu, kdy zůstane zařízení zapnuté a čeká na upload softwaru.

Nastavení Arduino IDE pro Generic ESP8266 Module

Volba parametrů programování v Arduino prostředí zásadně ovlivňuje funkčnost OTA. Zde uvádím nastavení, které mi funguje pro variantu ESP-12E: