From ce3ffd5b785cf091e47086f443907b25b0efce7e Mon Sep 17 00:00:00 2001 From: Gitshaoxiang <1026025056@qq.com> Date: Wed, 25 Nov 2020 16:54:10 +0800 Subject: [PATCH] add some paper api --- .../unit/pbhub/pbhub_i2c_addr.webp | Bin 0 -> 38538 bytes docs/en/api/coreink/eink_api.md | 2 + docs/en/api/coreink/system_api.md | 23 + docs/en/api/lcd.md | 5 +- docs/en/arduino/arduino_home_page.md | 33 +- docs/en/base/node_base.md | 2 +- docs/en/core/basic.md | 4 +- docs/en/core/core2.md | 6 +- docs/en/core/core2_aws.md | 6 +- docs/en/core/face_kit.md | 2 +- docs/en/core/fire.md | 2 +- docs/en/core/gray.md | 4 +- docs/en/core/m5go.md | 2 +- docs/en/core/m5go_lite.md | 2 +- docs/en/core/m5paper.md | 9 +- docs/en/core/m5stickc.md | 2 +- docs/en/core/m5stickc_plus.md | 2 +- docs/en/core/m5stickv.md | 6 +- docs/en/hat/hat_roverc_pro.md | 16 +- docs/en/unit/pbhub.md | 65 +++ docs/zh_CN/api/coreink/eink_api.md | 2 + docs/zh_CN/api/coreink/system_api.md | 28 +- docs/zh_CN/api/lcd.md | 1 + docs/zh_CN/api/m5paper/epd_canvas.md | 512 ++++++++++++++++++ docs/zh_CN/api/m5paper/system_api.md | 349 ++++++++++++ docs/zh_CN/api/m5paper/touch.md | 103 ++++ docs/zh_CN/arduino/arduino_home_page.md | 17 +- docs/zh_CN/core/basic.md | 4 +- docs/zh_CN/core/core2.md | 6 +- docs/zh_CN/core/core2_aws.md | 6 +- docs/zh_CN/core/face_kit.md | 2 +- docs/zh_CN/core/fire.md | 2 +- docs/zh_CN/core/gray.md | 4 +- docs/zh_CN/core/m5go.md | 2 +- docs/zh_CN/core/m5go_lite.md | 2 +- docs/zh_CN/core/m5paper.md | 9 +- docs/zh_CN/core/m5stickc.md | 2 +- docs/zh_CN/core/m5stickc_plus.md | 2 +- docs/zh_CN/core/m5stickv.md | 6 +- docs/zh_CN/hat/hat_roverc_pro.md | 22 +- docs/zh_CN/unit/pbhub.md | 67 ++- 41 files changed, 1248 insertions(+), 93 deletions(-) create mode 100644 docs/assets/img/product_pics/unit/pbhub/pbhub_i2c_addr.webp create mode 100644 docs/zh_CN/api/m5paper/epd_canvas.md create mode 100644 docs/zh_CN/api/m5paper/system_api.md create mode 100644 docs/zh_CN/api/m5paper/touch.md diff --git a/docs/assets/img/product_pics/unit/pbhub/pbhub_i2c_addr.webp b/docs/assets/img/product_pics/unit/pbhub/pbhub_i2c_addr.webp new file mode 100644 index 0000000000000000000000000000000000000000..124f3ff32cc2dba93550de37d5439901ecaaf7d2 GIT binary patch literal 38538 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 Lb!5|CJ@Q literal 0 HcmV?d00001 diff --git a/docs/en/api/coreink/eink_api.md b/docs/en/api/coreink/eink_api.md index 084201a4..28c6f825 100644 --- a/docs/en/api/coreink/eink_api.md +++ b/docs/en/api/coreink/eink_api.md @@ -20,6 +20,8 @@ Ink_Sprite InkPageSprite(&M5.M5Ink); **Description: create image area, configure whether to get image data buff from screen driver (default is to save true)**. +?>The `x` coordinate of the >create image area must be an integer multiple of 8. (eg: 0 , 8 , 16...) Otherwise, the display will not work properly. + **Example:** ```arduino diff --git a/docs/en/api/coreink/system_api.md b/docs/en/api/coreink/system_api.md index 522dc03d..69b3a8a3 100644 --- a/docs/en/api/coreink/system_api.md +++ b/docs/en/api/coreink/system_api.md @@ -82,8 +82,31 @@ M5.update(); M5.Speaker.tone(2700); ``` +## RTC + ?> Please use `M5.begin();` to initialize RTC related functions before using +``` +typedef struct RTC_Time +{ + int8_t Hours; + int8_t Minutes; + int8_t Seconds; + RTC_Time() : Hours(),Minutes(),Seconds(){} + RTC_Time(int8_t h,int8_t m,int8_t s) : Hours(h),Minutes(m),Seconds(s){} +} RTC_TimeTypeDef; + +typedef struct RTC_Date +{ + int8_t WeekDay; + int8_t Month; + int8_t Date; + int16_t Year; + RTC_Date() : WeekDay(),Month(),Date(),Year(){} + RTC_Date(int8_t w,int8_t m,int8_t d, int16_t y) : WeekDay(w),Month(m),Date(d),Year(y){} +} RTC_DateTypeDef; +``` + ## SetTime() **Syntax:** diff --git a/docs/en/api/lcd.md b/docs/en/api/lcd.md index acce5eb4..3e3058c3 100644 --- a/docs/en/api/lcd.md +++ b/docs/en/api/lcd.md @@ -309,6 +309,7 @@ None M5.Lcd.drawBmpFile(SD, "/p2.bmp",0,0); ``` +?>We provide a script that can be used to convert `jpg` images -> `.c` files, you can use it to convert some personal images and draw them on the screen using the following API.[bin2code.py](https://github.com/m5stack/M5Stack/tree/master/tools) ## drawJpg() @@ -1583,7 +1584,7 @@ M5.begin(); M5.Lcd.drawCentreString("hello", 160, 0, 2); ``` -##drawRightString() +## drawRightString() **Description:** @@ -1612,7 +1613,7 @@ M5.begin(); M5.Lcd.drawRightString("hello", 160, 0, 2); ``` -##int16_t fontHeight() +## int16_t fontHeight() **Description:** diff --git a/docs/en/arduino/arduino_home_page.md b/docs/en/arduino/arduino_home_page.md index fa8d8406..6d602919 100644 --- a/docs/en/arduino/arduino_home_page.md +++ b/docs/en/arduino/arduino_home_page.md @@ -14,7 +14,7 @@
- +
{{item.title}} @@ -37,7 +37,8 @@ const quickstart = { 'M5Stick':'#/en/arduino/arduino_development', 'ATOM Lite / Matrix':'#/en/arduino/arduino_development', 'M5Core2':'#/en/arduino/arduino_core2_development', - } + }, + "id":"quickstart" }; const m5core_api = { @@ -55,7 +56,18 @@ const m5core_api = { 'I2C':'#/en/api/commutil', 'WIFI':'#/en/api/wifi', 'Timer':'#/en/api/ticker', - } + }, + "id":"m5core_api" +}; + +const m5core2_api = { + 'title':"M5Core2 API", + 'item':{ + 'AXP192':'#/en/api/axp192_core2', + 'TFT-SCREEN':'#/en/api/lcd', + 'TOUCH':'#/en/api/touch', + }, + "id":"m5core2_api" }; const m5stickc_api = { @@ -67,16 +79,8 @@ const m5stickc_api = { 'IMU':'#/en/api/imu', 'RTC':'#/en/api/rtc', 'PWM':'#/en/api/pwm', - } -}; - -const m5core2_api = { - 'title':"M5Core2 API", - 'item':{ - 'AXP192':'#/en/api/axp192_core2', - 'TFT-SCREEN':'#/en/api/lcd', - 'TOUCH':'#/en/api/touch', - } + }, + "id":"m5stickc_api" }; const coreink_api = { @@ -84,7 +88,8 @@ const coreink_api = { 'item':{ 'System & Button & RTC & Speaker':'#/en/api/coreink/system_api', 'E-Ink':'#/en/api/coreink/eink_api' - } + }, + "id":"coreink_api" }; diff --git a/docs/en/base/node_base.md b/docs/en/base/node_base.md index 38908dd4..bded12ff 100644 --- a/docs/en/base/node_base.md +++ b/docs/en/base/node_base.md @@ -12,7 +12,7 @@ ESP32 provides an Audio Develope Platform called ESP-ADF. ESP-ADF supports development of audio applications for the Espressif Systems ESP32 chip in the most comprehensive way. With ESP-ADF, you can easily add features, develop audio applications from simple to complex: - Music player or recorder supports audio formats such as MP3, AAC, FLAC, WAV, OGG, AMR, TS, EQ, Downmixer, Sonic, G.711, SPEEX ... -- Play music from sources: HTTP, HLS(HTTP Live Streaming), SPIFFS, SDCARD, A2DP-Source, A2DP-Sink, HFP ... +- Play music from sources: HTTP, HLS(HTTP Live Streaming), SPIFFS, TF-card(microSD), A2DP-Source, A2DP-Sink, HFP ... - Integrate Media services such as: DLNA, WeChat ... Internet Radio - Voice recognition and integration with online services such as Alexa, DuerOS, and more. diff --git a/docs/en/core/basic.md b/docs/en/core/basic.md index 9de10b2b..52ddc487 100644 --- a/docs/en/core/basic.md +++ b/docs/en/core/basic.md @@ -154,7 +154,7 @@ M5Stack Basic is consist with two separable parts. The upside part has all kinds

Description:

-

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, SD card, screen, etc.

+

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, TF-card(microSD), screen, etc.

@@ -358,7 +358,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Schematic diff --git a/docs/en/core/core2.md b/docs/en/core/core2.md index bbfbcf4b..04cc1291 100644 --- a/docs/en/core/core2.md +++ b/docs/en/core/core2.md @@ -18,7 +18,7 @@ The MCU is an ESP32 model D0WDQ6-V3 and has dual core Xtensa® 32-bit 240Mhz LX6 M5Core2 also features a built-in RTC module which can provide accurate timing. The power supply is managed by an AXP192 power management chip, which can effectively control the power consumption of the base and a built-in green LED power indicator helps to notify the user of battery level. The battery capacity has been upgraded to 390mAh, which can power the core for much longer than the previous model. -The M5Core2 retains the SD card slot and speakers. However, in order to ensure higher quality sound output, the I2S digital audio interface power amplifier chip is used to effectively prevent signal distortion. There are independent power and reset buttons on the left side and bottom of the base. +The M5Core2 retains the TF-card(microSD) slot and speakers. However, in order to ensure higher quality sound output, the I2S digital audio interface power amplifier chip is used to effectively prevent signal distortion. There are independent power and reset buttons on the left side and bottom of the base. The 3 icons on the front of the screen are capacitive buttons which are programmable. There is a small expansion board on the back of the base with a 6-axis IMU sensor and microphone. The development platform and programming language supported by M5Stack Core2: Arduino, [UIFlow](http://flow.m5stack.com) (using Blockly, MicroPython language) No matter what level of your development and programming skills, M5Stack will help You gradually turn your ideas into reality. @@ -196,7 +196,7 @@ Restart: Click the RST button at the bottom

Description:

-

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, SD card, screen, etc.

+

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, TF-card(microSD), screen, etc.

@@ -350,7 +350,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core2_api) ## Schematic diff --git a/docs/en/core/core2_aws.md b/docs/en/core/core2_aws.md index cb9b1d21..c8a91137 100644 --- a/docs/en/core/core2_aws.md +++ b/docs/en/core/core2_aws.md @@ -10,7 +10,7 @@ ### Core2 -**Core2** is the second generation device in the M5Stack development kit series. based on the original first generation device, with enhanced and improved hardware functionalities. The main controller which is based on the ESP32 D0WDQ6-V3 model cmomes with two Xtensa® 32-bit LX6 processors that can be controlled separately, the main frequency supports up to 240Mhz additionally to WiFi and Bluetooth and onboard 16MB Flash and 8MB PSRAM functionalities. The TYPE-C interface can be used to Download and upload programs to the microcontroller, The front side of the Core2 is equipped with a 2.0-inch integrated capacitive touch screen, which brings users a smoother human-computer interaction experience. The case has a built-in vibration motor, which can provide feedback and vibration reminder functionalities. The built-in RTC module can provide accurate timing, The power supply is equipped with AXP192 power management chip which can effectively control the power consumption of the Core2, At the same time, the Core2 is equipped with an SD card slot and speakers. In order to ensure higher quality sound effects, the I2S digital audio interface power amplifier chip can effectively prevent signal distortion. There are independent power buttons and reset (RST) buttons on the left and bottom of the Core2. The 3 dots on the front of the screen are part of the touch screen, and the hot zone (touch screen) can be mapped to 3 virtual buttons by programming. +**Core2** is the second generation device in the M5Stack development kit series. based on the original first generation device, with enhanced and improved hardware functionalities. The main controller which is based on the ESP32 D0WDQ6-V3 model cmomes with two Xtensa® 32-bit LX6 processors that can be controlled separately, the main frequency supports up to 240Mhz additionally to WiFi and Bluetooth and onboard 16MB Flash and 8MB PSRAM functionalities. The TYPE-C interface can be used to Download and upload programs to the microcontroller, The front side of the Core2 is equipped with a 2.0-inch integrated capacitive touch screen, which brings users a smoother human-computer interaction experience. The case has a built-in vibration motor, which can provide feedback and vibration reminder functionalities. The built-in RTC module can provide accurate timing, The power supply is equipped with AXP192 power management chip which can effectively control the power consumption of the Core2, At the same time, the Core2 is equipped with an TF-card(microSD) slot and speakers. In order to ensure higher quality sound effects, the I2S digital audio interface power amplifier chip can effectively prevent signal distortion. There are independent power buttons and reset (RST) buttons on the left and bottom of the Core2. The 3 dots on the front of the screen are part of the touch screen, and the hot zone (touch screen) can be mapped to 3 virtual buttons by programming. ### M5GO-Bottom For AWS @@ -194,7 +194,7 @@

Description:

-

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, SD card, screen, etc.

+

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, TF-card(microSD), screen, etc.

@@ -364,7 +364,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core2_api) ## Schematic diff --git a/docs/en/core/face_kit.md b/docs/en/core/face_kit.md index 9b89e369..6440c19e 100644 --- a/docs/en/core/face_kit.md +++ b/docs/en/core/face_kit.md @@ -359,7 +359,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Schematic diff --git a/docs/en/core/fire.md b/docs/en/core/fire.md index f9690534..5fab1ff5 100644 --- a/docs/en/core/fire.md +++ b/docs/en/core/fire.md @@ -355,7 +355,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Version Change diff --git a/docs/en/core/gray.md b/docs/en/core/gray.md index 1e54e35c..d23ce406 100644 --- a/docs/en/core/gray.md +++ b/docs/en/core/gray.md @@ -155,7 +155,7 @@ If you ever played with ESP8266, you would realize that ESP32 is a perfect upgra

Description:

-

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, SD card, screen, etc.

+

This case will perform hardware running tests for speakers, wifi, buttons, accelerometer, TF-card(microSD), screen, etc.

@@ -335,7 +335,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Example diff --git a/docs/en/core/m5go.md b/docs/en/core/m5go.md index 66023217..8bfad44d 100644 --- a/docs/en/core/m5go.md +++ b/docs/en/core/m5go.md @@ -339,7 +339,7 @@ To complete schematic, click [here](https://github.com/m5stack/M5-Schematic/tree - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Schematic diff --git a/docs/en/core/m5go_lite.md b/docs/en/core/m5go_lite.md index d8baa64e..6a6a4f22 100644 --- a/docs/en/core/m5go_lite.md +++ b/docs/en/core/m5go_lite.md @@ -332,7 +332,7 @@ For more information about Pin assignment and Pin Remapping, Please refer to [ES - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5core_api) ## Schematic diff --git a/docs/en/core/m5paper.md b/docs/en/core/m5paper.md index 8f9c3c85..a35cc4fe 100644 --- a/docs/en/core/m5paper.md +++ b/docs/en/core/m5paper.md @@ -4,7 +4,7 @@ ## Description -**M5Paper** is M5Stacks latest core device with a touch enabled E-ink display. Powered by the ESP32-D0WDQ6-V3 this is our first device to integrate a super sized 540*960 @4.7" E-ink display,which supports 16 grayscale levels. The display is a GT911 capacitive touch screen,which supports two point touch and a variety of gesture controls . Compared to a regular LCD,E-ink displays are easier on the eyes, which makes them a great choice for reading or viewing for longer periods. Other benefits are the low power consumption and the ability to retain the image even if power to the display is terminated. Integrated in the CoreInk are an multi-function button for operation, SHT30 temperature and moisture sensor, physical buttons and an SD card port for data storage. +**M5Paper** is M5Stacks latest core device with a touch enabled E-ink display. Powered by the ESP32-D0WDQ6-V3 this is our first device to integrate a super sized 540*960 @4.7" E-ink display,which supports 16 grayscale levels. The display is a GT911 capacitive touch screen,which supports two point touch and a variety of gesture controls . Compared to a regular LCD,E-ink displays are easier on the eyes, which makes them a great choice for reading or viewing for longer periods. Other benefits are the low power consumption and the ability to retain the image even if power to the display is terminated. Integrated in the CoreInk are an multi-function button for operation, SHT30 temperature and moisture sensor, physical buttons and an TF-card(microSD) port for data storage. Additionally the FM24C02 internal eeprom chip(256KB-EEPROM)can be used to store vital data even when the device is off. A 1150mAh lipo battery keeps the device going for long periods and battery life can be further preserved by using the RTC(BM8563)to set the device into deep sleep and wake it up again when needed。Three HY2.0-4P expansion ports are included which allow for building complex projects using the existing sensors in the M5Stack ecosystem. @@ -55,7 +55,7 @@ Additionally the FM24C02 internal eeprom chip(256KB-EEPROM)can be used to store Ports - TypeC*1, HY2.0-4P*3 , SD/TF card slot + TypeC*1, HY2.0-4P*3 , TF-card(microSD) slot E-Ink Display @@ -109,14 +109,14 @@ Additionally the FM24C02 internal eeprom chip(256KB-EEPROM)can be used to store ## PinMap -**E-INK & SD Card** +**E-INK & TF-card(microSD)** Resolution:540*960 - +
ESP32 ChipGPIO13GPIO12GPIO14GPIO15GPIO4
IT8951MISOMOSISCKCS/
SD CardMISOMOSISCK/CS
TF-card(microSD)MISOMOSISCK/CS
@@ -206,7 +206,6 @@ For more info on specific pin functions refer to the official ESP32 Docs[ESP32 d - [SHT30 Datasheet](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/unit/SHT3x_Datasheet_digital.pdf) - [BM8563](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/BM8563_V1.1_cn.pdf) - [SY7088](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/SY7088-Silergy.pdf) - - [GT911-datasheet](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/m5paper/gt911_datasheet.pdf) - **API** diff --git a/docs/en/core/m5stickc.md b/docs/en/core/m5stickc.md index be71b236..b798cf52 100644 --- a/docs/en/core/m5stickc.md +++ b/docs/en/core/m5stickc.md @@ -263,7 +263,7 @@ Resolution:80 * 160 - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5stickc_api) ## structural-design-file diff --git a/docs/en/core/m5stickc_plus.md b/docs/en/core/m5stickc_plus.md index 35fb3047..7443dd89 100644 --- a/docs/en/core/m5stickc_plus.md +++ b/docs/en/core/m5stickc_plus.md @@ -269,7 +269,7 @@ Resolution:135 * 240 - **API** - - [Arduino API](en/arduino/arduino_home_page) + - [Arduino API](en/arduino/arduino_home_page?id=m5stickc_api) - **Arduino Library** - [M5StickC_PLUS Library](https://github.com/m5stack/M5StickC-Plus) diff --git a/docs/en/core/m5stickv.md b/docs/en/core/m5stickv.md index b82f757c..8b5318f2 100644 --- a/docs/en/core/m5stickv.md +++ b/docs/en/core/m5stickv.md @@ -121,7 +121,7 @@ It is able to perform convolutional neural network calculations at low power con External storage - TF Card/Micro SD + TF-card(microSD) MEMS @@ -150,9 +150,9 @@ It is able to perform convolutional neural network calculations at low power con -### SD card test +### TF-card(microSD) test -M5StickV does not currently recognize all types of SD cards. We have tested some common SD cards. The test results are as follows. +M5StickV does not currently recognize all types of TF-card(microSD). We have tested some common TF-card(microSD). The test results are as follows. diff --git a/docs/en/hat/hat_roverc_pro.md b/docs/en/hat/hat_roverc_pro.md index 7ca234dc..bf23b41f 100644 --- a/docs/en/hat/hat_roverc_pro.md +++ b/docs/en/hat/hat_roverc_pro.md @@ -70,13 +70,13 @@ The PRO version provides a gripping mechanism controlled by a servo for gripping Servo Gripper - ● - - + x1 + -//td> - 2 Servo Pin - ● - - + Servo Ext Port + x2 + / Battery @@ -124,8 +124,8 @@ MotorControl: - - + +
Servo numberAngle(Register address)Parameter valuePulse(Register address)Parameter value
010x100~180°0x20500~2500ms
020x110~180°0x21500~2500ms
010x100~180°0x20500~2500us
020x110~180°0x21500~2500us
## Example @@ -136,7 +136,7 @@ Use with JoyC HAT(without servo gripper), please click [here](https://github.com Before use, please make sure that the RoverC is fully charged. Charging method: insert M5StickC/M5StickC Plus into the RoverC, and connect the USB cable for charging.Burn the easyloader firmware of JoyC and RoverC with two M5StickC respectively. Insert JoyC and RoverC respectively after burning. After power on, RoverC will display the MAC address name and battery level. At the same time, JoyC will scan for the MAC address of RoverC. Long press the A key of M5StickC on Joyc, and the two will be paired. Left thumbstick controlls forward and back motion, left and right control translation, right thumbstick controls left and right steering. Independent(with servo gripper) usage [here](https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Application/RoverC_PRO_Arduino_Alone) -0ppp + ### 2. UIFlow diff --git a/docs/en/unit/pbhub.md b/docs/en/unit/pbhub.md index 6a1d5ac6..03f6bbba 100644 --- a/docs/en/unit/pbhub.md +++ b/docs/en/unit/pbhub.md @@ -55,6 +55,71 @@ See the below picture for timing sequence of HX711: + +## Change I2C Address + +The I2C address of the unit is 0x40 (which can be changed by using solder resistors A0 ~ A2, the address range is 0x40~0x47). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A0A1A2I2C Address
///0x40
Resistors//0x41
/Resistors/0x42
ResistorsResistors/0x43
//Resistors0x44
Resistors/Resistors0x45
/ResistorsResistors0x46
ResistorsResistorsResistors0x47
+ + ## EasyLoader diff --git a/docs/zh_CN/api/coreink/eink_api.md b/docs/zh_CN/api/coreink/eink_api.md index 07201f0b..b312a9df 100644 --- a/docs/zh_CN/api/coreink/eink_api.md +++ b/docs/zh_CN/api/coreink/eink_api.md @@ -20,6 +20,8 @@ Ink_Sprite InkPageSprite(&M5.M5Ink); **功能:创建图像区域,配置是否从屏幕驱动获取图像数据buff(默认为保存true)** +?>创建图像区域的`x`坐标必须为8的整数倍.(eg: 0 , 8 , 16...)否则会出现显示不正常的状况。 + **例程** ```arduino diff --git a/docs/zh_CN/api/coreink/system_api.md b/docs/zh_CN/api/coreink/system_api.md index d837a62a..9e1390d5 100644 --- a/docs/zh_CN/api/coreink/system_api.md +++ b/docs/zh_CN/api/coreink/system_api.md @@ -52,8 +52,6 @@ M5.update(); `M5.BtnPWR.wasPressed()` -?>RTC相关函数使用前请使用`M5.begin();`进行初始化 - ## Speaker **功能:蜂鸣器驱动** @@ -83,6 +81,32 @@ M5.update(); M5.Speaker.tone(2700); ``` +## RTC + +?>RTC相关函数使用前请使用`M5.begin();`进行初始化 + + +``` +typedef struct RTC_Time +{ + int8_t Hours; + int8_t Minutes; + int8_t Seconds; + RTC_Time() : Hours(),Minutes(),Seconds(){} + RTC_Time(int8_t h,int8_t m,int8_t s) : Hours(h),Minutes(m),Seconds(s){} +} RTC_TimeTypeDef; + +typedef struct RTC_Date +{ + int8_t WeekDay; + int8_t Month; + int8_t Date; + int16_t Year; + RTC_Date() : WeekDay(),Month(),Date(),Year(){} + RTC_Date(int8_t w,int8_t m,int8_t d, int16_t y) : WeekDay(w),Month(m),Date(d),Year(y){} +} RTC_DateTypeDef; +``` + ## SetTime() **函数原型:** diff --git a/docs/zh_CN/api/lcd.md b/docs/zh_CN/api/lcd.md index aeb762f4..80049756 100644 --- a/docs/zh_CN/api/lcd.md +++ b/docs/zh_CN/api/lcd.md @@ -369,6 +369,7 @@ Generate a QR code. M5.Lcd.drawBmpFile(SD, "/p2.bmp",0,0); ``` +?>我们提供一个可以用来转换`jpg`图像->`.c`文件的脚本,你可以使用它来转换一些个人图片,并使用下面的API将图像绘制到屏幕上。[bin2code.py](https://github.com/m5stack/M5Stack/tree/master/tools) ## drawJpg() diff --git a/docs/zh_CN/api/m5paper/epd_canvas.md b/docs/zh_CN/api/m5paper/epd_canvas.md new file mode 100644 index 00000000..0efd4309 --- /dev/null +++ b/docs/zh_CN/api/m5paper/epd_canvas.md @@ -0,0 +1,512 @@ +## EPD Driver + +>M5PAPER搭载了一块分辨率为540*960 @4.7"的电子墨水屏,支持16级灰度显示. 在`M5.begin()`初始化中,已经创建了实例`M5EPD_Driver EPD = M5EPD_Driver();`并进行了初始化.通过下面的屏幕驱动,你能够将内容绘制的数据推送至屏幕. + + +- `m5epd_err_t begin(int8_t sck, int8_t mosi, int8_t miso, int8_t cs, int8_t busy, int8_t rst = -1);` + +- `m5epd_err_t Clear(bool init = false);` + +- `m5epd_err_t WriteFullGram4bpp(const uint8_t *gram);` + +- `m5epd_err_t WritePartGram4bpp(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint8_t *gram);` + +- `m5epd_err_t FillPartGram4bpp(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t data);` + +- `m5epd_err_t SetRotation(uint16_t rotate = IT8951_ROTATE_0);` + +- `m5epd_err_t SetArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h);` + +- `m5epd_err_t UpdateFull(m5epd_update_mode_t mode);` + +- `m5epd_err_t UpdateArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h, m5epd_update_mode_t mode);` + +- `uint16_t UpdateCount(void);` + +- `uint8_t GetRotate(void) {return _rotate;};` + +- `uint8_t GetDirection(void) {return _direction;};` + +- `void ResetUpdateCount(void);` + +- `m5epd_err_t CheckAFSR(void);` + +- `SPIClass* GetSPI(void) {return _epd_spi;}` + +- `void SetColorReverse(bool is_reverse);` + +## Canvas + +>该库使用`Canvas`类进行图案绘制,该类中提供了多种绘图API(其中包含绘制字符串,矩形,三角形,圆形,图片数据等). 使用前需要创建canvas实例并传入屏幕驱动,如下方代码所示。 + +``` +#include + +M5EPD_Canvas canvas(&M5.EPD); +``` + +## 创建/删除Canvas + +>在开始绘图前,我们需要使用Canvas实例创建一个绘制区域 + +- **功能:创建Canvas** +- `void *createCanvas(int16_t width, int16_t height, uint8_t frames = 1) { return TFT_eSprite::createSprite(width, height, frames); };` + +- **功能:删除Canvas** +- `void deleteCanvas(void) { TFT_eSprite::deleteSprite(); }` + +``` +#include + +M5EPD_Canvas canvas(&M5.EPD); + +M5.begin(); +M5.EPD.SetRotation(90); +canvas.createCanvas(400, 300); + +``` + +## 推送Canvas + +>在使用绘图API完成内容绘制后,我们需要使用`push`API将绘制区域推送到屏幕。 + +// Re-implement functions + +- `void *frameBuffer(int8_t f = 1);` + +- `void pushCanvas(int32_t x, int32_t y, m5epd_update_mode_t mode);` + +- `void pushCanvas(m5epd_update_mode_t mode);` + +- `void pushToCanvas(int32_t x, int32_t y, M5EPD_Canvas* canvas);` + +**例程:** + +``` +#include + +M5EPD_Canvas canvas(&M5.EPD); + +void setup() +{ + M5.begin(); + M5.EPD.SetRotation(90); + M5.EPD.Clear(true); + canvas.createCanvas(540, 960); + canvas.setTextSize(3); + canvas.drawString("Hello World!", 50, 350); + canvas.drawString("Hello M5Stack!", 45, 450); + canvas.pushCanvas(0,0,UPDATE_MODE_DU4); +} + +void loop() +{ + +} + +``` + +## 刷新模式 + +>在使用`pushCanvas`时,我们需要传入一个刷新模式参数,在该库中的`m5epd_update_mode_t`已经枚举了几种不同的刷新模式,下面为你说明它们分别有什么样的特点。 + +``` +typedef enum // Typical +{ // Ghosting Update Time Usage + UPDATE_MODE_INIT = 0, // * N/A 2000ms Display initialization, + UPDATE_MODE_DU = 1, // Low 260ms Monochrome menu, text input, and touch screen input 1bit黑白,存在残影 + UPDATE_MODE_GC16 = 2, // * Very Low 450ms High quality images + UPDATE_MODE_GL16 = 3, // * Medium 450ms Text with white background + UPDATE_MODE_GLR16 = 4, // Low 450ms Text with white background + UPDATE_MODE_GLD16 = 5, // Low 450ms Text and graphics with white background + UPDATE_MODE_DU4 = 6, // * Medium 120ms Fast page flipping at reduced contrast 1bit黑白 稍微比DU快一点,残影相对DU较大 + UPDATE_MODE_A2 = 7, // Medium 290ms Anti-aliased text in menus / touch and screen input 2bit灰度,残影 + UPDATE_MODE_NONE = 8 上传至8951缓存区 不刷新。 +} m5epd_update_mode_t; // The ones marked with * are more commonly used + + + + UPDATE_MODE_GC16 = 2, // * Very Low 450ms High quality images 先黑闪后刷新 + UPDATE_MODE_GL16 = 3, // * Medium 450ms Text with white background 不黑闪 + UPDATE_MODE_GLR16 = 4, // Low 450ms Text with white background 不黑闪 + UPDATE_MODE_GLD16 = 5, // Low 450ms Text and graphics with white background 不黑闪 + + 刷新质量较好 + +``` + + + + + +- `uint16_t readPixel(int32_t x, int32_t y);` + +- `void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data);` + +- `void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t transp, const uint8_t *data);` + + + +- `void fillCanvas(uint32_t color);` + + +- `void drawPixel(int32_t x, int32_t y, uint32_t color);` + + +- `uint16_t alphaBlend16(uint8_t alpha, uint8_t fgc, uint8_t bgc);` + + +- `void drawFreetypeBitmap(int32_t cx, int32_t cy, uint16_t bw, uint16_t bh, uint8_t *bitmap);` + + + +**例程:** + + + + + + + + + + +- `void setDriver(M5EPD_Driver *driver);` + +- `void qrcode(const char *string, uint16_t x = 50, uint16_t y = 10, uint16_t width = 220, uint8_t version = 6);` + +- `void qrcode(const String &string, uint16_t x = 50, uint16_t y = 10, uint16_t width = 220, uint8_t version = 6);` + +- `void fillCenterSquare(int32_t cx, int32_t cy, uint16_t w, uint8_t color);` + +- `void drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint8_t thickness, uint8_t color);` + +- `void drawFastVLine(int32_t x, int32_t y, int32_t h, uint8_t thickness, uint8_t color);` + +- `void drawFastHLine(int32_t x, int32_t y, int32_t w, uint8_t thickness, uint8_t color);` + +- `void fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color);` + +- `uint32_t getBufferSize(void) {return _buffer_size;}` + +- `void ReverseColor(void);` + +- `void ReversePartColor(int32_t x, int32_t y, int32_t w, int32_t h);` + +- `void operator=(const M5EPD_Canvas &src);` + + + + +## JPG/BMP/PNG + +- **功能:使用Bmp文件数据绘制图像** +- `bool drawBmpFile(fs::FS &fs, const char *path, uint16_t x, uint16_t y); +- `bool drawBmpFile(fs::FS &fs, String path, uint16_t x, uint16_t y);` + + +- **功能:使用Jpg文件数据绘制图像** +- `bool drawJpgFile(fs::FS &fs, const char *path, uint16_t x = 0, + uint16_t y = 0, uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + jpeg_div_t scale = JPEG_DIV_NONE);` + +- `bool drawJpgFile(fs::FS &fs, String path, uint16_t x = 0, + uint16_t y = 0, uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + jpeg_div_t scale = JPEG_DIV_NONE);` + +- **功能:使用Png文件数据绘制图像** +- `bool drawPngFile(fs::FS &fs, const char *path, uint16_t x = 0, uint16_t y = 0, + uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + double scale = 1.0, uint8_t alphaThreshold = 127);` + +- `bool drawPngFile(fs::FS &fs, String path, uint16_t x = 0, uint16_t y = 0, + uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + double scale = 1.0, uint8_t alphaThreshold = 127);` + +- **功能:使用内存Jpg数据绘制图像** +- `bool drawJpg(const uint8_t *jpg_data, size_t jpg_len, uint16_t x = 0, + uint16_t y = 0, uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + jpeg_div_t scale = JPEG_DIV_NONE);` + +- **功能:使用Jpg的Url/网络资源数据绘制图像** +- `bool drawJpgUrl(String url, uint16_t x = 0, + uint16_t y = 0, uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, jpeg_div_t scale = JPEG_DIV_NONE);` + + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `bool drawPngUrl(const char *url, uint16_t x = 0, uint16_t y = 0, + uint16_t maxWidth = 0, uint16_t maxHeight = 0, + uint16_t offX = 0, uint16_t offY = 0, + double scale = 1.0, uint8_t alphaThreshold = 127);` + + + + + + + +- `uint32_t getExceedOffset(void) {return TFT_eSPI::getExceedOffset();}` + +- `void setTextArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {TFT_eSprite::setTextArea(x,y,w,h);}` + +- `size_t write(uint8_t utf8){return TFT_eSprite::write(utf8);}` + +- `void *createCanvas(int16_t width, int16_t height, uint8_t frames = 1) { return TFT_eSprite::createSprite(width, height, frames); };` + +- `void deleteCanvas(void) { TFT_eSprite::deleteSprite(); }` + + + + +- `void setPivot(int16_t x, int16_t y) { TFT_eSprite::setPivot(x, y); }` + +- `int16_t getPivotX(void) { return _xpivot; }` + +- `int16_t getPivotY(void) { return _ypivot; }` + +- `int16_t width(void) { return _dwidth; }` + +- `int16_t height(void) { return _dheight; }` + +- `void setCursor(int16_t x, int16_t y) { TFT_eSPI::setCursor(x, y); }` + +- `void setCursor(int16_t x, int16_t y, uint8_t font) { TFT_eSPI::setCursor(x, y, font); }` + +- `int16_t getCursorX(void) { return TFT_eSPI::getCursorX(); }` + +- `int16_t getCursorY(void) { return TFT_eSPI::getCursorY(); }` + +- `uint16_t fontsLoaded(void) { return TFT_eSPI::fontsLoaded(); }` + + + + + + + + + +- `int16_t textWidth(const char *string, uint8_t font) {return TFT_eSPI::textWidth(string, font);}` + +- `int16_t textWidth(const char *string) {return TFT_eSPI::textWidth(string);}` + +- `int16_t textWidth(const String& string, uint8_t font) {return TFT_eSPI::textWidth(string, font);}` + +- `int16_t textWidth(const String& string) {return TFT_eSPI::textWidth(string);}` + + + + +## Drawing + + // Parent functions - drawing + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) { TFT_eSPI::drawCircle(x0, y0, r, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, uint32_t color) { TFT_eSPI::drawCircleHelper(x0, y0, r, cornername, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) { TFT_eSPI::fillCircle(x0, y0, r, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, int32_t delta, uint32_t color) { TFT_eSPI::fillCircleHelper(x0, y0, r, cornername, delta, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { TFT_eSprite::setWindow(x0, y0, x1, y1); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void pushColor(uint32_t color) { TFT_eSprite::pushColor(color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void pushColor(uint32_t color, uint16_t len) { TFT_eSprite::pushColor(color, len); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void writeColor(uint16_t color) { TFT_eSprite::writeColor(color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) { TFT_eSprite::drawLine(x0, y0, x1, y1, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) { TFT_eSprite::drawFastVLine(x, y, h, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) { TFT_eSprite::drawFastHLine(x, y, w, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size) { TFT_eSprite::drawChar(x, y, c, color, bg, size); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y) { return TFT_eSprite::drawChar(uniCode, x, y); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) { return TFT_eSprite::drawChar(uniCode, x, y, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawGlyph(uint16_t code) { TFT_eSprite::drawGlyph(code); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void printToSprite(String string) { TFT_eSprite::printToSprite(string); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void printToSprite(char *cbuffer, uint16_t len) { TFT_eSprite::printToSprite(cbuffer, len); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t printToSprite(int16_t x, int16_t y, uint16_t index) { return TFT_eSprite::printToSprite(x, y, index); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) { TFT_eSPI::drawEllipse(x0, y0, rx, ry, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void fillEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) { TFT_eSPI::fillEllipse(x0, y0, rx, ry, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) { TFT_eSPI::drawRect(x, y, w, h, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color) { TFT_eSPI::drawRoundRect(x0, y0, w, h, radius, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void fillRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color) { TFT_eSPI::fillRoundRect(x0, y0, w, h, radius, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) { TFT_eSPI::drawTriangle(x0, y0, x1, y1, x2, y2, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void fillTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) { TFT_eSPI::fillTriangle(x0, y0, x1, y1, x2, y2, color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextColor(uint16_t color) { TFT_eSPI::setTextColor(color); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextColor(uint16_t fgcolor, uint16_t bgcolor) { TFT_eSPI::setTextColor(fgcolor, bgcolor); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextSize(uint8_t size) { TFT_eSPI::setTextSize(size); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextWrap(boolean wrapX, boolean wrapY = false) { TFT_eSPI::setTextWrap(wrapX, wrapY); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextDatum(uint8_t datum) { TFT_eSPI::setTextDatum(datum); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `void setTextPadding(uint16_t x_width) { TFT_eSPI::setTextPadding(x_width); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawNumber(long long_num, int32_t poX, int32_t poY, uint8_t font) { return TFT_eSPI::drawNumber(long_num, poX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawNumber(long long_num, int32_t poX, int32_t poY) { return TFT_eSPI::drawNumber(long_num, poX, poY); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawFloat(float floatNumber, uint8_t decimal, int32_t poX, int32_t poY, uint8_t font) { return TFT_eSPI::drawFloat(floatNumber, decimal, poX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawFloat(float floatNumber, uint8_t decimal, int32_t poX, int32_t poY) { return TFT_eSPI::drawFloat(floatNumber, decimal, poX, poY); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawString(const char *string, int32_t poX, int32_t poY, uint8_t font) { return TFT_eSPI::drawString(string, poX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawString(const char *string, int32_t poX, int32_t poY) { return TFT_eSPI::drawString(string, poX, poY); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawCentreString(const char *string, int32_t dX, int32_t poY, uint8_t font) { return TFT_eSPI::drawCentreString(string, dX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawRightString(const char *string, int32_t dX, int32_t poY, uint8_t font) { return TFT_eSPI::drawRightString(string, dX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawString(const String &string, int32_t poX, int32_t poY, uint8_t font) { return TFT_eSPI::drawString(string, poX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawString(const String &string, int32_t poX, int32_t poY) { return TFT_eSPI::drawString(string, poX, poY); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawCentreString(const String &string, int32_t dX, int32_t poY, uint8_t font) { return TFT_eSPI::drawCentreString(string, dX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `int16_t drawRightString(const String &string, int32_t dX, int32_t poY, uint8_t font) { return TFT_eSPI::drawRightString(string, dX, poY, font); }` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining) { return TFT_eSPI::decodeUTF8(buf, index, remaining); };` + +- **功能:使用Png的Url/网络资源数据绘制图像** +- `uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining, uint8_t *length) { return TFT_eSPI::decodeUTF8(buf, index, remaining, length); };` + + + +// Parent functions - Print +- `size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));` + +- `size_t print(const __FlashStringHelper *x){return Print::print(x);}` + +- `size_t print(const String &x){return Print::print(x);}` + +- `size_t print(const char x[]){return Print::print(x);}` + +- `size_t print(char x){return Print::print(x);}` + +- `size_t print(unsigned char x, int y = DEC){return Print::print(x, y);}` + +- `size_t print(int x, int y = DEC){return Print::print(x, y);}` + +- `size_t print(unsigned int x, int y = DEC){return Print::print(x, y);}` + +- `size_t print(long x, int y = DEC){return Print::print(x, y);}` + +- `size_t print(unsigned long x, int y = DEC){return Print::print(x, y);}` + +- `size_t print(double x, int y = 2){return Print::print(x, y);}` + +- `size_t print(const Printable& x){return Print::print(x);}` + +- `size_t print(struct tm * timeinfo, const char * format = NULL){return Print::print(timeinfo, format);}` + + +- `size_t println(const __FlashStringHelper *x){return Print::println(x);}` + +- `size_t println(const String &x){return Print::println(x);}` + +- `size_t println(const char x[]){return Print::println(x);}` + +- `size_t println(char x){return Print::println(x);}` + +- `size_t println(unsigned char x, int y = DEC){return Print::println(x, y);}` + +- `size_t println(int x, int y = DEC){return Print::println(x, y);}` + +- `size_t println(unsigned int x, int y = DEC){return Print::println(x, y);}` + +- `size_t println(long x, int y = DEC){return Print::println(x, y);}` + +- `size_t println(unsigned long x, int y = DEC){return Print::println(x, y);}` + +- `size_t println(double x, int y = 2){return Print::println(x, y);}` + +- `size_t println(const Printable& x){return Print::println(x);}` + +- `size_t println(struct tm * timeinfo, const char * format = NULL){return Print::println(timeinfo, format);}` + +- `size_t println(void){return Print::println();}` + + + + + + + + + + + + + diff --git a/docs/zh_CN/api/m5paper/system_api.md b/docs/zh_CN/api/m5paper/system_api.md new file mode 100644 index 00000000..fe627a46 --- /dev/null +++ b/docs/zh_CN/api/m5paper/system_api.md @@ -0,0 +1,349 @@ +# System & Button & SHT30 & POWER & RTC + +## begin() + +**函数原型:** + +`void begin(bool touchEnable = true, bool SDEnable = true, bool SerialEnable = true, bool BatteryADCEnable = true, bool I2CEnable = false);` + +**功能:初始化触摸屏 ,TF Card , UART , 电池ADC读取 ,I2C** + +**例程** + +```arduino +#include + +void setup() { + M5.begin(true,true,true,true,true); +} +``` + +## Button类 + +**功能:检测设备按键状态** + +``` + Button(uint8_t pin, uint8_t invert, uint32_t dbTime); + uint8_t read(); + uint8_t isPressed(); + uint8_t isReleased(); + uint8_t wasPressed(); + uint8_t wasReleased(); + uint8_t pressedFor(uint32_t ms); + uint8_t releasedFor(uint32_t ms); + uint8_t wasReleasefor(uint32_t ms); + uint32_t lastChange(); + +``` + +## update() + +**函数原型:** + +`void update();` + +**功能:刷新设备按键状态** + + +**例程:** + +```arduino + +if( M5.BtnL.wasPressed()) +{ + Serial.printf("BtnL wasPressed!"); +} +M5.update(); + +``` + +## SHT30 + +**功能:读取SHT30检测到的温湿度** + +``` + float GetTemperature(TemperatureScale Degree = Cel); + float GetRelHumidity(); + float GetAbsHumidity(AbsHumidityScale Scale = Torr); +``` + +**刷新检测数据(需要调用该API后才能获取新的检测数值)** + +`void UpdateData();` + +**例程:** + +```arduino +#include + +char temStr[10]; +char humStr[10]; + +float tem; +float hum; + +M5EPD_Canvas canvas(&M5.EPD); +void setup() +{ + M5.begin(); + M5.SHT30.Begin(); + M5.EPD.SetRotation(90); + M5.EPD.Clear(true); + canvas.createCanvas(400, 300); + canvas.setTextSize(2); +} + +void loop() +{ + + M5.SHT30.UpdateData(); + tem = M5.SHT30.GetTemperature(); + hum = M5.SHT30.GetRelHumidity(); + Serial.printf("Temperatura: %2.2f*C Humedad: %0.2f%%\r\n", tem, hum); + dtostrf(tem, 2, 2 , temStr); + dtostrf(hum, 2, 2 , humStr); + canvas.drawString("Temperatura:" + String(temStr) + "*C", 100, 100); + canvas.drawString("Humedad:" + String(humStr) , 100, 200); + canvas.pushCanvas(0,300,UPDATE_MODE_A2); + delay(1000); +} + +``` + +## 相关引脚定义 + +``` +#define M5EPD_MAIN_PWR_PIN 2 +#define M5EPD_CS_PIN 15 +#define M5EPD_SCK_PIN 14 +#define M5EPD_MOSI_PIN 12 +#define M5EPD_BUSY_PIN 27 +#define M5EPD_MISO_PIN 13 +#define M5EPD_EXT_PWR_EN_PIN 5 +#define M5EPD_EPD_PWR_EN_PIN 23 +#define M5EPD_KEY_RIGHT_PIN 39 +#define M5EPD_KEY_PUSH_PIN 38 +#define M5EPD_KEY_LEFT_PIN 37 +#define M5EPD_BAT_VOL_PIN 35 +#define M5EPD_PORTC_W_PIN 19 +#define M5EPD_PORTC_Y_PIN 18 +#define M5EPD_PORTB_W_PIN 33 +#define M5EPD_PORTB_Y_PIN 26 +#define M5EPD_PORTA_W_PIN 32 +#define M5EPD_PORTA_Y_PIN 25 +``` + +## Power + +- **功能:启用拓展端口电源** +- `void enableEXTPower() { digitalWrite(M5EPD_EXT_PWR_EN_PIN, 1); }` + +- **功能:关闭拓展端口电源** +- `void disableEXTPower() { digitalWrite(M5EPD_EXT_PWR_EN_PIN, 0); }` + +- **功能:启用墨水屏电源** +- `void enableEPDPower() { digitalWrite(M5EPD_EPD_PWR_EN_PIN, 1); }` + +- **功能:关闭墨水屏电源** +- `void disableEPDPower() { digitalWrite(M5EPD_EPD_PWR_EN_PIN, 0); }` + +- **功能:启用主电源** +- `void enableMainPower() { digitalWrite(M5EPD_MAIN_PWR_PIN, 1); }` + +- **功能:关闭主电源** +- `void disableMainPower() { digitalWrite(M5EPD_MAIN_PWR_PIN, 0); }` + +- **功能:初始化电池ADC检测** +- `void BatteryADCBegin();` + +- **功能:读取电池电压原生ADC值** +- `uint32_t getBatteryRaw();` + +- **功能:读取电池电压** +- `uint32_t getBatteryVoltage();` + +## RTC + +?>RTC相关函数使用前请使用`M5.RTC.begin();`进行初始化 + +``` +typedef struct RTC_Time +{ + int8_t hour; + int8_t min; + int8_t sec; + RTC_Time() : hour(), min(), sec() {} + RTC_Time(int8_t h, int8_t m, int8_t s) : hour(h), min(m), sec(s) {} +} rtc_time_t; + +typedef struct RTC_Date +{ + int8_t week; + int8_t mon; + int8_t day; + int16_t year; + RTC_Date() : week(), mon(), day(), year() {} + RTC_Date(int8_t w, int8_t m, int8_t d, int16_t y) : week(w), mon(m), day(d), year(y) {} +} rtc_date_t; + +``` + +## setTime() + +**函数原型:** + +`void setTime(rtc_time_t *time);` + +**函数参数:** + +设置结构体变量时间 + +## getTime() + +**函数原型:** + +`void getTime(rtc_time_t *time);` + +**函数参数:** + +获取结构体时间 + +## setDate() + +**函数原型:** + +`void setDate(rtc_date_t *date);` + +**函数参数:** + +设置结构体变量日期 + +## getDate() + +**函数原型:** + +`void getDate(rtc_date_t *date);` + +**函数参数:** + +获取结构体变量日期 + +**使用示例:** + + +``` +#include + +M5EPD_Canvas canvas(&M5.EPD); + +rtc_time_t RTCtime; +rtc_date_t RTCDate; + +char timeStrbuff[64]; + +void flushTime(){ + M5.RTC.getTime(&RTCtime); + M5.RTC.getDate(&RTCDate); + + sprintf(timeStrbuff,"%d/%02d/%02d %02d:%02d:%02d", + RTCDate.year,RTCDate.mon,RTCDate.day, + RTCtime.hour,RTCtime.min,RTCtime.sec); + + canvas.drawString(timeStrbuff, 0, 0); + canvas.pushCanvas(100,200,UPDATE_MODE_DU4); +} + +void setupTime(){ + + RTCtime.hour = 23; + RTCtime.min = 33; + RTCtime.sec = 33; + M5.RTC.setTime(&RTCtime); + + RTCDate.year = 2020; + RTCDate.mon = 11; + RTCDate.day = 27; + M5.RTC.setDate(&RTCDate); +} + +void setup() { + + M5.begin(); + M5.EPD.SetRotation(90); + M5.EPD.Clear(true); + M5.RTC.begin(); + canvas.createCanvas(400, 300); + canvas.setTextSize(3); + setupTime(); +} + +void loop() { + flushTime(); + delay(1000); +} +``` + + +## shutdown() + +### 函数重载1: + +关闭电源,再次启动需要通过PWR按键唤醒 + +`void shutdown();` + +### 函数重载2: + +关闭电源,根据传入的延时秒数,在延时结束后通过RTC唤醒设备。 + +`int shutdown( int seconds );` + +### 函数重载3: + +关闭电源,传入指定了某个时间点的RTC时间结构体,当符合该时间的`时`,`分`,`秒`的时候通过RTC唤醒设备。 + +`int shutdown( const rtc_time_t &RTC_TimeStruct);` + +### 函数重载4: + +关闭电源,传入指定了某个时间点的RTC时间结构体,当同时符合该时间点的`周数`,`天数`,`时间`的时通过RTC唤醒设备。 + +`int shutdown( const rtc_date_t &RTC_DateStruct, const rtc_time_t &RTC_TimeStruct);` + + +**使用示例:** + +``` +#include + +M5EPD_Canvas canvas(&M5.EPD); + +void setup() +{ + M5.begin(); + M5.EPD.SetRotation(90); + M5.TP.SetRotation(90); + M5.EPD.Clear(true); + M5.RTC.begin(); + canvas.createCanvas(540, 960); + canvas.setTextSize(3); + canvas.drawString("Press PWR Btn for sleep!", 45, 350); + canvas.drawString("after 5 sec wakeup!", 70, 450); + canvas.pushCanvas(0,0,UPDATE_MODE_DU4); + + +} + +void loop() +{ + if(M5.BtnP.wasPressed()){ + + canvas.drawString("I'm going to sleep.zzzZZZ~", 45, 550); + canvas.pushCanvas(0,0,UPDATE_MODE_DU4); + delay(1000); + M5.shutdown(5); + } + M5.update(); + delay(100); +} +``` \ No newline at end of file diff --git a/docs/zh_CN/api/m5paper/touch.md b/docs/zh_CN/api/m5paper/touch.md new file mode 100644 index 00000000..9ba91831 --- /dev/null +++ b/docs/zh_CN/api/m5paper/touch.md @@ -0,0 +1,103 @@ +# TOUCH-GT911 + +>这是M5Stack Paper触摸屏库。 + +## GT911类 + +>在`M5.begin()`初始化中,已经创建了实例`GT911 TP = GT911();`并进行了初始化. 你可以用该实例中的API获取触摸交互信息。 + +- 初始化I2C总线 +- `esp_err_t begin(uint8_t pin_sda, uint8_t pin_scl, uint8_t pin_int);` + +- 是否有新的屏幕触摸数据待读取 +- `bool avaliable();` + +- 刷新屏幕检测 +- `void update();` + +- 设置屏幕旋转角度 +- `void SetRotation(uint16_t rotate);` + +- 读取触摸手指X坐标 +- `uint16_t readFingerX(uint8_t num);` + +- 读取触摸手指Y坐标 +- `uint16_t readFingerY(uint8_t num);` + +- 读取触摸手指ID坐标 +- `uint16_t readFingerID(uint8_t num);` + +- 读取触摸手指作用区域矩形大小 +- `uint16_t readFingerSize(uint8_t num);` + +- 最后一次读取触摸手指数量 +- `uint8_t getFingerNum(void);` + +- 检测手指是否抬起 +- `bool isFingerUp(void);` + +- 将当前触摸状态清空 +- `void flush(void);` + +- 读取触摸手指信息,返回结构体实例 +- `tp_finger_t readFinger(uint8_t num);` + +``` +typedef struct +{ + uint16_t x; + uint16_t y; + uint16_t id; + uint16_t size; +}tp_finger_t; + +``` + +**例程:** + +```arduino +#include + +M5EPD_Canvas canvas(&M5.EPD); + +int point[2][2]; + +void setup() +{ + M5.begin(); + M5.EPD.SetRotation(90); + M5.TP.SetRotation(90); + M5.EPD.Clear(true); + canvas.createCanvas(540, 960); + canvas.setTextSize(5); + canvas.drawString("Touch The Screen!", 20, 400); + canvas.pushCanvas(0,0,UPDATE_MODE_DU4); +} + +void loop() +{ + + if(M5.TP.avaliable()){ + if(!M5.TP.isFingerUp()){ + M5.TP.update(); + canvas.fillCanvas(0); + bool is_upadte = false; + for(int i=0;i<2; i++){ + tp_finger_t FingerItem = M5.TP.readFinger(i); + if((point[i][0]!=FingerItem.x)||(point[i][1]!=FingerItem.y)){ + is_upadte = true; + point[i][0] = FingerItem.x; + point[i][1] = FingerItem.y; + canvas.fillRect(FingerItem.x-50, FingerItem.y-50, 100, 100, 15); + Serial.printf("Finger ID:%d-->X: %d*C Y: %d Size: %d\r\n", FingerItem.id, FingerItem.x, FingerItem.y , FingerItem.size); + } + } + if(is_upadte) + { + canvas.pushCanvas(0,0,UPDATE_MODE_DU4); + } + } + } +} + +``` diff --git a/docs/zh_CN/arduino/arduino_home_page.md b/docs/zh_CN/arduino/arduino_home_page.md index 7af45ad4..e11bef54 100644 --- a/docs/zh_CN/arduino/arduino_home_page.md +++ b/docs/zh_CN/arduino/arduino_home_page.md @@ -14,7 +14,7 @@
- +
{{item.title}} @@ -36,7 +36,8 @@ const quickstart = { 'M5Stick':'#/zh_CN/arduino/arduino_development', 'ATOM Lite / Matrix':'#/zh_CN/arduino/arduino_development', 'M5Core2':'#/zh_CN/arduino/arduino_core2_development' - } + }, + "id":"quickstart" }; const m5core_api = { @@ -54,7 +55,8 @@ const m5core_api = { 'I2C':'#/zh_CN/api/commutil', 'WIFI':'#/zh_CN/api/wifi', 'Timer':'#/zh_CN/api/ticker', - } + }, + "id":"m5core_api" }; const m5core2_api = { @@ -63,7 +65,8 @@ const m5core2_api = { 'AXP192':'#/zh_CN/api/axp192_core2', 'TFT-SCREEN':'#/zh_CN/api/lcd', 'TOUCH':'#/zh_CN/api/touch', - } + }, + "id":"m5core2_api" }; const m5stickc_api = { @@ -75,7 +78,8 @@ const m5stickc_api = { 'IMU':'#/zh_CN/api/imu', 'RTC':'#/zh_CN/api/rtc', 'PWM':'#/zh_CN/api/pwm', - } + }, + "id":"m5stickc_api" }; const coreink_api = { @@ -83,7 +87,8 @@ const coreink_api = { 'item':{ 'System & Button & RTC & Speaker':'#/zh_CN/api/coreink/system_api', 'E-Ink':'#/zh_CN/api/coreink/eink_api' - } + }, + "id":"coreink_api" }; diff --git a/docs/zh_CN/core/basic.md b/docs/zh_CN/core/basic.md index a8095004..0b663385 100644 --- a/docs/zh_CN/core/basic.md +++ b/docs/zh_CN/core/basic.md @@ -153,7 +153,7 @@ M5Stack Basic 由两个可分离部分堆叠组成. 顶部放置了电路板,

案例描述:

-

该案例将执行喇叭,wifi,按键,加速计,SD卡,屏幕等硬件运行测试.

+

该案例将执行喇叭,wifi,按键,加速计,TF-card(microSD)卡,屏幕等硬件运行测试.

@@ -296,7 +296,7 @@ TF 卡最大支持 16GB - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/core2.md b/docs/zh_CN/core/core2.md index 341c9b0e..abca380c 100644 --- a/docs/zh_CN/core/core2.md +++ b/docs/zh_CN/core/core2.md @@ -13,7 +13,7 @@ ## 描述 -**M5Core2** 是M5Stack开发套件系列中第二代主机,在原有一代主机基础上对功能进一步加强,硬件功能更加齐全。主控ESP32型号为D0WDQ6-V3,具有两个可以单独控制的 Xtensa® 32-bit LX6 处理器,主频高达240Mhz,支持WiFi与蓝牙功能,板载16MB Flash与8MB PSRAM,可通过TYPE-C接口下载程序,强劲的配置满足复杂应用的资源开销。正面搭载一块2.0寸一体化电容式触摸屏,为用户带来更流畅的人机交互体验。机身内置震动马达,可提供触觉回馈和震动提醒功能。内建的RTC模块可提供精准计时功能。电源部分搭载AXP192电源管理芯片可有效控制机身功耗,内置绿色电源指示灯,配备390mAh电池,续航时间更持久。同时机身内配备了SD卡槽与扬声器,为了保证获得更高质量的声音效果,采用I2S数字音频接口的功放芯片,能有效防止信号失真。在机身的左侧和底部配有独立的电源按键与重启(RST)按键,屏幕正面的3个圆点属于触摸屏的一部分,可通过编写程序设置热区映射为3个虚拟按键。机身背部有一块扩展小板,板上带有6轴IMU传感器与麦克风。 +**M5Core2** 是M5Stack开发套件系列中第二代主机,在原有一代主机基础上对功能进一步加强,硬件功能更加齐全。主控ESP32型号为D0WDQ6-V3,具有两个可以单独控制的 Xtensa® 32-bit LX6 处理器,主频高达240Mhz,支持WiFi与蓝牙功能,板载16MB Flash与8MB PSRAM,可通过TYPE-C接口下载程序,强劲的配置满足复杂应用的资源开销。正面搭载一块2.0寸一体化电容式触摸屏,为用户带来更流畅的人机交互体验。机身内置震动马达,可提供触觉回馈和震动提醒功能。内建的RTC模块可提供精准计时功能。电源部分搭载AXP192电源管理芯片可有效控制机身功耗,内置绿色电源指示灯,配备390mAh电池,续航时间更持久。同时机身内配备了TF-card(microSD)卡槽与扬声器,为了保证获得更高质量的声音效果,采用I2S数字音频接口的功放芯片,能有效防止信号失真。在机身的左侧和底部配有独立的电源按键与重启(RST)按键,屏幕正面的3个圆点属于触摸屏的一部分,可通过编写程序设置热区映射为3个虚拟按键。机身背部有一块扩展小板,板上带有6轴IMU传感器与麦克风。 M5Stack Core2支持的开发平台和程序语言:Arduino,[UIFlow](http://flow.m5stack.com) (采用Blockly ,MicroPython语言) 无论你的开发和编程能力处在何种水平,M5Stack 都将协助你,逐步的将想法变为现实。 **开关机操作:** @@ -185,7 +185,7 @@ M5Stack Core2支持的开发平台和程序语言:Arduino,[UIFlow](http://fl

案例描述:

-

该案例将执行喇叭,wifi,按键,加速计,SD卡,屏幕等硬件运行测试.

+

该案例将执行喇叭,wifi,按键,加速计,TF-card(microSD),屏幕等硬件运行测试.

@@ -337,7 +337,7 @@ TF 卡最大支持 16GB - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core2_api) ## 原理图 diff --git a/docs/zh_CN/core/core2_aws.md b/docs/zh_CN/core/core2_aws.md index 2188c7a2..edf30f73 100644 --- a/docs/zh_CN/core/core2_aws.md +++ b/docs/zh_CN/core/core2_aws.md @@ -10,7 +10,7 @@ ### Core2 -**Core2** 是M5Stack开发套件系列中第二代主机,在原有一代主机基础上对功能进一步加强,硬件功能更加齐全。主控ESP32型号为D0WDQ6-V3,具有两个可以单独控制的 Xtensa® 32-bit LX6 处理器,主频高达240Mhz,支持WiFi与蓝牙功能,板载16MB Flash与8MB PSRAM,可通过TYPE-C接口下载程序,强劲的配置满足复杂应用的资源开销。正面搭载一块2.0寸一体化电容式触摸屏,为用户带来更流畅的人机交互体验。机身内置震动马达,可提供触觉回馈和震动提醒功能。内建的RTC模块可提供精准计时功能。电源部分搭载AXP192电源管理芯片可有效控制机身功耗,内置绿色电源指示灯。同时机身内配备了SD卡槽与扬声器,为了保证获得更高质量的声音效果,采用I2S数字音频接口的功放芯片,能有效防止信号失真。在机身的左侧和底部配有独立的电源按键与重启(RST)按键,屏幕正面的3个圆点属于触摸屏的一部分,可通过编写程序设置热区映射为3个虚拟按键。 +**Core2** 是M5Stack开发套件系列中第二代主机,在原有一代主机基础上对功能进一步加强,硬件功能更加齐全。主控ESP32型号为D0WDQ6-V3,具有两个可以单独控制的 Xtensa® 32-bit LX6 处理器,主频高达240Mhz,支持WiFi与蓝牙功能,板载16MB Flash与8MB PSRAM,可通过TYPE-C接口下载程序,强劲的配置满足复杂应用的资源开销。正面搭载一块2.0寸一体化电容式触摸屏,为用户带来更流畅的人机交互体验。机身内置震动马达,可提供触觉回馈和震动提醒功能。内建的RTC模块可提供精准计时功能。电源部分搭载AXP192电源管理芯片可有效控制机身功耗,内置绿色电源指示灯。同时机身内配备了TF-card(microSD)卡槽与扬声器,为了保证获得更高质量的声音效果,采用I2S数字音频接口的功放芯片,能有效防止信号失真。在机身的左侧和底部配有独立的电源按键与重启(RST)按键,屏幕正面的3个圆点属于触摸屏的一部分,可通过编写程序设置热区映射为3个虚拟按键。 ### M5GO-Bottom For AWS @@ -193,7 +193,7 @@

案例描述:

-

该案例将执行喇叭,wifi,按键,加速计,SD卡,屏幕等硬件运行测试.

+

该案例将执行喇叭,wifi,按键,加速计,TF-card(microSD),屏幕等硬件运行测试.

@@ -364,7 +364,7 @@ TF 卡最大支持 16GB - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core2_api) ## 原理图 diff --git a/docs/zh_CN/core/face_kit.md b/docs/zh_CN/core/face_kit.md index 877608de..1c0dd071 100644 --- a/docs/zh_CN/core/face_kit.md +++ b/docs/zh_CN/core/face_kit.md @@ -267,7 +267,7 @@ - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/fire.md b/docs/zh_CN/core/fire.md index 74b73028..da6c94f9 100644 --- a/docs/zh_CN/core/fire.md +++ b/docs/zh_CN/core/fire.md @@ -355,7 +355,7 @@ BMM150 I2C address 0x10 - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/gray.md b/docs/zh_CN/core/gray.md index 93c326b7..7600e1ba 100644 --- a/docs/zh_CN/core/gray.md +++ b/docs/zh_CN/core/gray.md @@ -161,7 +161,7 @@

案例描述:

-

该案例将执行喇叭,wifi,按键,加速计,SD卡,屏幕等硬件运行测试.

+

该案例将执行喇叭,wifi,按键,加速计,TF-card(microSD),屏幕等硬件运行测试.

@@ -326,7 +326,7 @@ BMM150 I2C 地址为 0x10 - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/m5go.md b/docs/zh_CN/core/m5go.md index e95c025b..3175eeb1 100644 --- a/docs/zh_CN/core/m5go.md +++ b/docs/zh_CN/core/m5go.md @@ -344,7 +344,7 @@ BMM150 I2C address 0x10 - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/m5go_lite.md b/docs/zh_CN/core/m5go_lite.md index 1c822e97..9284b97f 100644 --- a/docs/zh_CN/core/m5go_lite.md +++ b/docs/zh_CN/core/m5go_lite.md @@ -346,7 +346,7 @@ BMM150 I2C address 0x10 - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5core_api) ## 原理图 diff --git a/docs/zh_CN/core/m5paper.md b/docs/zh_CN/core/m5paper.md index 8996a266..7e48913e 100644 --- a/docs/zh_CN/core/m5paper.md +++ b/docs/zh_CN/core/m5paper.md @@ -2,7 +2,7 @@ ## 描述 -**M5Paper** 是M5Stack推出的一款可触控墨水屏主控设备,控制器采用ESP32-D0WD。正面嵌入了一块分辨率为540*960 @4.7"的电子墨水屏,支持16级灰度显示。搭配GT911电容式触控面板,支持两点触控与多种手势操作。相对于普通的LCD的屏幕,电子墨水屏能够提供用户更好的文本阅读体验, 同时具有低功耗,掉电图像保持等特性。 集成拨轮开关, SHT30温湿度传感器, 与物理按键。 数据储存方面预留了SD卡接口,并集成了FM24C02储存芯片(256KB-EEPROM)用于用户数据的断电存储。内置了1150mAh锂电池,结合内部的RTC(BM8563)可实现休眠与唤醒功能,能够为设备提供强大的续航能力。开放了3组HY2.0-4P外设接口能够拓展各式各样的传感器设备,为后续的应用功能开发提供无限可能。 +**M5Paper** 是M5Stack推出的一款可触控墨水屏主控设备,控制器采用ESP32-D0WD。正面嵌入了一块分辨率为540*960 @4.7"的电子墨水屏,支持16级灰度显示。搭配GT911电容式触控面板,支持两点触控与多种手势操作。相对于普通的LCD的屏幕,电子墨水屏能够提供用户更好的文本阅读体验, 同时具有低功耗,掉电图像保持等特性。 集成拨轮开关, SHT30温湿度传感器, 与物理按键。 数据储存方面预留了TF-card(microSD)接口,并集成了FM24C02储存芯片(256KB-EEPROM)用于用户数据的断电存储。内置了1150mAh锂电池,结合内部的RTC(BM8563)可实现休眠与唤醒功能,能够为设备提供强大的续航能力。开放了3组HY2.0-4P外设接口能够拓展各式各样的传感器设备,为后续的应用功能开发提供无限可能。 ## 产品特性 @@ -51,7 +51,7 @@ 接口 - TypeC*1, HY2.0-4P*3 , SD卡槽 + TypeC*1, HY2.0-4P*3 , TF-card(microSD)卡槽 墨水屏 @@ -105,14 +105,14 @@ ## 管脚映射 -**墨水屏幕 & SD Card** +**墨水屏幕 & TF-card(microSD)** 屏幕像素:540*960 - +
ESP32 ChipGPIO13GPIO12GPIO14GPIO15GPIO4
IT8951MISOMOSISCKCS/
SD CardMISOMOSISCK/CS
TF-card(microSD)MISOMOSISCK/CS
@@ -203,7 +203,6 @@ - [SHT30 Datasheet](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/unit/SHT3x_Datasheet_digital.pdf) - [BM8563](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/BM8563_V1.1_cn.pdf) - [SY7088](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/SY7088-Silergy.pdf) - - [GT911-datasheet](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/m5paper/gt911_datasheet.pdf) - **API** diff --git a/docs/zh_CN/core/m5stickc.md b/docs/zh_CN/core/m5stickc.md index cf47492b..9aee3ea8 100644 --- a/docs/zh_CN/core/m5stickc.md +++ b/docs/zh_CN/core/m5stickc.md @@ -265,7 +265,7 @@ M5StickC 是 M5Stack 产品系列中的核心设备之一,该产品系列建 - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5stickc_api) ## 结构设计文件 diff --git a/docs/zh_CN/core/m5stickc_plus.md b/docs/zh_CN/core/m5stickc_plus.md index a75ce326..6c4d6214 100644 --- a/docs/zh_CN/core/m5stickc_plus.md +++ b/docs/zh_CN/core/m5stickc_plus.md @@ -273,7 +273,7 @@ setup() - **API** - - [Arduino API](zh_CN/arduino/arduino_home_page) + - [Arduino API](zh_CN/arduino/arduino_home_page?id=m5stickc_api) ## 案例程序 diff --git a/docs/zh_CN/core/m5stickv.md b/docs/zh_CN/core/m5stickv.md index adb32b52..9e5b1783 100644 --- a/docs/zh_CN/core/m5stickv.md +++ b/docs/zh_CN/core/m5stickv.md @@ -115,7 +115,7 @@ M5stickV AI 摄像头具备机器视觉能力,配备OmniVision OV7740图像传 外部存储 - TF Card/Micro SD + TF-card(microSD) MEMS六轴传感器 @@ -143,9 +143,9 @@ M5stickV AI 摄像头具备机器视觉能力,配备OmniVision OV7740图像传 -## SD卡测试 +## TF-card(microSD)测试 -M5StickV目前并不能识别所有类型的SD卡,我们对一些常见的SD卡进行了测试,测试结果如下. +M5StickV目前并不能识别所有类型的TF-card(microSD),我们对一些常见的TF-card进行了测试,测试结果如下. diff --git a/docs/zh_CN/hat/hat_roverc_pro.md b/docs/zh_CN/hat/hat_roverc_pro.md index 4b5fd4fa..e19bfad7 100644 --- a/docs/zh_CN/hat/hat_roverc_pro.md +++ b/docs/zh_CN/hat/hat_roverc_pro.md @@ -14,7 +14,7 @@ - I2C地址0x38 - 可遥控 -- 带有夹持机构 +- 带有夹持结构 - 可编程 - 全方位灵活移动 - 四通道电机驱动器 @@ -65,7 +65,7 @@ - + @@ -73,13 +73,13 @@ - - + + - - - + + + @@ -128,8 +128,8 @@ MotorControl:
/ RoverC PRO RoverC
舵机爪手-x1/
2路舵机接口-舵机拓展接口x2/
电池
- - + +
舵机编号角度(寄存器地址)参数范围脉冲(寄存器地址)参数范围
010x100~180°0x20500~2500ms
020x110~180°0x21500~2500ms
010x100~180°0x20500~2500us
020x110~180°0x21500~2500us
## 案例程序 @@ -141,6 +141,10 @@ MotorControl: 单独使用参考(含夹持) [点击此处](https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Application/RoverC_PRO_Arduino_Alone) +### 2. UIFlow + + + ### 引脚映射 diff --git a/docs/zh_CN/unit/pbhub.md b/docs/zh_CN/unit/pbhub.md index 78967e13..2fdeb5b8 100644 --- a/docs/zh_CN/unit/pbhub.md +++ b/docs/zh_CN/unit/pbhub.md @@ -12,8 +12,6 @@ Port B 中的两条数据总线与ESP32的**GPIO36**和**GPIO26**连接,可根 对于使用电平控制或是模拟值输入的项目,PbHUB 是一个不错的多设备控制的解决方案. -该 Unit 的 I2C 地址为0x40(可通过调整电阻进行更改). - *注意1:编程时请注意通道顺序*
@@ -22,7 +20,7 @@ Port B 中的两条数据总线与ESP32的**GPIO36**和**GPIO26**连接,可根 *注意2: 并非所有带有黑色接口(PortB)的Unit都支持通过PbHUB扩展.PbHUB只能应用于基本的单总线通信,通过I2C协议(内置MEGA328)能够实现基本的数字读写,模拟读写.但对于像Weight(内置HX711)这种通信不仅需要进行anglog读取,还需要依赖于时序的Unit来说,PbHUB无法进行拓展.* 参考下图,了解HX711的时序:
- + ## 产品特性 @@ -60,6 +58,69 @@ Port B 中的两条数据总线与ESP32的**GPIO36**和**GPIO26**连接,可根
+## 修改I2C地址 + +该 Unit 的 I2C 地址为0x40(可通过焊接电阻A0~A2进行更改, 地址范围为0x40~0x47). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A0A1A2I2C Address
///0x40
焊接电阻//0x41
/焊接电阻/0x42
焊接电阻焊接电阻/0x43
//焊接电阻0x44
焊接电阻/焊接电阻0x45
/焊接电阻焊接电阻0x46
焊接电阻焊接电阻焊接电阻0x47
+ ## EasyLoader