Voltar

Relógio RTC I2C com DS1307 no Velxio

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.

Diagrama do circuito i2c-rtc-read no canvas do simulador Velxio

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.

Modal do seletor de componentes do Velxio navegando por peças por categoria

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

Problemas Comuns e Dicas de Depuração

Barra de ferramentas do editor Velxio com controles de compilar e executar

Extensões Sugeridas

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

Barra de ferramentas do canvas do Velxio acima da janela de simulação

Boas simulações!


Compartilhar em:
David Montero

Escrito por

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Artigos relacionados


Artigo anterior
Leitura/Gravação de EEPROM I2C com Arduino: Um Guia Completo
Próximo artigo
Scanner I2C com Arduino: Encontre Todos os Dispositivos no Barramento