//ALESSANDRA KIMIE HIRO.
//EMBARCATEC IFMA - GRUPO 02
//TAREFA 2
//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.
//Na tabela a seguir são apresentados os principais endereços do RTC DS1307
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define I2C_PORT i2c0
#define DS1307_ADDR 0x68
uint8_t dec_to_bcd(uint8_t val) { return ((val / 10 * 16) + (val % 10)); }
uint8_t bcd_to_dec(uint8_t val) { return ((val / 16 * 10) + (val % 16)); }
void set_time(uint8_t day, uint8_t month, uint8_t year, uint8_t hours, uint8_t minutes, uint8_t seconds) {
uint8_t data[8] = {0x00, dec_to_bcd(seconds), dec_to_bcd(minutes), dec_to_bcd(hours),
dec_to_bcd(2), dec_to_bcd(day), dec_to_bcd(month), dec_to_bcd(year)};
if (i2c_write_blocking(I2C_PORT, DS1307_ADDR, data, 8, false) < 0)
printf("Erro ao configurar RTC!\n");
}
void read_time() {
uint8_t reg = 0x00, time_data[7];
if (i2c_write_blocking(I2C_PORT, DS1307_ADDR, ®, 1, true) < 0 ||
i2c_read_blocking(I2C_PORT, DS1307_ADDR, time_data, 7, false) < 0) {
printf("Erro ao ler RTC!\n");
return;
}
uint8_t seconds = bcd_to_dec(time_data[0]);
uint8_t minutes = bcd_to_dec(time_data[1]);
uint8_t hours = bcd_to_dec(time_data[2]);
uint8_t day = bcd_to_dec(time_data[4]);
uint8_t month = bcd_to_dec(time_data[5]);
uint8_t year = bcd_to_dec(time_data[6]);
printf("Data/Hora: %02d/%02d/20%02d %02d:%02d:%02d\n", day, month, year, hours, minutes, seconds);
}
int main() {
stdio_init_all();
i2c_init(I2C_PORT, 100 * 1000);
gpio_set_function(4, GPIO_FUNC_I2C);
gpio_set_function(5, GPIO_FUNC_I2C);
gpio_pull_up(4);
gpio_pull_up(5);
printf("Configurando RTC DS1307...\n");
set_time(24, 9, 24, 13, 27, 0);
while (true) {
read_time();
sleep_ms(5000);
}
return 0;
}