diff --git a/docs/en/api/power.md b/docs/en/api/power.md
new file mode 100644
index 00000000..ef3e2de9
--- /dev/null
+++ b/docs/en/api/power.md
@@ -0,0 +1,248 @@
+# Power
+
+## setPowerBoostKeepOn()
+
+**Syntax:**
+
+bool setPowerBoostKeepOn(bool en);
+
+**Description:**
+
+This function sets enable/disable power mode.
+
+**Definition:**
+
+```arduino
+bool setPowerBoostKeepOn(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | BOOST_OUT_BIT);
+ else Wire.write(data &(~BOOST_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+#endif
+```
+
+## setCharge()
+
+**Syntax:**
+
+bool setCharge(bool en);
+
+**Description:**
+
+This function sets enable/disable charge mode.
+
+**Definition:**
+
+```arduino
+bool POWER::setCharge(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | CHARGE_OUT_BIT);
+ else Wire.write(data &(~CHARGE_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+## isChargeFull()
+
+**Syntax:**
+
+bool isChargeFull(bool en);
+
+**Description:**
+
+This function check battery level.
+
+**Definition:**
+
+```arduino
+bool isChargeFull(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission(false);
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+ if (data & (1 << CHARGE_FULL_BIT)) return true;
+ else return false;
+ }
+ return false;
+}
+```
+
+## canControl()
+
+**Syntax:**
+
+bool canControl();
+
+**Description:**
+
+This function checks the existence of the battery controller
+
+**Definition:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+## isCharging()
+
+**Syntax:**
+
+bool isCharging(){
+
+**Description:**
+
+This function checks the state of the charge
+
+**Definition:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+
+## setWakeupButton()
+
+**Syntax:**
+
+void setWakeupButton(uint8_t button){
+
+**Description:**
+
+This function set the port to exit sleep
+
+**Definition:**
+
+```arduino
+void setWakeupButton(uint8_t button) {
+ _wakeupPin = button;
+}
+```
+
+## reset()
+
+**Syntax:**
+
+void reset()
+
+**Description:**
+
+This function reset the CPU.
+
+**Definition:**
+
+```arduino
+void POWER::reset() {
+ esp_restart();
+}
+```
+
+
+## batteryMode()
+
+**Syntax:**
+
+bool batteryMode(bool en)
+
+**Description:**
+
+This function controls battery supply
+
+**Definition:**
+
+```arduino
+bool batteryMode(bool en){
+
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ if (en) Wire.write(data | BOOST_ENABLE_BIT);
+ else Wire.write(data &(~BOOST_ENABLE_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+
+## deepSleep()
+
+**Syntax:**
+
+void deepSleep()
+
+**Description:**
+
+This function shifts to deep sleep mode
+
+**Definition:**
+
+```arduino
+void deepSleep(){
+
+ #ifdef M5STACK_FIRE
+ // Keep power keep boost on
+ setPowerBoostKeepOn(true);
+ #endif
+
+ // power off the Lcd
+ M5.Lcd.setBrightness(0);
+ M5.Lcd.sleep();
+
+ // ESP32 into deep sleep
+ esp_sleep_enable_ext0_wakeup((gpio_num_t)_wakeupPin , LOW);
+
+ while(digitalRead(_wakeupPin) == LOW) {
+ delay(10);
+ }
+ esp_deep_sleep_start();
+}
+```
\ No newline at end of file
diff --git a/docs/en/api/system.md b/docs/en/api/system.md
index ac79c7ca..4c8fc497 100644
--- a/docs/en/api/system.md
+++ b/docs/en/api/system.md
@@ -4,42 +4,67 @@
**Syntax:**
-void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true);
+void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true,bool I2CEnable=false);
**Description:**
-This function sets enable/disable LCD, TF Card and Serial port.
+This function sets enable/disable LCD, TF Card,Serial port and I2C port.
**Definition:**
```arduino
-void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable) {
- if (isInited) return;
- else isInited = true;
- if (SerialEnable) {
- Serial.begin(115200);
- Serial.flush();
- delay(50);
- Serial.print("M5Stack initializing...");
- }
- if (LCDEnable) {
- Lcd.begin();
- }
- if (SDEnable) {
- SD.begin(TFCARD_CS_PIN, SPI, 40000000);
- }
- setWakeupButton(BUTTON_A_PIN);
+void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable,bool I2CEnable) {
+
+ // Correct init once
+ if (isInited) return;
+ else isInited = true;
+
+ // UART
+ if (SerialEnable) {
+ Serial.begin(115200);
+ Serial.flush();
+ delay(50);
+ Serial.print("M5Stack initializing...");
+ }
+
+ // LCD INIT
+ if (LCDEnable) {
+ Lcd.begin();
+ }
+
+ // TF Card
+ if (SDEnable) {
+ SD.begin(TFCARD_CS_PIN, SPI, 40000000);
+ }
+
+ // TONE
+ // Speaker.begin();
+
+ // Set wakeup button
+ Power.setWakeupButton(BUTTON_A_PIN);
+
+ // I2C init
+ if(I2CEnable)
+ {
+ Wire.begin(21, 22);
+ }
+
+ if (SerialEnable) {
+ Serial.println("OK");
+ }
}
-```
-**Example:**
+void M5Stack::update() {
-```arduino
-#include
+ //Button update
+ BtnA.read();
+ BtnB.read();
+ BtnC.read();
-void setup() {
- M5.begin();
+ //Speaker update
+ Speaker.update();
}
+
```
## update()
diff --git a/docs/ja/api/power.md b/docs/ja/api/power.md
new file mode 100644
index 00000000..f9949d96
--- /dev/null
+++ b/docs/ja/api/power.md
@@ -0,0 +1,248 @@
+# Power
+
+## setPowerBoostKeepOn()
+
+**構文:**
+
+bool setPowerBoostKeepOn(bool en);
+
+**説明:**
+
+電源供給状態を設定します。
+
+**定義:**
+
+```arduino
+bool setPowerBoostKeepOn(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | BOOST_OUT_BIT);
+ else Wire.write(data &(~BOOST_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+#endif
+```
+
+## setCharge()
+
+**構文:**
+
+bool setCharge(bool en);
+
+**説明:**
+
+充電状態を設定します。
+
+**定義:**
+
+```arduino
+bool POWER::setCharge(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | CHARGE_OUT_BIT);
+ else Wire.write(data &(~CHARGE_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+## isChargeFull()
+
+**構文:**
+
+bool isChargeFull(bool en);
+
+**説明:**
+
+満充電かを判定します
+
+**定義:**
+
+```arduino
+bool isChargeFull(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission(false);
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+ if (data & (1 << CHARGE_FULL_BIT)) return true;
+ else return false;
+ }
+ return false;
+}
+```
+
+## canControl()
+
+**構文:**
+
+bool canControl();
+
+**説明:**
+
+電源コントローラが使用可能かを判断します
+
+**定義:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+## isCharging()
+
+**構文:**
+
+bool isCharging(){
+
+**説明:**
+
+充電中かを返答します
+
+**定義:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+
+## setWakeupButton()
+
+**構文:**
+
+void setWakeupButton(uint8_t button){
+
+**説明:**
+
+スリープ復帰信号ポートを設定します
+
+**定義:**
+
+```arduino
+void setWakeupButton(uint8_t button) {
+ _wakeupPin = button;
+}
+```
+
+## reset()
+
+**構文:**
+
+void reset()
+
+**説明:**
+
+CPUをリセットします
+
+**定義:**
+
+```arduino
+void POWER::reset() {
+ esp_restart();
+}
+```
+
+
+## batteryMode()
+
+**構文:**
+
+bool batteryMode(bool en)
+
+**説明:**
+
+バッテリーの供給状態を設定します
+
+**定義:**
+
+```arduino
+bool batteryMode(bool en){
+
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ if (en) Wire.write(data | BOOST_ENABLE_BIT);
+ else Wire.write(data &(~BOOST_ENABLE_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+
+## deepSleep()
+
+**構文:**
+
+void deepSleep()
+
+**説明:**
+
+省エネモードに移行します
+
+**定義:**
+
+```arduino
+void deepSleep(){
+
+ #ifdef M5STACK_FIRE
+ // Keep power keep boost on
+ setPowerBoostKeepOn(true);
+ #endif
+
+ // power off the Lcd
+ M5.Lcd.setBrightness(0);
+ M5.Lcd.sleep();
+
+ // ESP32 into deep sleep
+ esp_sleep_enable_ext0_wakeup((gpio_num_t)_wakeupPin , LOW);
+
+ while(digitalRead(_wakeupPin) == LOW) {
+ delay(10);
+ }
+ esp_deep_sleep_start();
+}
+```
\ No newline at end of file
diff --git a/docs/ja/api/system.md b/docs/ja/api/system.md
index 4dbe2741..b2ee7798 100644
--- a/docs/ja/api/system.md
+++ b/docs/ja/api/system.md
@@ -4,32 +4,67 @@
**説明:**
-LCD、TFカード、シリアルポートの有効化/無効化を設定します。
+LCD、TFカード、シリアルポート、I2Cの有効化/無効化を設定します。
**構文:**
-void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true);
+void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true,bool I2CEnable=false);
**定義:**
```arduino
-void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable) {
- if (isInited) return;
- else isInited = true;
- if (SerialEnable) {
- Serial.begin(115200);
- Serial.flush();
- delay(50);
- Serial.print("M5Stack initializing...");
- }
- if (LCDEnable) {
- Lcd.begin();
- }
- if (SDEnable) {
- SD.begin(TFCARD_CS_PIN, SPI, 40000000);
- }
- setWakeupButton(BUTTON_A_PIN);
+void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable,bool I2CEnable) {
+
+ // Correct init once
+ if (isInited) return;
+ else isInited = true;
+
+ // UART
+ if (SerialEnable) {
+ Serial.begin(115200);
+ Serial.flush();
+ delay(50);
+ Serial.print("M5Stack initializing...");
+ }
+
+ // LCD INIT
+ if (LCDEnable) {
+ Lcd.begin();
+ }
+
+ // TF Card
+ if (SDEnable) {
+ SD.begin(TFCARD_CS_PIN, SPI, 40000000);
+ }
+
+ // TONE
+ // Speaker.begin();
+
+ // Set wakeup button
+ Power.setWakeupButton(BUTTON_A_PIN);
+
+ // I2C init
+ if(I2CEnable)
+ {
+ Wire.begin(21, 22);
+ }
+
+ if (SerialEnable) {
+ Serial.println("OK");
+ }
}
+
+void M5Stack::update() {
+
+ //Button update
+ BtnA.read();
+ BtnB.read();
+ BtnC.read();
+
+ //Speaker update
+ Speaker.update();
+}
+
```
**使用例:**
diff --git a/docs/zh_CN/api/power.md b/docs/zh_CN/api/power.md
new file mode 100644
index 00000000..3b1e5f26
--- /dev/null
+++ b/docs/zh_CN/api/power.md
@@ -0,0 +1,230 @@
+# Power
+
+## setPowerBoostKeepOn()
+
+**函数原型:**
+
+bool setPowerBoostKeepOn(bool en);
+
+**功能:BOOST输出常开功能**
+
+**函数实现:**
+
+```arduino
+bool setPowerBoostKeepOn(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | BOOST_OUT_BIT);
+ else Wire.write(data &(~BOOST_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+#endif
+```
+
+## setCharge()
+
+**函数原型:**
+
+bool setCharge(bool en);
+
+**功能:设置充电状态**
+
+**函数实现:**
+
+```arduino
+bool POWER::setCharge(bool en){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_SYS_CTL0);
+ if (en) Wire.write(data | CHARGE_OUT_BIT);
+ else Wire.write(data &(~CHARGE_OUT_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+## isChargeFull()
+
+**函数原型:**
+
+bool isChargeFull(bool en);
+
+**功能:确认完全充电**
+
+**函数实现:**
+
+```arduino
+bool isChargeFull(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission(false);
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+ if (data & (1 << CHARGE_FULL_BIT)) return true;
+ else return false;
+ }
+ return false;
+}
+```
+
+## canControl()
+
+**函数原型:**
+
+bool canControl();
+
+**功能:确认可以使用电源控制器**
+
+**函数实现:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+## isCharging()
+
+**函数原型:**
+
+bool isCharging(){
+
+**功能:确认是否正在充电**
+
+**函数实现:**
+
+```arduino
+bool canControl(){
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ0);
+ return(Wire.endTransmission()==0);
+}
+```
+
+
+## setWakeupButton()
+
+**函数原型:**
+
+void setWakeupButton(uint8_t button){
+
+**功能:设置睡眠返回端口**
+
+**函数实现:**
+
+```arduino
+void setWakeupButton(uint8_t button) {
+ _wakeupPin = button;
+}
+```
+
+## reset()
+
+**函数原型:**
+
+void reset()
+
+**功能:执行CPU重置**
+
+**函数实现:**
+
+```arduino
+void POWER::reset() {
+ esp_restart();
+}
+```
+
+
+## batteryMode()
+
+**函数原型:**
+
+bool batteryMode(bool en)
+
+**功能:设置电池供电状态**
+
+**函数实现:**
+
+```arduino
+bool batteryMode(bool en){
+
+ uint8_t data;
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ Wire.endTransmission();
+
+ if(Wire.requestFrom(IP5306_ADDR, 1))
+ {
+ data = Wire.read();
+
+ Wire.beginTransmission(IP5306_ADDR);
+ Wire.write(IP5306_REG_READ1);
+ if (en) Wire.write(data | BOOST_ENABLE_BIT);
+ else Wire.write(data &(~BOOST_ENABLE_BIT));
+ Wire.endTransmission();
+ return true;
+ }
+ return false;
+}
+```
+
+
+## deepSleep()
+
+**函数原型:**
+
+void deepSleep()
+
+**功能:进入 deep sleep 状态**
+
+**函数实现:**
+
+```arduino
+void deepSleep(){
+
+ #ifdef M5STACK_FIRE
+ // Keep power keep boost on
+ setPowerBoostKeepOn(true);
+ #endif
+
+ // power off the Lcd
+ M5.Lcd.setBrightness(0);
+ M5.Lcd.sleep();
+
+ // ESP32 into deep sleep
+ esp_sleep_enable_ext0_wakeup((gpio_num_t)_wakeupPin , LOW);
+
+ while(digitalRead(_wakeupPin) == LOW) {
+ delay(10);
+ }
+ esp_deep_sleep_start();
+}
+```
\ No newline at end of file
diff --git a/docs/zh_CN/api/system.md b/docs/zh_CN/api/system.md
index d3f1547c..08d95e83 100644
--- a/docs/zh_CN/api/system.md
+++ b/docs/zh_CN/api/system.md
@@ -4,31 +4,66 @@
**函数原型:**
-void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true);
+void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true,bool I2CEnable=false);
-**功能:清串口缓冲区,设置串口波特率为 115200;初始化 LCD;初始化 SD 卡;设置按键 A 是睡眠唤醒按键。**
+**功能:清串口缓冲区,设置串口波特率为 115200;初始化 LCD;初始化 SD 卡;初始化 I2C;设置按键 A 是睡眠唤醒按键。**
**函数实现**
```arduino
-void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable) {
- if (isInited) return;
- else isInited = true;
- if (SerialEnable) {
- Serial.begin(115200);
- Serial.flush();
- delay(50);
- Serial.print("M5Stack initializing...");
- }
- if (LCDEnable) {
- Lcd.begin();
- }
- if (SDEnable) {
- SD.begin(TFCARD_CS_PIN, SPI, 40000000);
- }
- setWakeupButton(BUTTON_A_PIN);
+void M5Stack::begin(bool LCDEnable, bool SDEnable, bool SerialEnable,bool I2CEnable) {
+
+ // Correct init once
+ if (isInited) return;
+ else isInited = true;
+
+ // UART
+ if (SerialEnable) {
+ Serial.begin(115200);
+ Serial.flush();
+ delay(50);
+ Serial.print("M5Stack initializing...");
+ }
+
+ // LCD INIT
+ if (LCDEnable) {
+ Lcd.begin();
+ }
+
+ // TF Card
+ if (SDEnable) {
+ SD.begin(TFCARD_CS_PIN, SPI, 40000000);
+ }
+
+ // TONE
+ // Speaker.begin();
+
+ // Set wakeup button
+ Power.setWakeupButton(BUTTON_A_PIN);
+
+ // I2C init
+ if(I2CEnable)
+ {
+ Wire.begin(21, 22);
+ }
+
+ if (SerialEnable) {
+ Serial.println("OK");
+ }
}
+
+void M5Stack::update() {
+
+ //Button update
+ BtnA.read();
+ BtnB.read();
+ BtnC.read();
+
+ //Speaker update
+ Speaker.update();
+}
+
```
**例程**