/*
Unidade 4 - Tarefa 2
Lara Gardenia
Questão 4: 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.
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
// Configurações do I2C e RTC DS1307
#define I2C_PORT i2c0
#define SDA_PIN 4
#define SCL_PIN 5
#define DS1307_ADDRESS 0x68
// Funções auxiliares para BCD
uint8_t dec_to_bcd(uint8_t dec) {
return ((dec / 10) << 4) | (dec % 10);
}
uint8_t bcd_to_dec(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
// Escreve no registro do RTC
void ds1307_write(uint8_t reg, uint8_t value) {
uint8_t buffer[2] = {reg, value};
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 2, false);
}
// Lê do registro do RTC
uint8_t ds1307_read(uint8_t reg) {
uint8_t value;
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, ®, 1, true);
i2c_read_blocking(I2C_PORT, DS1307_ADDRESS, &value, 1, false);
return value;
}
// Configura data e hora no RTC
void set_rtc_time() {
ds1307_write(0x00, dec_to_bcd(0)); // Segundos
ds1307_write(0x01, dec_to_bcd(27)); // Minutos
ds1307_write(0x02, dec_to_bcd(13)); // Horas
ds1307_write(0x04, dec_to_bcd(24)); // Dia
ds1307_write(0x05, dec_to_bcd(9)); // Mês
ds1307_write(0x06, dec_to_bcd(24)); // Ano (2024)
printf("Data e hora configuradas no RTC.\n");
}
// Lê e imprime a data e hora do RTC
void read_rtc_time() {
uint8_t segundos = bcd_to_dec(ds1307_read(0x00));
uint8_t minutos = bcd_to_dec(ds1307_read(0x01));
uint8_t horas = bcd_to_dec(ds1307_read(0x02));
uint8_t dia = bcd_to_dec(ds1307_read(0x04));
uint8_t mes = bcd_to_dec(ds1307_read(0x05));
uint8_t ano = bcd_to_dec(ds1307_read(0x06));
printf("Data e hora: %02d/%02d/20%02d %02d:%02d:%02d\n", dia, mes, ano, horas, minutos, segundos);
}
int main() {
stdio_init_all();
i2c_init(I2C_PORT, 100 * 1000); // Inicializa I2C com frequência 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("Inicializando RTC DS1307...\n");
set_rtc_time();
while (true) {
read_rtc_time();
sleep_ms(5000); // Espera 5 segundos entre as leituras
}
return 0;
}