#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include <stdio.h>
#define SDAI2C 20
#define SCLI2C 21
#define ADR_DS1307 0x68
//Converter binario para decimal
int bi_dec(uint8_t bi) {
return ((bi >> 4) * 10) + (bi & 0x0F);
}
//Converter decimal para binario
uint8_t dec_bi(int dec) {
return ((dec / 10) << 4) | (dec % 10);
}
//Função para a data e hora
void set_rtc_time() {
uint8_t data[8]; //vetor p segundos, min, horas, dias...
data[0] = 0x00;
data[1] = dec_bi(0);
data[2] = dec_bi(27);
data[3] = dec_bi(13);
data[4] = dec_bi(2);
data[5] = dec_bi(24);
data[6] = dec_bi(9);
data[7] = dec_bi(24);
i2c_write_blocking(i2c0, ADR_DS1307, data, 8, false);
}
// Função para ler tempo
void ler_tempo() {
uint8_t reg = 0x00;
uint8_t buffer[7];
i2c_write_blocking(i2c0, ADR_DS1307, ®, 1, true);
i2c_read_blocking(i2c0, ADR_DS1307, buffer, 7, false);
// Converte de binario para decimal
int seg = bi_dec(buffer[0] & 0x7F);
int min = bi_dec(buffer[1]);
int hora = bi_dec(buffer[2]);
int dia = bi_dec(buffer[4]);
int mes = bi_dec(buffer[5]);
int ano = bi_dec(buffer[6]) + 2000;
printf("Data: %02d/%02d/%04d - Hora: %02d:%02d:%02d\n", dia, mes, ano, hora, min, seg);
}
int main() {
stdio_init_all();
sleep_ms(2000); // Aguarda inicialização do console
// Inicializa o I2C0 (SDA = GPIO 20, SCL = GPIO 21)
i2c_init(i2c0, 100 * 1000);
gpio_set_function(SDAI2C, GPIO_FUNC_I2C);
gpio_set_function(SCLI2C, GPIO_FUNC_I2C);
gpio_pull_up(SDAI2C);
gpio_pull_up(SCLI2C);
set_rtc_time();
while (1) {
ler_tempo();
sleep_ms(5000);
}
}