Uso dos periféricos onboard
Esta página reúne demos autônomos em nível de função para cada periférico onboard do display IPS de 1,14''. Cada seção é independente — você pode escolher a que corresponde ao seu caso de uso sem precisar ler as demais.
Os GIFs de demonstração nesta página estão acelerados para mantê-los curtos.
Todos os demos desta página exigem Seeed nRF52 Boards (1.1.13) conforme descrito em Introdução, além da biblioteca Seeed_GFX2 instalada manualmente conforme descrito abaixo.
- Library Manager — vá em Sketch > Include Library > Manage Libraries..., pesquise e instale:
| Library | Search Keyword | Author | Required by |
|---|---|---|---|
| Seeed Arduino LSM6DS3 | Seeed Arduino LSM6DS3 | Seeed Studio | Demos de IMU |
- Seeed_GFX2 (Instalação manual) — esta biblioteca não está disponível no Library Manager e deve ser instalada manualmente:
Passo 1. Clique no botão acima para baixar Seeed_GFX2 v1.0.0 como um arquivo ZIP (fixado em uma tag de release para que o tutorial permaneça reprodutível). Como alternativa, clone o repositório em Seeed-Studio/Seeed_GFX2.
Passo 2. No Arduino IDE, vá em Sketch > Include Library > Add .ZIP Library... e selecione o ZIP baixado. O IDE lê library.properties e instala automaticamente na pasta Seeed_GFX2 correta — você não precisa renomear a pasta extraída. (Para instalar manualmente em vez disso, descompacte o arquivo e renomeie a pasta extraída para Seeed_GFX2 antes de colocá-la em Documents/Arduino/libraries/.)
Passo 3. Reinicie o Arduino IDE para que a nova biblioteca seja detectada.
- Seeed_GFX2 é a biblioteca gráfica da Seeed Studio construída sobre uma arquitetura em camadas
Board+Panel Config. Cada demo inicializa o display com uma única chamadadisplay.begin<Board_..., Config_...>()— o template Board é responsável pelo mapa de pinos (CS/DC/SCK/MOSI/RST/BL), e o Panel Config incorpora a resolução 135×240, a ordem de cores e a inversão. Nenhumdriver.hou configuração manual de pinos é necessária. - Nesta placa os demos usam
Board_XIAO_1inch14_LCD<38, 37>(RST=38, BL=37) comConfig_Seeed_1inch14_LCD_ST7789(135×240). Alguns demos definem uma substituição local do sketchConfig_XIAO_1inch14_LCD_ST7789_BGRpara a ordem de cores BGR. - Os demos de IMU usam a biblioteca Seeed Arduino LSM6DS3 (instalada acima).
- O display IPS de 1,14'' não possui controlador touch nem slot para cartão SD, portanto não são necessárias bibliotecas de touch ou SD.
As bibliotecas PDM, Adafruit TinyUSB, Adafruit LittleFS e InternalFileSystem usadas pelo tutorial de Flash Recorder vêm empacotadas com Seeed nRF52 Boards 1.1.13 — não instale versões separadas pelo Library Manager.
A gravação é armazenada no filesystem interno em Flash do nRF52840. Este display não possui slot para cartão SD, e o tutorial não usa SdFat.
Obtendo o código de demonstração
Cada demo desta página está no repositório Display-Gadgets, dentro do diretório code_GFX2/Function/. Cada demo é uma pasta contendo um único sketch .ino. Sempre baixe a pasta completa em vez de copiar o código-fonte .ino da visualização web do GitHub.
Opção A — Baixar o repositório como ZIP (recomendado):
- Abra github.com/Seeed-Projects/Display-Gadgets e clique em Code > Download ZIP, depois extraia o arquivo em qualquer lugar conveniente.
- Navegue até
code_GFX2/Function/e abra a pasta mostrada na linha Code location de cada demo. Por exemplo, o demo GraphicTest para esta placa está emcode_GFX2/Function/114_nRF52840/xiao_nrf52840_114_graphictest/. - Dê um clique duplo no arquivo
.inopara abri-lo no Arduino IDE.
Opção B — git clone:
git clone https://github.com/Seeed-Projects/Display-Gadgets.git
Em seguida, abra o arquivo .ino do demo a partir da pasta clonada code_GFX2/Function/....
Display de tela — GraphicTest
Este demo executa um benchmark gráfico completo no painel IPS ST7789 de 1,14 polegada (135×240), cobrindo barras de cores, linhas, retângulos, círculos, triângulos, retângulos arredondados, texto e um gradiente de pixels. Use-o para verificar se a tela está conectada corretamente e se todas as chamadas de desenho funcionam como esperado.
Code location: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_graphictest/
Como funciona
O sketch inicializa o painel IPS ST7789 via Seeed_GFX2, depois percorre dez primitivas gráficas em sequência, medindo o tempo de execução de cada uma via micros() e imprimindo o resultado no monitor serial.
O display é inicializado com uma única chamada de template:
display.begin<Board_XIAO_1inch14_LCD<38, 37>,
Config_Seeed_1inch14_LCD_ST7789>();
O template Board é responsável pelo mapa de pinos — CS=D2, DC=D3, SCK=D8, MOSI=D10 — e seus parâmetros de template <RST, BL> recebem números GPIO puros, então <38, 37> define RST=GPIO38 e BL=GPIO37. O Panel Config incorpora a resolução 135×240, a ordem de cores e a inversão (invert = true), portanto nenhum driver.h ou chamada manual de invertDisplay() é necessária.
Executando o demo
Passo 1. Abra xiao_nrf52840_114_graphictest.ino no Arduino IDE.
Passo 2. Selecione Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus e a Porta correta.
Passo 3. Clique em Upload.
Passo 4. Abra Tools > Serial Monitor (115200 baud). Você deverá ver a saída de tempo para cada teste:
LCD width: 135
LCD height: 240
Color bars: 34.18 ms
Lines: 2599.61 ms
Fast lines: 57.62 ms
Rectangles: 44.92 ms
Filled rectangles: 125.98 ms
Circles: 291.02 ms
Triangles: 289.06 ms
Round rectangles: 95.70 ms
Text: 1416.02 ms
Pixel gradient: 4774.42 ms
Graphic test finished.
Na tela, você verá cada padrão de teste exibido por cerca de um segundo antes que o próximo comece. Quando todos os testes terminarem, aparecerá uma tela "Finished".
Resultado esperado

Depois que o sketch percorre todos os padrões, a tela mostra a mensagem "Finished". Reinicie a placa para executar o teste novamente.
IMU
O display IPS de 1,14'' possui uma IMU de 6 eixos onboard (LSM6DS3) conectada via I2C em D4/D5. A linha de interrupção de movimento em D14 oferece suporte a wake-up por hardware e detecção de gestos.
Ambos os demos abaixo usam o LSM6DS3 no endereço I2C 0x6A.
Demo 1: Areia movediça eletrônica
Este demo transforma a tela em uma simulação de fluido interativa — partículas de areia dourada que fluem e se acomodam de acordo com a gravidade, conforme medida pela IMU de 6 eixos onboard. Incline a placa e a areia muda de direção em tempo real.
Code location: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_electronic_quicksand/
Como Funciona
A simulação usa uma grade de ocupação de 22×40 sobreposta na tela de 135×240, onde cada célula tem 6×6 pixels. Cerca de 150 partículas são colocadas na grade, cada uma com posição, velocidade e um gradiente de cor dourado.
O IMU é lido via I2C (D4/D5) usando a biblioteca Seeed Arduino LSM6DS3 no endereço 0x6A. Os valores brutos de aceleração são filtrados com um filtro passa-baixa e usados para derivar um vetor de gravidade. Quando você inclina a placa:
- Atualização do vetor de gravidade — os dados do acelerômetro são suavizados com uma média móvel exponencial para evitar tremores.
- Velocidade das partículas — cada partícula acelera na direção do vetor de gravidade, com amortecimento e um fator de mobilidade por partícula baseado em sua profundidade no fluxo.
- Ocupação das células — partículas mais profundas no fluxo (mais próximas do "fundo" em relação à gravidade) têm mobilidade reduzida, criando um efeito de empacotamento realista.
- Renderização diferencial — apenas as células para onde as partículas se moveram para dentro ou para fora são redesenhadas, minimizando o tráfego SPI e mantendo a animação suave.
Partículas próximas à superfície fluem livremente (maior mobilidade); partículas enterradas mais profundamente se empacotam firmemente (menor mobilidade) — imitando como a areia real se comporta.
Executando a Demo
Passo 1. Abra xiao_nrf52840_114_electronic_quicksand.ino na Arduino IDE.
Passo 2. Selecione a placa e a porta, depois clique em Upload.
Passo 3. Depois de enviado, a tela se enche de partículas douradas na parte inferior. Incline a placa em diferentes direções — a areia flui como se fosse puxada pela gravidade.
Passo 4. Abra Tools > Serial Monitor (115200 baud) para confirmar a inicialização:
=== Electronic Quicksand 1.14 ===
imu.begin=0
Resultado Esperado

As partículas de areia dourada fluem suavemente enquanto você inclina a placa. Quando mantida plana, a areia se acomoda na parte inferior da tela. Gire a placa em 90 graus e a areia flui para o novo "fundo" em um segundo.
Demo 2: Levantar para Despertar
Esta demo implementa um sistema de suspensão/despertar da tela acionado pela interrupção de movimento integrada do IMU no D14. A tela desliga automaticamente (luz de fundo desligada + sono System ON do nRF52) após um período de inatividade configurável, e desperta instantaneamente quando você pega ou move o dispositivo.
Localização do código: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_wakeup/
Como Funciona
A demo usa o detector de evento de despertar incorporado do LSM6DS3 — um recurso de hardware que monitora internamente os dados do acelerômetro e aciona o pino INT1 (conectado ao D14 nesta placa) quando o movimento excede um limite configurável. Isso significa que o MCU não precisa consultar o acelerômetro continuamente.
Configuração do IMU (LSM6DS3):
| Registrador | Valor | Finalidade |
|---|---|---|
CTRL1_XL | 0x40 | Acelerômetro @ 104 Hz, ±2g |
TAP_CFG | 0x80 | Habilitar interrupções incorporadas |
WAKE_UP_THS | 0x05 | Limiar de despertar (sensibilidade média-baixa) |
WAKE_UP_DUR | 0x00 | Sem filtro de duração (despertar responsivo) |
MD1_CFG | 0x20 | Roteia o despertar para INT1 |
Fluxo de suspensão/despertar:
- Estado ativo — a tela está ligada, luz de fundo em brilho máximo, a interface é atualizada a cada 250 ms com dados em tempo real do IMU. Um temporizador regressivo mostra os segundos restantes até a suspensão automática.
- Suspensão automática — após o tempo limite de inatividade, o sketch desliga a luz de fundo, exibe a mensagem "Sleeping... Pick up device to wake" e entra no modo System ON sleep do nRF52 (modo de baixo consumo com retenção de RAM). A interrupção de despertar do IMU no D14 já foi configurada na inicialização, então a detecção de movimento permanece ativa durante o sono.
- Despertar — quando o usuário pega a placa, o IMU detecta movimento e aciona D14 em nível HIGH. O nRF52840 sai do System ON sleep, restaura a luz de fundo e redesenha a interface. O LCD e o IMU não são reinicializados — o System ON sleep mantém a RAM e a configuração dos periféricos, então ambos preservam as configurações aplicadas na inicialização.
Botões de teste manual:
| Botão | Pino | Ação |
|---|---|---|
| USR1 | D6 | Forçar suspensão |
| USR2 | D7 | Forçar despertar |
Executando a Demo
Passo 1. Abra xiao_nrf52840_114_wakeup.ino na Arduino IDE, selecione a placa e a porta, e clique em Upload.
Passo 2. A tela mostra um painel com estado de energia, dados de movimento e um temporizador regressivo. Deixe a placa parada — ela entrará automaticamente em suspensão após o período de inatividade.
Passo 3. Pegue a placa ou agite-a suavemente — a tela desperta imediatamente.
Passo 4. Abra Tools > Serial Monitor (115200 baud) para observar as transições de suspensão/despertar:
LCD: 135x240
[IMU] Seeed LSM6DS3 begin=0
[IMU] D14 wake interrupt OK
[BOOT] done. Screen should be on.
[WAKE] reason=IMU_D14 wakeCount=1 sleptMs=3568 sleepLoops=0
[SLEEP] screen off, entering System ON sleep
[SLEEP] loops=1 D14=0 awake=N
[WAKE] reason=IMU_D14 wakeCount=2 sleptMs=1378 sleepLoops=439
Resultado Esperado

A tela exibe dados de movimento em tempo real enquanto está acordada. Após o período de inatividade em repouso, a tela escurece e o nRF52840 entra em modo de suspensão de baixo consumo. Pegue o dispositivo e a tela é restaurada instantaneamente, com o contador de despertares incrementado.
Microfone e Alto-falante
O Display IPS de 1,14'' possui o mesmo microfone digital PDM da versão de 1,47", conectado aos mesmos pinos:
| Pino | Sinal | Função |
|---|---|---|
| D0 | PDM_CLK | Saída de clock PDM para o microfone |
| D1 | MIC_DATA | Entrada de dados PDM do microfone |
Demo 1: Barra de Voz
Esta demo visualiza a entrada de áudio em tempo real do microfone PDM como uma forma de onda dinâmica no estilo equalizador e uma barra de volume segmentada. Fale, bata palmas ou assopre no microfone onboard e veja as barras reagirem instantaneamente.
Localização do código: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_voice_bar/
Como Funciona
O sketch usa o periférico PDM do nRF52840 por meio da biblioteca PDM (incluída com Seeed nRF52 Boards) a 16 kHz, canal único. A ISR (onPDMdata) captura amostras PDM brutas em um buffer circular de 256 amostras e calcula a amplitude de pico.
A tela é dividida em três zonas:
| Zona | Posição | Descrição |
|---|---|---|
| Forma de onda | Topo (y=30–95) | Visualizador equalizador de 27 barras. Amostras brutas são subamostradas e desenhadas como barras simétricas em torno de uma linha de base central. A cor da forma de onda é controlada pelo mesmo volume suavizado que a barra de volume e o rótulo de porcentagem — verde (<50%), amarelo (50–90%), vermelho (>90%). |
| Porcentagem | Meio | Porcentagem de volume numérica grande (0–100%), codificada por cores em verde (<50%), amarelo (50–90%), vermelho (>90%). |
| Barra de volume | Inferior (y=130–225) | Barra de 10 segmentos (degradê verde/amarelo/vermelho). Atualiza com o volume suavizado a partir do pico PDM. |
Processamento de sinal:
- PDM ISR —
onPDMdata()é acionada a ~62 Hz (16000 / 256). Ela lê as amostras brutas, calcula a magnitude de pico e faz o downsampling em 27 faixas para o visualizador de forma de onda. - Normalização — valores de pico abaixo de 10 são tratados como silêncio. Valores acima de 1500 saturam em 100%. Entre esses valores, um mapeamento linear produz um nível de volume de 0,0–1,0.
- Suavização exponencial — o volume exibido é suavizado com um fator de mistura de 20% (
SMOOTH = 0.20) para evitar tremulação. Durante o silêncio, o volume decai a 6% por quadro. - Renderização diferencial — a barra de volume e o rótulo de porcentagem só são redesenhados quando o valor muda, minimizando o tráfego SPI.
Executando a demonstração
Passo 1. Abra xiao_nrf52840_114_voice_bar.ino na Arduino IDE.
Passo 2. Selecione Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus e a Port correta.
Passo 3. Clique em Upload.
Passo 4. Abra Tools > Serial Monitor (115200 baud). Você deverá ver:
[MIC] ready
Passo 5. Fale, bata palmas ou assopre no microfone. A forma de onda e a barra de volume respondem em tempo real. O rótulo de porcentagem muda de cor à medida que o volume aumenta.
Resultado esperado

Quando em silêncio, a forma de onda é plana e a barra de volume fica vazia (0%). Fale no microfone e as barras do equalizador se animam enquanto a barra de volume se enche de verde passando por amarelo até vermelho. O rótulo de porcentagem é atualizado em tempo real.
Demo 2: Gravador em Flash com reprodução I2S
Esta demonstração grava um pequeno clipe de áudio do microfone PDM onboard no sistema de arquivos Flash interno do nRF52840 e depois o reproduz por meio de um amplificador I2S externo e alto-falante:
- USR1 grava a partir do microfone PDM onboard.
- A gravação é 16 kHz, 16 bits, mono.
- Cada clipe tem cerca de 0,7 segundos — 11.200 amostras (22.400 bytes de PCM).
- O clipe é salvo como
/REC_RAW.WAVno sistema de arquivos Flash interno. - USR2 reproduz a gravação por meio de um MAX98357A externo e alto-falante.
- Esta demonstração foi compilada, gravada e verificada em hardware no XIAO nRF52840 Plus com Seeed nRF52 Boards 1.1.13.
Localização do código: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_flash_record/
Configuração de hardware
A reprodução requer um amplificador de áudio I2S externo e alto-falante. A demonstração foi escrita para um módulo MAX98357A conectado aos pads de saída I2S da placa:
| Placa de display | MAX98357A |
|---|---|
| 3V3 | VIN |
| GND | GND |
| D11 / I2S_SD | DIN |
| D12 / I2S_SCK | BCLK |
| D13 / I2S_WS | LRC / WS |
Conecte o alto-falante aos terminais SPK+ e SPK- do MAX98357A. Não conecte um fio do alto-falante ao GND — o MAX98357A é um amplificador BTL (bridge-tied-load), portanto ambos os terminais do alto-falante devem ir para as saídas SPK.
Desconecte a alimentação USB antes de fazer a fiação do amplificador e do alto-falante.
Como funciona
- O microfone PDM usa D0 (CLK) e D1 (DATA).
- A biblioteca
PDMcaptura o microfone em 16 kHz mono. - O arquivo WAV consiste em um cabeçalho de 44 bytes mais 22.400 bytes de dados PCM.
- O sistema de arquivos Flash interno (InternalFS) tem apenas cerca de 28 KB, o que limita cada gravação a aproximadamente 0,7 segundos.
- A reprodução usa o periférico de hardware I2S do nRF52840 no formato Philips I2S, saída 16 bits, estéreo.
- As amostras mono são duplicadas para os canais esquerdo e direito.
- Os pinos I2S são D11, D12 e D13.
Executando o tutorial
Passo 1. Desconecte a alimentação USB e faça a fiação do MAX98357A e do alto-falante conforme mostrado acima.
Passo 2. Abra xiao_nrf52840_114_flash_record.ino na Arduino IDE.
Passo 3. Selecione Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus e a Port correta.
Passo 4. Compile e envie o sketch.
Passo 5. Pressione USR1 e imediatamente fale no microfone onboard por cerca de 0,7 segundos.
A gravação começa no momento em que você pressiona USR1 — não espere a barra de progresso vermelha aparecer. A janela de 0,7 segundo é contada a partir do momento em que USR1 é pressionado, então fale imediatamente ou você perderá o início do seu clipe.
Passo 6. Aguarde a tela mostrar Saved WAV.
Passo 7. Pressione USR2 e o alto-falante reproduzirá sua gravação.
Resultado esperado
- Na inicialização, a tela mostra Flash Recorder.
- Quando não existe gravação, a tela mostra No recording.
- Durante a gravação, a tela mostra um indicador de progresso.
- Quando a gravação é salva, a tela mostra Saved WAV.
- Pressione USR2 e você ouvirá a gravação pelo alto-falante.

Grove I2C
O display IPS de 1,14'' possui um conector Grove I2C dedicado que expõe D4 (SDA) e D5 (SCL) em um soquete Grove padrão de 4 pinos (GND / 3V3 / SDA / SCL). Diferente da versão de 1,47", em que D4/D5 também são compartilhados com o controlador de toque, o display de 1,14" compartilha D4/D5 apenas com o IMU onboard (ele não possui controlador de toque).
| Pino Grove | Pino XIAO | Notas |
|---|---|---|
| GND | GND | Terra comum |
| 3V3 | 3V3 | Saída de alimentação de 3,3 V |
| SDA | D4 | Dados I2C — compartilhado com o IMU onboard |
| SCL | D5 | Clock I2C — compartilhado com o IMU onboard |
D4/D5 são compartilhados entre o conector Grove e o IMU onboard. O IMU está no endereço 0x6A. Ao conectar um dispositivo I2C externo, certifique-se de que ele não entre em conflito com esse endereço.
Demo: Temperatura e umidade SHT31
Esta demonstração lê temperatura e umidade de um sensor Grove SHT31 conectado ao conector Grove I2C e exibe as leituras na tela. O sketch se comunica com o sensor diretamente via I2C com Wire.h — nenhuma biblioteca SHT31 é necessária — e valida cada leitura com o CRC do sensor.
Localização do código: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_sht31_temperature_humidity/
Configuração de hardware
Conecte um sensor de temperatura e umidade Grove SHT31 ao conector Grove I2C. O sensor é alimentado a 3,3 V e se comunica no endereço I2C 0x44:
| Pino Grove | Pino XIAO | SHT31 |
|---|---|---|
| GND | GND | GND |
| 3V3 | 3V3 | VCC |
| SDA | D4 | SDA |
| SCL | D5 | SCL |
Como funciona
O sketch lê o SHT31 diretamente via I2C (Wire) no endereço 0x44:
- Varredura I2C — na inicialização ele faz uma varredura no barramento I2C e relata cada dispositivo encontrado.
- Medição de disparo único — ele envia um comando de disparo único de alta repetibilidade (
0x24 0x00, sem clock stretching), espera 20 ms e então lê 6 bytes: temperatura alto/baixo + CRC, umidade alto/baixo + CRC. - Verificação de CRC — cada valor de 16 bits é verificado em relação ao seu byte CRC; uma incompatibilidade é relatada como erro (fiação ou módulo danificado/ruidoso).
- Conversão — os valores brutos são convertidos em temperatura (
-45 + 175 × raw / 65535°C) e umidade relativa (100 × raw / 65535%).
O display é inicializado com Board_XIAO_1inch14_LCD<38, 37> e um Config_XIAO_1inch14_LCD_ST7789_BGR local do sketch (135×240, ordem de cores BGR, invertido) para que as cores sejam renderizadas corretamente. A tela mostra "SHT31 OK" com a temperatura e umidade em tempo real, ou "SHT31 ERROR" mais um código de erro se uma leitura falhar.
Executando o Demo
Passo 1. Abra xiao_nrf52840_114_sht31_temperature_humidity.ino na Arduino IDE.
Passo 2. Selecione Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus e a Port correta, depois clique em Upload.
Passo 3. Abra Tools > Serial Monitor (115200 baud). Você deverá ver:
=== XIAO nRF52840 1.14 SHT31 Temperature/Humidity ===
[PIN] SDA=D4 SCL=D5 address=0x44
[I2C] scan start
[I2C] found 0x44
[I2C] scan done
[SHT31] OK T=26.81 C H=48.32 %
A tela mostra "SHT31 OK" com a temperatura e umidade, atualizando uma vez por segundo. Se o sensor for desconectado ou a verificação de CRC falhar, a tela mostra "SHT31 ERROR" com um código de erro.
Resultado Esperado

A temperatura e a umidade são atualizadas uma vez por segundo na tela. Assopre sobre o sensor e a leitura de umidade irá subir.
Botões do Usuário
O Display IPS de 1,14'' possui três botões físicos de pressão conectados ao XIAO nRF52840 Plus. Todos os três botões têm resistores de pull-up de 1 KΩ externos na placa, então você pode configurar os pinos correspondentes como INPUT (nenhum pull-up interno é necessário):
| Botão | Pino | Lógica | Rótulo na Serigrafia | Pad de Breakout |
|---|---|---|---|---|
| USR1 | D6 | Ativo em nível baixo (pressionado = LOW) | USR1 | U1 |
| USR2 | D7 | Ativo em nível baixo (pressionado = LOW) | USR2 | U2 |
| USR3 | D19 | Ativo em nível baixo (pressionado = LOW) | USR3 | U3 |
Leitura dos Botões
Com o pull-up externo de 1 KΩ já na placa, você pode ler os botões com uma simples leitura direta:
const int USR1 = D6;
const int USR2 = D7;
const int USR3 = D19;
void setup() {
// External 1K pull-up on the board — no internal pull-up needed.
pinMode(USR1, INPUT);
pinMode(USR2, INPUT);
pinMode(USR3, INPUT);
Serial.begin(115200);
}
void loop() {
if (digitalRead(USR1) == LOW) {
Serial.println("USR1 (D6) pressed");
delay(200); // simple debounce
}
if (digitalRead(USR2) == LOW) {
Serial.println("USR2 (D7) pressed");
delay(200);
}
if (digitalRead(USR3) == LOW) {
Serial.println("USR3 (D19) pressed");
delay(200);
}
}
Antirruído (Debounce) com Interrupções
Para um tratamento de botões responsivo, com antirruído e sem bloquear o loop principal, você pode usar interrupções por mudança de estado no pino:
volatile bool btn1Flag = false;
volatile bool btn2Flag = false;
volatile bool btn3Flag = false;
void btn1Isr() { btn1Flag = true; }
void btn2Isr() { btn2Flag = true; }
void btn3Isr() { btn3Flag = true; }
void setup() {
pinMode(D6, INPUT);
pinMode(D7, INPUT);
pinMode(D19, INPUT);
attachInterrupt(digitalPinToInterrupt(D6), btn1Isr, FALLING);
attachInterrupt(digitalPinToInterrupt(D7), btn2Isr, FALLING);
attachInterrupt(digitalPinToInterrupt(D19), btn3Isr, FALLING);
}
void loop() {
if (btn1Flag) {
btn1Flag = false;
delay(30); // debounce settling time
if (digitalRead(D6) == LOW) {
// handle USR1 press
}
}
if (btn2Flag) {
btn2Flag = false;
delay(30);
if (digitalRead(D7) == LOW) {
// handle USR2 press
}
}
if (btn3Flag) {
btn3Flag = false;
delay(30);
if (digitalRead(D19) == LOW) {
// handle USR3 press
}
}
}
Comportamento Padrão no Dashboard de Fábrica
No firmware de fábrica pré-carregado, os botões são mapeados da seguinte forma (você pode sobrescrever isso no seu próprio código):
| Botão | Pino | Ação |
|---|---|---|
| USR1 | D6 | Cicla o brilho da tela (100% → 75% → 50% → 25% → 100%) |
| USR2 | D7 | Alterna a tela desligada / restaura para o último brilho |
| USR3 | D19 | Alterna o título do cabeçalho entre "Hello,XIAO!" e "Seeed" |
Os pads de breakout dos botões (rotulados como U1, U2 e U3 na placa) espelham D6, D7 e D19 respectivamente, permitindo que você conecte botões externos se desejar.
Status da Bateria
Este demo mostra o status da bateria — um ícone de bateria com nível de carga e estado de carregamento — no Display IPS de 1,14''. Ele detecta se uma bateria LiPo está fisicamente conectada e mostra um de três estados: USB PWR (sem bateria), porcentagem (apenas bateria) ou carregando (USB + bateria).
O Display IPS de 1,14'' inclui um circuito de medição de tensão de bateria integrado, conectado ao XIAO nRF52840 Plus.
Localização do código: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_battery_status/
Como Funciona
Display:
A tela é controlada pela Seeed_GFX2 com Board_XIAO_1inch14_LCD<38, 37> e uma substituição BGR de Config_Seeed_1inch14_LCD_ST7789 (135×240, BGR, rotação 2) sobre SPI de hardware a 10 MHz.
Circuito da bateria:
O nRF52840 Plus usa três pinos GPIO para formar um sistema completo de monitoramento de bateria:
| Sinal | Pino do nRF52840 | Função |
|---|---|---|
READ_BAT | P0.14 | Habilitação do divisor de tensão da bateria. Ativo em nível baixo — defina LOW para habilitar o divisor, depois libere para HIGH (alta impedância) para economizar energia. |
VBAT_ADC | PIN_VBAT (AIN7 / P0.31) | Entrada analógica que lê a tensão da bateria dividida. |
CHG | P0.17 | Indicador de status de carregamento. Ativo em nível baixo — lê LOW quando um carregador está conectado e a bateria está carregando. |
Detecção:
Sob USB-C, uma tensão VBAT estática não consegue indicar se uma bateria está presente — o nó BAT do carregador pode se parecer com uma célula Li-ion real mesmo sem nenhuma bateria conectada. Portanto, o demo primeiro aprende uma linha de base apenas USB, depois confirma a inserção da bateria somente após um deslocamento sustentado de VBAT para baixo, e confirma a remoção após uma leitura ruidosa/saltada combinada com ~CHG indo para HIGH. Isso espelha a lógica de detecção do Dashboard de fábrica.
Estados do ícone:
- Sem bateria — ícone de bateria com contorno cinza e um X vermelho, rotulado como USB PWR.
- Bateria presente — ícone de bateria com contorno branco e preenchimento colorido (verde / amarelo / vermelho conforme a porcentagem), rotulado com a porcentagem e a tensão.
- Carregando — preenchimento ciano com um ícone de raio, rotulado com a porcentagem e a tensão.
O pino ~CHG é lido através dos registradores GPIO brutos do nRF52840 (nrf_gpio_cfg_input() e NRF_P0->IN) em vez de digitalRead(). Na API do Arduino, os números de pino seguem o mapeamento do pacote da placa, onde digitalRead(17) na verdade lê P0.07 (a linha de dados I2C do IMU de 6 eixos) em vez de P0.17. As constantes 14 e 17 aqui são números de pino brutos Nordic P0.x (P0.14 e P0.17), que é exatamente o que as chamadas de registrador esperam.
O demo usa o resistor de lado baixo 499 kΩ calibrado de fábrica (taxa do divisor ≈ 3,004), não o valor nominal de 510 kΩ. O divisor está integrado no próprio módulo XIAO nRF52840 Plus, não na placa de display. O pino de habilitação P0.14 é ativo em nível baixo: coloque-o em LOW para habilitar o divisor, depois libere para alta impedância (INPUT) para minimizar a corrente de repouso quando a bateria não estiver sendo medida.
Executando o Demo
Passo 1. Abra xiao_nrf52840_114_battery_status.ino na Arduino IDE.
Passo 2. Selecione Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus e a Port correta.
Passo 3. Clique em Upload.
Passo 4. Observe a tela — ela mostra o ícone de bateria com o estado atual. Conecte ou desconecte uma bateria LiPo (ou o cabo USB-C) para ver o ícone alternar entre os três estados.
Resultado Esperado
![]() USB PWR (sem bateria) | ![]() Percentage (apenas bateria) |
![]() Charging (USB + bateria) | ![]() Battery connector (parte de trás) |
Sem uma bateria, a tela mostra uma bateria cinza com um X vermelho e o rótulo USB PWR. Insira uma bateria LiPo e o ícone muda para um preenchimento colorido com a porcentagem e a tensão. Conecte o USB-C enquanto uma bateria estiver presente e o preenchimento fica ciano com um raio, indicando carregamento.
A demonstração também imprime uma linha de diagnóstico no Serial Monitor a cada 500 ms, por exemplo:
VBAT 3.87V charging 85 spread=5 usb=ON base=4.140 baseValid=Y state=PRESENT filter=STABLE removeCount=0
Recursos
- 🗃️[Arquivos de Design de PCB] XIAO 1.14'' IPS Display (nRF52840) KiCad Project
- 📄[Esquemático] XIAO 1.14'' IPS Display (nRF52840) Schematic
- 📦[Modelo 3D] XIAO 1.14'' IPS Display (STEP)
- 📄[Datasheet] 1.14 Inch Display Datasheet
- 💾[Firmware de Fábrica] XIAO 1.14'' IPS Display (nRF52840) Factory Firmware
- [Demo] Código de Demonstração da Placa de Display XIAO — todas as demos de Function estão no diretório
code_GFX2/Function/114_nRF52840/
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.



