#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define I2C_PORT i2c0
#define SDA_PIN 16
#define SCL_PIN 17
#define DS1307_ADDRESS 0x68
uint8_t bcd_to_decimal(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0b00001111);
}
uint8_t decimal_to_bcd(uint8_t decimal) {
return ((decimal / 10) << 4) | (decimal % 10);
}
void set_rtc_time(uint8_t second, uint8_t minute, uint8_t hour, uint8_t day, uint8_t month, uint16_t year) {
uint8_t time_array[7];
uint8_t data_to_write[8];
time_array[0] = decimal_to_bcd(second); // Segundos
time_array[1] = decimal_to_bcd(minute); // Minutos
time_array[2] = decimal_to_bcd(hour); // Horas
time_array[3] = decimal_to_bcd(2); // Dia da semana (não utilizado)
time_array[4] = decimal_to_bcd(day); // Dia do mês
time_array[5] = decimal_to_bcd(month); // Mês
time_array[6] = decimal_to_bcd(year - 2000);
data_to_write[0] = 0x00;
for(int i = 0; i < 7 ; i++) {
data_to_write[i+1] = time_array[i];
}
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, data_to_write, 8, false);
}
void read_rtc_time() {
uint8_t time_array[7];
uint8_t start_register = 0x00;
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, &start_register, 1, true);
i2c_read_blocking(I2C_PORT, DS1307_ADDRESS, time_array, 7, false);
uint8_t second = bcd_to_decimal(time_array[0]);
uint8_t minute = bcd_to_decimal(time_array[1]);
uint8_t hour = bcd_to_decimal(time_array[2]);
uint8_t day = bcd_to_decimal(time_array[4]);
uint8_t month = bcd_to_decimal(time_array[5]);
uint16_t year = bcd_to_decimal(time_array[6]) + 2000;
printf("Data/Hora: %02d/%02d/%04d - %02d:%02d:%02d\n", day, month, year, hour, minute, second);
}
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 RTC DS1307\n");
sleep_ms(2000);
set_rtc_time(0, 27, 13, 24, 9, 2024);
printf("RTC configurado para 24/09/2024 - 13:27:00\n");
while (true) {
read_rtc_time();
sleep_ms(5000);
}
}
Loading
pi-pico-w
pi-pico-w