/**
Já para a comunicação 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.
Autor: César Ricardo Ferreira da Silva
Email: [email protected]
Data: 23 de janeiro de 2025
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define SDA_PIN 4
#define SCL_PIN 5
#define enderecoDS1307 0x68
void configuracaoRTC() {
uint8_t data[] = {
0x00, // Endereço inicial (segundos)
0x00, // Segundos (BCD para 00)
0x27, // Minutos (BCD para 27)
0x13, // Horas (BCD para 13, formato 24 horas)
0x02, // Dia da semana (arbitrário, 2: terça-feira)
0x24, // Dia (BCD para 24)
0x09, // Mês (BCD para 09)
0x24 // Ano (BCD para 2024 - só considera os dois últimos dígitos)
};
i2c_write_blocking(i2c0 , enderecoDS1307, data, sizeof(data), false);
printf("RTC configurado para 24/09/2024 - 13:27:00\n");
}
uint8_t converteBCDparaInteiro(uint8_t valor){
return ((valor >> 4) * 10) + (valor & 0x0F);
}
void leituraRTC() {
uint8_t reg = 0x00; // Endereço inicial para leitura
uint8_t data[7]; // Buffer para armazenar os valores lidos
i2c_write_blocking(i2c0 , enderecoDS1307, ®, 1, true);
i2c_read_blocking(i2c0 , enderecoDS1307, data, sizeof(data), false);
// Conversão de BCD para valores inteiros
uint8_t segundos = converteBCDparaInteiro(data[0]);
uint8_t minutos = converteBCDparaInteiro(data[1]);
uint8_t horas = converteBCDparaInteiro(data[2]);
uint8_t dia = converteBCDparaInteiro(data[4]);
uint8_t mes = converteBCDparaInteiro(data[5]);
uint8_t ano = converteBCDparaInteiro(data[6]);
printf("Data: %02d/%02d/20%02d - Hora: %02d:%02d:%02d\n", dia, mes, ano, horas, minutos, segundos);
}
void configuracaoI2C(){
i2c_init(i2c0 , 100000);
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(" I2C-> ok\n");
}
int main() {
stdio_init_all();
configuracaoI2C();
configuracaoRTC();
while (true) {
leituraRTC();
sleep_ms(5000);
}
return 0;
}