#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/time.h"
#include "hardware/i2c.h"
// Definições dos pinos e do endereço do dispositivo I2C
#define I2C_PORT i2c0
#define SDA_PIN 20
#define SCL_PIN 21
#define DS1307_ADDRESS 0x68
// Definições de data e hora para inicialização do RTC
/*#define dia 24
#define mes 9
#define ano 24
#define hora 13
#define minutos 27
#define segundos 0*/
int main() {
// Inicializa a comunicação serial para permitir o uso de printf
stdio_init_all();
// Inicializa a interface I2C com uma taxa de 100 kHz
i2c_init(I2C_PORT, 100 * 1000);
// Configura os pinos GPIO para a função I2C
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
// Habilita os resistores de pull-up nos pinos I2C
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
// Buffer para armazenar os dados a serem enviados ao RTC
uint8_t buffer[8];
buffer[0] = 0x00; // Endereço de início no RTC
buffer[1] = ((0 / 10) << 4) | (0 % 10);//dec_to_bcd(segundos);
buffer[2] = ((27 / 10) << 4) | (27 % 10);//dec_to_bcd(minutos);
buffer[3] = ((13 / 10) << 4) | (13 % 10);//dec_to_bcd(hora);
buffer[5] = ((24 / 10) << 4) | (24 % 10);//dec_to_bcd(dia);
buffer[6] = ((9 / 10) << 4) | (9 % 10);//dec_to_bcd(mes);
buffer[7] = ((24 / 10) << 4) | (24 % 10);//dec_to_bcd(ano);
// Configurar a data e hora do RTC
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 8, false);
while (true) {
buffer[0] = 0x00; // Endereço de início no RTC
// Envia o endereço de início para o RTC
i2c_write_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 1, true);
// Lê 7 bytes de dados do RTC
i2c_read_blocking(I2C_PORT, DS1307_ADDRESS, buffer, 7, false);
// Converte os valores de BCD para decimal
uint8_t seconds = (buffer[0] >> 4) * 10 + (buffer[0] & 0x0F);//bcd_to_dec(buffer[0] & 0x7F);
uint8_t minutes = (buffer[1] >> 4) * 10 + (buffer[1] & 0x0F);//bcd_to_dec(buffer[1]);
uint8_t hours = (buffer[2] >> 4) * 10 + (buffer[2] & 0x0F);//bcd_to_dec(buffer[2] & 0x3F);
uint8_t day = (buffer[4] >> 4) * 10 + (buffer[4] & 0x0F);//bcd_to_dec(buffer[4]);
uint8_t month = (buffer[5] >> 4) * 10 + (buffer[5] & 0x0F);//bcd_to_dec(buffer[5]);
uint8_t year = (buffer[6] >> 4) * 10 + (buffer[6] & 0x0F);//bcd_to_dec(buffer[6]);
// Imprime a data e hora no formato DD/MM/YY - HH:MM:SS
printf("Leitura de tempo: %02u/%02u/%02u - %02u:%02u:%02u\n", year, month, day, hours, minutes, seconds);
sleep_ms(5000);
}
return 0;
}Loading
pi-pico-w
pi-pico-w