// #include "RTClib.h"
#define DS1307_ADDR 0x68 // I2C address of DS1307 RTC
// DS1307 register addresses
#define DS1307_SECONDS 0x00
#define DS1307_MINUTES 0x01
#define DS1307_HOURS 0x02
#define DS1307_DAY 0x03
#define DS1307_DATE 0x04
#define DS1307_MONTH 0x05
#define DS1307_YEAR 0x06
#define DS1307_CONTROL 0x07
void setup () {
Serial.begin(9600);
i2c_init();
// Set date and time (hours, minutes, seconds)
ds1307_set_time(11, 49, 0);
}
void loop () {
uint8_t hours, minutes, seconds;
// Get current time (hours, minutes, seconds)
ds1307_get_time(&hours, &minutes, &seconds);
Serial.print(hours);
Serial.print(" : ");
Serial.print(minutes);
Serial.print(" : ");
Serial.println(seconds);
delay(1000);
}
// I2C Initialization
void i2c_init() {
// Set prescaler to 1 (TWPS0 = 0, TWPS1 = 0)
TWSR &= ~(1 << TWPS0);
TWSR &= ~(1 << TWPS1);
// Set SCL frequency to desired value (e.g., 100 kHz)
TWBR = ((F_CPU / 100000UL) - 16) / 2;
// Enable TWI module
TWCR |= (1 << TWEN);
}
// I2C Start Condition
void i2c_start() {
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Start condition
while (!(TWCR & (1 << TWINT))); // Wait for start condition to be transmitted
}
// I2C Stop Condition
void i2c_stop() {
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stop condition
while (TWCR & (1 << TWSTO)); // Wait for stop condition to complete
}
// I2C Send Data
void i2c_send(uint8_t data) {
TWDR = data; // Load data into TWI data register
TWCR = (1 << TWINT) | (1 << TWEN); // Start transmission
while (!(TWCR & (1 << TWINT))); // Wait for transmission to complete
}
// I2C Receive Data with ACK
uint8_t i2c_receive_ack() {
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); // Enable ACK and start reception
while (!(TWCR & (1 << TWINT))); // Wait for data reception to complete
return TWDR; // Return received data
}
// I2C Receive Data with NACK
uint8_t i2c_receive_nack() {
TWCR = (1 << TWINT) | (1 << TWEN); // Don't send ACK, start reception
while (!(TWCR & (1 << TWINT))); // Wait for data reception to complete
return TWDR; // Return received data
}
// Function to read a register from DS1307 RTC
uint8_t ds1307_read(uint8_t reg) {
uint8_t data;
// Start condition
i2c_start();
// Send device address + write bit
i2c_send(DS1307_ADDR << 1);
// Send register address
i2c_send(reg);
// Restart condition
i2c_start();
// Send device address + read bit
i2c_send((DS1307_ADDR << 1) | 1);
// Receive data
data = i2c_receive_nack();
// Stop condition
i2c_stop();
return data;
}
// Function to write to a register in DS1307 RTC
void ds1307_write(uint8_t reg, uint8_t data) {
// Start condition
i2c_start();
// Send device address + write bit
i2c_send(DS1307_ADDR << 1);
// Send register address
i2c_send(reg);
// Send data
i2c_send(data);
// Stop condition
i2c_stop();
}
// Function to read current time from DS1307 RTC
void ds1307_get_time(uint8_t *hours, uint8_t *minutes, uint8_t *seconds) {
*seconds = ds1307_read(DS1307_SECONDS);
*minutes = ds1307_read(DS1307_MINUTES);
*hours = ds1307_read(DS1307_HOURS);
}
// Function to set current time in DS1307 RTC
void ds1307_set_time(uint8_t hours, uint8_t minutes, uint8_t seconds) {
ds1307_write(DS1307_SECONDS, seconds);
ds1307_write(DS1307_MINUTES, minutes);
ds1307_write(DS1307_HOURS, hours);
}