Pular para o conteúdo principal

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,47''. Cada seção é independente — você pode escolher a que corresponde ao seu caso de uso sem precisar ler as demais.

dica

Os GIFs de demonstração nesta página estão acelerados para mantê-los curtos.

nota

Todas as demos desta página exigem Seeed nRF52 Boards (1.1.13) conforme descrito em Getting Started, além da biblioteca Seeed_GFX2 instalada manualmente conforme descrito abaixo.

  • Library Manager — vá em Sketch > Include Library > Manage Libraries..., pesquise e instale:
LibrarySearch KeywordAuthorRequired by
Seeed Arduino LSM6DS3Seeed Arduino LSM6DS3Seeed StudioDemos de IMU
nota

SdFat vem incluída no pacote de placas Seeed nRF52 Boards (1.1.13), portanto as demos SD Image Reader e Record to SD não precisam de instalação separada do SdFat. Não instale SdFat pelo Library Manager, pois isso pode sobrescrever a versão incluída e causar conflitos de biblioteca ou de API.

  • 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 o 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.

dica
  • 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 chamada display.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 172×320, a ordem de cores (BGR) e a orientação. Nenhum driver.h ou configuração manual de pinos é necessária.
  • Nesta placa as demos usam Board_XIAO_1inch47_Touch_Display<38, 37> (RST=38, BL=37) com Config_Seeed_1inch47_Touch_JD9853A (172×320, BGR, sem inversão).
  • O controlador de toque (AXS5106L) é tratado pela camada Touch do Seeed_GFX2 (Touch_AXS5106L) — nenhuma biblioteca extra é necessária. As demos de IMU usam a biblioteca Seeed Arduino LSM6DS3 (instalada acima).

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):

  1. Abra github.com/Seeed-Projects/Display-Gadgets e clique em Code > Download ZIP, depois extraia o arquivo em qualquer lugar conveniente.
  2. Navegue até code_GFX2/Function/ e abra a pasta mostrada na linha Code location de cada demo. Por exemplo, a demo GraphicTest para esta placa está em code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_graphictest/.
  3. Dê um clique duplo no arquivo .ino para 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 da demo a partir da pasta clonada code_GFX2/Function/....

Exibição na tela — GraphicTest

Esta demo executa um benchmark gráfico completo no painel JD9853A de 1,47 polegada, cobrindo barras de cores, linhas, retângulos, círculos, triângulos, retângulos arredondados, texto e um gradiente de pixels. Use-a para verificar se a tela está ligada corretamente e se todas as chamadas de desenho funcionam como esperado.

Code location: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_graphictest/


Como funciona

O sketch inicializa o painel JD9853A via Seeed_GFX2, depois executa em sequência dez primitivas gráficas, 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_1inch47_Touch_Display<38, 37>,
Config_Seeed_1inch47_Touch_JD9853A>();

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 172×320, a ordem de cores BGR e nenhuma inversão — nenhum driver.h ou escrita manual de MADCTL é necessária.

Executando a demo

Passo 1. Abra xiao_nrf52840_147_graphictest.ino no 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 a saída de tempo para cada teste:

LCD width: 172
LCD height: 320
Color bars: 57.62 ms
Lines: 4859.38 ms
Fast lines: 95.70 ms
Rectangles: 74.22 ms
Filled rectangles: 236.33 ms
Circles: 588.87 ms
Triangles: 413.09 ms
Round rectangles: 125.98 ms
Text: 1961.91 ms
Pixel gradient: 8716.80 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" com uma borda azul de retângulo arredondado.

Resultado esperado

Depois que o sketch executa todos os padrões, a tela mostra a mensagem "Graphic Test / Finished". Reinicie a placa para executar o teste novamente.


Toque — Touch Circle

Esta demo transforma a tela sensível ao toque de 1,47 polegada em um bloco de desenho interativo. Toque em qualquer lugar da tela e um círculo branco aparecerá na ponta do seu dedo. Os círculos permanecem na tela, acumulando-se conforme você toca. Toque na barra CLEAR na parte inferior da tela para apagar todos os círculos e recomeçar.

Code location: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_touch_circle/


Como Funciona

A demonstração usa o controlador de toque capacitivo AXS5106L (endereço I2C 0x63) conectado via I2C em D4/D5. A linha de interrupção de toque em D7 é acionada na borda de descida sempre que um dedo toca ou solta a tela. O toque é tratado pela camada Touch do Seeed_GFX2 (Touch_AXS5106L):

Touch_AXS5106L touch(-1, D7, Wire, 172, 320);
display.attachTouch(touch, display.panel().driver().bus());
// ...
display.getTouch(&x, &y);
PinoFunção
D4 (SDA)Barramento de dados I2C — compartilhado com o IMU
D5 (SCL)Barramento de clock I2C — compartilhado com o IMU
D7Interrupção de toque (ativo em nível baixo, borda de descida)
RSTCompartilhado com o reset do LCD (GPIO38)

Desenho acionado por borda. O sketch usa uma abordagem de detecção de borda: ele só adiciona um círculo na borda de descida de um toque (dedo pressionando), não enquanto o dedo é mantido na tela. Isso proporciona um comportamento nítido e intencional de toque-para-desenhar em vez de pintar continuamente um rastro enquanto você arrasta.

Espelhamento do eixo X. O painel de toque é fisicamente montado em uma orientação diferente do LCD, portanto a coordenada X bruta precisa ser espelhada. display.getTouch() já aplica esse espelhamento internamente e retorna coordenadas de tela, então não é necessária nenhuma transformação manual screenX = 172 - 1 - rawX.

Buffer de círculos. Até 120 círculos são armazenados em um buffer circular. Quando o buffer está cheio, o círculo mais antigo é removido e a tela é redesenhada para manter a exibição limpa.

Zona CLEAR. Os 36 pixels inferiores da tela são reservados como uma barra CLEAR. Tocar nessa área apaga todos os círculos e reinicia o contador em vez de desenhar um novo círculo.

Área segura de desenho. Uma borda cinza escura delimita a área onde os círculos ficam totalmente visíveis.

Executando a Demonstração

Passo 1. Abra xiao_nrf52840_147_touch_circle.ino na Arduino IDE.

Passo 2. Selecione a placa e a porta e clique em Upload.

Passo 3. Abra Tools > Serial Monitor (115200 baud). Você deverá ver:

LCD: 172x320
Touch: AXS5106L ready
Tap screen to draw white circles.
Tap CLEAR bar at bottom to erase.

Passo 4. Toque na tela — cada toque imprime as coordenadas de tela mapeadas:

Touch: screen=(144,124)
Touch: screen=(166,210)
Touch: screen=(121,250)
Touch: screen=(37,231)
Touch: screen=(122,44)

Toque na barra CLEAR na parte inferior para apagar todos os círculos.

Resultado Esperado

Cada toque deixa um círculo branco na ponta do seu dedo. A barra de título da tela mostra a contagem em execução. Toque na barra CLEAR e a tela é redefinida para em branco, com a borda e a barra de título redesenhadas.


Cartão SD — Leitor de Imagens

Esta demonstração lê arquivos de imagem .bmp de um cartão MicroSD e os exibe na tela. Ela oferece suporte a imagens BMP de 24 bits sem compactação e faz um recorte central para ajustá-las ao display de 172×320.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_sd_image_reader/


Como Funciona

O LCD e o cartão SD compartilham o mesmo barramento SPI de hardware (SCK = D8, MOSI = D10, MISO = D9). Para evitar contenção no barramento, o sketch desativa o chip-select do cartão SD (D6) antes de qualquer operação no LCD e o reativa antes do acesso ao SD. O cartão SD é controlado pelo SdFat no modo SHARED_SPI na instância padrão SPI, enquanto o LCD roda no host SPI do Seeed_GFX2 — ambos compartilham os mesmos pinos físicos D8/D9/D10.

O sketch varre o diretório raiz do cartão SD em busca de arquivos .bmp (até 24) e depois os exibe em loop com um intervalo de 2 segundos entre as imagens.

Formatos BMP suportados:

FormatoProfundidade de bitsObservações
BMP sem compactação24 bitsBGR888 convertido para RGB565 para exibição

Imagens maiores que 172×320 são recortadas ao centro.

Executando a Demonstração

Passo 1. Formate um cartão MicroSD como FAT32.

Passo 2. Copie uma ou mais imagens .bmp para a raiz do cartão SD.

Passo 3. Insira o cartão SD no slot MicroSD na placa de display.

Passo 4. Abra xiao_nrf52840_147_sd_image_reader.ino na Arduino IDE, selecione a placa e a porta e clique em Upload.

Passo 5. Abra Tools > Serial Monitor (115200 baud). Você deverá ver:

[IMAGE] /Atest.bmp
[IMAGE] /Another test.bmp
[IMAGE] /test.bmp
[SD] mounted @ 8000000
nota

Os nomes de arquivos listados refletem os arquivos .bmp que você colocou no cartão SD. Sua saída irá variar dependendo dos arquivos que você copiar para o cartão.

A tela exibe cada imagem por 2 segundos e depois avança para a próxima em um loop contínuo.

Resultado Esperado

Se nenhum arquivo BMP for encontrado, a tela mostra "No BMP found". Se uma imagem falhar na decodificação, a tela mostra brevemente o caminho do arquivo com "BMP decode failed" e passa para o próximo arquivo.


Microfone e Alto-falante

O Display IPS de 1,47'' possui um microfone digital PDM (Pulse Density Modulation) integrado para entrada de áudio, além de pads de saída I2S para acionar um alto-falante/amplificador externo. Esta seção mostra duas demonstrações: uma visualização em tempo real de Barra de Volume da entrada do microfone (sem hardware extra) e uma demonstração de Gravação em SD que grava 5 segundos de áudio em um cartão MicroSD e o reproduz por meio de um amplificador I2S externo.

PinoSinalFunção
D0PDM_CLKSaída de clock PDM para o microfone
D1MIC_DATAEntrada de dados PDM do microfone

Demo 1: Barra de Volume

Esta demonstração transforma o microfone PDM integrado em um grande e responsivo medidor de volume. Uma barra de 10 segmentos preenche o centro da tela — verde em níveis baixos, amarela na faixa média e vermelha quando alto. A porcentagem é exibida acima da barra e muda de cor para corresponder ao nível.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_mic_canvas/


Como Funciona

O microfone digital PDM (Pulse Density Modulation) integrado está conectado ao periférico PDM do nRF52840 por meio de D0 (PDM_CLK) e D1 (MIC_DATA), conforme mostrado na tabela de pinos acima.

A biblioteca PDM da Arduino lida com a conversão de baixo nível de PDM para PCM em hardware. O sketch configura o periférico PDM em 16 kHz mono com ganho de 30 e registra uma função de retorno de chamada acionada por interrupção (onPDMdata) que é chamada sempre que um buffer de 256 amostras fica pronto.

Processamento de sinal:

  1. Extração de pico — cada callback varre o buffer de 256 amostras em busca do maior valor absoluto (amplitude de pico).
  2. Normalização — o pico bruto é mapeado de um piso de 40 para um teto de 16.000, produzindo um valor de volume de 0,0–1,0. Valores abaixo do piso são tratados como silêncio.
  3. Suavização exponencial — o volume exibido é uma média móvel exponencial do pico bruto (α = 0,20) para evitar tremulação. Quando o silêncio é detectado, o valor exibido decai em ×0,94 por quadro.

Desenho da barra:

SegmentoCorFaixa de volume
0–4 (5 inferiores)Verde0% – 50%
5–8 (4 do meio)Amarelo50% – 90%
9 (top)Vermelho90% – 100%

A barra usa renderização diferencial: apenas os segmentos cujo estado mudou desde o último quadro são redesenhados. Os segmentos inalterados são deixados como estão, minimizando o tráfego SPI e evitando cintilação.

Executando a demonstração

Passo 1. Abra xiao_nrf52840_147_mic_canvas.ino na Arduino IDE.

Passo 2. Selecione a placa e a porta e clique em Upload.

Passo 3. Abra Tools > Serial Monitor (115200 baud). Você deverá ver:

[MIC] ready

Passo 4. Fale no microfone PDM (localizado próximo ao canto inferior esquerdo da placa de exibição) ou assopre nele. A barra se preenche de verde para amarelo e vermelho, e a porcentagem é atualizada acima dela.

Resultado esperado

A barra responde em tempo real. Em um ambiente silencioso, a barra permanece vazia. Falando em volume normal a cerca de 20 cm de distância acende os segmentos verdes. Assoprar diretamente no microfone empurra para a faixa amarela ou vermelha.


Demo 2: Gravar no SD

Esta demonstração grava 5 segundos de áudio do microfone PDM onboard na RAM, salva em um cartão MicroSD como um arquivo WAV e depois o reproduz por meio de um amplificador I2S externo. Pressione um botão para gravar e outro para reproduzir.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_sd_unline_record/


Configuração de hardware

A reprodução requer um amplificador de áudio I2S e alto-falante externos. A demonstração foi escrita para um breakout MAX98357A conectado aos pads de saída I2S da placa:

Pad I2SPino XIAOMAX98357A
3V33V3VIN
GNDGNDGND
I2S_SDD11DIN
I2S_SCKD12BCLK
I2S_WSD13LRC

Os pads I2S (3V3, GND, D11, D12, D13) estão expostos no grupo de pads de expansão inferior da placa de exibição.

Como funciona

Gravação. O microfone PDM onboard é capturado em 16 kHz mono, 16 bits por meio do periférico PDM do nRF52840, usando os mesmos pinos D0 (PDM_CLK) / D1 (MIC_DATA) da Demo 1. Quando você pressiona USR1, o sketch amostra 5 segundos de áudio diretamente em um buffer estático de RAM e depois grava no cartão SD como um arquivo WAV (/REC_001_RAW.WAV) usando a biblioteca SdFat incluída em Seeed nRF52 Boards 1.1.13.

A gravação é armazenada em buffer na RAM porque o nRF52840 tem apenas 256 KB de RAM. Em 16 kHz × 16 bits mono, 5 segundos precisam de 160.000 bytes — o que cabe. 10 segundos precisariam de 320.000 bytes e não caberiam, portanto a demonstração é fixa em 5 segundos.

Reprodução. Pressionar USR2 lê o WAV de volta do cartão SD (pulando o cabeçalho WAV de 44 bytes) e o transmite pelo periférico I2S do nRF52840 no modo estéreo Philips em D11/D12/D13. As amostras mono são duplicadas para ambos os canais com um ganho de 0.75× aplicado para evitar clipping. O amplificador aciona um pequeno alto-falante para que você possa ouvir a gravação.

Máquina de estados. O gravador percorre uma sequência determinística de estados, imprimindo cada transição no monitor serial:

IDLE → PREPARE_SYSTEM → QUIET_RADIO → PREPARE_PERIPHERALS → START_HFCLK → START_PDM
→ DISCARD_WARMUP → CAPTURE_RAM → STOP_PDM → SAVE_RAW → DONE
  • QUIET_RADIO desativa o periférico RADIO (este sketch nunca inicializa BLE) para manter estável a seção de captura sensível ao tempo.
  • START_HFCLK alterna o clock de alta frequência para o cristal externo de 32 MHz, que o periférico PDM precisa para amostragem precisa.
  • DISCARD_WARMUP descarta os primeiros 300 ms da saída PDM enquanto o microfone estabiliza.
  • CAPTURE_RAM preenche o buffer até que 80.000 amostras (5 s) sejam coletadas, desenhando uma barra de progresso em tempo real na tela.

Estados na tela:

EstadoDescrição
ReadyTítulo "RAM Recorder" com "USR1: record" e "USR2: play last"
RecordingRótulo "Recording", um cronômetro decorrido ("2.3s / 5s") e uma barra de progresso vermelha
DoneTítulo "Done" com o nome do arquivo salvo e "Saved raw WAV", além de "USR1: record" / "USR2: play raw"
PlaybackTítulo "Playback" mostrando "Loading RAW audio..." e depois "Playing RAW audio", terminando em "Finished"

Executando a demonstração

Passo 1. Formate um cartão MicroSD como FAT32 e insira-o no slot MicroSD na placa de exibição.

Passo 2. Conecte um amplificador MAX98357A e um alto-falante aos pads I2S conforme descrito acima.

Passo 3. Abra xiao_nrf52840_147_sd_unline_record.ino na Arduino IDE, selecione a placa e a porta e clique em Upload.

Passo 4. Abra Tools > Serial Monitor (115200 baud). Na inicialização você deverá ver:

=== XIAO nRF52840 Plus RAM PDM recorder ===
[RAM] record buffer bytes=160000
[RADIO] BLE is not initialized by this sketch
[PDM] library uses EasyDMA double buffering
[STATE] IDLE

Passo 5. Pressione USR1 (D19) para gravar 5 segundos de áudio do microfone onboard. A barra de progresso se preenche enquanto grava, e a máquina de estados imprime cada transição:

[STATE] PREPARE_SYSTEM
[STATE] QUIET_RADIO
[STATE] PREPARE_PERIPHERALS
[STATE] START_HFCLK
[STATE] START_PDM
[STATE] DISCARD_WARMUP
[STATE] CAPTURE_RAM
[STATE] STOP_PDM
[STATE] SAVE_RAW
[STATE] DONE
[SAVE] /REC_001_RAW.WAV

Passo 6. Pressione USR2 (D15) para reproduzir a gravação pelo alto-falante:

[PLAY] latest RAW audio
[PLAY] finished
nota

Cada nova gravação é salva como um arquivo WAV numerado (REC_001_RAW.WAV, REC_002_RAW.WAV, …), portanto as gravações anteriores são mantidas. A tela "Done" mostra o nome do arquivo da gravação mais recente.

Resultado esperado

Pressione USR1 e a tela mostra uma barra de progresso de gravação. Após 5 segundos, ela confirma que o WAV foi salvo no cartão SD. Pressione USR2 e o áudio é reproduzido pelo alto-falante conectado enquanto a tela mostra o status da reprodução.


IMU

Demo 1: Areia movediça eletrônica

Esta demonstração 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 medido pela IMU de 6 eixos LSM6DS3 onboard. Incline a placa e a areia muda de direção em tempo real.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_electronic_quicksand/


Como funciona

A simulação usa uma grade de ocupação 24×45 sobreposta à tela de 172×320, em que cada célula tem 7×7 pixels. Cerca de 180 partículas são colocadas na grade, cada uma com posição, velocidade e um gradiente de cor dourado.

O acelerômetro LSM6DS3 é lido via I2C (D4/D5) a cada 8 ms. Os valores brutos de aceleração são filtrados em baixa frequência e usados para derivar um vetor de gravidade. Quando você inclina a placa:

  1. O vetor de gravidade é atualizado — os dados do acelerômetro são suavizados com uma média móvel exponencial para evitar tremores.
  2. Velocidade das partículas — cada partículas acelera na direção do vetor de gravidade, com amortecimento e um fator de mobilidade por partícula baseado em sua profundidade no fluxo.
  3. 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.
  4. Renderização diferencial — apenas as células para as quais partículas se moveram para dentro ou para fora são redesenhadas, minimizando o tráfego SPI e mantendo a animação suave.

As partículas próximas à superfície fluem livremente (maior mobilidade); as partículas enterradas mais profundamente ficam mais compactadas (menor mobilidade) — imitando o comportamento da areia real.

Executando a demonstração

Passo 1. Abra xiao_nrf52840_147_electronic_quicksand.ino na Arduino IDE.

Passo 2. Selecione a placa e a porta e, em seguida, clique em Upload.

Passo 3. Depois do upload, a tela é preenchida com 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 ===
imu.begin=0

Resultado esperado

As partículas de areia douradas fluem suavemente conforme você inclina a placa. Quando mantida na horizontal, a areia se acomoda na parte inferior da tela. Gire a placa em 90 graus e a areia flui para o novo "fundo" em menos de um segundo.


Demo 2: Levantar para despertar

Esta demonstração implementa um sistema de suspensão/ativação da tela acionado pela interrupção de wake-up integrada do IMU LSM6DS3 no D14. A tela desliga automaticamente (backlight desligado + CPU entra em System ON sleep) após 8 segundos de inatividade e desperta instantaneamente quando você pega ou move o dispositivo.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_wakeup/


Como funciona

A demonstração usa o detector de evento de wake-up 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:

RegistradorValorFunção
CTRL1_XL0x40Acelerômetro @ 104 Hz, ±2g
CTRL3_C0x44Atualização de dados em bloco + auto-incremento
TAP_CFG0x80Habilitar interrupções integradas
WAKE_UP_THS0x05Limite de wake-up (sensibilidade média-baixa)
WAKE_UP_DUR0x00Sem filtro de duração (wake responsivo)
MD1_CFG0x20Direcionar wake-up para INT1

Fluxo de suspensão/ativação:

  1. Estado ativo — a tela está ligada, backlight em PWM 120. Os dados do IMU e o status da bateria são atualizados a cada 250 ms / 1000 ms, respectivamente. Um temporizador regressivo mostra os segundos restantes até a suspensão automática.
  2. Suspensão automática — após 8 segundos sem atividade, o sketch desliga o backlight, desenha a mensagem "Sleeping... Pick up device to wake" e entra em System ON sleep do nRF52840 via WFE (Wait For Event).
  3. Wake-up — quando o usuário pega a placa, o LSM6DS3 detecta o movimento e coloca D14 em nível HIGH. A interrupção de GPIO é disparada, a CPU acorda do WFE, o backlight é ligado e a interface é totalmente redesenhada.

Em System ON sleep, toda a RAM e os estados dos periféricos são preservados — o wake-up é praticamente instantâneo (menos de 1 ms entre a interrupção e o backlight ligado).

Botões de teste manual:

BotãoPinoAção
USR1D19Forçar suspensão
USR2D15Forçar wake

Executando a demonstração

Passo 1. Abra xiao_nrf52840_147_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 por 8 segundos — ela entrará em suspensão automaticamente.

Passo 3. Pegue a placa ou agite-a levemente — a tela desperta imediatamente.

Passo 4. Abra Tools > Serial Monitor (115200 baud) para observar as transições de suspensão/wake:

[SLEEP] screen backlight off, waiting for IMU D14 wake
[SYS_ON_SLEEP] waiting, sleepLoops=26625 D14=0 awake=N
[SYS_ON_SLEEP] waiting, sleepLoops=27649 D14=0 awake=N
[SYS_ON_SLEEP] waiting, sleepLoops=28673 D14=0 awake=N
[SYS_ON_SLEEP] waiting, sleepLoops=29697 D14=0 awake=N
[WAKE] reason=IMU_D14 wakeCount=1 sleptMs=58776 sleepLoops=29705
[WAKE] reason=IMU_D14 wakeCount=2 sleptMs=60110 sleepLoops=29705

Resultado esperado

A tela exibe dados em tempo real do acelerômetro e giroscópio enquanto está ativa. Após 8 segundos de imobilidade, a tela escurece e o nRF52840 entra em modo de suspensão de baixo consumo. Pegue o dispositivo e a tela é restaurada em uma fração de segundo, com o contador de wake incrementado.


Botão de usuário

O Display IPS de 1,47'' possui dois botões físicos de pressão conectados ao XIAO nRF52840 Plus:

BotãoPinoLógicaRótulo na serigrafia
BTN_AD19Ativo em nível baixo (pressionado = LOW)USR1
BTN_BD15Ativo em nível baixo (pressionado = LOW)USR2

Lendo um botão

Ambos os botões usam os resistores de pull-up internos do XIAO. Uma leitura simples e não bloqueante se parece com isto:

const int BTN_A = D19;
const int BTN_B = D15;

void setup() {
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_B, INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
if (digitalRead(BTN_A) == LOW) {
Serial.println("BTN_A pressed");
delay(200); // simple debounce
}
if (digitalRead(BTN_B) == LOW) {
Serial.println("BTN_B pressed");
delay(200);
}
}

Eliminação de bounce com interrupções

Para um tratamento de botões responsivo, com eliminação de bounce e sem bloquear o loop principal, você pode usar interrupções por mudança de pino:

volatile bool btnAFlag = false;
volatile bool btnBFlag = false;

void btnAIsr() { btnAFlag = true; }
void btnBIsr() { btnBFlag = true; }

void setup() {
pinMode(D19, INPUT_PULLUP);
pinMode(D15, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(D19), btnAIsr, FALLING);
attachInterrupt(digitalPinToInterrupt(D15), btnBIsr, FALLING);
}

void loop() {
if (btnAFlag) {
btnAFlag = false;
delay(30); // debounce settling time
if (digitalRead(D19) == LOW) {
// handle BTN_A press
}
}
if (btnBFlag) {
btnBFlag = false;
delay(30);
if (digitalRead(D15) == LOW) {
// handle BTN_B press
}
}
}

Comportamento padrão no painel 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ãoAção
BTN_A (D19)Pressão curta: alternar o brilho da tela 100% → 75% → 50% → 25% → 0% → 100%
BTN_B (D15)Pressão curta: alternar tela desligada / restaurar para o último brilho

Os pads de breakout dos botões (rotulados como U1 e U2 na placa) espelham D19 e D15, respectivamente, permitindo que você conecte botões externos, se desejar.


Status da bateria

Esta demonstração mostra o status da bateria — um ícone de bateria com nível de carga e estado de carregamento — no Display IPS de 1,47''. Ela detecta se uma bateria LiPo está fisicamente conectada e exibe um de três estados: USB PWR (sem bateria), percentual (apenas bateria) ou carregando (USB + bateria).

O Display IPS de 1,47'' inclui um circuito integrado de medição de tensão da bateria. O nRF52840 Plus lê a tensão da bateria LiPo através de um divisor de tensão e pode exibir a capacidade restante como uma porcentagem.

Localização do código: code_GFX2/Function/147_nRF52840/xiao_nrf52840_147_battery_status/


Como funciona

Display:

A tela é controlada pela Seeed_GFX2 com Board_XIAO_1inch47_Touch_Display<38, 37> e Config_Seeed_1inch47_Touch_JD9853A (172×320, BGR, rotação 2) via SPI de hardware de 10 MHz.

Circuito da bateria:

O nRF52840 Plus usa três pinos GPIO para formar um sistema completo de monitoramento de bateria:

SinalPino nRF52840Função
READ_BATP0.14Habilitação do divisor de tensão da bateria. Ativo em nível baixo — defina como LOW para habilitar o divisor e depois libere para HIGH (alta impedância) para economizar energia.
VBAT_ADCPIN_VBAT (AIN7 / P0.31)Entrada analógica que lê a tensão da bateria dividida.
CHGP0.17Indicador 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 há uma bateria 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 somente USB, depois confirma a inserção da bateria apenas após um deslocamento sustentado de VBAT para baixo e confirma a remoção após uma leitura ruidosa/pulada 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 em cinza com um X vermelho, rotulado como USB PWR.
  • Bateria presente — ícone de bateria com contorno branco e preenchimento colorido (verde / amarelo / vermelho por 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.
nota

O pino ~CHG é lido através dos registradores brutos de GPIO 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, em que 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 brutos de pino Nordic P0.x (P0.14 e P0.17), que é exatamente o que as chamadas de registrador esperam.

nota

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 e 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_147_battery_status.ino na 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. Observe a tela — ela mostra o ícone da 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)

Porcentagem (somente bateria)

Carregando (USB + bateria)

Conector da bateria (parte traseira)

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.

O demo também imprime uma linha de diagnóstico no Monitor Serial 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

Suporte técnico e discussão sobre o produto

Obrigado por escolher nossos produtos! Estamos aqui para oferecer 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.

Loading Comments...