M5StickCのLCDが起動時に点灯しないようにする

M5StickCって ScreenBreath(0)の指定をしても、**起動時には一瞬最大輝度で光りますよね。**
あれを光らせない方法です。

# やりかた
LCDの初期設定はM5.begin()内でM5.Axp.begin()が呼び出されることによって行われています。
その時に一瞬光るので、その部分を書き換えればLCDのバックライトが光るのを止められます。

大きな副作用としては、**電源を止めてしまうのでスクリーン表示は一切使えなくなります。**
なんという荒業。

## 具体的に
**M5.begin()を使わず、自前で必要な処理を書きます。**
[GitHub](https://github.com/m5stack/M5StickC/blob/master/src/M5StickC.cpp "M5StickC.cpp")でM5.begin()の内容を見ながら必要な処理だけコピペします。

<details><summary>M5.begin()の内容(引用)</summary>

```

void M5StickC::begin(bool LCDEnable, bool PowerEnable, bool SerialEnable) {
    //! Correct init once
    if (isInited)
        return;
    else
        isInited = true;

    //! UART
    if (SerialEnable) {
        Serial.begin(115200);
        Serial.flush();
        delay(50);
        Serial.print("M5StickC initializing...");
    }

    // Power
    if (PowerEnable) {
        Axp.begin();
    }

    // LCD INIT
    if (LCDEnable) {
        Lcd.begin();
    }

    if (SerialEnable) {
        Serial.println("OK");
    }

    Rtc.begin();
}
```

</details>


// Power と // LCD INIT とコメントしてあるあたりをカットすればいいと思います。
最低限、

```
 Serial.begin(115200); 
```

だけ忘れずに書いておけば動く(たぶん)

次に、**Axp.begin() 相当の処理を、これも[GitHub](https://github.com/m5stack/M5StickC/blob/master/src/AXP192.cpp "AXP192.cpp")を見ながら追加していきます。**

<details><summary>Axp.begin()の内容(引用)</summary>

```
void AXP192::begin(bool disableLDO2, bool disableLDO3, bool disableRTC,
                   bool disableDCDC1, bool disableDCDC3, bool disableLDO0) {
    Wire1.begin(21, 22);
    Wire1.setClock(400000);

    // Set LDO2 & LDO3(TFT_LED & TFT) 3.0V
    Write1Byte(0x28, 0xcc);

    // Set ADC sample rate to 200hz
    Write1Byte(0x84, 0b11110010);

    // Set ADC to All Enable
    Write1Byte(0x82, 0xff);

    // Bat charge voltage to 4.2, Current 100MA
    Write1Byte(0x33, 0xc0);

    // Depending on configuration enable LDO2, LDO3, DCDC1, DCDC3.
    byte buf = (Read8bit(0x12) & 0xef) | 0x4D;
    if (disableLDO3) buf &= ~(1 << 3);
    if (disableLDO2) buf &= ~(1 << 2);
    if (disableDCDC3) buf &= ~(1 << 1);
    if (disableDCDC1) buf &= ~(1 << 0);
    Write1Byte(0x12, buf);

    // 128ms power on, 4s power off
    Write1Byte(0x36, 0x0C);

    if (!disableLDO0) {
        // Set MIC voltage to 2.8V
        Write1Byte(0x91, 0xA0);

        // Set GPIO0 to LDO
        Write1Byte(0x90, 0x02);
    } else {
        Write1Byte(0x90, 0x07);  // GPIO0 floating
    }

    // Disable vbus hold limit
    Write1Byte(0x30, 0x80);

    // Set temperature protection
    Write1Byte(0x39, 0xfc);

    // Enable RTC BAT charge
    Write1Byte(0x35, 0xa2 & (disableRTC ? 0x7F : 0xFF));

    // Enable bat detection
    Write1Byte(0x32, 0x46);

    // Set Power off voltage 3.0v
    Write1Byte(0x31, (Read8bit(0x31) & 0xf8) | (1 << 2));
}

```

</details>

以下は私が必要だと思ったものだけを抜き出したものです。参考までに。

```
    Wire1.begin(21, 22);
    Wire1.setClock(400000);

    // Set ADC sample rate to 200hz
    Write1Byte(0x84, 0b11110010);

    // Set ADC to All Enable
    Write1Byte(0x82, 0xff);

    // Bat charge voltage to 4.2, Current 100MA
    Write1Byte(0x33, 0xc0);

    // Depending on configuration enable LDO2, LDO3, DCDC1, DCDC3.
    byte buf = (Read8bit(0x12) & 0xef) | 0x4D;
    buf &= ~(1 << 3); //
    buf &= ~(1 << 2); //
    buf &= ~(1 << 1); //
    Write1Byte(0x12, buf);

    // 128ms power on, 4s power off
    Write1Byte(0x36, 0x0C);

    // GPIO0 floating
    Write1Byte(0x90, 0x07);

    // Disable vbus hold limit
    Write1Byte(0x30, 0x80);

    // Set temperature protection
    Write1Byte(0x39, 0xfc);

    // Enable RTC BAT charge
    Write1Byte(0x35, 0xa2 & 0xFF);

    // Enable bat detection
    Write1Byte(0x32, 0x46);

    // Set Power off voltage 3.0v
    Write1Byte(0x31, (Read8bit(0x31) & 0xf8) | (1 << 2));
```

 コードのうち、
    // Set LDO2 & LDO3(TFT_LED & TFT) 3.0V
    // Depending on configuration enable LDO2, LDO3, DCDC1, DCDC3.
    // Set MIC voltage to 2.8V
というコメントがあるあたりの処理を変更or削除しています。
マイクの電源もついでに止めました。


そうそう、以下の関数は必須なので忘れず書いておいてください。

```
void Write1Byte(uint8_t Addr, uint8_t Data) {
    Wire1.beginTransmission(0x34);
    Wire1.write(Addr);
    Wire1.write(Data);
    Wire1.endTransmission();
}

uint8_t Read8bit(uint8_t Addr) {
    Wire1.beginTransmission(0x34);
    Wire1.write(Addr);
    Wire1.endTransmission();
    Wire1.requestFrom(0x34, 1);
    return Wire1.read();
}
```

他にもバッテリーの電圧をモニターしたいとかAxp関連の処理をするなら、必要な関数とかをコピペしてくる必要があるかもですね。


# なんでこんなことを？
環境センサを繋いであるM5StickCが、ディープスリープから復帰するたび夜中にチカチカ光るのが意外と気になったので調べてみました。
「光れば動作してるのが確認できる」と言えばそうなのですが、まあ、電気の無駄ですよね。

LCDを使わないのならAtom LITEを使えば？と思われるかもしれませんが、M5StickCはバッテリーを内蔵しているというのが地味にありがたいのです…。