//Antonio Sergio Castro de Carvalho Junior
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define I2C_RTC 0x68
// Função de converção de decimal para BCD
unsigned int decimal_to_bcd(unsigned int decimal) {
return ((decimal / 10) << 4) | (decimal % 10);
}
// Função de converção de BCD para decimal
unsigned int bcd_to_decimal(unsigned int bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
int main() {
stdio_init_all();
i2c_init(i2c0, 100 * 1000);
gpio_set_function(4, GPIO_FUNC_I2C);
gpio_set_function(5, GPIO_FUNC_I2C);
gpio_pull_up(4);
gpio_pull_up(5);
uint8_t initial_data_config[8]; // Variável para armazenar as configurações iniciais a serem transmitidas ao RTC
initial_data_config[0] = 0; //controle
initial_data_config[1] = decimal_to_bcd(0); //segundos
initial_data_config[2] = decimal_to_bcd(27); //minutos
initial_data_config[3] = decimal_to_bcd(13); //horas
initial_data_config[4] = 1; //dia da semana
initial_data_config[5] = decimal_to_bcd(24); //dia da data
initial_data_config[6] = decimal_to_bcd(9); //mês da data
initial_data_config[7] = decimal_to_bcd(24); //ano da data
i2c_write_blocking(i2c0, I2C_RTC, initial_data_config, 8, false);
uint8_t data[8]; // Variável para armazenar os dados lidos do RTC
while (true) {
uint8_t ch = 0x00;
i2c_write_blocking(i2c0, I2C_RTC, ch, 1, true);
i2c_read_blocking(i2c0, I2C_RTC, data, 8, false);
// Converção e armazenamento dos dados lidos
int segundo = bcd_to_decimal(data[0]);
int minuto = bcd_to_decimal(data[1]);
int hora = bcd_to_decimal(data[2]);
int dia = bcd_to_decimal(data[4]);
int mes = bcd_to_decimal(data[5]);
int ano = bcd_to_decimal(data[6]);
// Print formatado dos dados desejados
printf("%02d/%02d/20%d - %02d:%02d:%02d\n", dia, mes, ano, hora, minuto, segundo);
//A questao pedia "realizar a leitura do mesmo a cada 5 segundos"
sleep_ms(5000);
}
}