Introdução
Já quis adicionar um relógio de tempo real (RTC) ao seu projeto, mas não tinha o hardware disponível? Com a Velxio, você pode simular uma leitura completa de um RTC I2C usando um Raspberry Pi Pico e um DS1307 virtual — tudo no seu navegador. Neste tutorial, vamos percorrer o circuito, o código e os conceitos principais para que você possa usar a comunicação I2C com confiança em seus próprios projetos.
Visão Geral do Circuito
Vamos começar observando o circuito. Abra o exemplo na Velxio e você verá os seguintes componentes:

O circuito é simples: um Raspberry Pi Pico (nano-rp2040) está conectado a dois LEDs e um RTC DS1307 virtual (não mostrado como um componente separado — o RTC está embutido na simulação). Os LEDs são usados como indicadores visuais para a atividade I2C.
- LED (azul): Conectado ao pino D12 (linha SDA) através de um fio azul. Seu ânodo (A) conecta-se ao D12, e seu cátodo (C) vai para o GND.1 através de um fio preto.
- LED (amarelo): Conectado ao pino D10 (linha SCL) através de um fio laranja. Seu ânodo (A) conecta-se ao D10, e seu cátodo (C) vai para o GND.1 através de um fio preto.
Ambos os LEDs compartilham o mesmo terra (GND.1). O barramento I2C consiste nas linhas SDA (dados) e SCL (clock). O RTC DS1307 está conectado internamente a essas linhas no endereço 0x68. Os LEDs não são estritamente necessários para a comunicação I2C, mas fornecem uma dica visual de que as linhas estão alternando.
Para montar este circuito você mesmo, use o seletor de componentes da Velxio:

Pesquise por “Raspberry Pi Pico” e “LED”, e então conecte-os conforme descrito. A barra de ferramentas da tela ajuda a ampliar e organizar os componentes:

Explicação do Código
Agora vamos mergulhar no código. O sketch utiliza a biblioteca Wire (embutida) para se comunicar com o DS1307 via I2C. Aqui está o código completo:
// Raspberry Pi Pico — I2C DS1307 RTC Read
// Reads time from virtual RTC at address 0x68
#include <Wire.h>
byte bcdToDec(byte val) {
return ((val >> 4) * 10) + (val & 0x0F);
}
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin();
Serial.println("=== Pico I2C RTC Read ===");
Serial.println("Reading DS1307 at 0x68 (system time)");
Serial.println();
}
void loop() {
// Set register pointer to 0
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
// Read 7 bytes: sec, min, hr, dow, date, month, year
Wire.requestFrom(0x68, 7);
if (Wire.available() >= 7) {
byte sec = bcdToDec(Wire.read() & 0x7F);
byte min = bcdToDec(Wire.read());
byte hr = bcdToDec(Wire.read() & 0x3F);
byte dow = bcdToDec(Wire.read());
byte date = bcdToDec(Wire.read());
byte month = bcdToDec(Wire.read());
byte year = bcdToDec(Wire.read());
const char* days[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
Serial.print("Time: ");
if (hr < 10) Serial.print('0'); Serial.print(hr); Serial.print(':');
if (min < 10) Serial.print('0'); Serial.print(min); Serial.print(':');
if (sec < 10) Serial.print('0'); Serial.print(sec);
Serial.print(" Date: ");
Serial.print(days[dow]); Serial.print(' ');
if (date < 10) Serial.print('0'); Serial.print(date); Serial.print('/');
if (month < 10) Serial.print('0'); Serial.print(month); Serial.print('/');
Serial.print("20"); if (year < 10) Serial.print('0'); Serial.println(year);
} else {
Serial.println("RTC not responding!");
}
delay(1000);
}
Como Funciona
-
Configuração: Iniciamos a comunicação serial a 115200 baud e inicializamos o barramento I2C com
Wire.begin(). O DS1307 está no endereço 0x68. -
Loop: A cada segundo, nós:
- Enviamos um
beginTransmissionpara o endereço 0x68, escrevemos 0x00 (o ponteiro de registrador para o registrador de segundos) eendTransmission. - Solicitamos 7 bytes do RTC usando
Wire.requestFrom(0x68, 7). - Lemos cada byte e convertemos de BCD (Decimal Codificado em Binário) para decimal usando a função auxiliar
bcdToDec. - Formatamos e imprimimos a hora e a data no Monitor Serial.
- Enviamos um
-
Conversão BCD: O DS1307 armazena valores de tempo no formato BCD. Por exemplo, o byte
0x45representa 45 em BCD (4*10 + 5 = 45). A funçãobcdToDecextrai o dígito das dezenas (nibble alto) e o dígito das unidades (nibble baixo) e os combina. -
Mascaramento: Aplicamos máscaras a certos registradores:
- Segundos:
& 0x7Flimpa o bit CH (parada do clock). - Horas:
& 0x3Flimpa o bit de modo 12/24 horas (assumindo modo 24 horas).
- Segundos:
Conceitos Principais
- Protocolo I2C: Um barramento serial de dois fios (SDA, SCL) para comunicação entre microcontroladores e periféricos. Cada dispositivo tem um endereço único.
- Biblioteca Wire: A biblioteca I2C embutida do Arduino. Use
Wire.begin()para entrar no barramento,Wire.beginTransmission(addr)para começar a falar com um dispositivo,Wire.write()para enviar dados,Wire.endTransmission()para finalizar, eWire.requestFrom(addr, count)para ler bytes. - Formato BCD: Muitos RTCs usam BCD para simplificar a exibição. Você deve converter para decimal para uma saída legível por humanos.
- Mapeamento de Registradores: O DS1307 tem um mapa de registradores específico: segundos (0x00), minutos (0x01), horas (0x02), dia da semana (0x03), data (0x04), mês (0x05), ano (0x06).
Problemas Comuns e Dicas de Depuração
- Endereço I2C Errado: Verifique novamente o endereço do dispositivo. O DS1307 é tipicamente 0x68 (7 bits). Se você receber “RTC not responding!”, verifique o endereço.
- Resistores de Pull-up Ausentes: Em hardware real, as linhas I2C precisam de resistores de pull-up. Na Velxio, eles são simulados internamente, então você não precisa adicioná-los.
- Incompatibilidade de Baud Rate: Certifique-se de que a taxa de baud do Monitor Serial corresponde a 115200.
- Ponteiro de Registrador Não Definido: Sempre defina o ponteiro de registrador antes de ler. O código escreve 0x00 para apontar para o registrador de segundos.
- Erros de Mascaramento: Esquecer de mascarar o bit CH (segundos) ou o bit de modo 12/24 horas (horas) pode fornecer valores incorretos.
Extensões Sugeridas
- Ajustar a Hora: Adicione código para escrever a hora atual no RTC. Use
Wire.write()para definir cada registrador. - Função de Alarme: Implemente um alarme que acione um LED quando uma determinada hora for atingida.
- Exibir em LCD: Use um LCD I2C para mostrar a hora em vez do Monitor Serial.
- Múltiplos RTCs: Tente ler de dois dispositivos I2C diferentes no mesmo barramento.
Experimente Você Mesmo!
Pronto para experimentar? Abra o exemplo ao vivo na Velxio e execute a simulação. Você verá a hora impressa no Monitor Serial a cada segundo. Modifique o código para alterar o intervalo de atualização ou adicionar novos recursos.
Inicie o Exemplo de Leitura do RTC I2C Pico
Feliz simulação!