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」を使用する手順です。
- ヘッダーファイル”Capture.h”のインクルード
- 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;
}
}