Multiplexação de Pinos com Seeed Studio XIAO MG24

O XIAO MG24 possui até 22 pinos regulares, 18 pinos analógicos, 18 pinos digitais, 2 SPI, 2 UART, 2 I2C e oferece suporte a todo PWM. Ele oferece uma grande variedade de pinos disponíveis para o nosso uso. Neste wiki, vou ensinar você a acionar esses pinos, permitindo que possamos utilizá-los de forma eficaz 😀!
Digital
Preparação de Hardware
| Seeed Studio XIAO MG24 Sense | Seeed Studio Expansion Base for XIAO with Grove OLED | Grove - Relay |
|---|---|---|
![]() | ![]() | ![]() |
Instale o XIAO MG24(Sense) na placa de expansão e conecte o relé à interface A0/D0 da placa de expansão por meio de um cabo Grove. Por fim, conecte o XIAO ao computador usando um cabo USB-C.
Implementação de Software
Neste exemplo, vamos implementar o controle do estado ligado/desligado de um relé usando um botão conectado à placa de expansão do XIAO. Quando o botão for pressionado, o relé ligará, e quando o botão for solto, o relé desligará.
const int buttonPin = D1; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status
const int relayPin = D0;
void setup() {
// initialize the Relay pin as an output:
pinMode(relayPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn Relay on:
digitalWrite(relayPin, HIGH);
} else {
// turn Relay off:
digitalWrite(relayPin, LOW);
}
}
Gráfico de resultado
Se tudo correr bem, após o envio do programa, você deverá ver o seguinte efeito.

Digital como PWM
Todos os pinos GPIO no XIAO MG24(Sense) suportam saída PWM. Portanto, você pode usar qualquer pino para gerar PWM para ajustar o brilho de luzes, controlar servos e outras funções.
Preparação de Hardware
| Seeed Studio XIAO MG24 Sense | Seeed Studio Expansion Base for XIAO with Grove OLED | Grove - Variable Color LED |
|---|---|---|
![]() | ![]() | ![]() |
Instale o XIAO MG24(Sense) na placa de expansão e, em seguida, conecte o Variable Color LED à interface A0/D0 da placa de expansão usando um cabo Grove. Por fim, conecte o XIAO ao computador através de um cabo USB-C.
Implementação de Software
Neste exemplo, vamos demonstrar como usar a saída PWM para controlar o brilho de uma luz.
int LED_pin = D0; // LED connected to digital pin 10
void setup() {
// declaring LED pin as output
pinMode(LED_pin, OUTPUT);
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, 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 -= 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
Gráfico de resultado
Se o programa for executado com sucesso, você verá o seguinte efeito.

Analógico
A placa de desenvolvimento XIAO MG24(Sense) possui ADC de 12 bits para leitura de alta resolução de valores de sensores analógicos, o que nos ajuda a ler valores mais precisos.
Em seguida, escolheremos dois sensores para refletir as características do ADC.
Preparação de Hardware
| Seeed Studio XIAO MG24 Sense | Grove-Variable Color LED | Grove-Rotary Angle Sensor | Seeed Studio Grove Base for XIAO |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Implementação de Software
- analogRead sem DMA
- analogRead With DMA
const int analogInPin = D1; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to
int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
void setup() {
Serial.begin(115200);
}
void loop() {
sensorValue = analogRead(analogInPin);
outputValue = map(sensorValue, 0, 4095, 0, 255);
analogWrite(analogOutPin, outputValue);
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
delay(100);
}
#define ANALOG_VALUE_MIN 0 // Define the minimum analog value
#define ANALOG_VALUE_MAX 4095 // Define the maximum analog value for 12-bit ADC
#define NUM_SAMPLES 128 // Define the number of samples to collect each time
const int analogInPin = D1; // Analog input pin that the potentiometer is attached to
const int analogOutPin = LED_BUILTIN; // Analog output pin that the LED is attached to
// Buffers for storing samples
uint32_t analog_buffer[NUM_SAMPLES]; // Global buffer to store sampled values
uint32_t analog_buffer_local[NUM_SAMPLES]; // Local buffer to store sampled values for calculations
volatile bool data_ready_flag = false; // Data ready flag indicating new sample data is available
void analog_samples_ready_cb(); // Callback function called when samples are ready
void calculate_and_display_analog_level(); // Function to calculate and display the analog level
float getAverage(uint32_t *buffer, uint32_t buf_size); // Function to compute the average of the given buffer
void setup() {
Serial.begin(115200);
pinMode(analogOutPin, OUTPUT);
// Start DMA sampling, storing samples in analog_buffer, with callback on completion
analogReadDMA(analogInPin, analog_buffer, NUM_SAMPLES, analog_samples_ready_cb);
Serial.println("Sampling started...");
}
void loop() {
// If data is ready, process it
if (data_ready_flag) {
data_ready_flag = false;
calculate_and_display_analog_level();
}
}
void analog_samples_ready_cb() {
// Copy data to the local buffer in order to prevent it from overwriting
memcpy(analog_buffer_local, analog_buffer, NUM_SAMPLES * sizeof(uint32_t));
data_ready_flag = true;
}
void calculate_and_display_analog_level() {
// Rolling average for smoothing the analog level
static uint32_t rolling_average = 0u;
// Stop sampling in order to prevent overwriting the current data
ADC.scan_stop();
// Get the average of the sampled values
uint32_t analog_level = (uint32_t)getAverage(analog_buffer_local, NUM_SAMPLES);
// Adjust the analog level
analog_level = constrain(analog_level, ANALOG_VALUE_MIN, ANALOG_VALUE_MAX);
// Calculate the rolling average
rolling_average = (analog_level + rolling_average) / 2;
// Map the current average level to brightness
int brightness = map(rolling_average, ANALOG_VALUE_MIN, ANALOG_VALUE_MAX, 0, 255);
if (LED_BUILTIN_ACTIVE == LOW) {
analogWrite(analogOutPin, 255 - brightness);
} else {
analogWrite(analogOutPin, brightness);
}
// Print the average analog level and brightness output
Serial.print("sensor = ");
Serial.print(rolling_average);
Serial.print("\t output = ");
Serial.println(brightness);
// Restart sampling
analogReadDMA(analogInPin, analog_buffer, NUM_SAMPLES, analog_samples_ready_cb);
}
// Gets the average value of the provided samples
float getAverage(uint32_t *buffer, uint32_t buf_size) {
if (!buffer) {
return 0.0f;
}
float sum = 0.0f;
for (uint32_t i = 0u; i < buf_size; i++) {
sum += buffer[i];
}
return sum / buf_size;
}
Deve-se observar que, se você quiser usar DMA para ler sinais analógicos, a versão da sua biblioteca precisa ser superior a 2.2.0. Atualmente, a nova versão ainda não foi aprovada e você precisa instalá‑la manualmente.
Gráfico de resultado
Se tudo correr bem, depois de enviar o programa, você deverá ver o seguinte efeito.

UART
Ao trabalhar com a Arduino IDE, a comunicação Serial é uma parte essencial de muitos projetos. Para usar Serial na Arduino IDE, você precisa começar abrindo a janela do Monitor Serial. Isso pode ser feito clicando no ícone Serial Monitor na barra de ferramentas ou pressionando a tecla de atalho Ctrl+Shift+M.
Uso geral de Serial
Algumas das funções Serial mais usadas incluem:
Serial.begin()-- que inicializa a comunicação em uma taxa de baud específica;Serial.print()-- que envia dados para a porta Serial em um formato legível;Serial.write()-- que envia dados binários para a porta Serial;Serial.available()-- que verifica se há algum dado disponível para ser lido da porta Serial;Serial.read()-- que lê um único byte de dados da porta Serial;Serial.flush()-- que aguarda a conclusão da transmissão dos dados seriais de saída.
Usando essas funções Serial, você pode enviar e receber dados entre a placa Arduino e o seu computador, o que abre muitas possibilidades para criar projetos interativos.
Aqui está um programa de exemplo:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
// send data to the serial port
Serial.println("Hello World!");
// read data from the serial port
if (Serial.available() > 0) {
// read the incoming byte:
char incomingByte = Serial.read();
// print the incoming byte to the serial monitor:
Serial.print("I received: ");
Serial.println(incomingByte);
}
// wait for a second before repeating the loop
delay(1000);
}
Uso do Serial1
De acordo com os diagramas de pinos do XIAO MG24(Sense) acima, para parâmetros específicos, podemos observar que há um pino TX e um pino RX. Isso é diferente da comunicação Serial, mas o uso também é muito semelhante, exceto que alguns parâmetros precisam ser adicionados. Portanto, a seguir, usaremos os pinos expostos pelo chip para comunicação Serial.
#define BAUD 115200
void setup() {
Serial1.begin(BAUD);
}
void loop() {
if(Serial1.available() > 0)
{
char incominByte = Serial1.read();
Serial1.print("I received : ");
Serial1.println(incominByte);
}
delay(1000);
}
I2C
XIAO MG24(Sense) possui uma interface I2C que pode ser usada para transmissão e análise de dados de muitos sensores, bem como para usar algumas telas OLED.
Preparação de hardware
| Seeed Studio XIAO MG24 Sense | Seeed Studio Expansion Base for XIAO with Grove OLED |
|---|---|
![]() | ![]() |
O display OLED na placa de expansão XIAO usa o protocolo I2C e é conectado à interface I2C do XIAO por meio do circuito I2C da placa. Portanto, podemos simplesmente encaixar o XIAO na placa de expansão e programá‑lo para exibir conteúdo na tela.
Implementação de software
Este exemplo apresenta como usar o display OLED na Seeed Studio Expansion Base para XIAO MG24(Sense).
Etapa 1. Instale o Seeed Studio XIAO MG24(Sense) na placa de expansão e conecte o cabo Type‑C.
Etapa 2. Instale a biblioteca u8g2.
Etapa 3. Copie o código e cole na Arduino IDE e, em seguida, envie‑o.
- Baixe o arquivo zip abaixo
📄 [ZIP] Cabeçalho smiley_face
- Crie um arquivo de cabeçalho chamado "smiley_face. h" e copie o conteúdo do arquivo zip baixado para o arquivo de cabeçalho que você criou

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "smiley_face.h"
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
int xx = 20;
int yy = 10;
void setup() {
u8g2.begin();
}
void loop() {
smeil_display();
delay(500);
}
void smeil_display() {
const unsigned char* smileImages[] = {
semil1, semil2, semil3, semil4, semil5,
semil6, semil7, semil8, semil9, semil10,
semil11, semil12, semil13, semil14, semil15,
semil16, semil17, semil18, semil19, semil20,
semil21, semil22, semil23, semil24, semil25,
semil26, semil27
};
int delays[] = {
40, 50, 40, 40, 40,
40, 40, 50, 40, 40,
40, 40, 40, 50, 40,
40, 50, 40, 40, 50,
40, 50, 40, 40, 50,
50, 50, 40, 50
};
for (int i = 0; i < sizeof(smileImages) / sizeof(smileImages[0]); i++) {
u8g2.firstPage();
do {
u8g2.drawXBMP(xx, yy, 48, 48, smileImages[i]);
} while (u8g2.nextPage());
delay(delays[i]);
}
}
Gráfico de resultados

SPI
O chip XIAO MG24(Sense) integra vários periféricos, incluindo uma interface SPI que pode ser usada para conectar dispositivos SPI externos, como memória flash, displays, sensores e mais.
Visão geral da biblioteca Arduino
Com base no programa de exemplo do Arduino fornecido pela Waveshare, escrevemos uma biblioteca Arduino para uso com toda a série XIAO, e você pode ir diretamente para o Github dessa biblioteca através do botão abaixo.
Preparação de hardware
| Seeed Studio XIAO MG24 Sense | Display LCD SPI de 1,69 polegadas |
|---|---|
![]() | ![]() |
Conexão de pinos
Depois de preparar o hardware conforme mencionado acima, use jumpers para conectar a interface SPI do XIAO e do OLED. Consulte o diagrama a seguir para o método de fiação.

Instalação
Como você já baixou a biblioteca zip, abra o Arduino IDE, clique em Sketch > Include Library > Add .ZIP Library. Escolha o arquivo zip que você acabou de baixar e, se a biblioteca for instalada corretamente, você verá Library added to your libraries na janela de aviso. Isso significa que a biblioteca foi instalada com sucesso.

Implementação de software
Após baixar e instalar a biblioteca corretamente, você pode encontrar dois programas de exemplo chamados helloworld.ino e bgcolor.ino na pasta de exemplos. O bgcolor.ino é um exemplo para mostrar a cor de fundo, definimos o vermelho como padrão. E o helloworld.ino é um exemplo para mostrar a animação sobre o logotipo da nossa empresa, e este exemplo contém o efeito que o exemplo bgcolor possui.
#include <st7789v2.h>
#include "SPI.h"
#include "seeed.h"
st7789v2 Display;
void setup() {
// put your setup code here, to run once:
Display.SetRotate(270);
Display.Init();
Display.SetBacklight(100);
Display.Clear(WHITE);
}
void loop() {
// put your main code here, to run repeatedly:
// Display.SetPixel(100, 100, RED);
// Display.DrawPoint(50, 50, YELLOW, DOT_PIXEL_8X8, DOT_FILL_AROUND);
Display.DrawImage(gImage_seeed, 20, 90, 240, 47);
Display.DrawLine(15, 65, 65, 65, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawLine(15, 70, 80, 70, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawRectangle(15, 80, 265, 150, GRAY, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(270, 10, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(10, 230, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(270, 230, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawLine(200, 160, 265, 160, GRAYBLUE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawLine(215, 165, 265, 165, GRAYBLUE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawString_EN(20, 180, "By: Jason", &Font20, WHITE, BLACK);
// Display.DrawNum(100, 220, 123456, &Font24, RED, BRED);
Display.DrawFloatNum(100, 210, 1.00, 2, &Font16, WHITE, BLACK);
}
Você verá o logotipo da Seeed Studio impresso dinamicamente no display.

Finalizando
Você aprendeu as funções básicas dos pinos do XIAO MG24 (Sense). Agora, vamos explorar ainda mais os sensores integrados.

Suporte técnico e discussão sobre o 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.






