#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include <stdio.h>
// Configurações da I2C
#define I2C_PORT i2c0
#define SDA_PIN 4 // GPIO para SDA
#define SCL_PIN 5 // GPIO para SCL
#define DS1307_ADDRESS 0x68 // Endereço I2C do DS1307
// Função para converter um número decimal para BCD
uint8_t decimal_to_bcd(int val) {
return ((val / 10) << 4) | (val % 10);
}
// Função para converter um número BCD para decimal
int bcd_to_decimal(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
// Função para configurar o DS1307 com uma data/hora inicial
void ds1307_set_time(int year, int month, int day, int hour, int minute, int second) {
uint8_t buffer[8];
buffer[0] = 0x00; // Endereço inicial do RTC
buffer[1] = decimal_to_bcd(second); // Segundos
buffer[2] = decimal_to_bcd(minute); // Minutos
buffer[3] = decimal_to_bcd(hour); // Horas
buffer[4] = 0x01; // Dia da semana (1 = Segunda)
buffer[5] = decimal_to_bcd(day); // Dia
buffer[6] = decimal_to_bcd(month); // Mês
buffer[7] = decimal_to_bcd(year - 2000); // Ano (apenas os últimos dois dígitos)
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 8, false);
}
// Função para ler a data/hora atual do DS1307
void ds1307_get_time() {
uint8_t buffer[7];
uint8_t reg = 0x00; // Endereço inicial do RTC
// Envia o registro inicial para leitura
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, ®, 1, true);
// Lê 7 bytes da data/hora
i2c_read_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 7, false);
// Converte os valores BCD para decimal
int second = bcd_to_decimal(buffer[0]);
int minute = bcd_to_decimal(buffer[1]);
int hour = bcd_to_decimal(buffer[2]);
int day = bcd_to_decimal(buffer[4]);
int month = bcd_to_decimal(buffer[5]);
int year = bcd_to_decimal(buffer[6]) + 2000;
// Imprime a data/hora no console
printf("Data: %02d/%02d/%04d - Hora: %02d:%02d:%02d\n",
day, month, year, hour, minute, second);
}
int main() {
// Inicializa a UART padrão para o console
stdio_init_all();
// Inicializa a I2C
i2c_init(I2C_PORT, 100 * 1000); // Frequência de 100 kHz
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
printf("Inicializando o RTC DS1307...\n");
// Configura o RTC com a data/hora inicial
ds1307_set_time(2024, 9, 24, 13, 27, 0);
// Loop principal para leitura periódica
while (true) {
ds1307_get_time(); // Lê e imprime a data/hora
sleep_ms(5000); // Aguarda 5 segundos
}
return 0;
}