#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, &reg, 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);
    }
}
$abcdeabcde151015202530354045505560fghijfghij
GND5VSDASCLSQWRTCDS1307+