// Basic RTC clock with LED display using Attiny85
// Work-in-progress!!!
// TODO: Time not running
#include <TinyWireM.h>
// DS1307 related
#define DS1307_ADDR 0x68
byte seconds,minutes,hours;
// Display related
#define latchPin 3 //STCP
#define clockPin 5 //SHCP
#define dataPin 4 //DS
const uint8_t digitToSegment[] = {
// ABCDEFGx encoded 0123456789_--1
0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110111,
0b00000000, 0b00000010, 0b01100010
};
const int dms = 950;
byte d1 = 1;
byte d2 = 2;
byte d3 = 3;
byte d4 = 4;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
digitalWrite(clockPin, LOW);
TinyWireM.begin(); //SDA=PB0, SCL=PB2
delay(100);
}
void loop() {
// release latch
digitalWrite(latchPin, LOW);
// shift out the bits
shiftOut(dataPin, clockPin, LSBFIRST, ~digitToSegment[d4]);
shiftOut(dataPin, clockPin, LSBFIRST, ~digitToSegment[d3]);
shiftOut(dataPin, clockPin, LSBFIRST, ~digitToSegment[d2]);
shiftOut(dataPin, clockPin, LSBFIRST, ~digitToSegment[d1]);
//latch output
digitalWrite(latchPin, HIGH);
// pause before next value:
delay(dms);
//reload time from RTC
getTime();
}
void getTime(){
byte wireRet = 0;
TinyWireM.beginTransmission(DS1307_ADDR); // reset DS1307 register pointer
TinyWireM.write(0);
wireRet = TinyWireM.endTransmission();
if (wireRet) delay(1500);
wireRet = TinyWireM.requestFrom(DS1307_ADDR, 3); // request n bytes from DS1307
if (wireRet) delay(1500);
seconds = bcdToDec(TinyWireM.read()); //read bytes received
minutes = bcdToDec(TinyWireM.read());
hours = bcdToDec(TinyWireM.read());
}
byte bcdToDec(byte val) { // Convert binary coded decimal to normal decimal numbers
return (val>>4) * 10 + (val & 15);
//Each set of 4 bits represents a digit
}
byte decToBcd(byte val) { // Convert to BCD
return (int)(val/10)*16 + val - 10*(int)(val/10);
}
void setTime() {
byte wireRet = 0;
TinyWireM.beginTransmission(DS1307_ADDR);
TinyWireM.write(0); // reset register pointer
TinyWireM.write(decToBcd(seconds)); // write the seconds, with the stop bit clear to restart
TinyWireM.write(decToBcd(minutes));
TinyWireM.write(decToBcd(hours));
wireRet = TinyWireM.endTransmission();
return wireRet;
}