Tutorial Prático do Código-Fonte do Firmware Meshtastic
Este tutorial é destinado a usuários que estão começando a trabalhar com o código-fonte do firmware Meshtastic. Ele inclui fluxos de trabalho comuns tanto para Windows quanto para macOS. O objetivo é direto: clonar o repositório oficial, concluir uma compilação bem-sucedida, fazer uma alteração simples na interface do usuário e gravar o firmware modificado no dispositivo para verificação.
Se você já está familiarizado com Git, Python ou PlatformIO, pode pular as seções correspondentes e ir diretamente para a parte prática.
Este guia inclui comandos comuns para Windows e macOS. A maioria das capturas de tela ainda é feita em um ambiente Windows, mas o fluxo de trabalho geral no macOS é muito semelhante.
Pré-requisitos
Antes de começar, prepare as seguintes ferramentas:
- Git
- Python 3
- VS Code
- PlatformIO
1. Instalar o Git
- Windows
- macOS
Abra a página oficial de download do Git para Windows:
O instalador geralmente começa a ser baixado automaticamente quando você abre a página. Após a conclusão do download, clique duas vezes no instalador e siga o assistente de instalação.
Durante a instalação, a etapa mais importante é Adjusting your PATH environment. Escolha:
Git from the command line and also from 3rd-party software
Para as outras opções, os valores padrão geralmente são suficientes. Basta continuar clicando em Next.

Aguarde até que a instalação termine.
Após a instalação, feche todas as janelas atuais do PowerShell e terminais do VS Code, depois abra uma nova janela do PowerShell e execute:
& "C:\Program Files\Git\cmd\git.exe" --version

Se um número de versão do Git for exibido, o Git foi instalado com sucesso.
Se o comando git ainda não estiver disponível
Você pode primeiro executar os seguintes comandos no PowerShell para confirmar os caminhos padrão de instalação do Git:
$gitCmd = "C:\Program Files\Git\cmd"
$gitBin = "C:\Program Files\Git\bin"
Write-Host $gitCmd
Write-Host $gitBin

Em seguida, adicione manualmente o Git às variáveis de ambiente do sistema.
Etapas de correção via GUI
- Pressione
Win - Pesquise por "Edit the system environment variables"
- Abra e clique em Environment Variables
- Encontre
Pathem System variables - Clique em Edit
- Clique em New e adicione os dois caminhos a seguir:
C:\Program Files\Git\cmd
C:\Program Files\Git\bin
- Clique em OK em todas as janelas para salvar

Depois de salvar, você ainda precisa:
- Fechar todas as janelas do PowerShell
- Abrir o PowerShell novamente
Depois execute:
git --version

Se um número de versão aparecer, a instalação está concluída.
No macOS, o Git pode ser instalado de mais de uma forma, mas usar o Homebrew geralmente é a opção mais fácil:
- Instale primeiro as Command Line Tools:
xcode-select --install
- Se o Homebrew ainda não estiver instalado, instale-o primeiro:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Instale o Git:
brew install git
- Verifique a versão instalada:
git --version
Se o seu terminal já retornar uma versão válida do Git, você não precisa instalá-lo novamente.
Configure sua identidade do Git
Em seguida, configure suas informações de usuário do Git. Substitua os valores de exemplo pelo seu próprio nome e endereço de e-mail:
git config --global user.name "your name"
git config --global user.email "your [email protected]"
Depois execute:
git config --global --list
para confirmar que a configuração entrou em vigor.
2. Instalar o Python 3
Instalar o Python pela linha de comando
- Windows
- macOS
Execute os seguintes comandos no terminal:
winget search --id Python.Python.3.13 --source winget
winget install -e --id Python.Python.3.13 --source winget
Se o primeiro comando conseguir encontrar o Python, o segundo normalmente deve instalá-lo diretamente.
Após a instalação, feche o terminal e abra-o novamente, depois execute:
python --version
pip --version

Se forem exibidos números de versão, o Python e o pip estão prontos para uso.
O macOS frequentemente já inclui um ambiente Python. Antes de instalar uma nova versão, verifique se python3 e pip3 já estão disponíveis:
python3 --version
pip3 --version
Se eles não estiverem disponíveis, ou se você quiser uma versão mais recente, instale o Python com o Homebrew:
brew install python
Após a instalação, reabra o terminal e execute:
python3 --version
pip3 --version
Se você preferir usar python e pip, pode definir aliases no shell por conta própria. No macOS, porém, usar python3 e pip3 costuma ser a opção mais confiável.
3. Instalar o PlatformIO
Esta etapa pode parecer menos amigável para iniciantes porque o PlatformIO baixa muitas dependências automaticamente, e a instalação pode levar algum tempo. Se aparecerem erros durante a instalação, geralmente é melhor esperar com paciência e resolver um problema de cada vez. Usar ferramentas de IA para ajudar a inspecionar as mensagens de erro também pode economizar tempo.
Pesquise por PlatformIO no marketplace de Extensões do VS Code e instale-o.

Após a instalação, normalmente aparece um ícone em forma de formiga na barra de ferramentas à esquerda.

4. Clonar o repositório de firmware do Meshtastic
O repositório oficial de firmware do Meshtastic é meshtastic/firmware.
- Windows
- macOS
Execute os seguintes comandos no terminal do seu diretório de trabalho:
git clone https://github.com/meshtastic/firmware.git
cd firmware
git submodule update --init
Se o diretório do seu projeto estiver em outra unidade ou em um caminho diferente, mude para esse local primeiro.


Se a saída for semelhante às capturas de tela acima, o repositório foi clonado com sucesso.
Execute os seguintes comandos no terminal do seu diretório de trabalho:
cd ~/workplace
git clone https://github.com/meshtastic/firmware.git
cd firmware
git submodule update --init
Se ~/workplace ainda não existir, crie-o primeiro:
mkdir -p ~/workplace
Se os comandos forem concluídos normalmente, o repositório foi clonado com sucesso.
5. Prática hands-on
Neste estágio, não tenha pressa em editar o código. Primeiro, certifique-se de que o projeto consegue passar com sucesso por todo o processo de compilação.
Recomenda-se começar com três tarefas:
- Abrir
firmware - Verificar
platformio.ini - Encontrar o ambiente de compilação para sua placa-alvo
Um detalhe importante: não foque apenas no platformio.ini da raiz. Ele na verdade inclui arquivos de configuração adicionais, por exemplo:
extra_configs =
variants/*/*.ini
variants/*/*/platformio.ini
variants/*/diy/*/platformio.ini
Isso significa que as definições reais de ambiente em nível de placa geralmente estão localizadas em variants/.../platformio.ini.
Ao identificar a placa-alvo, preste atenção especial a estes dois diretórios:
variants/boards/
Aqui usamos Wio Tracker L1 Pro como placa-alvo de exemplo.

Isso mostra que, no Meshtastic, o alvo de compilação para Wio Tracker L1 / L1 Pro é seeed_wio_tracker_L1.
Resumo da modificação mínima
Se você só quiser concluir uma prática mínima de ponta a ponta, concentre-se nestas etapas principais:
- Instalar Git, Python 3, VS Code e PlatformIO.
- Clonar o repositório
meshtastic/firmwaree inicializar os submódulos. - Usar
pio run -e seeed_wio_tracker_L1para confirmar que o projeto original compila com sucesso. - Modificar a lógica de exibição em
src/graphics/SharedUIDisplay.cpp. - Recompilar o firmware e gravar o arquivo UF2 gerado no dispositivo para verificação.
Etapa 1: Confirmar que o projeto compila com sucesso
Aqui usamos o PlatformIO Core CLI para compilar.

Para a primeira compilação, recomenda-se executar o seguinte comando:
- Windows
- macOS
cd D:\workplace\firmware # Adjust to your actual project path
pio run -e seeed_wio_tracker_L1
cd ~/workplace/firmware # Adjust to your actual project path
pio run -e seeed_wio_tracker_L1

Se a interface estiver semelhante à captura de tela acima, o processo de compilação foi iniciado corretamente. A primeira compilação geralmente leva um tempo, portanto seja paciente.
Se a compilação falhar
Quando uma compilação falhar, você pode primeiro pedir ao PlatformIO para instalar as dependências exigidas pelo ambiente atual:
- Windows
- macOS
cd D:\workplace\firmware # Adjust to your actual project path
pio pkg install -e seeed_wio_tracker_L1
cd ~/workplace/firmware # Adjust to your actual project path
pio pkg install -e seeed_wio_tracker_L1
Essa abordagem tem vários benefícios:
- Ela instala apenas as dependências, sem iniciar imediatamente uma compilação completa.
- Ela facilita ver qual pacote está causando o problema.
- As mensagens de erro geralmente são mais focadas e fáceis de depurar.
Depois que as dependências forem instaladas, execute:
- Windows
- macOS
pio run -e seeed_wio_tracker_L1 -v
pio run -e seeed_wio_tracker_L1 -v

Quando a instalação das dependências terminar, execute novamente a compilação normal:
- Windows
- macOS
pio run -e seeed_wio_tracker_L1
pio run -e seeed_wio_tracker_L1

Se a compilação passar neste ponto, o firmware de saída foi gerado com sucesso.

Etapa 2: Modificar o código
Prática 1: Modificar a interface de exibição (UI)
Comece rastreando a implementação da exibição a partir da configuração em nível de placa. Você pode primeiro verificar:
variants/nrf52840/seeed_wio_tracker_L1/platformio.inivariants/nrf52840/seeed_wio_tracker_L1/variant.h

A partir desses arquivos de configuração, você pode ver que o L1 define HAS_SCREEN e USE_SSD1306. Isso significa que ele usa o pipeline padrão de exibição OLED, não uma configuração sem tela e não uma solução de E-Ink.
Se você continuar rastreando a lógica de exibição, a maior parte do código relacionado está localizada em:
src/graphics/src/graphics/draw/
Exatamente como você o modifica depende da sua capacidade de ler o código-fonte. Aqui começamos com um exemplo bem simples: modificar a interface da tela inicial.
Alteração 1: Registrar a borda direita do texto da bateria
Before / After
// Before
int batteryX = 1;
int batteryY = HEADER_OFFSET_Y + 1;
// After
int batteryX = 1;
int batteryY = HEADER_OFFSET_Y + 1;
int batteryTextEndX = batteryX - 1;
src/graphics/SharedUIDisplay.cpp:157
Isso adiciona batteryTextEndX, que registra a posição final do texto de porcentagem da bateria. Isso facilita anexar texto personalizado após as informações da bateria mais tarde.
Alteração 2: Calcular o limite direito ao desenhar a porcentagem da bateria
// Before
if (chargePercent != 101) {
char chargeStr[4];
snprintf(chargeStr, sizeof(chargeStr), "%d", chargePercent);
int chargeNumWidth = display->getStringWidth(chargeStr);
display->drawString(batteryX, textY, chargeStr);
display->drawString(batteryX + chargeNumWidth - 1, textY, "%");
if (isBold) {
display->drawString(batteryX + 1, textY, chargeStr);
display->drawString(batteryX + chargeNumWidth, textY, "%");
}
}
// After
if (chargePercent != 101) {
char chargeStr[4];
snprintf(chargeStr, sizeof(chargeStr), "%d", chargePercent);
int chargeNumWidth = display->getStringWidth(chargeStr);
int percentWidth = display->getStringWidth("%");
display->drawString(batteryX, textY, chargeStr);
display->drawString(batteryX + chargeNumWidth - 1, textY, "%");
if (isBold) {
display->drawString(batteryX + 1, textY, chargeStr);
display->drawString(batteryX + chargeNumWidth, textY, "%");
}
batteryTextEndX = batteryX + chargeNumWidth + percentWidth - 1 + (isBold ? 1 : 0);
} else {
batteryTextEndX = batteryX - 1;
}
src/graphics/SharedUIDisplay.cpp:204
Esse código fica dentro da lógica de desenho da porcentagem da bateria. Além de exibir o nível da bateria normalmente, ele também calcula o limite direito da área de texto para que rótulos personalizados possam ser colocados após as informações da bateria.
Alteração 3: Reservar um limite para a área de ícones à direita
// Before
int iconRightEdge = timeX - 2;
// After
int iconRightEdge = timeX - 2;
int headerLabelRight = timeX - 4;
src/graphics/SharedUIDisplay.cpp:263
Esta parte lida com a área usada pelos ícones de hora, e-mail, mudo e outros ícones no lado direito. Eu adicionei headerLabelRight para limitar o limite máximo à direita do texto central e evitar sobreposição com o conteúdo do lado direito.
Alteração 4: Desenhar um rótulo personalizado quando o título estiver vazio
// Newly added core logic
#if defined(SEEED_WIO_TRACKER_L1) && !defined(SEEED_WIO_TRACKER_L1_EINK)
if (titleStr && titleStr[0] == '\0') {
static const char *yclLabel = "made by AE";
int labelWidth = display->getStringWidth(yclLabel);
int labelLeft = batteryTextEndX + 4;
if (labelLeft + labelWidth <= headerLabelRight) {
int labelX = labelLeft + ((headerLabelRight - labelLeft) - labelWidth) / 2;
display->drawString(labelX, textY, yclLabel);
if (isBold)
display->drawString(labelX + 1, textY, yclLabel);
}
}
#endif
src/graphics/SharedUIDisplay.cpp:350
Esta é a lógica central da modificação. Ela se aplica apenas a SEEED_WIO_TRACKER_L1 e exclui explicitamente a variante de E-Ink. Ela centraliza o texto made by AE no espaço em branco entre as informações da bateria e a exibição da hora.
Alteração 5: Tratar o ramo em que nenhuma hora é exibida
// Add the same boundary control for the no-time branch
int iconRightEdge = screenW - xOffset;
int headerLabelRight = screenW - xOffset - 2;
src/graphics/SharedUIDisplay.cpp:377
Este é o ramo usado quando nenhum valor de hora é exibido. O mesmo controle de limite precisa ser adicionado aqui também.
#if defined(SEEED_WIO_TRACKER_L1) && !defined(SEEED_WIO_TRACKER_L1_EINK)
if (titleStr && titleStr[0] == '\0') {
static const char *yclLabel = "made by AE";
int labelWidth = display->getStringWidth(yclLabel);
int labelLeft = batteryTextEndX + 4;
if (labelLeft + labelWidth <= headerLabelRight) {
int labelX = labelLeft + ((headerLabelRight - labelLeft) - labelWidth) / 2;
display->drawString(labelX, textY, yclLabel);
if (isBold)
display->drawString(labelX + 1, textY, yclLabel);
}
}
#endif
src/graphics/SharedUIDisplay.cpp:426
Esta é a implementação para desenhar made by AE no ramo sem hora.
Você pode encontrar o código completo aqui:
Etapa 3: Compilar o seu próprio firmware
Depois de terminar a modificação, volte para a raiz do projeto e compile o mesmo alvo novamente:
- Windows
- macOS
cd D:\workplace\firmware # Adjust to your actual project path
pio run -e seeed_wio_tracker_L1
cd ~/workplace/firmware # Adjust to your actual project path
pio run -e seeed_wio_tracker_L1
A lógica de exibição foi alterada, mas o alvo de compilação ainda é o mesmo:
seeed_wio_tracker_L1
Após uma compilação bem-sucedida, a saída geralmente fica localizada em:
- Windows
- macOS
D:\workplace\firmware\.pio\build\seeed_wio_tracker_L1\
~/workplace/firmware/.pio/build/seeed_wio_tracker_L1/
O arquivo que você deve confirmar que foi atualizado é:
firmware-seeed_wio_tracker_L1-*.uf2
6. Gravar o firmware
Depois que a compilação estiver concluída, abra a página oficial de gravação:
Na maioria dos casos, você deve executar primeiro uma operação de apagamento.

Em seguida, selecione o arquivo de firmware que você acabou de compilar e grave-o no dispositivo.


Neste ponto, o exercício prático com o código-fonte do Meshtastic está concluído. Você passou por todo o fluxo de trabalho: configuração do ambiente, clonagem do repositório, descoberta da configuração da placa, compilação do firmware, modificação da lógica de exibição e verificação final da gravação.
Se quiser ir além, você pode continuar explorando estas direções:
- Modificar mais elementos na tela inicial
- Ajustar o comportamento dos botões, GPS, Bluetooth e outros módulos
- Adicionar um
variantindependente para a sua própria placa - Continuar rastreando as relações entre
src/,variants/eboards/
Problemas comuns
O comando git não está disponível
- No Windows, primeiro verifique se o Git foi adicionado ao
PATH. - No macOS, execute primeiro
git --version. Se o sistema pedir para instalar as Command Line Tools, siga a instrução.
python3 ou pip3 não está disponível
- No Windows, confirme se o Python foi adicionado ao
PATHou reabra o terminal e tente novamente. - No macOS, primeiro verifique se
python3/pip3já existem e instale o Python com o Homebrew somente se necessário.
O comando pio não está disponível
- Execute primeiro
pio --version. - Se o comando ainda não estiver disponível, reinicie o VS Code e o terminal e tente novamente.
- Se necessário, reinstale a extensão PlatformIO e confirme que o PlatformIO Core foi inicializado corretamente.
O código ainda parece incompleto após git submodule update --init
- Primeiro, certifique-se de que você está no diretório raiz do repositório
firmware. - Se a conexão de rede estiver instável, tente novamente com:
git submodule update --init --recursive
A primeira compilação leva muito tempo
- É normal que a primeira compilação baixe muitas dependências.
- Se parecer travado por muito tempo, tente instalar os pacotes separadamente primeiro:
pio pkg install -e seeed_wio_tracker_L1
Em seguida, execute a compilação novamente.