利用RTC module和LED七段顯示器做出一個簡單的時鐘, SPI介面可以省去許多arduino的IO pin.
DIY材料:
1.Arduino
2.RTC (DS1307) module
3.SPI LED module(7-segment)
4.Inteface Shield (option)
5.9V battery
Arduino sketch:
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 3;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 9;
byte Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
byte Dot = 0x7f;
boolean DotOn;
/* Set the appropriate digital I/O pin connections */
uint8_t CE_PIN = 5; //RST
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 7;
/* Create buffers */
char buf[50];
char day[10];
/* Create a DS1302 object */
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
void clearAll()
{
for(int i=0; i<8; i++)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
digitalWrite(latchPin, HIGH);
delay(10);
}
}
void displayTime(byte h1, byte h2, byte m1, byte m2, byte s1, byte s2)
{
if (DotOn)
{
digitalWrite(latchPin, LOW);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, s2);
shiftOut(dataPin, clockPin, MSBFIRST, s1);
shiftOut(dataPin, clockPin, MSBFIRST, Dot);
shiftOut(dataPin, clockPin, MSBFIRST, m2);
shiftOut(dataPin, clockPin, MSBFIRST, m1);
shiftOut(dataPin, clockPin, MSBFIRST, Dot);
shiftOut(dataPin, clockPin, MSBFIRST, h2);
shiftOut(dataPin, clockPin, MSBFIRST, h1);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
DotOn = false;
}
else
{
digitalWrite(latchPin, LOW);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, s2);
shiftOut(dataPin, clockPin, MSBFIRST, s1);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
shiftOut(dataPin, clockPin, MSBFIRST, m2);
shiftOut(dataPin, clockPin, MSBFIRST, m1);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
shiftOut(dataPin, clockPin, MSBFIRST, h2);
shiftOut(dataPin, clockPin, MSBFIRST, h1);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
DotOn = true;
}
}
void print_time()
{
/* Get the current time and date from the chip */
Time t = rtc.time();
/* Name the day of the week */
memset(day, 0, sizeof(day)); /* clear day buffer */
int Hour1 = t.hr/10;
int Hour2 = t.hr%10;
int min1 = t.min/10;
int min2 = t.min%10;
int sec1 = t.sec/10;
int sec2 = t.sec%10;
byte h1 = Tab[Hour1];
byte h2 = Tab[Hour2];
byte m1 = Tab[min1];
byte m2 = Tab[min2];
byte s1 = Tab[sec1];
byte s2 = Tab[sec2];
displayTime(h1, h2, m1, m2, s1, s2);
}
void setup()
{
Serial.begin(57600);
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
rtc.write_protect(false);
rtc.halt(false);
/* Make a new time object to set the date and time */
Time t(2012, 7, 11, 21, 16, 37, 3);
/* Set the time and date on the chip */
rtc.time(t);
clearAll();
}
/* Loop and print the time every second */
void loop()
{
print_time();
delay(1000);
}
Video: http://www.youtube.com/watch?v=RAb9WjOctdU
My Blog: http://sinocgtchen.blogspot.com
More videos: http://www.youtube.com/user/sinocgtchen
Motoduino information: http://motoduino.com
My Email: sinocgtchen@gmail.com
DIY材料:
1.Arduino
2.RTC (DS1307) module
3.SPI LED module(7-segment)
4.Inteface Shield (option)
5.9V battery
Arduino sketch:
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 3;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 9;
byte Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
byte Dot = 0x7f;
boolean DotOn;
/* Set the appropriate digital I/O pin connections */
uint8_t CE_PIN = 5; //RST
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 7;
/* Create buffers */
char buf[50];
char day[10];
/* Create a DS1302 object */
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
void clearAll()
{
for(int i=0; i<8; i++)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
digitalWrite(latchPin, HIGH);
delay(10);
}
}
void displayTime(byte h1, byte h2, byte m1, byte m2, byte s1, byte s2)
{
if (DotOn)
{
digitalWrite(latchPin, LOW);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, s2);
shiftOut(dataPin, clockPin, MSBFIRST, s1);
shiftOut(dataPin, clockPin, MSBFIRST, Dot);
shiftOut(dataPin, clockPin, MSBFIRST, m2);
shiftOut(dataPin, clockPin, MSBFIRST, m1);
shiftOut(dataPin, clockPin, MSBFIRST, Dot);
shiftOut(dataPin, clockPin, MSBFIRST, h2);
shiftOut(dataPin, clockPin, MSBFIRST, h1);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
DotOn = false;
}
else
{
digitalWrite(latchPin, LOW);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, s2);
shiftOut(dataPin, clockPin, MSBFIRST, s1);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
shiftOut(dataPin, clockPin, MSBFIRST, m2);
shiftOut(dataPin, clockPin, MSBFIRST, m1);
shiftOut(dataPin, clockPin, MSBFIRST, 0xff);
shiftOut(dataPin, clockPin, MSBFIRST, h2);
shiftOut(dataPin, clockPin, MSBFIRST, h1);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
DotOn = true;
}
}
void print_time()
{
/* Get the current time and date from the chip */
Time t = rtc.time();
/* Name the day of the week */
memset(day, 0, sizeof(day)); /* clear day buffer */
int Hour1 = t.hr/10;
int Hour2 = t.hr%10;
int min1 = t.min/10;
int min2 = t.min%10;
int sec1 = t.sec/10;
int sec2 = t.sec%10;
byte h1 = Tab[Hour1];
byte h2 = Tab[Hour2];
byte m1 = Tab[min1];
byte m2 = Tab[min2];
byte s1 = Tab[sec1];
byte s2 = Tab[sec2];
displayTime(h1, h2, m1, m2, s1, s2);
}
void setup()
{
Serial.begin(57600);
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
rtc.write_protect(false);
rtc.halt(false);
/* Make a new time object to set the date and time */
Time t(2012, 7, 11, 21, 16, 37, 3);
/* Set the time and date on the chip */
rtc.time(t);
clearAll();
}
/* Loop and print the time every second */
void loop()
{
print_time();
delay(1000);
}
Video: http://www.youtube.com/watch?v=RAb9WjOctdU
My Blog: http://sinocgtchen.blogspot.com
More videos: http://www.youtube.com/user/sinocgtchen
Motoduino information: http://motoduino.com
My Email: sinocgtchen@gmail.com