[IoT] PlatformIOを使って、ESP8266をOTAでアップデート

動作確認(Lチカ)ができたので、OTAしてみることに
[IoT] VisualStudio + PlatformIO + ESP32 での環境構築

OTA

OTAそのものは、Arudinoのサンプルからとってきたものに、Lチカを追加

setup で準備して、loop から、ArduinoOTA.handle()を 呼び出すだけ。

コード
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

#ifndef STASSID
#define STASSID "SSID"
#define STAPSK  "password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_SPIFFS
      type = "filesystem";
    }

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  });
  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();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // setup ping in/out
  pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {
  ArduinoOTA.handle();

  // LED On/Off
  digitalWrite(LED_BUILTIN, HIGH)  ;
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);

}

PlatformIOの設定

ArduinoIDEだとネットワーク上のターゲットを見つけてくれるみたいだけど、PlatformIOでは、手書きが必要です。

platformio.iniの中に、以下の設定を追加。

コード
upload_protocol = espota
upload_port = IPアドレス or mDNSで引ける名前
MEMO
DHCPベースだとIPアドレス変わるかもしれないから、固定IPにするか、mDNSにしたほうが、後のメンテナンスは楽になります。

書き込み

普通に、"upload"を実行すると、以下のように、表示されて書き込み完了します。

コード
16:01:20 [INFO]: Sending invitation to: <ESP8266のIPアドレス>
16:01:21 [INFO]: Waiting for device...

まとめ: ESP8266 OTA 設定

ESP8266 で OTA するための設定
  • setup で OTA 設定を行う
  • loop で ArduinoOTA.handle() して、必要に応じて OTA を行う

ものの、10分でOTAできるようになります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です