#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/i2c.h"
#define I2C_INTERFACE i2c0 //utilizaemos o i2c0
#define ds1307_SDA 4
#define ds1307_SCL 5
#define ds1307_I2C_ADDR 0x68
void init();
//conversores
uint8_t BCD(uint8_t val);
uint8_t BCD_return(uint8_t val);
void rtc_config(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day_of_week, uint8_t day, uint8_t month, uint8_t year);
void rtc_data(uint8_t *sec, uint8_t *min, uint8_t *hour, uint8_t *day_of_week, uint8_t *day, uint8_t *month, uint8_t *year);
int main() {
stdio_init_all();
init();
rtc_config(0, 27, 13, 2, 24, 9, 24);
uint8_t sec, min, hour, day_of_week, day, month, year;
while (true) {
rtc_data(&sec, &min, &hour, &day_of_week, &day, &month, &year);
printf("Agora sao: %02d-%02d-20%02d [%02d:%02d:%02d]\n", day, month, year, hour, min, sec);
sleep_ms(5000); // Aguardar 5 segundos
}
}
void init() {
i2c_init(I2C_INTERFACE, 100000);
gpio_set_function(ds1307_SDA, GPIO_FUNC_I2C);
gpio_set_function(ds1307_SCL, GPIO_FUNC_I2C);
gpio_pull_up(ds1307_SDA);
gpio_pull_up(ds1307_SCL);
}
uint8_t BCD(uint8_t val) {
return ((val / 10) << 4) | (val % 10);
}
uint8_t BCD_return(uint8_t val) {
return ((val >> 4) * 10) + (val & 0x0F);
}
void rtc_config(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day_of_week, uint8_t day, uint8_t month, uint8_t year) {
uint8_t datetime_data[7] = {
BCD(sec),
BCD(min),
BCD(hour),
BCD(day_of_week),
BCD(day),
BCD(month),
BCD(year)
};
//comeca daqui
uint8_t data_to_write[8] = {0x00};
for (int i = 0; i < 7; i++) {
data_to_write[i + 1] = datetime_data[i];
}
i2c_write_blocking(I2C_INTERFACE, ds1307_I2C_ADDR, data_to_write, 8, false);
}
void rtc_data(uint8_t *sec, uint8_t *min, uint8_t *hour, uint8_t *day_of_week, uint8_t *day, uint8_t *month, uint8_t *year) {
uint8_t start = 0x00;
uint8_t datetime_data[7];
//habilita e busca os dados
i2c_write_blocking(I2C_INTERFACE, ds1307_I2C_ADDR, &start, 1, true);
i2c_read_blocking(I2C_INTERFACE, ds1307_I2C_ADDR, datetime_data, 7, false);
*sec = BCD_return(datetime_data[0]);
*min = BCD_return(datetime_data[1]);
*hour = BCD_return(datetime_data[2]);
*day_of_week = BCD_return(datetime_data[3]);
*day = BCD_return(datetime_data[4]);
*month = BCD_return(datetime_data[5]);
*year = BCD_return(datetime_data[6]);
}