0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

M5.Lcd.*の関数をシリアルモニタで操作する

Posted at

1. はじめに

M5.Lcd.*の関数をシリアルモニタで操作できるようにしました。画面設計のお供に。
m5lcd.png

MyM5Stack_LCDdraw.jpg

2. プログラム

m5lcdコマンドとm5btnコマンドを追加しました。

2.1 MyM5Stack004.ino

M5StackにRTCを接続しI2C通信で時刻の設定、取得を行う6.プログラムとの差分を以下に示します。

2.1.1 MyM5Utils.hのインクルード

MyM5Stack004.ino
# include "MyM5Utils.h"

2.1.2 Command Modeのマクロの多重定義よけ

_CMD_でくくります。

# ifndef _CMD_
# define _CMD_
# define CMD_QUIT             1
# define CMD_OK          ERR_OK
# define CMD_BUF_LENGTH      64 // 63+1
# define CMD_MAX_LENGTH      64 // 63+1
# define ARG_MAX_LENGTH      64 // 63+1
# endif

2.1.3 cmd_print_help()

ヘルプを追加します。

    Serial.print("m5lcd      : M5Stack Lcd function\r\n");
    Serial.print("m5btn      : M5Stack Btn function\r\n");

2.1.4 cmd_execute()

呼び出し側を追加します。

    else if(strcmp(cmd, "m5lcd")==0)
    {
        my_m5_lcd();
    }
    else if(strcmp(cmd, "m5btn")==0)
    {
        my_m5_btn();
    }

2.2 MyM5Utils.h

MyM5Utils.h
# ifndef _MYM5UTILS_H_
# define _MYM5UTILS_H_

# ifndef _CMD_
# define _CMD_
# define CMD_QUIT             1
# define CMD_OK          ERR_OK
# define CMD_BUF_LENGTH      64 // 63+1
# define CMD_MAX_LENGTH      64 // 63+1
# define ARG_MAX_LENGTH      64 // 63+1
# endif

int my_m5_lcd();
int my_m5_btn();

# endif

2.3 MyM5Utils.cpp

M5Stack.hに記載の関数を呼び出します。

  • 未実装のものもあります。
  • 25.drawCentreStringと26.drawRightStringのフォントはTFT_Clockに記載のコメントをご参照ください。
TFT_Clock.ino
// Only font numbers 2,4,6,7 are valid. Font 6 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . - a p m
// Font 7 is a 7 segment font and only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : .
MyM5Utils.cpp
# include <M5Stack.h>
# include "MyM5Utils.h"
extern int cmd_getstr(char *buf);
extern int cmd_getnum(int type);

int my_m5_lcd()
{
    int      ret;
    uint8_t  select = 0;
    char     buf[CMD_MAX_LENGTH];

    boolean  wrap;
    int16_t  x, y, x0, y0, x1, y1, x2, y2;
    int16_t  w, h, radius, r, delta;
    int      dX, poY, font;
    
    uint8_t  ubrightness, ucornername, usize;
    uint16_t ucolor, ubg;
    uint16_t ux, uy, ux0, uy0;

    while( select != 99 )
    {
        Serial.print("----------------\r\n");
        Serial.print(" 1.setBrightness\r\n");
        Serial.print(" 2.drawPixel\r\n");
        Serial.print(" 3.drawLine\r\n");
        Serial.print(" 4.fillRect\r\n");
        Serial.print(" 5.fillScreen\r\n");
        Serial.print(" 6.drawCircle\r\n");
        Serial.print(" 7.drawCircleHelper\r\n");
        Serial.print(" 8.fillCircle\r\n");
        Serial.print(" 9.fillCircleHelper\r\n");
        Serial.print("10.drawTriangle\r\n");
        Serial.print("11.fillTriangle\r\n");
        Serial.print("12.drawRoundRect\r\n");
        Serial.print("13.fillRoundRect\r\n");
//        Serial.print("14.drawBitmap    (Unimplemented)\r\n");
//        Serial.print("15.drawRGBBitmap (Unimplemented)\r\n");
        Serial.print("16.drawChar\r\n");
        Serial.print("17.setCursor\r\n");
        Serial.print("18.setTextColor\r\n");
        Serial.print("19.setTextColor /w bgcolor\r\n");
        Serial.print("20.setTextSize\r\n");
        Serial.print("21.setTextWrap\r\n");
        Serial.print("23.print\r\n");
        Serial.print("25.drawCentreString\r\n");
        Serial.print("26.drawRightString\r\n");
//        Serial.print("27.drawJpg     (Unimplemented)\r\n");
//        Serial.print("28.drawJpgFile (Unimplemented)\r\n");
//        Serial.print("29.drawBmpFile (Unimplemented)\r\n");
        Serial.print("99.exit\r\n");
        Serial.print("select : ");
        select = cmd_getnum(DEC);
        Serial.print("\r\n");
        switch(select)
        {
            case 1:
                Serial.print("Brightness(0-255) : "); ubrightness = cmd_getnum(DEC); Serial.print("\r\n");
                M5.Lcd.setBrightness(ubrightness);
                break;
            case 2:
                Serial.print("x     : ");   x      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y     : ");   y      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawPixel(x, y, ucolor);
                break;
            case 3:
                Serial.print("x0    : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0    : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("x1    : ");   x1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y1    : ");   y1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawLine(x0, y0, x1, y1, ucolor);
                break;
            case 4:
                Serial.print("x     : ");   x      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y     : ");   y      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("w     : ");   w      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("h     : ");   h      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillRect(x, y, w, h, ucolor);
                break;
            case 5:
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillScreen(ucolor);
                break;
            case 6:
                Serial.print("x0    : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0    : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("r     : ");   r      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawCircle(x0, y0, r, ucolor);
                break;
            case 7:
                Serial.print("x0         : ");   x0          = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0         : ");   y0          = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("r          : ");   r           = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("cornername : ");   ucornername = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color      : 0x"); ucolor      = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawCircleHelper(x0, y0, r, ucornername, ucolor);
                break;
            case 8:
                Serial.print("x0    : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0    : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("r     : ");   r      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillCircle(x0, y0, r, ucolor);
                break;
            case 9:
                Serial.print("x0         : ");   x0          = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0         : ");   y0          = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("r          : ");   r           = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("cornername : ");   ucornername = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("delta      : ");   delta       = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color      : 0x"); ucolor      = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillCircleHelper(x0, y0, r, ucornername, delta, ucolor);
                break;
            case 10:
                Serial.print("x0    : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0    : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("x1    : ");   x1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y1    : ");   y1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("x2    : ");   x2     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y2    : ");   y2     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawTriangle(x0, y0, x1, y1, x2, y2, ucolor);
                break;
            case 11:
                Serial.print("x0    : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0    : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("x1    : ");   x1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y1    : ");   y1     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("x2    : ");   x2     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y2    : ");   y2     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillTriangle(x0, y0, x1, y1, x2, y2, ucolor);
                break;
            case 12:
                Serial.print("x0     : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0     : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("w      : ");   w      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("h      : ");   h      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("radius : ");   radius = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color  : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.drawRoundRect(x0, y0, w, h, radius, ucolor);
                break;
            case 13:
                Serial.print("x0     : ");   x0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0     : ");   y0     = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("w      : ");   w      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("h      : ");   h      = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("radius : ");   radius = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("color  : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.fillRoundRect(x0, y0, w, h, radius, ucolor);
                break;
            case 16:
                Serial.print("x     : ");   ux     = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("y     : ");   uy     = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("char  : ");   ret    = cmd_getstr(&buf[0]); Serial.print("\r\n");
                Serial.print("color : 0x"); ucolor = cmd_getnum(HEX);     Serial.print("\r\n");
                Serial.print("bg    : 0x"); ubg    = cmd_getnum(HEX);     Serial.print("\r\n");
                Serial.print("size  : ");   usize  = cmd_getnum(DEC);     Serial.print("\r\n");
                M5.Lcd.drawChar(ux, uy, buf[0], ucolor, ubg, usize);
                break;
            case 17:
                Serial.print("x0 : "); ux0 = cmd_getnum(DEC); Serial.print("\r\n");
                Serial.print("y0 : "); uy0 = cmd_getnum(DEC); Serial.print("\r\n");
                M5.Lcd.setCursor(ux0, uy0);
                break;
            case 18:
                Serial.print("TextColor : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.setTextColor(ucolor);
                break;
            case 19:
                Serial.print("TextColor : 0x"); ucolor = cmd_getnum(HEX); Serial.print("\r\n");
                Serial.print("bg        : 0x"); ubg    = cmd_getnum(HEX); Serial.print("\r\n");
                M5.Lcd.setTextColor(ucolor, ubg);
                break;
            case 20:
                Serial.print("TextSize : "); usize = cmd_getnum(DEC); Serial.print("\r\n");
                M5.Lcd.setTextSize(usize);
                break;
            case 21:
                Serial.print("TextWrap (0 or 1): "); wrap = cmd_getnum(DEC); Serial.print("\r\n");
                M5.Lcd.setTextWrap(wrap);
                break;
            case 23:
                Serial.print("str : "); ret = cmd_getstr(&buf[0]); Serial.print("\r\n");
                M5.Lcd.print(buf);
                break;
            case 25:
                Serial.print("str  : "); ret  = cmd_getstr(&buf[0]); Serial.print("\r\n");
                Serial.print("dX   : "); dX   = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("poY  : "); poY  = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("font : "); font = cmd_getnum(DEC);     Serial.print("\r\n");
                M5.Lcd.drawCentreString(buf, dX, poY, font);
                break;
            case 26:
                Serial.print("str  : "); ret  = cmd_getstr(&buf[0]); Serial.print("\r\n");
                Serial.print("dX   : "); dX   = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("poY  : "); poY  = cmd_getnum(DEC);     Serial.print("\r\n");
                Serial.print("font : "); font = cmd_getnum(DEC);     Serial.print("\r\n");
                M5.Lcd.drawRightString(buf, dX, poY, font);
                break;
            case 99:
                break;
            default:
                break;
        }
    }
    return 0;
}

int my_m5_btn()
{
    uint8_t  select = 0;

    while( select != 99 )
    {
        Serial.print("----------------\r\n");
        Serial.print(" 1.BtnA/B/C.read\r\n");
        Serial.print("99.exit\r\n");
        Serial.print("select : ");
        select = cmd_getnum(DEC);
        Serial.print("\r\n");
        switch(select)
        {
            case 1:
                M5.Lcd.fillScreen(0xffff); // white
                M5.Lcd.setCursor(10, 10); M5.Lcd.print("BtnA:"); M5.Lcd.println( M5.BtnA.read() );
                M5.Lcd.setCursor(10, 30); M5.Lcd.print("BtnB:"); M5.Lcd.println( M5.BtnB.read() );
                M5.Lcd.setCursor(10, 50); M5.Lcd.print("BtnC:"); M5.Lcd.println( M5.BtnC.read() );
                break;
            case 99:
                break;
            default:
                break;
        }
    }
    return 0;
}

3. 使い方

  1. M5Stackを起動しUARTで何かキーを送ってCommand Modeへ遷移します。
  2. m5lcdコマンドを実行します。
  3. メニューが表示されるので5番のfillScreenを実行してLCDの画面を初期化します。
  1. 99でメニューから抜けてCommand Modeに戻ります。

4. おわりに

ちょっと前に某界隈で話題になったリバーシの盤面を描いてみました。
M5Stack_LCD_Reversi.jpg

  • 5.fillScreenでLCDをグリーンにペイント
  • 3.drawLineで格子状に描線
  • 8.fillCircleでコマを配置
0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?