Skip to Content

Começar com XIAO ESP32-S3 e Arduino IDE

Começar com XIAO ESP32-S3 e Arduino IDE

A Seeed Studio XIAO ESP32-S3 é uma pequena placa microcontroladora projetada para aplicações embutidas e IoT. Faz parte da série XIAO, que foca em placas de formato muito pequeno com forte capacidade de processamento. A placa mede apenas cerca de 21 × 17,8 mm, tornando-a adequada para projetos com espaço limitado.

Baseia-se no chip ESP32-S3 com um processador dual-core Xtensa LX7 a funcionar até 240 MHz. A placa inclui Wi-Fi integrado e Bluetooth Low Energy, permitindo comunicação sem fios sem hardware adicional. Também oferece memória flash e PSRAM integradas, que suportam aplicações mais avançadas como IA de borda e processamento de dados.

A gestão de energia é uma característica importante desta placa. Suporta carregamento de bateria e oferece modos de baixo consumo para designs energeticamente eficientes. Isto torna-a adequada para projetos portáteis e alimentados por bateria.

Neste tutorial, aprenderás como programar a XIAO ESP32-S3 usando o Arduino IDE.

Onde Comprar

Podes adquirir a XIAO ESP32-S3 na Seeed Studio ou na Amazon. Também vais precisar de um cabo USB-C, caso ainda não tenhas um. Um pequeno dissipador de calor pode ser necessário se fizeres uso intensivo do processamento na placa.

Cabo USB C

Pequeno dissipador 9×9 mm

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Características da placa XIAO ESP32-S3

A XIAO ESP32-S3 é construída em torno do sistema em chip ESP32-S3R8. Utiliza um processador dual-core Xtensa LX7 com arquitetura de 32 bits. A CPU pode funcionar a uma frequência de até 240 MHz. A foto abaixo mostra a frente e o verso da placa:

Front and Back of XIAO ESP32-S3 board
Frente e verso da placa XIAO ESP32-S3

O chip oferece 8 MB de memória flash e 8 MB de PSRAM. Esta memória estendida permite a execução de firmware mais complexo e suporta buffering para aplicações intensivas em dados, como processamento de áudio ou imagem.

O ESP32-S3 também inclui suporte de hardware para instruções vetoriais. Isto melhora o desempenho para processamento de sinais e inferência em redes neurais.

Conectividade Sem Fios

A placa integra um subsistema Wi-Fi completo a 2,4 GHz. Suporta os padrões IEEE 802.11 b/g/n para comunicação de rede. O rádio Wi-Fi está incorporado no chip e não requer componentes externos além de uma antena para melhor receção. A imagem abaixo mostra a XIAO ESP32-S3 com a antena externa ligada.

XIAO ESP32-S3 with external Antenna
XIAO ESP32-S3 com antena externa

Também é suportado Bluetooth Low Energy 5.0. Isto permite comunicação de baixo consumo com sensores, smartphones e outros dispositivos BLE. O chip pode também operar em modo Bluetooth Mesh para redes IoT distribuídas.

GPIO e Interfaces Periféricas

A XIAO ESP32-S3 expõe múltiplas interfaces digitais e analógicas. Fornece até 11 pinos GPIO com capacidade PWM. Inclui também até 9 canais ADC para entrada analógica. A imagem seguinte mostra o pinout da XIAO ESP32-S3:

Pinout da XIAO ESP32-S3 (source)

A placa suporta protocolos comuns de comunicação, incluindo UART, I2C e SPI. O ESP32-S3 usa uma matriz GPIO flexível, permitindo que a maioria das funções periféricas seja mapeada para diferentes pinos.

Existem pinos dedicados para comunicação I2C usando os sinais SDA e SCL. Os sinais SPI incluem clock, MOSI e MISO. UART está disponível para comunicação serial e depuração.

Características adicionais incluem um LED de utilizador e um LED de estado de carga. Existem também botões de reset e boot para controlo do firmware e flashing.

USB e Integração do Sistema

O ESP32-S3 inclui suporte USB nativo. A placa XIAO usa um conector USB-C para alimentação, programação e transferência de dados. A interface USB está diretamente ligada ao microcontrolador, não necessitando de um conversor USB-serial externo.

O chip suporta funcionalidade USB OTG, permitindo atuar tanto como dispositivo USB como host USB. Esta funcionalidade possibilita aplicações como dispositivos USB HID ou registo de dados em armazenamento externo.

Gestão de Energia

A placa suporta alimentação por USB e por bateria. Um circuito de carregamento integrado permite carregar uma bateria de lítio de 3,7 V. Isto possibilita operação autónoma sem hardware externo de gestão de energia.

A tensão de operação é tipicamente 3,3 V. O regulador onboard fornece energia estável para o microcontrolador e periféricos.

O ESP32-S3 suporta múltiplos modos de poupança de energia, incluindo modem sleep, light sleep e deep sleep. A tabela abaixo mostra o consumo de corrente do ESP32-S3 para diferentes modos:

Modo Corrente Típica (Chip) Unidade Descrição
Modem Sleep ~10.5 – 90 mA CPU ativa, Wi-Fi desativado
Light Sleep ~240 – 750 µA CPU pausada, memória retida
Deep Sleep ~7 – 25 µA RTC ativo, a maior parte do sistema desligado

Estes valores representam o chip ESP32-S3 em si. A placa XIAO ESP32-S3 normalmente consome um pouco mais de corrente devido ao hardware onboard.

Especificações Técnicas

A tabela seguinte resume as características técnicas da XIAO ESP32-S3:

Parâmetro Especificação
Microcontrolador ESP32-S3R8 (Xtensa LX7 dual-core)
Frequência da CPU Até 240 MHz
Arquitetura 32 bits
Memória Flash 8 MB
PSRAM 8 MB
Sem Fios Wi-Fi 802.11 b/g/n, Bluetooth LE 5.0
USB USB-C, USB OTG nativo
Pinos GPIO Até 11
Canais ADC Até 9
Interfaces de Comunicação UART, I2C, SPI
Tensão de Operação 3,3 V
Entrada de Energia USB-C ou bateria LiPo 3,7 V
Características de Energia Carregamento de bateria, suporte a deep sleep
Dimensões ~21 × 17,8 mm
Características Adicionais LED de utilizador, LED de carga, botões de reset e boot

Comparação da XIAO ESP32-S3 com outras placas ESP32 populares

O ecossistema ESP32 cresceu significativamente, e escolher a placa certa pode ser confuso. A tabela abaixo compara as opções mais populares, incluindo a série compacta XIAO e as placas ESP32 clássicas.

Característica XIAO ESP32-S3 XIAO ESP32-S3 Plus XIAO ESP32-S3 Sense ESP32-C5 ESP32 DevKit ESP32-CAM
MCU ESP32-S3 ESP32-S3 ESP32-S3 ESP32-C5 ESP32 ESP32
CPU Dual-core LX7 Dual-core LX7 Dual-core LX7 RISC-V Dual-core LX6 Dual-core LX6
Velocidade de Relógio 240 MHz 240 MHz 240 MHz 240 MHz 240 MHz 240 MHz
Aceleração AI
PSRAM 8 MB Até 8MB+ 8 MB Opcional 4 MB
Flash 8–16 MB Até 16MB+ 8–16 MB Externa 4–16 MB 4 MB
Wi-Fi 2,4 GHz 2,4 GHz 2,4 GHz Wi-Fi 6 (2,4 + 5 GHz) 2,4 GHz 2,4 GHz
Bluetooth BLE 5 BLE 5 BLE 5 BLE 5.3 Clássico + BLE Clássico + BLE
USB USB nativo USB nativo USB nativo Depende da placa Chip UART Não
Câmara
Microfone
Formato Ultra compacto Compacto Compacto + add-on Variável Grande Módulo
GPIO Limitado Moderado Limitado Moderado Alto Muito limitado
Melhor Caso de Uso IoT compacto Projetos de expansão IA / Visão IoT com Wi-Fi 6 Prototipagem geral Streaming de câmara

Qual placa deves escolher?

  • XIAO ESP32-S3: Melhor equilíbrio entre tamanho, desempenho e funcionalidades para a maioria dos projetos IoT.
  • XIAO ESP32-S3 Plus: Boa escolha se precisares de mais opções de expansão e flexibilidade.
  • XIAO ESP32-S3 Sense: Ideal para projetos de IA, câmara e áudio (reconhecimento facial, deteção de objetos).
  • ESP32-C5: Melhor para aplicações sem fios modernas com suporte a Wi-Fi 6 e 5 GHz.
  • ESP32 DevKit: Perfeito para iniciantes e prototipagem em breadboard com acesso máximo a GPIO.
  • ESP32-CAM: Opção económica para projetos simples de streaming de câmara, mas mais limitada.

Uma das vantagens mais subestimadas do ESP32-S3 é a sua capacidade USB nativa. Ao contrário das placas ESP32 clássicas, que dependem de um chip UART externo para comunicação, o S3 pode comunicar diretamente via USB. Isto permite funcionalidades poderosas como USB HID (permitindo que a placa atue como teclado ou rato) e comunicação serial CDC nativa sem hardware adicional.

Note também a importância da PSRAM para aplicações que lidam com fluxos de dados grandes ou contínuos, como processamento de áudio, captura de vídeo e cargas de trabalho de IA. Estes casos de uso rapidamente ultrapassam a SRAM interna limitada dos microcontroladores típicos. Na prática, a PSRAM muitas vezes faz a diferença entre um projeto que mal funciona e um que corre de forma fiável.

Se vais iniciar um novo projeto em 2026, a família ESP32-S3 é geralmente a melhor escolha devido ao suporte USB nativo e aceleração AI. As placas ESP32 clássicas ainda são úteis, mas principalmente para projetos sensíveis ao custo ou legados que não requerem as novas funcionalidades do ESP32-S3.

Instalar ESP32 Core

Se quiseres usar o Arduino IDE para programar a placa, primeiro precisas de instalar o ESP32 Core para ativar o suporte a placas ESP32 dentro do Arduino IDE. Abre o teu  Arduino IDE  e segue os passos indicados abaixo. Se tiveres problemas, podes encontrar instruções mais detalhadas no nosso tutorial Install ESP32 core in Arduino IDE.

URLs adicionais para o gestor de placas

Primeiro abre o diálogo de Preferências selecionando “Preferences…” no menu “File”:

Open Preferences Dialog
Abrir diálogo de Preferências

Isto abrirá o diálogo de Preferências mostrado abaixo. Na aba Settings encontrarás uma caixa de edição na parte inferior do diálogo rotulada “Additional boards manager URLs”:

Neste campo de entrada copia a seguinte URL: “https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json

Isto informa o Arduino IDE onde encontrar as bibliotecas core do ESP32. A seguir vamos instalar as bibliotecas core do ESP32 usando o Boards Manager.

Gestor de Placas

Abre o BOARDS MANAGER clicando no ícone da placa na barra lateral do Arduino IDE:

Board icon in Sidebar
Ícone da placa na barra lateral

Verás o BOARDS MANAGER aparecer à direita da barra lateral. Introduz “ESP32” no campo de pesquisa no topo e deverás ver dois tipos de placas ESP32; as “Arduino ESP32 Boards” e as placas “esp32 by Espressif”. Queremos as bibliotecas esp32 da Espressif. Clica no botão INSTALL e espera até o download e instalação terminarem.

Install ESP32 Core libraries
Instalar bibliotecas core ESP32

Uma vez instalado, o teu Boards Manager deverá parecer com isto, embora a versão real (aqui 3.3.7) possa ser diferente.

ESP32 core installed
Core ESP32 instalado

No próximo passo, mostro-te como selecionar a placa ESP32 para a XIAO ESP32-S3.

Selecionar placa XIAO_ESP32S3

Podes selecionar uma placa no seletor suspenso sob a barra de menu: No exemplo abaixo está selecionada uma Arduino Uno, por exemplo:

Bord selector
Seletor de placa

Clicar no nome da placa atualmente selecionada (Arduino Uno) abrirá o diálogo de seleção de placa. Na caixa de pesquisa escreve “xiao s3” e seleciona “XIAO_ESP32S3” como mostrado abaixo:

Select XIAO_ESP32S3_PLUS in Board Manager
Selecionar XIAO_ESP32S3 no Board Manager

Se a placa estiver ligada ao teu PC via USB, também deverás conseguir selecionar a porta COM. Na captura de ecrã acima é COM13, mas no teu caso pode ser outra porta COM.

Exemplos de Código

Nesta secção, vou fornecer-te alguns exemplos de código para experimentares as principais funcionalidades da XIAO ESP32-S3.

Encontrar pinos I2C e SPI

Este primeiro exemplo de código imprime as interfaces I2C e SPI, que vais precisar para ligar muitos sensores e displays:

void print(const char* name, int pin) {
  Serial.print(name);
  Serial.println(pin);
}

void setup() {
  Serial.begin(115200);
  delay(2000);

  print("LED:  ", LED_BUILTIN);

  print("SDA:  ", SDA);
  print("SCL:  ", SCL);

  print("SS:   ", SS);
  print("MOSI: ", MOSI);
  print("MISO: ", MISO);
  print("SCK:  ", SCK);  
}

void loop() { }

Podes usar este código para outras placas suportadas no Arduino IDE também. Para mais informações vê o Find I2C and SPI default pins tutorial. Para a XIAO ESP32-S3 este código imprime:

LED:  21
SDA:  5
SCL:  6
SS:   44
MOSI: 9
MISO: 8
SCK:  7

Piscar LED onboard

Este é o comum Blink exemplo. Liga e desliga o LED onboard durante um segundo. O LED onboard da XIAO ESP32-S3 está ligado ao GPIO21 mas é invertido. LOW significa que o LED está ligado e HIGH que está desligado. Podes ver isto no exemplo de código abaixo:

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  Serial.println("Off");
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);     
  Serial.println("On");                 
  digitalWrite(LED_BUILTIN, LOW);   
  delay(1000);                      
}

Ler & Escrever GPIO

Nos exemplos muito curtos seguintes, lemos e escrevemos GPIO. Para especificar pinos no código podes usar o número GPIO x ou o número Dx. Por exemplo, de acordo com o pinout, D3 ou GPIO4 identificam o mesmo pino e no teu código podes usar qualquer um. Os dois exemplos de código seguintes são idênticos em função e definem GPIO4 para HIGH:

digitalWrite(D3, HIGH);  // D3 == GPIO4
digitalWrite(4, HIGH);  // D3 == GPIO4

Se quiseres ler sinais analógicos podes usar as constantes pré-definidas Ax. Por exemplo, o código seguinte lê uma entrada analógica de A3, que é o mesmo que o pino GPIO4:

int val = analogRead(A3);  // A3 == GPIO4
int val = analogRead(4);  // A3 == GPIO4

Os valores analógicos variam de 0 a 4095, o que equivale a uma tensão na entrada entre 0 e 3,3V.

Entrada Touch

Este exemplo demonstra como usar os pinos de toque capacitivo da XIAO ESP32-S3 para detetar toques. Se tocares no primeiro pino (D0) da placa, o LED incorporado acende. Podes ter de ajustar o limiar de deteção.

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int value = touchRead(T1);
  Serial.println(value);

  if (value > 30000) { 
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }

  delay(200);
}

HID para Controlo de Volume

O ESP32-S3 suporta USB HID (Human Interface Device), o que significa que podes controlar dispositivos do computador como teclado ou volume com o ESP32 ligado. Nos exemplos seguintes usamos as entradas touch T1 e T2 para aumentar ou diminuir o volume do computador:

#include "USB.h"
#include "USBHIDConsumerControl.h"

USBHIDConsumerControl UCC;

#define TOUCH_THRESHOLD 30000

bool upPressed() {
  return touchRead(T1) > TOUCH_THRESHOLD;
}

bool downPressed() {
  return touchRead(T2) > TOUCH_THRESHOLD;
}

void setup() {
  USB.begin();
  UCC.begin();
}

void loop() {
  if (upPressed()) {
    UCC.press(CONSUMER_CONTROL_VOLUME_INCREMENT);
    UCC.release();
  }
  if (downPressed()) {
    UCC.press(CONSUMER_CONTROL_VOLUME_DECREMENT);
    UCC.release();
  }
  delay(100);
}

Em vez das entradas touch, obviamente também podes ligar botões. Mas com as entradas touch só precisas de ligar cabos no primeiro (D0) e segundo (D1) pino para experimentar o código do controlador de volume.

Vê a biblioteca arduino-esp32 para mais exemplos HID. Cuidado ao usar o ESP32 para HID, pois podes facilmente desativar o rato ou inundar o computador com teclas – tornando-o inutilizável enquanto o ESP32 estiver ligado.

Note também que a placa não pode ser flashada enquanto o HID está a correr. Ela desaparecerá como dispositivo USB no Arduino IDE. Para colocar a placa novamente em modo flash precisas de:

  1. Pressionar e segurar o botão BOOT (B)
  2. Enquanto seguras BOOT (B), pressiona e solta RESET (R)
  3. Soltar o botão BOOT (B)

Como os botões BOOT (B) e RESET (R) no ESP32-S3 são muito pequenos, isto pode ser bastante complicado.

Wi-Fi

O exemplo seguinte mostra como ligar a XIAO ESP32 a uma rede Wi-Fi. Isto funcionará sem a antena externa, se estiveres perto do router Wi-Fi. Mas para melhor alcance deves instalar a antena.

#include <WiFi.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConnected");
  Serial.println(WiFi.localIP());
}

void loop() {
}

Servidor Web

Podes estender o exemplo WiFi anterior e facilmente construir um servidor web simples. O código seguinte cria um servidor web, imprime o endereço IP onde o servidor está ativo e mostra o texto “Hello from XIAO ESP32-S3!” na página raiz:

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

WebServer server(80);

void handleRoot() {
  server.send(200, "text/plain", "Hello from XIAO ESP32-S3!");
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

Carrega o código para o teu ESP32-S3, abre o Monitor Serial e copia o endereço IP que é impresso lá (ex. “192.168.1.160”) para a barra de endereços do teu navegador. Deverás ver a mensagem aparecer:

Scanner Web

Se quiseres escanear a tua rede Wi-Fi local para detetar redes disponíveis, aqui está um exemplo de código:

#include "WiFi.h"

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
}

void loop() {
  Serial.println("scan start");
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
    }
    delay(10);
  }
  Serial.println("");
  delay(5000);
}

Podes começar sem a antena Wi-Fi ligada e só encontrarás as redes Wi-Fi mais fortes. Se ligares a antena provavelmente descobrirás mais redes. Por exemplo, sem a antena recebo um sinal fraco (-77 dB) e apenas uma rede:

scan start
scan done
1 networks found
1: maetasus (-77)*

Assim que ligo a antena, mais redes são detetadas e a força do sinal da minha rede local (maetasus) sobe de -77 dB para -35 dB:

scan start
scan done
5 networks found
1: maetasus (-35)*
2: FRITZ!Box 5590 DQ (-75)*
3: WLAN-762918 (-81)*
4: portthru (-83) 
5: WLAN-579476 (-91)*

Bluetooth

Este exemplo demonstra como criar um servidor Bluetooth Low Energy (BLE) simples.

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

void setup() {
  Serial.begin(115200);

  BLEDevice::init("XIAO-ESP32-S3");
  BLEServer *pServer = BLEDevice::createServer();
  BLEDevice::getAdvertising()->start();

  Serial.println("BLE server started");
}

void loop() {
}

Podes verificar se o servidor está ativo usando um scanner BLE no teu telemóvel. Opções comuns são nRF Connect ou LightBlue. Se iniciares uma pesquisa, verás “XIAO-ESP32-S3” aparecer.

Sensor de Pressão e Temperatura (BME280) via I2C

Este exemplo de código mostra como ligar um sensor via I2C à XIAO ESP32-S3. Usaremos o BME280 neste exemplo. Para mais informações sobre este sensor vê os tutoriais How To Use BME280 Pressure Sensor With Arduino e Weather Station on e-Paper Display.

A interface I2C da XIAO ESP32-S3 está nos pinos 5 (SDA) e 6 (SCL). O diagrama de ligação abaixo mostra como conectar o BME280 à XIAO ESP32-S3.

Connecting BME280 via I2C to XIAO ESP32-S3
Ligação do BME280 via I2C à XIAO ESP32-S3

O código seguinte mostra como ler pressão, temperatura, humidade e altitude do sensor BME280 e imprimir as medições no Monitor Serial:

#include "Adafruit_BME280.h"

#define SEALEVELPRESSURE_HPA 1013.25
#define BME280_ADDRESS 0x76

Adafruit_BME280 bme;

void setup() {
  Serial.begin(11520);
  while(!Serial);

  if (!bme.begin(BME280_ADDRESS)) {
    Serial.println("Can't find BME280!");
    while(1) delay(10);
  }
}

void loop() {
  Serial.print("Temperature in degC = ");
  Serial.println(bme.readTemperature());

  Serial.print("Pressure in hPa     = ");
  Serial.println(bme.readPressure() / 100.0F);

  Serial.print("Altitude in m       = ");
  Serial.println(bme.readAltitude(SEALEVELPRESSURE_HPA));

  Serial.print("Humidity in %RH     = ");
  Serial.println(bme.readHumidity());

  Serial.println();
  delay(5000);
}

Se tudo estiver ligado corretamente, deverás ver dados semelhantes à saída abaixo:

Temperature in degC = 22.93
Pressure in hPa     = 1000.40
Altitude in m       = 107.53
Humidity in %RH     = 34.61

OLED via I2C

No exemplo de código usamos novamente a interface I2C, mas ligamos um display OLED à XIAO ESP32-S3. Como antes, usamos os pinos 5 (SDA) e 6 (SCL) para I2C. A imagem abaixo mostra a ligação que precisas fazer com o OLED:

Connecting OLED via I2C to XIAO ESP32-S3
Ligação do OLED via I2C à XIAO ESP32-S3

E aqui está o código. Ele simplesmente escreve o texto “make” no display. Nota que precisarás de instalar a biblioteca Adafruit_SSD1306 library primeiro.

#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(4);
  oled.setTextColor(WHITE);
}

void loop() {
  oled.clearDisplay();
  oled.setCursor(20, 16);
  oled.print("make");
  oled.display();
  delay(1000);
}

Display E-Paper via SPI

No próximo exemplo, vamos controlar um Display E-Paper via a interface SPI da XIAO ESP32-S3. Os pinos SPI hardware para a XIAO ESP32-S3 são 8 (MISO), 9 (MOSI), 44 (CS/SS) e 7 (SCK). Os outros pinos são livres para escolher.

O diagrama de ligação abaixo mostra como conectar um 4.2″ e-Paper Display aos pinos SPI:

Connecting e-Paper to XIAO ESP32-S3 via SPI
Ligação do e-Paper à XIAO ESP32-S3 via SPI

Abaixo uma tabela com todas as ligações para conveniência. Nota que podes alimentar o display com 3,3V ou 5V, mas as linhas de dados SPI devem ser 3,3V! Para maior segurança, usa 3,3V para a alimentação.

Display e-Paper XIAO ESP32-S3
CS/SS GPIO44
CLK/SCL/SCK GPIO7
SDA/DIN/MOSI GPIO9
BUSY GPIO1
RES/RST GPIO2
DC GPIO3
VCC 3,3V
GND G

Antes de poderes desenhar no display e-Paper precisarás de instalar a biblioteca  GxEPD2  , que fornece o software do driver gráfico para o Display E-Paper. O exemplo de código abaixo usa a biblioteca para imprimir o texto “Makerguides” no display:

#include "GxEPD2_BW.h"

// hardware SPI
// #define MISO 8
// #define MOSI 9
// #define SCK 7

#define CS 44
#define DC 3
#define RST 2
#define BUSY 1
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT>
  epd(GxEPD2_420_GDEY042T81(CS, DC, RST, BUSY));

void setup() {
  epd.init(115200, true, 50, false);
  epd.setRotation(1);
  epd.setTextColor(GxEPD_BLACK);
  epd.setTextSize(2);
  epd.setFullWindow();

  epd.fillScreen(GxEPD_WHITE);
  epd.setCursor(90, 190);
  epd.print("Makerguides");
  epd.display();
  epd.hibernate();
}

void loop() {}

Se quiseres implementar algo mais interessante, dá uma vista de olhos nos tutoriais Monthly Calendar on E-Paper Display ou Analog Clock on e-Paper Display.

Deep Sleep

O código seguinte demonstra como usar o modo deep-sleep com o ESP32-S3. A cada 10 segundos coloca o ESP32-S3 em deep-sleep por 5 segundos e depois acorda-o novamente:

#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 5

void setup() {
  Serial.begin(115200);  
  Serial.println("Awake...");
  delay(10000);
  Serial.println("Going to sleep...");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}

void loop() {}

Cuidado ao aumentar o período de deep-sleep. Durante o deep-sleep a placa desconecta do USB e não podes flashar novo software. Para colocar a placa novamente em modo flash precisas de:

  1. Pressionar e segurar o botão BOOT (B)
  2. Enquanto seguras BOOT, pressiona e solta RESET (R)
  3. Soltar o botão BOOT

Atualização OTA (Over The Air)

Neste último exemplo de código, mostro como realizar uma atualização Over The Air (OTA) do código na XIAO ESP32-S3. Isto tem a vantagem de não precisares de ligar o teu ESP32 para flashar novo código.

#include <WiFi.h>
#include <ArduinoOTA.h>

const char* wifi_ssid = "YOUR_SSID";
const char* wifi_pwd = "YOUR_PASSWORD";

const char* ota_pwd = "1234";
const char* ota_name = "my-xiao-esp32-s3";


void setup() {
  WiFi.begin(wifi_ssid, wifi_pwd);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  ArduinoOTA.setHostname(ota_name);
  ArduinoOTA.setPassword(ota_pwd);
  ArduinoOTA.begin();

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  ArduinoOTA.handle();

  // Main code
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

O ESP32 aparecerá em Tools -> Ports -> Network Ports com o hostname dado “my-xiao-esp32-s3”. Se flashes para esse host, o Arduino IDE pedirá uma password (“1234”) e depois fará o flash do novo código via Wi-Fi. Obviamente, deves escolher uma password melhor que “1234” ; )

No exemplo de código, o código principal é o programa simples Blink. Altera o delay, flasha o novo código e verifica se a taxa de piscar mudou para testar a atualização OTA.

Conclusões

Este artigo mostrou como começar com a Seeed Studio XIAO ESP32-S3. A Seeed Studio fornece informação adicional no seu Wiki.

Note que existe uma versão XIAO ESP32-S3-Plus que tem mais Flash (16MB) e pinos GPIO. E também existe a XIAO-ESP32-S3-Sense, que vem com câmara e microfone. Se quiseres gravar áudio ou fazer streaming de vídeo escolhe a XIAO-ESP32-S3-Sense. Se precisares de mais memória ou IO, opta pela XIAO ESP32-S3-Plus.

Se tiveres alguma dúvida, sente-te à vontade para deixar nos comentários.

Boas experiências a criar 😉