/*
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
// Função para converter valores decimais para BCD
uint8_t dec_to_bcd(uint8_t val) {
return ((val / 10 * 16) + (val % 10));
}
// Função para converter valores BCD para decimal
uint8_t bcd_to_dec(uint8_t val) {
return ((val / 16 * 10) + (val % 16));
}
// Configura data e hora no DS1307
void set_time() {
uint8_t data[8];
data[0] = 0x00; // Endereço inicial do registro
data[1] = dec_to_bcd(0); // Segundos
data[2] = dec_to_bcd(27); // Minutos
data[3] = dec_to_bcd(13); // Horas (formato 24h)
data[4] = dec_to_bcd(2); // Dia da semana (1=Domingo, 2=Segunda, ...)
data[5] = dec_to_bcd(24); // Data
data[6] = dec_to_bcd(9); // Mês
data[7] = dec_to_bcd(24); // Ano (2024 -> '24')
i2c_write_blocking(I2C_PORT, DS1307_ADDR, data, 8, false);
}
// Lê a hora atual do DS1307
void read_time() {
uint8_t reg = 0x00;
uint8_t time_data[7];
// Solicita leitura a partir do endereço 0x00
i2c_write_blocking(I2C_PORT, DS1307_ADDR, ®, 1, true);
i2c_read_blocking(I2C_PORT, DS1307_ADDR, time_data, 7, false);
// Converte valores BCD para decimal
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();
// Inicializa a interface I2C
i2c_init(I2C_PORT, 100 * 1000); // Frequência de 100 kHz
gpio_set_function(4, GPIO_FUNC_I2C); // SDA no GPIO4
gpio_set_function(5, GPIO_FUNC_I2C); // SCL no GPIO5
gpio_pull_up(4);
gpio_pull_up(5);
printf("Configurando RTC DS1307...\n");
set_time(); // Configura a hora inicial
while (true) {
read_time(); // Lê e imprime a hora atual
sleep_ms(5000); // Aguarda 5 segundos antes da próxima leitura
}
return 0;
}
Loading
pi-pico-w
pi-pico-w