/* Embarcatech: 21-01-2025
* Autor: Marcio Barbosa
* 4 - Microcontroladores - Tarefa 1 - Firmware Embarcado
* exerc_4. 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.
*
* Para realizar este experimento, foi necessário os seguintes componentes:
* 1 x Raspberry Pi Pico W ,
* 1 x DS1307
https://www.makerhero.com/blog/usando-i2c-na-raspberry-pi-pico/?srsltid=AfmBOoqxdb-KaSpiX5eAQ0oUOJYUM54EefmxVPxECM30bgMoQgB2U_ca
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/i2c.h"
// Endereço I2C do DS1307
#define DS1307_ADDR 0x68
#define SDA_PIN 20
#define SCL_PIN 21
// Função para converter decimal para BCD
uint8_t dec_to_bcd(uint8_t dec) {
return ((dec / 10) << 4) | (dec % 10);
}
// Função para converter BCD para decimal
uint8_t bcd_to_dec(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
// Função para configurar data/hora inicial no DS1307
void config_rtc_time() {
uint8_t datetime[8] = {
0x00, // inicio do registro
dec_to_bcd(00) & 0x7F, // Segundo = 00
dec_to_bcd(27), // Minuto = 27
dec_to_bcd(13), // Hora = 13
dec_to_bcd(2), // Dia da semana (1=Domingo, 2=Segunda...)
dec_to_bcd(24), // Dia = 24
dec_to_bcd(9), // Mês = 09 (Setembro)
dec_to_bcd(24) // Ano = 2024
};
//registra o rtc
i2c_write_blocking(i2c0, DS1307_ADDR, datetime, 8, false);
}
// Função para ler data/hora do DS1307
void read_time(uint8_t *data) {
uint8_t reg = 0x00; // Endereço inicial dos registradores de tempo em posicao 0x00
i2c_write_blocking(i2c0, DS1307_ADDR, ®, 1, true); // Solicita leitura
i2c_read_blocking(i2c0, DS1307_ADDR, data, 7, false); // Lê os 7 bytes
}
int main() {
// Inicialização do sistema
stdio_init_all();
i2c_init(i2c0, 100 * 1000); // Inicializa I2C a 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("Configurando data e hora...\n");
config_rtc_time(); // Define a data/hora fixa
while (true) {
uint8_t datetime[7];
read_time(datetime);
// Conversão dos valores lidos, retorna do vetor
uint8_t seconds = bcd_to_dec(datetime[0] & 0x7F);
uint8_t minutes = bcd_to_dec(datetime[1]);
uint8_t hours = bcd_to_dec(datetime[2] & 0x3F);
uint8_t day = bcd_to_dec(datetime[4]);
uint8_t month = bcd_to_dec(datetime[5]);
uint8_t year = bcd_to_dec(datetime[6]);
// Exibir os dados no formato tabular
printf("Data = %02d/%02d/20%02d \n", day, month, year);
printf("Teste de saída: Hora = %02d:%02d:%02d \n", hours, minutes, seconds);
sleep_ms(5000); // Atualiza a cada 5 segundos
//sleep_ms(1000); // Atualiza a cada 1 segundos
}
return 0;
}