#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/i2c.h"
// Endereço I2C do DS1307
#define DS1307_ADDR 0x68
#define SDA_PIN 20
#define SCL_PIN 21
// Função para converter BCD para decimal
uint8_t bcd_to_dec(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
// Função para configurar o DS1307
void setup_time() {
uint8_t config[2];
config[0] = 0x00; // Endereço do registrador de segundos
config[1] = 0x00; // Configura os segundos para 0 (habilita o RTC)
i2c_write_blocking(i2c0, DS1307_ADDR, config, 2, false);
}
// Função para ler data/hora do DS1307
void read_time(uint8_t *data) {
uint8_t reg = 0x00; // Endereço inicial dos registradores de tempo
i2c_write_blocking(i2c0, DS1307_ADDR, ®, 1, true); // Solicita leitura
i2c_read_blocking(i2c0, DS1307_ADDR, data, 7, false); // Lê os 7 bytes
}
int main() {
// Inicialização
stdio_init_all();
i2c_init(i2c0, 100 * 1000); // Inicializa I2C a 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("Iniciando comunicação com DS1307...\n");
setup_time();
while (true) {
uint8_t datetime[7];
read_time(datetime);
// Conversão dos valores lidos
uint8_t seconds = bcd_to_dec(datetime[0] & 0x7F);
uint8_t minutes = bcd_to_dec(datetime[1]);
uint8_t hours = bcd_to_dec(datetime[2] & 0x3F);
uint8_t week = bcd_to_dec(datetime[3]); // Dia da semana (1=Domingo, 2=Segunda...)
uint8_t day = bcd_to_dec(datetime[4]);
uint8_t month = bcd_to_dec(datetime[5]);
uint8_t year = bcd_to_dec(datetime[6]);
// Exibe os dados em formato tabular
printf("Data = %02d/%02d/20%02d, semana =%2d \n", day, month, year, week);
printf("Teste de saída: Hora = %02d:%02d:%02d \n", hours, minutes, seconds);
//sleep_ms(5000); // Atualiza a cada 5segundo
sleep_ms(1000); // Atualiza a cada 1segundo
}
return 0;
}