Voltar

Leia um RTC DS1307 Virtual com I2C no Raspberry Pi Pico

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:

Diagrama do circuito pico-i2c-rtc-read na tela do simulador Velxio

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.

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:

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

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:

Barra de ferramentas da tela da Velxio acima da viewport de simulação

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

  1. 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.

  2. Loop: A cada segundo, nós:

    • Enviamos um beginTransmission para o endereço 0x68, escrevemos 0x00 (o ponteiro de registrador para o registrador de segundos) e endTransmission.
    • 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.
  3. Conversão BCD: O DS1307 armazena valores de tempo no formato BCD. Por exemplo, o byte 0x45 representa 45 em BCD (4*10 + 5 = 45). A função bcdToDec extrai o dígito das dezenas (nibble alto) e o dígito das unidades (nibble baixo) e os combina.

  4. Mascaramento: Aplicamos máscaras a certos registradores:

    • Segundos: & 0x7F limpa o bit CH (parada do clock).
    • Horas: & 0x3F limpa o bit de modo 12/24 horas (assumindo modo 24 horas).

Conceitos Principais

Problemas Comuns e Dicas de Depuração

Extensões Sugeridas

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!


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 Pico: Simule Memória Não Volátil no Seu Navegador
Próximo artigo
Scanner I2C Pico: Encontre Dispositivos no Barramento