Arduino RTC LED 时钟
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 15 | ||||
| × | 15 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 190 | ||||
| × | 10 | ||||
| × | 12 | ||||
| × | 4 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
|
关于这个项目
首先您必须下载以下库(链接在本页末尾) 1. Wire.h
2. RTClib.h零件清单
观看视频
这是RTC时钟模块
这是 Arduino 电路
RTC 接线连接
RTC 开关
确定阳极和阴极
电路图(COMMON ANODE)
图> 图>
如果您使用普通阴极 LED,请按以下方式进行更改
图> 图> 图>
电源
图> 图> 图> 图>
代码
- LED 时钟代码
LED 时钟代码Arduino
下载此代码并上传到项目/* 4 digit 7 segment display:http://www.sparkfun.com/products/9483 Datasheet:http://www.sparkfun.com/datasheets/Components/LED/ 7-Segment/YSD-439AR6B-35.pdf */// niq_ro 修改的连接来自 http://nicuflorica.blogspot.com// 数据集:http://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW -563XSA.pdf// BMIAK Basnayaka修改的代码// http://www.setnfix.comint digit1 =11; int digit2 =10; int digit3 =9; int digit4 =6; int digit5 =5; int digit6 =3; //如果需要,从Arduino到ATmega DIP28的引脚映射//http://www.arduino.cc/en/Hacking/PinMappingint segA =0; //显示引脚11int segB =1; //显示引脚7int segC =2; //显示引脚4int segD =4; //显示引脚2int segE =7; //显示引脚1int segF =8; //显示引脚10int segG =12; //显示引脚5int segDP =13; // 显示引脚 3#include#include "RTClib.h"RTC_DS1307 RTC;// 使用通过 I2C 和 Wire lib 连接的 DS1307 RTC 的日期和时间函数// 来自 http://learn.adafruit 的原始 sketck .com/ds1307-real-time-clock-breakout-board-kit/// 从 http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the- 添加 SQW=1Hz 的部分i2c-bus//添加手动调整部分 http://www.bristolwatch.com/arduino/arduino_ds1307.htmbyte SW0 =A0;byte SW1 =A2;byte SW2 =A1;byte SWT =A3;int Adhr=0; int Admnt=0;int D =0;int Z =0;// 用于十六进制转换long zh, uh, ore;long zm, um, miniti;void setup() { //Serial.begin(57600); Wire.begin(); RTC.begin(); // RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));//如果你需要设置时钟...只需从上面的行中删除////用于闪烁LEDWire.beginTransmission(0x68)的部分代码;Wire.write(0x07); // 将指针移动到 SQW 地址 // Wire.write(0x00); // 关闭 SQW 引脚 Wire.write(0x10); // 发送 0x10(十六进制)00010000(二进制)到控制寄存器 - 打开 1Hz 的方波 // Wire.write(0x13); // 发送 0x13(十六进制)00010011(二进制)32kHzWire.endTransmission(); pinMode(segA,输出); pinMode(segB,输出); pinMode(segC,输出); pinMode(segD,输出); pinMode(segE,输出); pinMode(segF,输出); pinMode(segG,输出); pinMode(segDP,输出); pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT); pinMode(digit4, OUTPUT); pinMode(digit5, OUTPUT); pinMode(digit6, OUTPUT);//Serial.begin(9600);pinMode(SW0, INPUT); // 不。按钮开关pinMode(SW1, INPUT); // 不。按钮开关pinMode(SW2, INPUT); // 不。按钮 switchpinMode(SWT, INPUT); // 不。按钮开关数字写入(SW0,高); // 上拉 ondigitalWrite(SW1, HIGH);digitalWrite(SW2, HIGH);digitalWrite(segDP, LOW);}void loop() { DateTime now =RTC.now(); long HR =now.hour()*1000; long timp =(HR*10)+now.minute()*100+now.second(); Adhr =now.hour(); Admnt=now.minute();int DIM =0;if (timp> =250000)timp=timp-240000;//---------------------- --------------------------------//12/24 小时拉屎 //--------- ---------------------------------------------if (timp <130000 ){digitalWrite(segDP, LOW);}if (digitalRead(SWT)==0){delay(300); if (D ==0) { D =1;delay(200);} else{D =0;}}if (D ==0){ if (timp> =130000){timp=timp-120000;digitalWrite( segDP, HIGH);}}if (timp> =130000){ digitalWrite(segDP, LOW);}if ((D==1)&(timp <130000))digitalWrite(segDP, LOW);//--- -------------------------------------------------- - //int timp =(now.minute(), DEC);// displayNumber(12); // 这是要显示的数字 (int i =100; i>0; i--) { if (timp> =100000) displayNumber01(timp);否则 displayNumber02(timp); } for(int i =100; i>0; i--) { if (timp> =100000) displayNumber03(timp);否则 displayNumber04(timp); } for(int i =100; i>0; i--) { if (timp> =100000) displayNumber05(timp);否则 displayNumber06(timp); } if (digitalRead(SW0)==0){delay(100);Z=1;设置时间(); }//按住开关设置时间}void set_time() { byte minutes1 =0;字节小时1 =0;字节分钟 =0;字节小时 =0;小时 =Adhr;分钟=Admnt;如果 ((小时 &0x0f)> 9) 小时 =小时 + 6;如果(小时> 0x24)小时 =1; // 午夜 12.00 将显示为 12:00(PM LED 亮起)或 24:00 //if (hours> 0x24) hours =1; // 午夜 12.00 将显示为 0:00 if ((minutes &0x0f)> 9) minutes =minutes + 6;如果(分钟> 0x59)分钟 =0; while (!(Z==0)){ // 设置时间开关必须松开才能退出 int TST =digitalRead(SW2); while (TST==0) // 设置小时 { hours++; // 将六进制转换为 zecimal:zh =hours / 16;呃 =小时 - 16 * zh;矿石 =10 * zh + 呃; zm =分钟 / 16; um =分钟 - 16 * zm ; miniti =10 * zm + um;如果 ((小时 &0x0f)> 9) 小时 =小时 + 6;如果(小时> 0x24)小时 =1; // 午夜 12.00 将显示为 12:00(PM LED 亮起)或 24:00 //if (hours> 0x24) hours =1; // 午夜 12.00 将显示为 0:00 if (hours <=9) delay(1); for(int i =400; i>0; i--) { displayNumber01(ore*10000+miniti*100); TST =数字读取(SW2); } while (!(digitalRead(SW1))) // 设置分钟 { minutes++; // 将六进制转换为 zecimal:zh =hours / 16;呃 =小时 - 16 * zh;矿石 =10 * zh + 呃; zm =分钟 / 16; um =分钟 - 16 * zm ; miniti =10 * zm + um; for(int i =400; i>0; i--) { displayNumber01(ore*10000+miniti*100); } if ((minutes &0x0f)> 9) 分钟 =分钟 + 6;如果(分钟> 0x59)分钟 =0;如果(分钟>=9)延迟(1); Wire.beginTransmission(0x68); // 激活 DS1307 Wire.write(0); // 从哪里开始 Wire.write(0x00); //秒 Wire.write(minutes); //分钟 Wire.write(0x80 | 小时); //小时(24 小时) Wire.write(0x06); // 01-07 天 Wire.write(0x01); // 日期 0-31 Wire.write(0x05); // 0-12 月 Wire.write(0x09); // 00-99 年 Wire.write(0x10); // Control 0x10 在引脚 7 上产生 1 HZ 方波。 Wire.endTransmission(); // 将六进制转换为 zecimal:zh =hours / 16;呃 =小时 - 16 * zh;矿石 =10 * zh + 呃; zm =分钟 / 16; um =分钟 - 16 * zm ; miniti =10 * zm + um; for(int i =400; i>0; i--) { displayNumber01(ore*10000+miniti*100); }延迟(100); //Serial.print(digitalRead(SW0));if (digitalRead(SW0)==0) Z =0;延迟(300); }//Serial.print(SW2);}void displayNumber01(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //开启一个短时间开关的数字(数字){ case 1:digitalWrite(digit1, DIGIT_ON);休息;情况 2:digitalWrite(digit2, DIGIT_ON); //数字写入(segDP,低);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} void displayNumber02(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //打开一个数字短时间 switch(digit) { case 1:lightNumber(10);休息;情况 2:digitalWrite(digit2, DIGIT_ON); //数字写入(segDP,低);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} void displayNumber03(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //打开一个数字短时间 switch(digit) { case 1:digitalWrite(digit1, DIGIT_ON);休息;情况 2:digitalWrite(digit2, DIGIT_ON);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} void displayNumber04(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //打开一个数字短时间 switch(digit) { case 1:lightNumber(10);休息;情况 2:digitalWrite(digit2, DIGIT_ON);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} void displayNumber05(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //打开一个数字短时间 switch(digit) { case 1:digitalWrite(digit1, DIGIT_ON);休息;情况 2:digitalWrite(digit2, DIGIT_ON);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} void displayNumber06(long toDisplay) {#define DISPLAY_BRIGHTNESS 25#define DIGIT_ON HIGH#define DIGIT_OFF LOW for(int digit =6; digit> 0; digit--) { //打开一个数字短时间内 switch(digit) { case 1://digitalWrite(digit1, DIGIT_ON);休息;情况 2:digitalWrite(digit2, DIGIT_ON);休息;情况 3:digitalWrite(digit3, DIGIT_ON);休息;情况 4:digitalWrite(digit4, DIGIT_ON);休息;案例 5:digitalWrite(digit5, DIGIT_ON);休息;情况 6:digitalWrite(digit6, DIGIT_ON);休息; } lightNumber(toDisplay % 10);显示 /=10;延迟微秒(DISPLAY_BRIGHTNESS); //关闭所有段 lightNumber(10); //关闭所有数字digitalWrite(digit1, DIGIT_OFF);数字写入(digit2,DIGIT_OFF);数字写入(digit3,DIGIT_OFF);数字写入(digit4,DIGIT_OFF);数字写入(digit5,DIGIT_OFF); digitalWrite(digit6, DIGIT_OFF);}} //给定一个数字,打开那些段//如果number ==10,则关闭numbervoid lightNumber(int numberToDisplay) {//Common Anode ********* ****************#define SEGMENT_ON HIGH#define SEGMENT_OFF LOW/* 共阴极 ***************** #define SEGMENT_ON LOW #定义 SEGMENT_OFF HIGH*/ switch (numberToDisplay){ case 0:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_ON);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_OFF);休息;情况 1:digitalWrite(segA, SEGMENT_OFF);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_OFF);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_OFF);数字写入(segG,SEGMENT_OFF);休息;情况 2:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_OFF);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_ON);数字写入(segF,SEGMENT_OFF);数字写入(segG,SEGMENT_ON);休息;情况 3:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_OFF);数字写入(segG,SEGMENT_ON);休息;情况 4:digitalWrite(segA, SEGMENT_OFF);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_OFF);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_ON);休息;情况 5:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_OFF);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_ON);休息;情况 6:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_OFF);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_ON);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_ON);休息;情况 7:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_OFF);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_OFF);数字写入(segG,SEGMENT_OFF);休息;情况 8:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_ON);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_ON);休息;案例 9:digitalWrite(segA, SEGMENT_ON);数字写入(segB,SEGMENT_ON);数字写入(segC,SEGMENT_ON);数字写入(segD,SEGMENT_ON);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_ON);数字写入(segG,SEGMENT_ON);休息; // 所有段都打开 case 10:digitalWrite(segA, SEGMENT_OFF);数字写入(segB,SEGMENT_OFF);数字写入(segC,SEGMENT_OFF);数字写入(segD,SEGMENT_OFF);数字写入(segE,SEGMENT_OFF);数字写入(segF,SEGMENT_OFF);数字写入(segG,SEGMENT_OFF);休息; }// 编码结束,BUDHUSARANAI,祝你好运。 }
示意图
这是SSD带LED的接线制造工艺