2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

M5Stackの画面キャプチャー

M5Stack

M5Stackの画面のキャプチャー方法について説明します。

M5Stack良いのアプリケーションの説明や、プログを書くときに画面のキャプチャーが欲しいときがあります。その様な時に、便利なキャプチャ・ツールをご紹介します。

M5Stack 画面キャプチャ・ツール

marutsuのHPで、M5Stack 画面キャプチャ・ツール「Screen_Capture_BMP」が紹介されています。

ライブラリ化はされておらず、ヘッダファイルとして公開されていますので、自由に改変が可能と説明されています。表示データを読み出し、BMPフォーマットの画像データを作成してファイルに保存します。このツールは、「M5Unified」でも使用できます。

ブログや取説に!M5Stack画面キャプチャ・ツール「Screen_Capture_BMP」 | マルツオンライン
ブログや取説に!M5Stack画面キャプチャ・ツール「Screen_Capture_BMP」ボタンでショット撮影!プログラムに埋め込んで連続撮影!320×240pxの美スクリーンをGET

基本仕様

 以下、M5Stack 画面キャプチャ・ツール「Screen_Capture_BMP」の基本仕様です。

  • 関数名:void Screen_Capture_BMP(char *file_name)
    ※全画面をキャプチャし、file_nameで指定されたファイル名でTF(microSD)カードにBMP形式で保存
  • 関数が呼ばれた時点でTF(microSD)カードが挿入されていない場合は、画面にエラー表示し動作停止
  • ファイルが何らかの原因でオープンできなかった場合も画面にエラー表示をし動作停止
  • キャプチャ中は画面バックライトの明るさを5%まで暗くする
    ※キャプチャ中であることを示すためと、使用するTF(microSD)カードによって書き込み中の電圧変動により、
    書き込みに失敗する例があったため実施(バックライトを暗くすることにより解消された)

使用方法

以下、M5Stack 画面キャプチャ・ツール「Screen_Capture_BMP」を使用する手順です。

  1. ヘッダーファイル”Capture.h”のインクルード
  2. void Screen_Capture_BMP(char *file_name)関数を呼び出す
    • 通常、ボタンを押されたときに呼び出します。

ヘッダーファイルのインクルード

#include "Capture.h"

サンプルコード

何らかのトリガーで、Screen_Capture_BMP関数を呼び出します。

以下は、ボタンA 及びデュアルボタンユニット [U025] を使用した例です。

ボタンAが押されたら画面をキャプチャします
#include <Arduino.h>
#include <M5Unified.h>

#include "Capture.h"

int counter;
char fn[100];

void setup() 
{
  M5.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.setTextDatum(TL_DATUM);
  M5.Lcd.setTextFont(4);
  M5.Lcd.setTextSize(1);
  counter = 0;
}

void loop() 
{
  delay(100); //100msウェイト
  M5.update();

  M5.Lcd.setCursor(10, 30);
  M5.Lcd.printf("Counter = %d", counter);
  if(M5.BtnA.isPressed())
  {
    sprintf(fn, "/Counter%d.bmp", counter);
    Screen_Capture_BMP(fn);
    counter++;
  }
}
M5Stack用デュアルボタンユニット [U025]を使用

必要な部分のコードのみ、抜き出しています。

#include <Capture.h>

#define RED_BUTTON	26
#define BLUE_BUTTON	36

int last_value_red	= 0;
int cur_value_red	= 0;
int last_value_blue	= 0;
int cur_value_blue	= 0;

void setup()
{

	// ------------------------------------------------
	pinMode(RED_BUTTON,		INPUT);
	pinMode(BLUE_BUTTON,	INPUT);
	// ------------------------------------------------
	cur_value_red	= digitalRead(RED_BUTTON);
	cur_value_blue	= digitalRead(BLUE_BUTTON);
	last_value_blue	= cur_value_blue;
	last_value_red	= cur_value_red;
}

char fn[100];
int CapNum	= 1;

void loop(void)
{
	M5.delay(1);
	M5.update();

	// ------------------------------------------------
	cur_value_red	= digitalRead(RED_BUTTON);
	cur_value_blue	= digitalRead(BLUE_BUTTON);

	if(cur_value_blue != last_value_blue)
	{
		sprintf(fn, "/Counter%d.bmp", CapNum);
		Screen_Capture_BMP(fn);
		// M5.Speaker.tone(523.251, 100);
		CapNum++;

		last_value_blue		= cur_value_blue;
	}
	
	if(cur_value_red != last_value_red)
	{
		last_value_red		= cur_value_red;
	}
}
タイトルとURLをコピーしました