ESP32用ヘルパーライブラリ その1 シリアルコマンド

概要

ESP32向けでよく使う機能や、FreeRTOS絡みで使いやすいクラス化がされていない機能を単純なヘルパークラスにしたライブラリを作ってみました。今回はシリアルモニタから対話的なコマンド操作ができる機能の紹介になります。

ライブラリ紹介

GitHub - tanakamasayuki/EspEasyUtils: ESP32 Easy Utils
ESP32 Easy Utils. Contribute to tanakamasayuki/EspEasyUtils development by creating an account on GitHub.

上記になります。CC0ライセンスなので、ライブラリのまま使ってもらっても構いませんし、そのままコピーして改造したものを取り込んでもらっても構いません。

すでにライブラリマネージャに登録済みですので、「EspEasyUtils」で検索することで利用可能です。

シリアルコマンド(EspEasySerialCommand)

最近良く使っている機能なのですが、シリアルモニタから対話的なコマンドを送信するためのライブラリになります。

#include <WiFi.h>
#include "EspEasySerialCommand.h"

EspEasySerialCommand command(Serial);
//EspEasySerialCommand command;
//EspEasySerialCommand command(Serial2);

void myReset(EspEasySerialCommand::command_t command) {
  ESP.restart();
}

void wifiSet(EspEasySerialCommand::command_t command) {
  // > WIFI [SSID] [KEY]
  // command.command2 = [SSID]
  // command.command3 = [KEY]
  WiFi.begin(command.command2.c_str(), command.command3.c_str());
  Serial.print("WiFi.begin()");
  int i = 0;
  while (WiFi.status() != WL_CONNECTED) {
    if (20 < i) {
      Serial.println("WiFi connection failed!");
      WiFi.disconnect();
      return;
    }

    Serial.print(".");
    delay(500);
    i++;
  }
  Serial.println("WiFi Connected.");
  Serial.printf("IP Address  : ");
  Serial.println(WiFi.localIP());
}

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

  // preset Reset Function
  command.addCommand("RESET", EspEasySerialCommand::resetCommand);

  // anonymous function
  command.addCommand("RESET2", [](EspEasySerialCommand::command_t) {
    ESP.restart();
  });

  // normal function
  command.addCommand("RESET3", myReset);
  command.addCommand("WIFI", wifiSet); // WIFI [SSID] [KEY]
}

void loop() {
  command.task();
}

上記がサンプルスケッチですが、よく使う機能が「RESET」コマンドです。最近リセットボタンがないボードが多いので、さくっとリセットしたいときにシリアルコンソールからできると便利です。

上記のようにシリアルモニタから「RESET」みたいにコマンドを投げるとボードで再起動がかかります。

あとはWi-Fiアクセスポイントの設定は「WIFI SSID KEY」でよく設定しています。キー情報をプログラムの中に書きたくないので、一度上記でボードに記憶させることで次回からはWiFi.begin()と引数無しで呼び出すと、最後の情報で再接続するようになります。

command.addCommand("RESET2", [](EspEasySerialCommand::command_t) {
  ESP.restart();
});

登録は上記のようにコマンド名と呼び出す関数のセットになっています。上記は無名関数で直接定義した例になります。

command.addCommand("WIFI", wifiSet); // WIFI [SSID] [KEY]

通常はよく使うコマンドを関数化しておいて、登録するほうがいいと思います。サンプルとして関数をいろいろ仕込んでおきたいと思っていますが、出力先がSerial固定になると微妙なので今はRESETしかありません。printfにして標準出力にしてサンプルを増やすかもしれません。

void dispMemory() {
  Serial.printf("===============================================================\n");
  Serial.printf("Memory Info\n");
  Serial.printf("===============================================================\n");

  Serial.printf("esp_get_free_heap_size()                              : %6d\n", esp_get_free_heap_size() );
  Serial.printf("esp_get_minimum_free_heap_size()                      : %6d\n", esp_get_minimum_free_heap_size() );

  //xPortGetFreeHeapSize()(データメモリ)ヒープの空きバイト数を返すFreeRTOS関数です。これはを呼び出すのと同じheap_caps_get_free_size(MALLOC_CAP_8BIT)です。
  Serial.printf("xPortGetFreeHeapSize()                                : %6d\n", xPortGetFreeHeapSize() );

  //xPortGetMinimumEverFreeHeapSize()また、関連heap_caps_get_minimum_free_size()するものを使用して、ブート以降のヒープの「最低水準点」を追跡できます。
  Serial.printf("xPortGetMinimumEverFreeHeapSize()                     : %6d\n", xPortGetMinimumEverFreeHeapSize() );

  //heap_caps_get_free_size() さまざまなメモリ機能の現在の空きメモリを返すためにも使用できます。
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_EXEC)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_EXEC) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_32BIT)             : %6d\n", heap_caps_get_free_size(MALLOC_CAP_32BIT) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_8BIT)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_8BIT) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_DMA)               : %6d\n", heap_caps_get_free_size(MALLOC_CAP_DMA) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID2)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID2) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID3)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID3) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID3)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID4) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID4)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID5) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID5)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID6) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID6)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID7) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_PID7)              : %6d\n", heap_caps_get_free_size(MALLOC_CAP_PID3) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_SPIRAM)            : %6d\n", heap_caps_get_free_size(MALLOC_CAP_SPIRAM) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_INTERNAL)          : %6d\n", heap_caps_get_free_size(MALLOC_CAP_INTERNAL) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_DEFAULT)           : %6d\n", heap_caps_get_free_size(MALLOC_CAP_DEFAULT) );
  Serial.printf("heap_caps_get_free_size(MALLOC_CAP_INVALID)           : %6d\n", heap_caps_get_free_size(MALLOC_CAP_INVALID) );
}

上記のようなメモリの情報を出力する関数も仕込んでおくといろいろ便利だと思います。

まとめ

シリアルコンソールは結構便利で、やっている処理もかんたんなのでおすすめです。ちょっとコマンドの判定が適当ですが、まあ動いているので、、、

シンプルに実装しているので、似たような機能を作るときの参考にしてください。

続編

コメント

  1. そーたメイ より:

    そういえば8266やESP32のESP-IDFの簡易入出力がATコマンドだった気がします。言われてみればArduinoIDE環境だと「簡易入出力」的なもの、あまりメジャーではないですね。

    • たなかまさゆき より:

      あると便利なんですが、あまり対話型のってないですよね
      Arduino UNOでも使えるのですが単純なライブラリは少ない感じです