ESP32-C3 + ESP-NOW: Controle Sem Fio com 5 Botões Analógicos e Display OLED
ESP-NOW com Dois ESP32-C3 + Módulo de 5 Botões Analógicos + OLED
O ESP-NOW é uma das tecnologias mais interessantes da família ESP32.
Com ela podemos criar comunicação sem fio entre placas ESP32 sem precisar de roteador Wi-Fi.
Neste projeto vamos usar:
- 2 placas ESP32-C3
- módulo analógico de 5 botões
- display OLED SSD1306
- comunicação ESP-NOW
O objetivo é simples:
Quando um botão for pressionado no ESP32-C3 transmissor, o comando será enviado sem fio para outro ESP32-C3 receptor, que mostrará o nome do botão no display OLED.
ESP32-C3: Por Que o Serial.print() Não Aparece? Entenda o USB CDC On Boot
Se você já programou um ESP32-C3 Super Mini e percebeu que o Serial.print() não mostra nada no Monitor Serial da Arduino IDE, mas tudo funciona normalmente ao ativar USB CDC On Boot: Enabled, você não está sozinho.
Esse é um comportamento comum nas placas com USB nativa, como o ESP32-C3.
Neste artigo, você vai entender:
- O que é USB CDC
- Por que o
Serial.print()pode não aparecer - Como configurar corretamente a Arduino IDE
- Código de teste para verificar a comunicação serial
- Dicas para evitar problemas
O Que é USB CDC?
USB CDC (Communication Device Class) é um padrão que permite que o microcontrolador seja reconhecido pelo computador como uma porta serial virtual (COM).
Na prática, isso significa que o código abaixo envia dados diretamente pela porta USB:
Serial.begin(115200);
Serial.println("Olá, mundo!");
Sem o CDC habilitado, a porta USB pode não funcionar como Monitor Serial.
Diferença Entre ESP32 Tradicional e ESP32-C3
ESP32 Tradicional
Muitas placas usam um conversor USB-Serial externo, como Silicon Labs CP2102 ou WCH CH340.
ESP32-C3
O chip possui USB nativa, dispensando conversores externos em muitas placas.
Isso reduz custo e tamanho, mas exige configuração correta no ambiente de desenvolvimento.
O Que Faz a Opção “USB CDC On Boot”?
Essa opção define se o ESP32-C3 inicializa já com a interface serial USB habilitada.
Enabled
- Cria automaticamente uma porta COM virtual.
Serial.print()funciona pela USB.- Ideal para depuração.
Disabled
- A interface CDC não é ativada no boot.
Serial.print()pode não aparecer.- Útil apenas em casos específicos.
Por Que o Serial.print() Não Aparece?
Com USB CDC On Boot = Disabled:
- O ESP32-C3 não ativa a interface USB serial.
- O computador não recebe os dados.
- O Monitor Serial permanece em branco.
Ao ativar Enabled, a USB passa a funcionar como porta serial virtual e as mensagens aparecem normalmente.
Configuração Recomendada na Arduino IDE
![]() |
| Configuração necessária no ESP32-C3: habilite USB CDC On Boot na Arduino IDE para que o Monitor Serial exiba corretamente os valores lidos pelo ADC, os comandos dos botões e as informações transmitidas via ESP-NOW. |
Código de Teste
/***********************************************************************
Teste de Serial no ESP32-C3
Autor: RodRobot
************************************************************************/
void setup() {
Serial.begin(115200);
delay(2000); // Aguarda a porta USB ser reconhecida
Serial.println("ESP32-C3 funcionando!");
}
void loop() {
Serial.println("Teste...");
delay(1000);
}
Resultado Esperado no Monitor Serial
ESP32-C3 funcionando!
Teste...
Teste...
Teste...
Por Que Usar delay(2000)?
Após o reset, o sistema operacional pode levar alguns segundos para reconhecer a porta USB.
Sem esse atraso, as primeiras mensagens podem ser perdidas.
Quando Desativar o USB CDC On Boot?
Na maioria dos projetos, deixe Enabled.
Desative apenas quando:
- Você quiser usar outra interface serial.
- Estiver desenvolvendo firmware USB personalizado.
- Precisar liberar recursos específicos do USB.
Solução de Problemas
Nada aparece no Monitor Serial
- Ative USB CDC On Boot: Enabled
- Verifique a velocidade em 115200 baud
- Feche e reabra o Monitor Serial
- Regrave o firmware
Porta COM desaparece
- Reconecte o cabo USB
- Use um cabo de dados (não apenas carregamento)
- Atualize os drivers do sistema
ESP32-C3 vs ESP32 Tradicional
| Recurso | ESP32 Tradicional | ESP32-C3 |
|---|---|---|
| USB nativa | Não (na maioria das placas) | Sim |
| Conversor externo | Geralmente sim | Geralmente não |
| Requer USB CDC On Boot | Não | Sim, para usar Serial pela USB |
Como descobrir o MAC do receptor
/*********************************************************************** * Projeto : Mostrar MAC Address do ESP32 * Função : Exibe o endereço MAC no Monitor Serial * Placa : ESP32 DevKit V1 * Autor : RodRobot ***********************************************************************/ #include <WiFi.h> void setup() { Serial.begin(115200); // Inicia Serial delay(1000); // Aguarda estabilizar WiFi.mode(WIFI_STA); // Modo Station WiFi.disconnect(); // Garante inicialização completa delay(500); // Pequena espera Serial.print("MAC Address: "); Serial.println(WiFi.macAddress()); } void loop() { }
Resultado esperado
MAC Address: 24:6F:28:AA:BB:CCArtigo comleto como descobrir o MAC do receptor.
https://rodrobot.blogspot.com/2026/05/esp-now-com-esp32-c3-e-esp32.html
Configurando a Serial do ESP32-C3 (USB CDC On Boot)
Em algumas placas ESP32-C3, o Monitor Serial não mostra mensagens sem habilitar a opção correta.
Na Arduino IDE:
- Ferramentas -> Selecione a placa ESP32C3 Dev Module.
- Vá em Tools (Ferramentas).
- Encontre USB CDC On Boot.
- Selecione Enabled.
- Compile e grave novamente.
Como funciona o projeto
ESP32-C3 transmissor
O transmissor:
- lê o módulo de 5 botões
- identifica qual botão foi pressionado
- envia o comando usando ESP-NOW
ESP32-C3 receptor
O receptor:
- recebe os dados via ESP-NOW
- mostra no OLED:
- FRENTE
- RE
- DIREITA
- ESQUERDA
- OK
O segredo do módulo de 5 botões
O módulo utiliza um circuito chamado:
Divisor de tensão com resistores
Em vez de usar:
- 5 fios
- 5 GPIOs
ele usa:
- apenas 1 pino analógico (ADC)
Isso é possível graças aos resistores internos do módulo.
Como o divisor de tensão funciona
![]() |
Circuito prático de divisor de tensão para identificar múltiplos comandos (Esquerda, Frente, Ré, Direita e OK) através de um único canal analógico (ADC). |
O circuito utiliza vários resistores em série.
Cada botão conecta um ponto diferente da escada resistiva ao GND, criando uma tensão diferente no pino ADC.
O ESP32-C3 converte essa tensão em um valor digital.
Quanto menor a tensão:
- menor o valor ADC
Quanto maior a tensão:
- maior o valor ADC
Alimentação em 3.3V
Como o ESP32-C3 trabalha em:
- lógica 3.3V
- ADC máximo 3.3V
Todo o circuito deve ser alimentado com 3.3V.
⚠️ Nunca utilize 5V diretamente no ADC do ESP32-C3.
Valores de Leitura
Com os resistores do circuito e alimentação em 3.3V, teremos aproximadamente:
| Botão | Valor ADC |
|---|---|
| ESQUERDA | 0 a 50 |
| FRENTE | 70 a 200 |
| RÉ | 350 a 430 |
| DIREITA | 700 a 740 |
| OK | 1400 a 1600 |
Faixas de Leitura
O ideal é trabalhar com faixas, pois pequenas variações podem acontecer.
Exemplo:
if(valor < 50){
// esquerda
}
else if(valor > 70 && valor < 200){
// frente
}
else if(valor > 350 && valor < 430){
// ré
}
else if(valor > 700 && valor < 740){
// direita
}
else if(valor > 1400 && valor < 1600){
// ok
}
Ligação no ESP32-C3
| Módulo | ESP32-C3 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| ADO | GPIO ADC |
Você pode usar:
- GPIO0
- GPIO1
- GPIO2
- GPIO3
- GPIO4
(desde que tenham ADC)
Como Calibrar
Cada ESP32 pode apresentar pequenas diferenças no ADC.
/***************************************************************
TESTE MÓDULO 5 BOTÕES ANALÓGICOS
PLACA: ESP32-C3 Super Mini
FUNÇÃO:
Identificar os botões usando
faixas de valores ADC
AUTOR: RodRobot
***************************************************************/
#define BUTTON_PIN 0 // Pino ADC dos botões
// ================= SETUP =================
void setup()
{
Serial.begin(115200); // Inicializa Serial
Serial.println();
Serial.println("Teste dos 5 botoes");
}
// ================= LOOP =================
void loop()
{
int valor = analogRead(BUTTON_PIN); // Leitura ADC
Serial.print("ADC: ");
Serial.print(valor);
Serial.print(" -> ");
// ================= ESQUERDA =================
if (valor >= 0 && valor <= 50)
{
Serial.println("ESQUERDA");
}
// ================= FRENTE =================
else if (valor >= 70 && valor <= 200)
{
Serial.println("FRENTE");
}
// ================= RE =================
else if (valor >= 350 && valor <= 430)
{
Serial.println("RE");
}
// ================= DIREITA =================
else if (valor >= 700 && valor <= 740)
{
Serial.println("DIREITA");
}
// ================= OK =================
else if (valor >= 1400 && valor <= 1600)
{
Serial.println("OK");
}
// ================= NENHUM BOTÃO =================
else
{
Serial.println("SEM BOTAO");
}
delay(250);
}
- abra o Serial Monitor
- pressione cada botão
- anote os valores
- ajuste as faixas no código
Vantagens Deste Sistema
✅ Usa apenas 1 pino ADC
✅ Reduz quantidade de fios
✅ Ideal para robôs
✅ Ótimo para menus OLED
✅ Fácil de expandir
Onde Utilizar
Este circuito é perfeito para:
- controle de robôs com ESP-NOW
- menu em display OLED
- joystick simples
- interface de configuração
- controle portátil
- projetos alimentados por bateria
O que é o ADC do ESP32-C3
ESP32-C3 Super Mini possui conversor analógico digital.
O ADC:
- converte tensão em números digitais
- permite ler sensores analógicos
- permite ler divisores de tensão
No projeto usamos:
GPIO0
que no ESP32-C3 corresponde ao:
ADC1_CH0
Como o ESP32-C3 lê os botões
O código usa:
analogRead(BUTTON_PIN);
Essa função:
- mede a tensão do pino
- converte para um valor digital
- retorna um número
Exemplo:
int value = analogRead(BUTTON_PIN);
Depois o programa compara os valores:
if (value >= 70 && value <= 200)
Se estiver nessa faixa:
- o botão FRENTE foi pressionado
Como funciona o ESP-NOW
ESP-NOW é um protocolo da Espressif Systems.
Ele permite:
- comunicação rápida
- baixo consumo
- comunicação direta entre ESP32
Sem:
- roteador
- internet
- servidor
Artigo comleto como funciona o ESP-NOW
https://rodrobot.blogspot.com/2026/05/esp-now-com-esp32-c3-e-esp32.htmlComo o transmissor envia os dados
O código cria uma estrutura:
typedef struct struct_message
{
char command[20];
} struct_message;
Essa estrutura armazena:
- texto do comando
Exemplo:
- FRENTE
- RE
- OK
Envio dos dados
esp_now_send(receiverMAC,
(uint8_t *) &data,
sizeof(data));
O ESP32-C3:
- pega o texto
- transforma em bytes
- envia sem fio para outro ESP32-C3
Código do Transmissor (ESP32-C3)
Como o receptor recebe
O receptor usa um callback:
esp_now_register_recv_cb(onReceive);
Quando chega um pacote:
- a função é executada automaticamente
Mostrando no display OLED
Após receber o comando:
display.println(data.command);
O OLED mostra:
- FRENTE
- RE
- ESQUERDA
- DIREITA
- OK
Código do Receptor (ESP32-C3)
Vantagens desse projeto
Usa apenas 1 ADC para 5 botões
Excelente para economizar GPIOs.
Comunicação sem fio rápida
ESP-NOW é extremamente rápido.
Baixo consumo
Ótimo para projetos com bateria.
Projeto modular
Você pode evoluir para:
- robô com motores N20
- DRV8833
- sensores ultrassônicos
- controle remoto sem fio
- automação
Conclusão
Esse projeto mostra uma combinação muito poderosa do ESP32-C3:
- leitura analógica
- divisor de tensão
- ESP-NOW
- OLED
- comunicação sem fio
Além de ser excelente para aprendizado, ele também serve como base para projetos maiores de robótica e automação com ESP32.
🔧 Acompanhe o RodRobot
Projetos maker com ESP32, Arduino, eletrônica e programação.
RodRobot – Projetos maker, eletrônica e programação na prática.





Comentários
Postar um comentário