
本教程中使用的主控设备为 CoreS3 ,搭配 Unit EXT.IO2。本 IO 拓展单元采用 I2C 的方式通讯,根据实际的电路连接修改程序中的引脚定义,设备连接后对应的通信 IO 为 G1 (SDA),G2 (SCL)。
引脚模拟量 ADC 输入
#include <M5Unified.h>
#include "M5_EXTIO2.h"
M5_EXTIO2 extio;
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.fillScreen(WHITE);
M5.Display.setTextColor(BLACK);
M5.Display.setTextFont(&fonts::FreeMonoBold9pt7b);
M5.Display.setCursor(0, 0);
while (!extio.begin(&Wire, 2, 1,
0x45)) {
Serial.println("extio Connect Error");
M5.Display.println("extio Connect Error");
delay(100);
}
extio.setAllPinMode(ADC_INPUT_MODE); // Set all pins to ADC input mode.
}
char info[50];
void loop() {
M5.Display.fillScreen(WHITE);
M5.Display.setCursor(0, 0);
M5.Display.println("ADC INPUT MODE");
M5.Display.println("FW VERSION: " + String(extio.getVersion()));
for (uint8_t i = 0; i < 8; i++) {
uint16_t adc =
extio.getAnalogInput(i, _12bit); // Get ADC value. 获取ADC值
Serial.printf("CH:%d ADC: %d", i, adc);
M5.Display.fillRect(0, i * 20 + 40, 200, 15, WHITE);
M5.Display.setCursor(0, i * 20 + 40);
M5.Display.printf("CH:%d ADC: %d", i, adc);
}
vTaskDelay(1000);
}#include <M5Unified.h>
#include "M5_EXTIO2.h"
M5_EXTIO2 extio;
extio_io_mode_t mode = DIGITAL_OUTPUT_MODE;
void btnTask(void *pvParameters) {
while (1) {
if (M5.BtnA.wasPressed()) {
if (mode == DIGITAL_INPUT_MODE) {
mode = DIGITAL_OUTPUT_MODE;
} else {
mode = DIGITAL_INPUT_MODE;
}
}
M5.update();
vTaskDelay(80);
}
}
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.fillScreen(WHITE);
M5.Display.setTextColor(BLACK);
M5.Display.setTextFont(&fonts::FreeMonoBold9pt7b);
M5.Display.setCursor(0, 0);
while (!extio.begin(&Wire, 2, 1, 0x45)) {
Serial.println("extio Connect Error");
M5.Display.println("extio Connect Error");
delay(100);
}
extio.setAllPinMode(
DIGITAL_OUTPUT_MODE);
xTaskCreatePinnedToCore(btnTask, "btnTask",
4096,
NULL,
1 ,
NULL, 0);
}
char info[50];
void loop() {
if (mode == DIGITAL_INPUT_MODE) {
M5.Display.fillScreen(WHITE);
M5.Display.setCursor(0, 0);
M5.Display.println("DIGITAL INPUT MODE");
M5.Display.println("FW VERSION: " + String(extio.getVersion()));
for (uint8_t i = 0; i < 8; i++) {
if (extio.getDigitalInput(i)) {
M5.Display.fillRect(i * 30 + 30, 145, 28, 30, WHITE);
} else {
M5.Display.fillRect(i * 30 + 30, 145, 28, 30, WHITE);
}
}
} else if (mode == DIGITAL_OUTPUT_MODE) {
M5.Display.fillScreen(WHITE);
M5.Display.setCursor(0, 0);
M5.Display.println("DIGITAL OUTPUT MODE");
M5.Display.printf("FW VERSION: %s",String(extio.getVersion()));
for (uint8_t i = 0; i < 8; i++) {
extio.setDigitalOutput(i, HIGH);
M5.Display.fillRect(i * 30 + 30, 145, 28, 30, BLACK);
M5.Display.setCursor(i * 30 + 30, 145);
vTaskDelay(100);
}
for (uint8_t i = 0; i < 8; i++) {
extio.setDigitalOutput(i, LOW);
M5.Display.fillRect(i * 30 + 30, 145, 28, 30, BLACK);
M5.Display.setCursor(i * 30 + 30, 145);
vTaskDelay(100);
}
}
extio.setAllPinMode(mode);
vTaskDelay(100);
}#include <M5Unified.h>
#include "M5_EXTIO2.h"
M5_EXTIO2 extio;
extio_io_mode_t mode = DIGITAL_OUTPUT_MODE;
void btnTask(void *pvParameters) {
while (1) {
if (M5.BtnA.wasPressed()) {
if (mode == DIGITAL_INPUT_MODE) {
mode = DIGITAL_OUTPUT_MODE;
} else {
mode = DIGITAL_INPUT_MODE;
}
}
M5.update();
vTaskDelay(80);
}
}
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.fillScreen(WHITE);
M5.Display.setTextColor(BLACK);
M5.Display.setTextFont(&fonts::FreeMonoBold9pt7b);
M5.Display.setCursor(0, 0);
while (!extio.begin(&Wire, 2, 1, 0x45)) {
Serial.println("extio Connect Error");
M5.Display.println("extio Connect Error");
delay(100);
}
extio.setAllPinMode(
DIGITAL_OUTPUT_MODE);
xTaskCreatePinnedToCore(btnTask, "btnTask",
4096,
NULL,
1 ,
NULL, 0);
}
char info[50];
void loop() {
M5.Display.fillScreen(WHITE);
M5.Display.setCursor(0, 0);
M5.Display.println("DIGITAL INPUT MODE");
M5.Display.println("FW VERSION: " + String(extio.getVersion()));
extio.setDigitalOutput(0, HIGH);
M5.Display.println("Set Pin_0 level to high");
M5.Display.printf("Pin_1 level is %s",(String)extio.getDigitalInput(1));
extio.setAllPinMode(mode);
vTaskDelay(100);
}#include <M5Unified.h>
#include "M5_EXTIO2.h"
M5_EXTIO2 extio;
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.fillScreen(WHITE);
M5.Display.setTextColor(BLACK);
M5.Display.setTextFont(&fonts::FreeMonoBold9pt7b);
M5.Display.setCursor(0, 0);
while (!extio.begin(&Wire, 2, 1, 0x45)) {
Serial.println("extio Connect Error");
M5.Display.println("extio Connect Error");
delay(100);
}
extio.setAllPinMode(SERVO_CTL_MODE);
}
char info[50];
void loop() {
M5.Display.fillScreen(WHITE);
M5.Display.setCursor(0, 0);
M5.Display.println("SERVO CTL MODE");
M5.Display.printf("FW VERSION: %s", String(extio.getVersion()));
for (uint8_t deg = 0; deg <= 180; deg += 45) {
for (uint8_t i = 0; i < 8; i++) {
extio.setServoAngle(i, deg);
Serial.printf("CH:%d DEG: %d", i, deg);
M5.Display.fillRect(0, i * 20, 200, i * 20 + 20, WHITE);
M5.Display.setCursor(0, i * 20);
M5.Display.printf("CH:%d DEG: %d", i, deg);
}
vTaskDelay(500);
}
for (int pulse = 500; pulse <= 2500; pulse += 100) {
for (uint8_t i = 0; i < 8; i++) {
extio.setServoPulse(i, pulse);
Serial.printf("CH:%d P: %d", i, pulse);
M5.Display.fillRect(0, i * 20, 200, i * 20 + 20, WHITE);
M5.Display.setCursor(0, i * 20);
M5.Display.printf("CH:%d P: %d", i, pulse);
}
vTaskDelay(500);
}
delay(100);
}下载模式:不同设备进行程序烧录前需要进入下载模式,不同的主控设备该步骤可能有所不同。详情可参考Arduino IDE上手教程页面底部的设备程序下载教程列表,查看具体的操作方式。
CoreS3 长按复位按键 (大约 2 秒) 直到内部绿色 LED 灯亮起,便可松开,此时设备已进入下载模式,等待烧录。
