Introdução
Você já conectou um novo sensor ou display I2C ao seu Arduino e se perguntou: “Qual endereço esse dispositivo usa?” Você não está sozinho! O protocolo I2C é uma forma poderosa de se comunicar com vários dispositivos usando apenas dois fios, mas cada dispositivo tem um endereço único — e às vezes esse endereço não é óbvio na folha de dados. É aí que entra um scanner I2C. É um sketch simples que testa todos os endereços possíveis e informa quais respondem.
Neste tutorial, vamos construir um scanner I2C usando um Arduino Uno e um display OLED SSD1306 (que também serve como um dispositivo conhecido no barramento). Vamos executar tudo dentro do simulador no navegador Velxio, então você não precisa de nenhum hardware para acompanhar. Ao final, você entenderá como o barramento I2C funciona, como conectar dispositivos e como escrever código para escaneá-los.
Vamos mergulhar!
Montagem do Circuito

O circuito é refrescantemente simples. Precisamos apenas de dois componentes:
- Arduino Uno – o cérebro da operação.
- Display OLED SSD1306 – um display monocromático de 128x64 pixels que usa I2C para comunicação. Seu endereço padrão é
0x3C.
Detalhes da Conexão
Conecte o OLED ao Arduino usando quatro fios:
| Pino do Arduino | Pino do OLED | Cor do Fio |
|---|---|---|
| A4 (SDA) | DATA | Azul |
| A5 (SCL) | CLK | Laranja |
| GND | GND | Preto |
| 5V | VIN | Vermelho |
- SDA (A4) é a linha de dados. Ela transporta os dados reais entre o mestre (Arduino) e o escravo (OLED).
- SCL (A5) é a linha de clock. Ela sincroniza a transferência de dados.
- GND e 5V fornecem energia ao OLED.
Nota: No Arduino Uno, A4 e A5 são os pinos I2C dedicados. Outras placas podem usar pinos diferentes (ex.: SDA/SCL em um ESP32).
No simulador Velxio, você pode adicionar o OLED pelo seletor de componentes e conectá-lo clicando nos pinos. A barra de ferramentas do canvas ajuda a ampliar e navegar para facilitar as conexões.

Explicação do Código

Agora vamos ver o código. Abra o editor de código no Velxio (você verá o editor Monaco com realce de sintaxe). O sketch é escrito em Arduino C++ e usa a biblioteca Wire embutida.
Incluindo a Biblioteca
#include <Wire.h>
A biblioteca Wire lida com toda a comunicação I2C de baixo nível. Ela já vem incluída com a IDE Arduino, então nenhuma instalação extra é necessária.
Função Setup
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("===========================");
Serial.println(" Scanner do Barramento I2C (TWI)");
Serial.println("===========================");
Serial.println("Escaneando...");
Serial.println();
int dispositivosEncontrados = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte erro = Wire.endTransmission();
if (erro == 0) {
Serial.print(" Dispositivo encontrado em 0x");
if (addr < 16) Serial.print("0");
Serial.print(addr, HEX);
// Identifica endereços conhecidos
switch (addr) {
case 0x27: Serial.print(" (Backpack LCD PCF8574)"); break;
case 0x3C: Serial.print(" (OLED SSD1306)"); break;
case 0x48: Serial.print(" (Sensor de temperatura)"); break;
case 0x50: Serial.print(" (EEPROM)"); break;
case 0x68: Serial.print(" (RTC DS1307)"); break;
case 0x76: Serial.print(" (Sensor BME280)"); break;
case 0x77: Serial.print(" (BMP180/BMP280)"); break;
}
Serial.println();
dispositivosEncontrados++;
}
}
Serial.println();
Serial.print("Escaneamento concluído. ");
Serial.print(dispositivosEncontrados);
Serial.println(" dispositivo(s) encontrado(s).");
if (dispositivosEncontrados == 0) {
Serial.println("Nenhum dispositivo I2C encontrado. Verifique as conexões.");
}
}
Vamos detalhar:
Wire.begin()– Inicializa o Arduino como mestre I2C.Serial.begin(9600)– Inicia a comunicação serial a 9600 baud para vermos os resultados no Monitor Serial.- O loop itera pelos endereços de 1 a 126 (0x01 a 0x7E). O endereço 0 é reservado para chamada geral, e 127 é reservado para fins especiais.
Wire.beginTransmission(addr)– Inicia uma transmissão para o endereço fornecido.Wire.endTransmission()– Finaliza a transmissão e retorna um código de erro. Se o erro for0, significa que o dispositivo reconheceu (ACK) — encontramos um dispositivo!- Imprimindo o endereço – Imprimimos em formato hexadecimal com zero à esquerda para legibilidade.
- Comando switch – Identifica dispositivos comuns por seus endereços conhecidos. Isso é opcional, mas útil.
- Contando dispositivos – Incrementamos
dispositivosEncontradospara cada ACK. - Relatório final – Imprime o número total de dispositivos encontrados.
Função Loop
void loop() {
// Reescaneia a cada 10 segundos
delay(10000);
Serial.println("\nReescaneando...");
setup();
}
A função loop() simplesmente espera 10 segundos e então chama setup() novamente para reescaneamento. Isso é útil se você adicionar ou remover dispositivos enquanto o sistema está em execução.
Conceitos-Chave para Estudantes
O que é I2C?
I2C (Inter-Integrated Circuit), também chamado de TWI (Two-Wire Interface), é um protocolo de comunicação serial síncrona. Ele usa duas linhas bidirecionais de dreno aberto: SDA (dados) e SCL (clock). Cada dispositivo no barramento tem um endereço único de 7 bits (embora existam endereços de 10 bits). O mestre (Arduino) inicia a comunicação e gera o sinal de clock.
Como o Scanner Funciona
O scanner envia uma condição de início seguida pelo byte de endereço (endereço de 7 bits + bit de leitura/escrita). Se um dispositivo com esse endereço existir, ele responde com um ACK (reconhecimento) puxando SDA para baixo durante o nono pulso de clock. Se nenhum dispositivo responder, um NACK (não reconhecimento) é recebido, e endTransmission() retorna um código de erro diferente de zero.
Por que Usar um Scanner?
- Encontrar endereços desconhecidos – Muitos dispositivos I2C têm endereços configuráveis (ex.: soldando pads). Um scanner informa o endereço real.
- Depurar a fiação – Se um dispositivo não está respondendo, o scanner pode confirmar se ele está conectado corretamente.
- Verificar conflitos – Dois dispositivos com o mesmo endereço causarão erros de comunicação. O scanner pode ajudar a identificar duplicatas.
Armadilhas Comuns e Dicas de Depuração
- Fiação errada – Verifique novamente se SDA e SCL estão conectados corretamente. Trocá-los não funcionará.
- Falta de resistores de pull-up – As linhas I2C precisam de resistores de pull-up (tipicamente 4,7kΩ) para VCC. Muitas placas de desenvolvimento os incluem, mas se você estiver montando do zero, não os esqueça.
- Conflitos de endereço – Se dois dispositivos compartilham o mesmo endereço, nenhum funcionará de forma confiável. Use o scanner para detectar conflitos.
- Incompatibilidade de taxa de transmissão – O scanner usa o padrão de 100 kHz (modo padrão). Alguns dispositivos podem precisar de velocidades mais lentas. Você pode alterar com
Wire.setClock(400000)para modo rápido. - Monitor Serial não mostrando saída – Certifique-se de que a taxa de transmissão no Monitor Serial corresponde a
9600.
No Velxio, você pode abrir o Monitor Serial pela barra de ferramentas do editor. Se não vir a saída, verifique se o código compilou com sucesso (procure por erros no console).

Extensões Sugeridas
Depois que o scanner básico estiver funcionando, tente estas melhorias:
- Exibir resultados no OLED – Em vez de imprimir no Serial, mostre a lista de endereços no display SSD1306. Você precisará das bibliotecas
Adafruit_SSD1306eAdafruit_GFX. - Adicionar um botão para acionar o escaneamento – Conecte um botão de pressão a um pino do Arduino e escaneie apenas quando pressionado.
- Escaneie dispositivos específicos – Modifique o código para procurar apenas uma faixa de endereços específica (ex.: 0x20-0x2F para PCF8574).
- Usar um LCD – Substitua o OLED por um LCD I2C 16x2 (endereço 0x27 ou 0x3F).
- Registrar em cartão SD – Se você tiver um módulo de cartão SD, registre os resultados do escaneamento para análise posterior.
Para adicionar bibliotecas no Velxio, use o Gerenciador de Bibliotecas.

Conclusão
Você acabou de construir um scanner I2C universal que funciona com qualquer placa compatível com Arduino. Esta ferramenta é inestimável para depurar e explorar novos módulos I2C. A melhor parte? Você pode executá-lo agora mesmo no seu navegador no Velxio, sem nenhum hardware.
Pronto para testar você mesmo? Abra o exemplo ao vivo e comece a escanear:
👉 Inicie o Scanner I2C no Velxio
Feliz programação!