Skip to main content

引脚复用

Seeed Studio XIAO ESP32C3 具有丰富的接口。它有 11 个数字 I/O 引脚可用作 PWM 引脚,以及 4 个模拟输入引脚可用作 ADC 引脚。它支持四种串行通信接口,如 UART、I2C、SPI 和 I2S。本 wiki 将帮助您了解这些接口并在您的下一个项目中实现它们!

数字

将一个按钮连接到引脚 D6,将一个 LED 连接到引脚 D10。然后上传以下代码,使用按钮控制 LED 的开/关。

const int buttonPin = D6;     // 按钮连接到数字引脚 6
const int ledPin = D10; // LED 连接到数字引脚 10

int buttonState = 0; // 用于读取按钮状态的变量

void setup() {
// 将 LED 引脚初始化为输出:
pinMode(ledPin, OUTPUT);
// 将按钮引脚初始化为输入:
pinMode(buttonPin, INPUT);
}

void loop() {
// 读取按钮的状态值:
buttonState = digitalRead(buttonPin);

// 检查按钮是否被按下。如果是,buttonState 为 HIGH:
if (buttonState == HIGH) {
// 打开 LED:
digitalWrite(ledPin, HIGH);
} else {
// 关闭 LED:
digitalWrite(ledPin, LOW);
}
}

数字引脚作为PWM

将LED连接到引脚D10。然后上传以下代码,观察LED逐渐淡化的效果。

int ledPin = D10;    // LED连接到数字引脚10

void setup() {
// 声明LED引脚为输出
pinMode(ledPin, OUTPUT);
}

void loop() {
// 从最小值到最大值以5为增量淡入:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// 设置值(范围从0到255):
analogWrite(ledPin, fadeValue);
// 等待30毫秒以观察调光效果
delay(30);
}

// 从最大值到最小值以5为增量淡出:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// 设置值(范围从0到255):
analogWrite(ledPin, fadeValue);
// 等待30毫秒以观察调光效果
delay(30);
}
}

模拟

将电位器连接到引脚 A0,将 LED 连接到引脚 D10。然后上传以下代码,通过旋转电位器旋钮来控制 LED 的闪烁间隔。

tip

ADC 映射范围为 0-2500mV。

const int sensorPin = A0;
const int ledPin = D10;

void setup() {
pinMode(sensorPin, INPUT); // 将 sensorPin 声明为输入
pinMode(ledPin, OUTPUT); // 将 ledPin 声明为输出
}

void loop() {
// 从传感器读取值:
int sensorValue = analogRead(sensorPin);
// 打开 ledPin
digitalWrite(ledPin, HIGH);
// 程序停止 <sensorValue> 毫秒:
delay(sensorValue);
// 关闭 ledPin:
digitalWrite(ledPin, LOW);
// 程序停止 <sensorValue> 毫秒:
delay(sensorValue);
}

串口 - UART

常规方法 - 选择使用 USB 串口或 UART0 串口中的一种

此开发板上有 2 个串口接口:

  • USB 串口
  • UART0 串口
note

XIAO ESP32 C3 没有 Serial2。 另外,如果您需要使用 Serial1,必须定义引脚;否则可能无法接收数据。对于 XIAO ESP32 系列,使用 Serial1 的方法如下:

Serial1.begin(115200, SERIAL_8N1, D7, D6); // RX, TX

默认情况下,USB串口是启用的,这意味着您可以通过USB Type-C将开发板连接到PC,并在Arduino IDE上打开串口监视器来查看通过串口发送的数据。

但是,如果您想使用UART0作为串口,您需要将引脚D6作为TX引脚,引脚D7作为RX引脚,并连接到USB-串口适配器。

pir

此外,您需要在Arduino IDE中将USB CDC On Boot设置为Disabled

注意:当开发板在Arduino开发板管理器中显示时更换照片

pir

将以下代码上传到Arduino IDE以通过串口发送字符串"Hello World!"

void setup() {
Serial.begin(115200);
while (!Serial);
}

void loop() {
Serial.println("Hello World!");
delay(1000);
}

在 Arduino 串口监视器上的输出如下所示

pir

特殊方法 - 同时使用 USB 串口和 UART0/UART1

很多时候,我们需要使用 UART 传感器连接到 XIAO ESP32C3 硬件串口来获取数据,同时,您可能需要使用 USB 串口在串口监视器上显示数据。这可以通过一些特殊方法来实现。

  • 示例程序:
// Need this for the lower level access to set them up.
#include <HardwareSerial.h>

//Define two Serial devices mapped to the two internal UARTs
HardwareSerial MySerial0(0);
HardwareSerial MySerial1(1);

void setup()
{
// For the USB, just use Serial as normal:
Serial.begin(115200);

// Configure MySerial0 on pins TX=D6 and RX=D7 (-1, -1 means use the default)
MySerial0.begin(9600, SERIAL_8N1, -1, -1);
MySerial0.print("MySerial0");

// And configure MySerial1 on pins RX=D9, TX=D10
MySerial1.begin(115200, SERIAL_8N1, 9, 10);
MySerial1.print("MySerial1");
}

void loop()
{

}

如您所见,XIAO ESP32C3 实际上有三个可用的 UART。

在下面的内容中,我们将以可供销售的 60GHz 毫米波传感器 - 人体静息呼吸和心跳模块 为例,解释如何使用 D6 和 D7 硬件串口以及 USB 串口。

请准备以下物品。

XIAO ESP32C360GHz 毫米波传感器 -
人体静息呼吸
和心跳模块
立即获取立即获取

将传感器库下载到您的计算机。并将其添加到 Arduino IDE 中。

在这里,我们想要解析心跳和呼吸数据信息,那么您可以像这样重写您的程序。

#include "Arduino.h"
#include <60ghzbreathheart.h>
#include <HardwareSerial.h>

HardwareSerial MySerial(0); //创建一个新的HardwareSerial类 -- D6/D7

// 也可以尝试使用硬件串口
BreathHeart_60GHz radar = BreathHeart_60GHz(&MySerial);

void setup() {
// 将你的设置代码放在这里,只运行一次:
Serial.begin(115200);
MySerial.begin(115200, SERIAL_8N1, -1, -1); // 当CPU频率为40MHz时,工作在定义速度的一半。

while(!Serial); //当串口打开时,程序开始执行。

Serial.println("准备就绪");

// radar.ModeSelect_fuc(1); //1: 表示实时传输模式,2: 表示睡眠状态模式。
//设置模式后,如果你没有看到返回的数据,可能需要重新给传感器上电。
}

void loop()
{
// 将你的主要代码放在这里,重复运行:
radar.Breath_Heart(); //呼吸和心跳信息输出
if(radar.sensor_report != 0x00){
switch(radar.sensor_report){
case HEARTRATEVAL:
Serial.print("传感器监测到当前心率值为: ");
Serial.println(radar.heart_rate, DEC);
Serial.println("----------------------------");
break;
case HEARTRATEWAVE: //仅在实时数据传输模式开启时有效
Serial.print("心率波形(正弦波) -- 点 1: ");
Serial.print(radar.heart_point_1);
Serial.print(", 点 2 : ");
Serial.print(radar.heart_point_2);
Serial.print(", 点 3 : ");
Serial.print(radar.heart_point_3);
Serial.print(", 点 4 : ");
Serial.print(radar.heart_point_4);
Serial.print(", 点 5 : ");
Serial.println(radar.heart_point_5);
Serial.println("----------------------------");
break;
case BREATHNOR:
Serial.println("传感器检测到当前呼吸频率正常。");
Serial.println("----------------------------");
break;
case BREATHRAPID:
Serial.println("传感器检测到当前呼吸频率过快。");
Serial.println("----------------------------");
break;
case BREATHSLOW:
Serial.println("传感器检测到当前呼吸频率过慢。");
Serial.println("----------------------------");
break;
case BREATHNONE:
Serial.println("暂时没有呼吸信息,请等待...");
Serial.println("----------------------------");
break;
case BREATHVAL:
Serial.print("传感器监测到当前呼吸频率值为: ");
Serial.println(radar.breath_rate, DEC);
Serial.println("----------------------------");
break;
case BREATHWAVE: //仅在实时数据传输模式开启时有效
Serial.print("呼吸频率波形(正弦波) -- 点 1: ");
Serial.print(radar.breath_point_1);
Serial.print(", 点 2 : ");
Serial.print(radar.breath_point_2);
Serial.print(", 点 3 : ");
Serial.print(radar.breath_point_3);
Serial.print(", 点 4 : ");
Serial.print(radar.breath_point_4);
Serial.print(", 点 5 : ");
Serial.println(radar.breath_point_5);
Serial.println("----------------------------");
break;
}
}
delay(200); //添加时间延迟以避免程序卡死
}

请上传程序,然后打开串口监视器并将波特率设置为115200。

接下来,我们可以使用以下连接方法将传感器连接到XIAO ESP32C3。

如果一切顺利,您将在串口监视器上看到数据消息。

pir

Serial1 使用方法

根据上述XIAO ESP32C3引脚图的具体参数,我们可以观察到有TX引脚和RX引脚。 这与串口通信不同,但使用方法也非常相似,只是需要添加一些参数。 因此接下来,我们将使用芯片引出的引脚进行串口通信。

需要包含的核心函数:

  • Serial1.begin(BAUD,SERIAL_8N1,RX_PIN,TX_PIN); -- 启用Serial1,函数原型:<Serial.Type>.begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin);
    • baud:波特率
    • config:配置位
    • rxPin:接收引脚
    • txPin:发送引脚

值得注意的是,如果我们使用数字引脚端口来定义,这里应该是#define RX_PIN D7#define TX_PIN D6,具体参数请参考不同XIAO系列的引脚图。

以下是一个示例程序:

#define RX_PIN D7
#define TX_PIN D6
#define BAUD 115200

void setup() {
Serial1.begin(BAUD,SERIAL_8N1,RX_PIN,TX_PIN);
}

void loop() {
if(Serial1.available() > 0)
{
char incominByte = Serial1.read();
Serial1.print("I received : ");
Serial1.println(incominByte);
}
delay(1000);
}

上传程序后,在Arduino IDE中打开串口监视器并将波特率设置为115200。然后,您可以通过串口监视器Serial在XIAO ESP32C3中发送您想要的内容,XIAO将打印出您发送内容的每个字节。在这里,我输入的内容是"Hello Everyone",我的结果图表如下

软件串口

要使用软件串口,请安装EspSoftwareSerial库。

tip

目前我们推荐使用EspSoftwareSerial库的7.0.0版本。其他版本可能存在不同程度的问题,导致软串口无法正常工作。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(D7, D6); // RX, TX

void setup() {
Serial.begin(9600);
mySerial.begin(9600);
}

void loop() {
if (mySerial.available()) {
char data = mySerial.read();
Serial.print("Received via software serial: ");
Serial.println(data);
}

if (Serial.available()) {
char data = Serial.read();
mySerial.print("Received via hardware serial: ");
mySerial.println(data);
}
}

这个示例在引脚 D7 (RX)D6 (TX) 上以 9600 波特率设置软件串口。它监控硬件串口(USB)和软件串口端口,在它们之间回显接收到的数据。

I2C

硬件连接

按照以下硬件连接将 Grove - OLED 黄蓝显示屏 0.96 (SSD1315) 连接到 XIAO ESP32C3。

Grove - OLED 黄蓝显示屏 0.96 (SSD1315)XIAO ESP32C3
SCLSCL
SDASDA
VCC5V
GNDGND
pir

软件设置

  • 步骤 1. 打开 Arduino IDE,导航到 Sketch > Include Library > Manage Libraries...

  • 步骤 2. 搜索 u8g2 并安装它

pir

  • 步骤 3. 上传以下代码在 OLED 显示屏上显示文本字符串
//#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C

void setup(void) {
u8g2.begin();
// u8x8.setFlipMode(1); // set number from 1 to 3, the screen word will rotary 180
}

void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,15,"Hello World!"); // write something to the internal memory
u8g2.drawStr(0,30,"Hello World!");
u8g2.drawStr(0,40,"Hello World!");
u8g2.sendBuffer(); // transfer internal memory to the display
// delay(1000);
}

SPI

硬件连接

按照以下硬件连接将 Grove - 高精度气压传感器 (DPS310) 连接到 XIAO ESP32C3。

Grove - 高精度气压传感器 (DPS310)XIAO ESP32C3
3V33V3
SDIMOSI
GNDGND
SDOMISO
CSKSCK
CSCS
pir

软件设置

pir
  • 步骤 2. 打开 Arduino IDE,导航到 Sketch > Include Library > Add .ZIP Library... 并打开下载的 zip 文件

pir

  • 步骤 3. 导航到 File > Examples > DigitalPressureSensor > spi_background 打开 spi_background 示例
pir

或者您也可以从下面复制代码

#include <Dps310.h>

// Dps310 对象
Dps310 Dps310PressureSensor = Dps310();

void setup() {
//你的从选择线的引脚号
//XMC2GO
int16_t pin_cs = SS;
//对于 XMC 1100 Bootkit 和 XMC4700 Relax Kit,取消注释以下行
//int16_t pin_cs = 10;

Serial.begin(9600);
while (!Serial);


//调用 begin 来初始化 Dps310
//参数 pin_nr 是你的微控制器上 CS 引脚的编号
Dps310PressureSensor.begin(SPI, pin_cs);

//温度测量速率(值从 0 到 7)
//每秒 2^temp_mr 个温度测量结果
int16_t temp_mr = 2;
//温度过采样率(值从 0 到 7)
//每个结果进行 2^temp_osr 次内部温度测量
//更高的值增加精度
int16_t temp_osr = 2;
//压力测量速率(值从 0 到 7)
//每秒 2^prs_mr 个压力测量结果
int16_t prs_mr = 2;
//压力过采样率(值从 0 到 7)
//每个结果进行 2^prs_osr 次内部压力测量
//更高的值增加精度
int16_t prs_osr = 2;
//startMeasureBothCont 启用后台模式
//温度和压力自动测量
//高精度和高测量速率不能同时使用。
//查阅数据手册(或试错)获取更多信息
int16_t ret = Dps310PressureSensor.startMeasureBothCont(temp_mr, temp_osr, prs_mr, prs_osr);
//使用下面注释的行之一来仅测量温度或压力
//int16_t ret = Dps310PressureSensor.startMeasureTempCont(temp_mr, temp_osr);
//int16_t ret = Dps310PressureSensor.startMeasurePressureCont(prs_mr, prs_osr);


if (ret != 0) {
Serial.print("初始化失败!ret = ");
Serial.println(ret);
} else {
Serial.println("初始化完成!");
}
}


void loop() {
uint8_t pressureCount = 20;
float pressure[pressureCount];
uint8_t temperatureCount = 20;
float temperature[temperatureCount];

//此函数将连续测量的结果写入作为参数给出的数组
//参数 temperatureCount 和 pressureCount 在调用函数时应保存数组 temperature 和 pressure 的大小
//函数结束后,temperatureCount 和 pressureCount 保存写入数组的值的数量
//注意:Dps310 不能保存超过 32 个结果。当其结果缓冲区满时,它不会保存任何新的测量结果
int16_t ret = Dps310PressureSensor.getContResults(temperature, temperatureCount, pressure, pressureCount);

if (ret != 0) {
Serial.println();
Serial.println();
Serial.print("失败!ret = ");
Serial.println(ret);
} else {
Serial.println();
Serial.println();
Serial.print(temperatureCount);
Serial.println(" 个温度值找到:");
for (int16_t i = 0; i < temperatureCount; i++) {
Serial.print(temperature[i]);
Serial.println(" 摄氏度");
}

Serial.println();
Serial.print(pressureCount);
Serial.println(" 个压力值找到:");
for (int16_t i = 0; i < pressureCount; i++) {
Serial.print(pressure[i]);
Serial.println(" 帕斯卡");
}
}

//等待一些时间,以便 Dps310 可以重新填充其缓冲区
delay(10000);
}
  • 步骤 4. 上传代码并打开串口监视器

注意: 一旦你上传了代码,它不会自动执行,直到你点击 Arduino 窗口右上角的串口监视器

pir

现在你将看到温度和压力数据如上所示在串口监视器上依次显示!

XIAO ESP32C3 IO 分配注意事项

D9

XIAO ESP32C3 的 D9 连接到 ESP32-C3 的 GPIO9 (15)、上拉电阻 (R6) 和 BOOT 按钮。BOOT 按钮(和 RESET 按钮)允许你手动切换 ESP32-C3 的启动模式。

pir

按下 BOOT 按钮将 D9 连接到 GND。因此最好将 D9 用作开关输入

D6

XIAO ESP32C3 的 D6 连接到 ESP32-C3 的 U0TXD (28)。第一/第二阶段引导加载程序的运行状态以文本形式输出到 U0TXD。

pir

D6 在启动时设置为 UART 输出,因此如果你将 D6 用作输入,可能会意外产生大电流。因此建议仅在输出模式下使用 D6 引脚

但是,由于这个 D6 是 UART 输出,你必须注意几件事:一是在不通信时,它在待机模式下为 HIGH。另一个是第一/第二阶段引导加载程序的文本输出。信号在启动后立即在 HIGH/LOW 之间跳动,如有必要必须进行抵消。

所以尽量不要使用 D6。(当然,在你理解它之后使用它是可以的。)

D8

Seeed Studio XIAO ESP32C3 的 D8 连接到 ESP32-C3 的 GPIO8 (14)。

pir

当通过按住 BOOT 按钮将启动模式设置为下载启动时,会引用 GPIO8,此时必须为 HIGH。(这里说:"GPIO8 = 0 和 GPIO9 = 0 的绑定组合无效,会触发意外行为。")

pir

如果你使用下载启动,添加一个上拉电阻以使 GPIO8 在启动时为 HIGH

特别感谢 SeeedJP 同事 matsujirushi 对本节的测试和贡献。这里是原文章的参考链接。

Loading Comments...