Introdução
Já quis adicionar um relógio de tempo real ao seu projeto Arduino mas não tinha o hardware disponível? Com o Velxio, você pode simular um RTC I2C (DS1307) diretamente no seu navegador. Neste tutorial, vamos construir um leitor I2C simples que obtém a hora e data atuais de um DS1307 virtual e as exibe no Monitor Serial. Nenhuma biblioteca externa é necessária — apenas a biblioteca Wire integrada.

Visão Geral do Circuito
Este exemplo é notavelmente simples porque o DS1307 já está integrado na placa Arduino Uno virtual. Não há componentes externos ou fios para adicionar. O barramento I2C (SDA no A4, SCL no A5) está conectado internamente ao DS1307 no endereço 0x68. O único componente é o próprio Arduino Uno.

Para começar, abra o editor do Velxio e selecione um Arduino Uno no seletor de componentes. O DS1307 está integrado ao ambiente de simulação, então você não precisa adicioná-lo separadamente. O circuito já está pronto para uso.
Explicação do Código
Vamos detalhar o código passo a passo.
Inclusão e Definição
#include <Wire.h>
#define DS1307_ADDR 0x68
Incluímos a biblioteca Wire para comunicação I2C e definimos o endereço I2C do DS1307 como 0x68.
Conversão de BCD para Decimal
byte bcdToDec(byte val) {
return ((val >> 4) * 10) + (val & 0x0F);
}
O DS1307 armazena valores de hora no formato Decimal Codificado em Binário (BCD). Esta função auxiliar converte um byte BCD para um número decimal comum.
Configuração
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("===========================");
Serial.println(" Leitor RTC DS1307 (I2C)");
Serial.println("===========================");
Serial.println();
}
Inicializamos o barramento I2C e a comunicação Serial a 9600 baud. Em seguida, imprimimos um cabeçalho.
Loop
void loop() {
// Define o ponteiro do registrador para 0 (segundos)
Wire.beginTransmission(DS1307_ADDR);
Wire.write(0x00);
Wire.endTransmission();
// Solicita 7 bytes: seg, min, hr, dds, data, mes, ano
Wire.requestFrom(DS1307_ADDR, 7);
if (Wire.available() >= 7) {
byte seg = bcdToDec(Wire.read() & 0x7F);
byte min = bcdToDec(Wire.read());
byte hr = bcdToDec(Wire.read() & 0x3F);
byte dds = bcdToDec(Wire.read());
byte data = bcdToDec(Wire.read());
byte mes = bcdToDec(Wire.read());
byte ano = bcdToDec(Wire.read());
// Imprime a hora formatada
Serial.print("Hora: ");
if (hr < 10) Serial.print("0");
Serial.print(hr);
Serial.print(":");
if (min < 10) Serial.print("0");
Serial.print(min);
Serial.print(":");
if (seg < 10) Serial.print("0");
Serial.print(seg);
Serial.print(" Data: ");
if (data < 10) Serial.print("0");
Serial.print(data);
Serial.print("/");
if (mes < 10) Serial.print("0");
Serial.print(mes);
Serial.print("/20");
if (ano < 10) Serial.print("0");
Serial.println(ano);
} else {
Serial.println("Erro: Nao foi possivel ler o RTC");
}
delay(1000);
}
No loop, primeiro definimos o ponteiro de registrador do DS1307 para 0 (registrador de segundos) enviando um único byte 0x00. Em seguida, solicitamos 7 bytes do RTC. O DS1307 retorna segundos, minutos, horas, dia-da-semana, data, mês e ano em BCD. Mascaramos o bit superior dos segundos (bit 7 é a flag de parada do relógio) e os dois bits superiores das horas (bits 6-7 são modo/AM-PM). Após a conversão, imprimimos a hora e a data com zeros à esquerda. Se menos de 7 bytes estiverem disponíveis, imprimimos um erro. Por fim, aguardamos 1 segundo.
Conceitos Principais
- Comunicação I2C: A biblioteca Wire gerencia o protocolo I2C.
beginTransmission()inicia uma escrita,write()enfileira dados,endTransmission()envia.requestFrom()lê bytes de um escravo. - Formato BCD: O DS1307 armazena a hora em BCD, onde cada nibble representa um dígito decimal. A função
bcdToDec()converte isso. - Endereçamento de Registradores: Os registradores internos do DS1307 são acessados primeiro escrevendo o endereço do registrador, depois lendo ou escrevendo dados.
- Mascaramento de Bits: O bit superior do registrador de segundos (CH) indica parada do relógio; mascaramos com
& 0x7F. Os bits superiores do registrador de horas indicam modo 12/24 horas; mascaramos com& 0x3F.
Problemas Comuns e Dicas de Depuração
- Endereço I2C Errado: Certifique-se de que o endereço é 0x68 (7 bits). Se usar um endereço de 8 bits, desloque 1 bit para a esquerda.
- Resistores de Pull-up Ausentes: Em hardware real, as linhas I2C precisam de pull-ups. No Velxio, eles são simulados internamente.
- Monitor Serial Não Aparece: Verifique se a taxa de transmissão corresponde (9600). Clique no ícone do Monitor Serial na barra de ferramentas do editor.

- Erros de Compilação: Verifique se você incluiu
Wire.h. O código não usa bibliotecas externas. - RTC Não Responde: Se você vir “Erro: Nao foi possivel ler o RTC”, a comunicação I2C pode ter falhado. Verifique o endereço e a fiação.
Extensões Sugeridas
- Ajustar a Hora: Adicione código para definir a hora do DS1307 via entrada Serial.
- Exibir em LCD: Use um LCD I2C para mostrar a hora.
- Função de Alarme: Implemente um alarme usando os registradores de alarme do DS1307.
- Registro de Dados: Registre timestamps na EEPROM ou em um cartão SD.
Experimente Você Mesmo
Pronto para ver em ação? Abra o exemplo ao vivo no Velxio e clique no botão Executar. Você verá a hora atualizando a cada segundo no Monitor Serial.
Inicie o Leitor RTC I2C no Velxio

Boas simulações!