//Aluno: ANTONIO JOSÉ PORTELA DE JESUS SANTOS
//UNIT04 - Cap. 05 a 08 - ATIVIDADE: TAREFA DE ENVIO - Clock e temporizador
/* Tarefa 2 - Questão 4- Já para a comunicaçãoo I2C, iremos utilizar o DS1307, que é
um Real Time Clock – RTC disponível no simulador Wokwi. O endereço I2C do DS1307 é
0x68. Um RTC é um hardware que garante a contagem de tempo na unidade de segundos.
Muitos microcontroladores possuem RTC internos, mas alguns fazem uso de hardware externos.
Para ler os valores, é necessário inicialmente configurar um valor de data e hora
que deve, por exemplo, ser configurado manualmente pelo usuário. Nessa questão você
deverá configurar o RTC para 24/09/2024 – 13:27:00 e em seguida, realizar a leitura
do mesmo a cada 5 segundos, e imprimir na tela do console (Serial USB) o valor lido.
Na tabela a seguir são apresentados os principais endereços do RTC DS1307.
*/
//Declaração das bibliotecas
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
//Definição das variáveis globais, GPIO e constantes
#define I2C_PORT i2c0 // Porta I2C utilizada
#define SDA_PIN 4 // Pino de dados SDA
#define SCL_PIN 5 // Pino de clock SCL
#define DS1307_ADDR 0x68 // Endereço I2C do DS1307
//Definição dos protótipos de funções
void setup(); //Configuração da interface i2c
int bcd_to_dec(uint8_t bcd);
uint8_t dec_to_bcd(int dec);
void rtc_set_datetime(uint8_t sec, uint8_t minutes, uint8_t hr, uint8_t day, uint8_t date, uint8_t month, uint8_t year);
void rtc_read_datetime();
//Função main
void main() {
setup();
rtc_set_datetime(0, 27, 13, 2, 24, 9, 24);
printf("Dados de data e hora inicializados.\n");
while(true){
rtc_read_datetime();
sleep_ms(5000);
}
}
//Funções implementadas
void setup(){
stdio_init_all();
i2c_init(I2C_PORT, 100000); // Velocidade de 100 kHz
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 RTC DS1307...\n");
}
// Função para converter número decimal para formato BCD
int bcd_to_dec(uint8_t bcd) {
return (bcd >> 4) * 10 + (bcd & 0x0F);
}
// Função para converter BCD para número decimal
uint8_t dec_to_bcd(int dec) {
return ((dec / 10) << 4) | (dec % 10);
}
// Configuração inicial do DS1307 com data e hora
void rtc_set_datetime(uint8_t sec, uint8_t minutes, uint8_t hr, uint8_t day, uint8_t date, uint8_t month, uint8_t year) {
uint8_t datetime[8] = {
0x00, // Registro de controle do RTC
dec_to_bcd(sec) & 0x7F, // Segundos (bit MSB 0 ativa o oscilador)
dec_to_bcd(minutes), // Minutos
dec_to_bcd(hr), // Horas
dec_to_bcd(day), // Dia da semana (1 = Domingo, 2 = Segunda, etc.)
dec_to_bcd(date), // Dia do mês
dec_to_bcd(month), // Mês
dec_to_bcd(year) // Ano
};
// Enviar dados para o DS1307
i2c_write_blocking(I2C_PORT, DS1307_ADDR, datetime, sizeof(datetime), false);
}
// Função para ler data e hora do DS1307
void rtc_read_datetime() {
uint8_t reg = 0x00; // Endereço inicial dos registros
uint8_t datetime[7];
// Enviar comando para iniciar leitura
i2c_write_blocking(I2C_PORT, DS1307_ADDR, ®, 1, true);
// Ler os 7 registros do DS1307
i2c_read_blocking(I2C_PORT, DS1307_ADDR, datetime, 7, false);
// Converter BCD para decimal e imprimir no console
printf("Data e Hora: %02d/%02d/20%02d %02d:%02d:%02d\n",
bcd_to_dec(datetime[4]), // Dia
bcd_to_dec(datetime[5]), // Mês
bcd_to_dec(datetime[6]), // Ano
bcd_to_dec(datetime[2]), // Horas
bcd_to_dec(datetime[1]), // Minutos
bcd_to_dec(datetime[0]) // Segundos
);
}