Multiplexação de Pinos com Seeed Studio XIAO ESP32-C5
| Seeed Studio XIAO ESP32-C5 |
|---|
![]() |
O Seeed Studio XIAO ESP32-C5 é uma placa de desenvolvimento poderosa e versátil que apresenta uma variedade de interfaces periféricas e pinos GPIO. Esses pinos podem ser usados para vários propósitos, como se comunicar com outros dispositivos, ler sensores analógicos, controlar LEDs e muito mais. Neste tutorial, vamos guiá‑lo sobre como usar os pinos multiplexados do XIAO ESP32-C5.
Em resumo, o XIAO ESP32-C5 possui 1×I2C, 1×SPI, 2×UART, até 11×GPIO (com capacidade de PWM), 5×canais ADC e uma interface de terminais JTAG (pads no lado inverso).
Primeiros Passos
Em seguida, fornecerei tutoriais de exemplo e códigos, respectivamente, com base em duas plataformas: PlatformIO e Arduino IDE, e você pode escolher a plataforma de desenvolvimento de acordo com suas circunstâncias específicas.
Se você ainda não utilizou o Arduino IDE, consulte Getting Started with Seeed Studio XIAO ESP32-C5.
Se você ainda não utilizou o PlatfromIO, consulte Platform IO with Seeed Studio XIAO ESP32-C5。
Visão Geral dos Pinos
Antes de começarmos, vamos revisar todos os pinos que o XIAO ESP32-C5 possui e suas funções com o seguinte esquema.
| Diagrama de indicação do XIAO ESP32-C5 |
|---|
![]() |
| Lista de pinos do XIAO ESP32-C5 |
![]() |
Digital
Todos os 11 pinos IO (D0–D10) do XIAO ESP32-C5 suportam funções digitais. Abaixo está um exemplo prático demonstrando como usar funções digitais para controlar o estado ligado/desligado de uma luz, e você pode multiplexar esses pinos de acordo com suas necessidades específicas.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Seeed Studio Grove Base para XIAO | Grove - Variable Color LED | Grove - Button |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Software
Os exemplos de código a seguir são baseados, respectivamente, no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de controle. Você pode selecionar e reutilizar o código apropriado de acordo com sua situação real de desenvolvimento.
- Arduino IDE
- PlatformIO
- Código de referência
const int buttonPin = D1; // Button pin
const int ledPin = D0; // LED pin
bool ledState = false; // LED current state (OFF/ON)
// Debounce
const unsigned long DEBOUNCE_MS = 30;
bool lastReading = HIGH; // because INPUT_PULLUP idle is HIGH
bool stableState = HIGH;
unsigned long lastChangeTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
bool reading = digitalRead(buttonPin);
// Detect a level change and start timing (for debouncing)
if (reading != lastReading) {
lastChangeTime = millis();
lastReading = reading;
}
if (millis() - lastChangeTime >= DEBOUNCE_MS) {
if (stableState != reading) {
stableState = reading;
if (stableState == LOW) {
ledState = !ledState; // toggle
digitalWrite(ledPin, ledState ? HIGH : LOW);
}
}
}
}
- Certifique‑se de que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
- Código de referência
#include <Arduino.h>
const int buttonPin = D1; // Button pin
const int ledPin = D0; // LED pin
bool ledState = false; // LED current state (OFF/ON)
// Debounce
const unsigned long DEBOUNCE_MS = 30;
bool lastReading = HIGH; // because INPUT_PULLUP idle is HIGH
bool stableState = HIGH;
unsigned long lastChangeTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
bool reading = digitalRead(buttonPin);
// Detect a level change and start timing (for debouncing)
if (reading != lastReading) {
lastChangeTime = millis();
lastReading = reading;
}
if (millis() - lastChangeTime >= DEBOUNCE_MS) {
if (stableState != reading) {
stableState = reading;
if (stableState == LOW) {
ledState = !ledState; // toggle
digitalWrite(ledPin, ledState ? HIGH : LOW);
}
}
}
}
Resultado
- Após enviar o código, pressione o botão — cada pressionamento alterna o LED entre ligado e desligado, simulando o efeito real de controlar uma luz.

Se o efeito acima não for alcançado depois de você pressionar o botão, talvez seja necessário pressionar primeiro o botão RESET da placa para despertá‑la.
PWM
Todos os pinos D0–D11 do XIAO ESP32-C5 suportam funcionalidade PWM. O PWM pode ser usado para acionar dispositivos como servos, motores e luzes LED. A seguir temos um exemplo de LEDs de respiração controlados por PWM para demonstrar a funcionalidade de PWM.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Seeed Studio Grove Base para XIAO | Grove - Variable Color LED |
|---|---|---|
![]() | ![]() | ![]() |
Software
Os seguintes exemplos de código são baseados respectivamente no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de controle. Você pode selecionar e reutilizar o código apropriado de acordo com a sua situação real de desenvolvimento.
- Arduino IDE
- PlatformIO
- Código de Referência
int ledPin = D1; // LED connected to digital pin 10
void setup() {
// declaring LED pin as output
pinMode(ledPin, OUTPUT);
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
- Certifique-se de que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
- Código de Referência
#include <Arduino.h>
int ledPin = D0; // LED connected to digital pin 10
void setup() {
// declaring LED pin as output
pinMode(ledPin, OUTPUT);
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
Resultado
Após enviar o código, o Grove - Variable Color LED exibirá um efeito de luz respiratória.

Analógico
Para o XIAO ESP32-C5, os pinos A0–A5 suportam funcionalidade de leitura analógica. A leitura do ADC pode ser aplicada a cenários como medição de tensão de bateria e leitura de encoders rotativos. Em seguida, demonstraremos a função de leitura do ADC tomando como exemplo a medição de tensão do Grove-Rotary Angle Sensor.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Seeed Studio Grove Base for XIAO | Grove - Rotary Angle Sensor |
|---|---|---|
![]() | ![]() | ![]() |
Software
Os seguintes exemplos de código são baseados respectivamente no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de controle. Você pode selecionar e reutilizar o código apropriado de acordo com a sua situação real de desenvolvimento.
- Arduino IDE
- PlatformIO
iconst int analogPin = A0;
void setup() {
// Initialize serial communication at 115200 bits per second
Serial.begin(115200);
// Set the resolution to 12 bits (0-4095)
analogReadResolution(12);
}
void loop() {
// Read the analog value and millivolts for the analogPin
int analogValue = analogRead(analogPin);
int analogVolts = analogReadMilliVolts(analogPin);
// Convert millivolts to volts
float voltage = analogVolts / 1000.0;
// Print the values to the Serial Monitor
Serial.printf("ADC analog value = %d\n", analogValue);
Serial.printf("ADC millivolts value = %d\n", analogVolts);
Serial.printf("Voltage = %.3f V\n", voltage);
delay(1000); // Delay for clear reading from serial
}
- Certifique-se de que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
- Código de Referência
#include <Arduino.h>
iconst int analogPin = A0;
void setup() {
// Initialize serial communication at 115200 bits per second
Serial.begin(115200);
// Set the resolution to 12 bits (0-4095)
analogReadResolution(12);
}
void loop() {
// Read the analog value and millivolts for the analogPin
int analogValue = analogRead(analogPin);
int analogVolts = analogReadMilliVolts(analogPin);
// Convert millivolts to volts
float voltage = analogVolts / 1000.0;
// Print the values to the Serial Monitor
Serial.printf("ADC analog value = %d\n", analogValue);
Serial.printf("ADC millivolts value = %d\n", analogVolts);
Serial.printf("Voltage = %.3f V\n", voltage);
delay(1000); // Delay for clear reading from serial
}
Resultado
Abra o monitor serial e ele imprimirá o valor bruto do ADC (analogValue), o valor em milivolts (analogVolts) e o valor de tensão (voltage) lidos do Grove-Rotary Angle Sensor. Mudanças evidentes ocorrerão à medida que você girar o Grove-Rotary Angle Sensor.

Comunicação Serial
O XIAO ESP32-C5 possui duas interfaces de comunicação serial por hardware: USB Serial e UART1 Serial, que você pode utilizar para comunicação serial. Além disso, você pode usar outros pinos de uso geral para simular interfaces de comunicação serial.
USB / UART1 Serial
Para USB Serial, conecte a placa diretamente a um computador via USB-C para monitoramento — esta é a interface usada nos exemplos anteriores. Para UART1 Serial, use o Seeed Studio XIAO Debug Mate para monitoramento.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Seeed Studio XIAO Debug Mate |
|---|---|
![]() | ![]() |
Software
Os seguintes exemplos de código são baseados respectivamente no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de controle. Você pode selecionar e reutilizar o código apropriado de acordo com a sua situação real de desenvolvimento.
Os pinos correspondentes para Serial1 são RX_PIN - D7 e TX_PIN - D6.
- Arduino IDE
- PlatformIO
- Código de Referência
#define RX_PIN D7
#define TX_PIN D6
#define BAUD 115200
void setup() {
Serial.begin(115200);
Serial1.begin(BAUD,SERIAL_8N1,RX_PIN,TX_PIN);
}
void loop() {
Serial.print("PC Serial \n");
Serial1.print("Hello XIAO ESP32-C5\n");
delay(1000);
}
- Certifique-se de que o conteúdo de platform.ini seja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
- Código de Referência
#include <Arduino.h>
#define RX_PIN D7
#define TX_PIN D6
#define BAUD 115200
void setup() {
Serial.begin(115200);
Serial1.begin(BAUD,SERIAL_8N1,RX_PIN,TX_PIN);
}
void loop() {
Serial.print("PC Serial \n");
Serial1.print("Hello XIAO ESP32-C5\n");
delay(1000);
}
Resultado
Após enviar o programa, você pode monitorá‑lo pela função UART do Seeed Studio XIAO Debug Mate.

Se você ainda não usou o Seeed Studio XIAO Debug Mate antes, pode acessar Getting Started with XIAO Debug Mate.
Serial por Software
Esta seção demonstrará a funcionalidade da comunicação serial por software, simulando pinos de comunicação serial usando pinos de uso geral.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Módulo&Adaptador CH340G USB para Serial (TTL) |
|---|---|
![]() | ![]() |
Software
Os seguintes exemplos de código são baseados, respectivamente, no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de controle. Você pode selecionar e reutilizar o código apropriado de acordo com a sua situação real de desenvolvimento.
Os pinos simulados por software correspondentes são RX_PIN - D2 e TX_PIN - D1.
- Arduino IDE
- PlatformIO
- Instale a biblioteca de dependência
EspSoftwareSerial.

- Código de referência
#include <SoftwareSerial.h>
#define MYPORT_TX D1
#define MYPORT_RX D2
EspSoftwareSerial::UART mySerial;
String receivedData = ""; // Used for storing the received data
unsigned long lastReceiveTime = 0; // Record the last reception time
const unsigned long TIMEOUT = 100; // 100ms timeout period
void setup() {
Serial.begin(115200); //USB-C
mySerial.begin(38400, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX, false);
}
void loop() {
// Process the data received via the serial port of the software
while (mySerial.available()) {
char incomingChar = mySerial.read();
receivedData += incomingChar;
lastReceiveTime = millis(); // The latest time of reception
}
// Check if the time limit has been exceeded. If it has, consider that the reception of one frame of data is complete.
if (receivedData.length() > 0 && (millis() - lastReceiveTime > TIMEOUT)) {
Serial.print("Received via software serial: ");
Serial.println(receivedData);
receivedData = ""; // Clear the buffer area
}
// Process the data received through the hardware serial port
if (Serial.available()) {
String data = Serial.readString(); // Read the entire string at once
mySerial.print("Received via hardware serial: ");
mySerial.println(data);
}
}
- Certifique‑se de que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
lib_deps = plerup/EspSoftwareSerial@^8.2.0
- Código de referência
#include <Arduino.h>
#include <SoftwareSerial.h>
#define MYPORT_TX D1
#define MYPORT_RX D2
EspSoftwareSerial::UART mySerial;
String receivedData = ""; // Used for storing the received data
unsigned long lastReceiveTime = 0; // Record the last reception time
const unsigned long TIMEOUT = 100; // 100ms timeout period
void setup() {
Serial.begin(115200); //USB-C
mySerial.begin(38400, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX, false);
}
void loop() {
// Process the data received via the serial port of the software
while (mySerial.available()) {
char incomingChar = mySerial.read();
receivedData += incomingChar;
lastReceiveTime = millis(); // The latest time of reception
}
// Check if the time limit has been exceeded. If it has, consider that the reception of one frame of data is complete.
if (receivedData.length() > 0 && (millis() - lastReceiveTime > TIMEOUT)) {
Serial.print("Received via software serial: ");
Serial.println(receivedData);
receivedData = ""; // Clear the buffer area
}
// Process the data received through the hardware serial port
if (Serial.available()) {
String data = Serial.readString(); // Read the entire string at once
mySerial.print("Received via hardware serial: ");
mySerial.println(data);
}
}
Resultado
- Diagrama de fiação

- Após enviar o programa, conecte a placa a qualquer ferramenta serial, configure a taxa de baud correspondente e então a comunicação bidirecional poderá ser estabelecida.

I2C
O chip XIAO ESP32-C5 integra uma interface I2C, que pode ser usada para conectar dispositivos I2C externos, como memória flash, displays e sensores. Em seguida, demonstraremos o uso de I2C com a Seeed Studio Expansion Board Base para XIAO como exemplo.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Seeed Studio Expansion Board Base para XIAO |
|---|---|
![]() | ![]() |
Software
Os seguintes exemplos de código são baseados, respectivamente, no Arduino IDE e no PlatformIO, e alcançam o mesmo efeito de exibição. Você pode selecionar e reutilizar o código apropriado de acordo com o seu cenário real de desenvolvimento.
- Arduino IDE
- PlatformIO
- Instale a biblioteca U8g2.

- Código de referência
#include <U8x8lib.h>
#include <Wire.h>
#define SCL D5
#define SDA D4
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display
void setup(void) {
u8x8.begin();
u8x8.setFlipMode(0);
}
void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.setCursor(2, 10);
u8x8.print("Hello World!");
u8x8.setCursor(1, 28);
u8x8.print("XIAO ESP32-C5!");
}
- Certifique‑se de que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
lib_deps =
olikraus/U8g2@^2.36.15
- Código de referência
#include <Arduino.h>
#include <U8x8lib.h>
#include <Wire.h>
#define SCL D5
#define SDA D4
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display
void setup(void) {
u8x8.begin();
u8x8.setFlipMode(0);
}
void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.setCursor(2, 10);
u8x8.print("Hello World!");
u8x8.setCursor(1, 28);
u8x8.print("XIAO ESP32-C5!");
}
Resultado
- Após enviar o programa, o texto
Hello World!eXIAO ESP32-C5!será exibido na tela.

SPI
O chip XIAO ESP32-C5 integra uma interface SPI, que pode ser usada para conectar dispositivos SPI externos, como memória flash, displays e sensores. Este exemplo demonstra a funcionalidade do SPI usando uma tela SPI.
Preparação de Hardware
| Seeed Studio XIAO ESP32-C5 | Grove - OLED Display 1.12 (SH1107) V3.0 - SPI/IIC |
|---|---|
![]() | ![]() |
Software
Os trechos de código a seguir são baseados em Arduino IDE e PlatformIO, respectivamente, e alcançam o mesmo efeito de exibição. Você pode selecionar e reutilizar o código apropriado de acordo com suas necessidades reais de desenvolvimento.
- Arduino IDE
- PlatformIO
- Instale a biblioteca U8g2.

- Código de referência
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R3,
/* cs=*/ D0,
/* dc=*/ D1,
/* reset=*/ D2);
void setup(void) {
u8g2.begin();
}
void loop(void) {
const char* msg = "Hello XIAO ESP32-C5";
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_luBIS08_tf);
int16_t w = u8g2.getStrWidth(msg);
int16_t x = (128 - w) / 2;
int16_t ascent = u8g2.getAscent();
int16_t descent = u8g2.getDescent();
int16_t h = ascent - descent;
int16_t y = (128 - h) / 2 + ascent;
u8g2.drawStr(x, y, msg);
} while (u8g2.nextPage());
}
- Garanta que o conteúdo de
platform.iniseja o seguinte.
[env:seeed-xiao-esp32-c5]
platform = Seeed Studio
board = seeed-xiao-esp32-c5
framework = arduino
lib_deps =
olikraus/U8g2@^2.36.15
- Código de referência
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R3,
/* cs=*/ D0,
/* dc=*/ D1,
/* reset=*/ D2);
void setup(void) {
u8g2.begin();
}
void loop(void) {
const char* msg = "Hello XIAO ESP32-C5";
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_luBIS08_tf);
int16_t w = u8g2.getStrWidth(msg);
int16_t x = (128 - w) / 2;
int16_t ascent = u8g2.getAscent();
int16_t descent = u8g2.getDescent();
int16_t h = ascent - descent;
int16_t y = (128 - h) / 2 + ascent;
u8g2.drawStr(x, y, msg);
} while (u8g2.nextPage());
}
Resultado
- Diagrama de fiação

- Após o upload do código, o texto Hello XIAO ESP32-C5 será exibido na tela.

Suporte Técnico e Discussão de Produto
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.










