// Incluindo/Import bibliotecas
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
// Definições do endereço I2C do DS1307 e pinos I2C
#define I2C_PORT i2c0
#define SDA_PIN 4
#define SCL_PIN 5
#define DS1307_ADDRESS 0x68
// Função para converter valores BCD para decimal
uint8_t bcd_to_dec(uint8_t val) {
return (val / 16 * 10) + (val % 16);
}
// Função para converter valores decimais para BCD
uint8_t dec_to_bcd(uint8_t val) {
return (val / 10 * 16) + (val % 10);
}
// Função para configurar a data e a hora no DS1307
void set_rtc_time(i2c_inst_t* i2c, uint8_t sec, uint8_t min, uint8_t hour, uint8_t day, uint8_t date, uint8_t month, uint8_t year) {
uint8_t time_data[] = {
0x00,
dec_to_bcd(sec),
dec_to_bcd(min),
dec_to_bcd(hour),
dec_to_bcd(day),
dec_to_bcd(date),
dec_to_bcd(month),
dec_to_bcd(year)
};
i2c_write_blocking(i2c, DS1307_ADDRESS, time_data, sizeof(time_data), false);
}
// Função para ler a data e a hora do DS1307
void get_rtc_time(i2c_inst_t* i2c, uint8_t* sec, uint8_t* min, uint8_t* hour, uint8_t* day, uint8_t* date, uint8_t* month, uint8_t* year) {
uint8_t reg = 0x00;
uint8_t time_data[7];
if (i2c_write_blocking(i2c, DS1307_ADDRESS, ®, 1, true) != PICO_OK) {
printf("Erro na escrita I2C.\n");
return;
}
if (i2c_read_blocking(i2c, DS1307_ADDRESS, time_data, sizeof(time_data), false) != PICO_OK) {
printf("Erro na leitura I2C.\n");
return;
}
i2c_write_blocking(i2c, DS1307_ADDRESS, ®, 1, true);
i2c_read_blocking(i2c, DS1307_ADDRESS, time_data, sizeof(time_data), false);
*sec = bcd_to_dec(time_data[0]);
*min = bcd_to_dec(time_data[1]);
*hour = bcd_to_dec(time_data[2]);
*day = bcd_to_dec(time_data[3]);
*date = bcd_to_dec(time_data[4]);
*month = bcd_to_dec(time_data[5]);
*year = bcd_to_dec(time_data[6]);
}
int main() {
stdio_init_all();
i2c_init(I2C_PORT, 100 * 1000);
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 o programa...\n");
sleep_ms(1000);
printf("Comunicação I2C inicializada.\n");
sleep_ms(1000);
printf("Pinos I2C configurados.\n");
sleep_ms(1000);
// printf("Configurando data e hora...\n");
sleep_ms(1000);
// Configurar a data e a hora: 24/09/2024 13:27:00
set_rtc_time(I2C_PORT, 0, 27, 13, 2, 24, 9, 24);
while (true) {
uint8_t sec, min, hour, day, date, month, year;
get_rtc_time(I2C_PORT, &sec, &min, &hour, &day, &date, &month, &year);
printf("Valores lidos - sec: %02d, min: %02d, hour: %02d, day: %02d, date: %02d, month: %02d, year: %02d\n", sec, min, hour, day, date, month, year);
printf("Data e hora: %02d/%02d/20%02d %02d:%02d:%02d\n", date, month, year, hour, min, sec);
sleep_ms(5000);
}
return 0;
}