singz
发表于 2017-10-12 09:37:31
galaxy 发表于 2017-10-11 13:13
0022的 IDE 組譯不過,
1.0 的 IDE 組譯ok
謝謝您,辛苦了~~讚
:):):):):):):):)
off-ice
发表于 2017-12-5 18:39:08
论坛里有朋友写了一个电波钟的解码程序。http://www.geek-workshop.com/thread-7797-1-1.html
可以加入电波校时,这样就可以减少外部的按键或者只添加一个手动校时按键。
off-ice
发表于 2017-12-5 20:00:43
suoma 发表于 2017-3-9 13:44
800行啊,我觉得这些功能实现100行就行了
你使用DS1302制作的时钟完成了吗?能写个详细的帖子吗?小白向你学习一下。谢谢了。
singz
发表于 2017-12-11 09:17:58
off-ice 发表于 2017-12-5 18:39
论坛里有朋友写了一个电波钟的解码程序。http://www.geek-workshop.com/thread-7797-1-1.html
可以加入电 ...
电波的那个挺厉害,这还有个网络校时的:
http://blog.csdn.net/wiznet2012/article/details/38274587
off-ice
发表于 2017-12-11 18:41:42
singz 发表于 2017-12-11 09:17
电波的那个挺厉害,这还有个网络校时的:
http://blog.csdn.net/wiznet2012/article/details/38274587
想自己做个时钟,手边有DS1302和1602显示屏。看到电波功能就心动了。但是本人是个小白,不知道从何入手。
singz
发表于 2017-12-12 11:11:41
off-ice 发表于 2017-12-11 18:41
想自己做个时钟,手边有DS1302和1602显示屏。看到电波功能就心动了。但是本人是个小白,不知道从何入手。
可以先搭个串口手动校时的普通钟,再学习网络自动校时钟,条件合适的话可以试试电波钟
off-ice
发表于 2017-12-12 18:23:06
singz 发表于 2017-12-12 11:11
可以先搭个串口手动校时的普通钟,再学习网络自动校时钟,条件合适的话可以试试电波钟
好的,慢慢学。有什么问题还要请教你
taoqi803
发表于 2018-3-26 19:02:33
大神第一个闹钟有用 连的led 可以亮
我尝试增加第二闹钟但是第二个闹钟貌似没用 LCD 可以显示 也可以设置但是第二个闹钟 LED 没反应#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal.h>
DS3231 Clock;
bool h12, PM, Century=false;
byte year, month, date, DoW, hour, minute, second;
bool A1Dy, A1h12, A1pm, A2Dy, A2h12, A2pm;
byte A1Day, A1Hour, A1Minute, A1Second, ABits, A2Day, A2Hour, A2Minute, A2Second;
const byte Set=2;
const byte New=3;
byte button = {Set, New};
LiquidCrystal lcd(A0, A1, A2, A3, 7, 8);
void setup()
{
Wire.begin();
lcd.begin(16, 2);
pinMode(Set,INPUT);// button for set
pinMode(New,INPUT);
pinMode(4,OUTPUT); // output
}
void loop()
{
unsigned long Rt=millis()%1000;
if(Rt<500)//0.5s
{
Pritime();
}
SetTime();
Alarm1();
Alarm2();
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Time display ~~~~~~~~~~~~~~~~~~~~~~~ */
void Pritime()
{
int second,minute,hour,date,month,year,dow,temperature;
second=Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
date=Clock.getDate();
month=Clock.getMonth(Century);
year=Clock.getYear();
dow=Clock.getDoW();
temperature=Clock.getTemperature();
lcd.setCursor(0, 0);
lcd.print("20");// 20 Century
if (year>=10)// print year
{
lcd.print(year,DEC);
}
else
{
lcd.print("0");
lcd.print(year,DEC);
}
lcd.print('-');
lcd.setCursor(5, 0);
if (month>=10)// print month
{
lcd.print(month,DEC);
}
else
{
lcd.print("0");
lcd.print(month,DEC);
}
lcd.print('-');
lcd.setCursor(8, 0);
if (date>=10)// print data
{
lcd.print(date,DEC);
}
else
{
lcd.print("0");
lcd.print(date,DEC);
}
lcd.setCursor(11, 0);
switch (dow)// week
{
case 1:// dow = 1
lcd.print("Mon");
break;
case 2:// dow =2
lcd.print("Tue");
break;
case 3:
lcd.print("Wed");
break;
case 4:
lcd.print("Thu");
break;
case 5:
lcd.print("Fri");
break;
case 6:
lcd.print("Sat");
break;
case 7:
lcd.print("Sun");
break;
}
lcd.setCursor(0, 1);
if (hour>=10)// print hour
{
lcd.print(hour,DEC);
}
else
{
lcd.print("0");
lcd.print(hour,DEC);
}
lcd.print(':');
lcd.setCursor(3, 1);
if (minute>=10)// print minute
{
lcd.print(minute,DEC);
}
else
{
lcd.print("0");
lcd.print(minute,DEC);
}
lcd.print(':');
lcd.setCursor(6, 1);
if (second>=10)// print second
{
lcd.print(second,DEC);
}
else
{
lcd.print("0");
lcd.print(second,DEC);
}
lcd.setCursor(9, 1);
if (Clock.checkAlarmEnabled(1))// alarm enable
{
lcd.write("on");
}
else
{
lcd.print(' ');
}
lcd.setCursor(12, 1);
lcd.print(temperature);// show temperature
lcd.write(0xdf);// symbol
lcd.print("C");
}
/* ~~~~~~~~~~~~~~~~~~~~~~Display set Data Week Time ~~~~~~~~~~~~~~~~~~~~~~~ */
void PritimeSet(byte syear,byte smonth,byte sdate,byte sdow,byte shour,byte sminute,byte ssecond)
{
lcd.setCursor(0, 0);
lcd.print("20");// 20 Century
if (syear>=10)// print year
{
lcd.print(syear,DEC);
}
else
{
lcd.print("0");
lcd.print(syear,DEC);
}
lcd.print('-');
lcd.setCursor(5, 0);
if (smonth>=10)// print month
{
lcd.print(smonth,DEC);
}
else
{
lcd.print("0");
lcd.print(smonth,DEC);
}
lcd.print('-');
lcd.setCursor(8, 0);
if (sdate>=10)// print date
{
lcd.print(sdate,DEC);
}
else
{
lcd.print("0");
lcd.print(sdate,DEC);
}
lcd.setCursor(11, 0);
switch (sdow)// print week
{
case 1:// dow = 1
lcd.print("Mon");
break;
case 2:// dow = 2
lcd.print("Tue");
break;
case 3:
lcd.print("Wed");
break;
case 4:
lcd.print("Thu");
break;
case 5:
lcd.print("Fri");
break;
case 6:
lcd.print("Sat");
break;
case 7:
lcd.print("Sun");
break;
}
lcd.setCursor(0, 1);
if (shour>=10)// print hour
{
lcd.print(shour,DEC);
}
else
{
lcd.print("0");
lcd.print(shour,DEC);
}
lcd.print(':');
lcd.setCursor(3, 1);
if (sminute>=10)// print minute
{
lcd.print(sminute,DEC);
}
else
{
lcd.print("0");
lcd.print(sminute,DEC);
}
lcd.print(':');
lcd.setCursor(6, 1);
if (ssecond>=10)// print second
{
lcd.print(ssecond,DEC);
}
else
{
lcd.print("0");
lcd.print(ssecond,DEC);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ flash set location ~~~~~~~~~~~~~~~~~~~~~~~ */
void TicSet(byte a,byte b)
{
lcd.setCursor(a,b);
lcd.print("");
}
/* ~~~~~~~~~~~~~~~~~~~~~~ display alarm1 ~~~~~~~~~~~~~~~~~~~~~~~ */
void PriA1()
{
lcd.setCursor(0, 0);
lcd.print("Alarm1 ");
if (Clock.checkAlarmEnabled(1))// alarm status
{
lcd.print("On");
}
else
{
lcd.print("Off");
}
Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, ABits, A1Dy, A1h12, A1pm);
lcd.setCursor(0, 1); //second line on lcd
if (A1Hour>=10)// print hour
{
lcd.print(A1Hour,DEC);
}
else
{
lcd.print("0");
lcd.print(A1Hour,DEC);
}
lcd.print(':');
lcd.setCursor(3, 1);
if (A1Minute>=10)//print minute
{
lcd.print(A1Minute,DEC);
}
else
{
lcd.print("0");
lcd.print(A1Minute,DEC);
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~display alarm2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void PriA2()
{
lcd.setCursor(0, 0);
lcd.print("Alarm2 ");
if (Clock.checkAlarmEnabled(2))// alarm status
{
lcd.print("On");
}
else
{
lcd.print("Off");
}
Clock.getA2Time(A2Day, A2Hour, A2Minute, ABits, A2Dy, A2h12, A2pm);
lcd.setCursor(0, 1); //second line on lcd
if (A2Hour>=10)// print hour
{
lcd.print(A2Hour,DEC);
}
else
{
lcd.print("0");
lcd.print(A2Hour,DEC);
}
lcd.print(':');
lcd.setCursor(3, 1);
if (A2Minute>=10)//print minute
{
lcd.print(A2Minute,DEC);
}
else
{
lcd.print("0");
lcd.print(A2Minute,DEC);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ switch debounce~~~~~~~~~~~~~~~~~~~~~~~ */
unsigned long LastP;
boolean buttonPress(byte button)
{
if(digitalRead(button)==HIGH) // button press?
{
unsigned long NowP = millis();
unsigned long buttonChange=NowP-LastP;// debounce function
if (buttonChange>500)
{
LastP = millis();
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ set time ~~~~~~~~~~~~~~~~~~~~~~~ */
void SetTime()
{
bool h12, PM, Century=false;
byte syear, smonth, sdate, sdow, shour, sminute, ssecond;
if(buttonPress(Set))
{
lcd.clear();
delay(200);
Clock.getTime(syear, smonth, sdate, sdow, shour, sminute, ssecond);
bool SetY=true;
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter year set ~~~~~~~~~~~~~~~~~~~~~~~ */
while(SetY)
{
unsigned long Rt=millis()%1000;
if(Rt<500)// flash every 0.5s
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
lcd.setCursor(0,0);
lcd.print(" ");
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set year ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
syear=syear+1;
if(syear>50)
{
syear = 0;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter month set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetMon=true;
while(SetMon)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
TicSet(5,0);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set month ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
smonth=smonth+1;
if(smonth>12)
{
smonth=1;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter data set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetD=true;
while(SetD)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
TicSet(8,0);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set data ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
sdate=sdate+1;
if(sdate>31)
{
sdate=1;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter week set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetW=true;
while(SetW)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
lcd.setCursor(11,0);
lcd.print(" ");
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set week ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
sdow=sdow+1;
if(sdow>7)
{
sdow=1;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter hour set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
long NewP=0;
bool SetH=true;
while(SetH)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
TicSet(0,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set hour ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
NewP=NewP+1;
shour=shour+1;
if(shour>23)
{
shour=0;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter minute set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetMin=true;
while(SetMin)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
TicSet(3,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set minute ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
NewP=NewP+1;
sminute=sminute+1;
if(sminute>59)
{
sminute=0;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter second set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetS=true;
while(SetS)
{
unsigned long Rt=millis()%1000;
if(Rt<500)
{
PritimeSet(syear, smonth, sdate, sdow, shour, sminute, ssecond);
}
else
{
TicSet(6,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set second ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
NewP=NewP+1;
ssecond=ssecond+1;
if(ssecond>59)
{
ssecond=0;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ exit and save ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
Clock.setYear(syear);
Clock.setMonth(smonth);
Clock.setDate(sdate);
Clock.setDoW(sdow);
if (NewP>0)
{
Clock.setHour(shour);
Clock.setMinute(sminute);
Clock.setSecond(ssecond);
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter alarm1 hour set ~~~~~~~~~~~~~~~~~~~~~~~ */
lcd.clear();
delay(200);
bool SetA1H=true;
while(SetA1H)
{
unsigned long RA1=millis()%1000;
if(RA1<500)// flash every 0.5s
{
PriA1();
}
else
{
TicSet(0,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set hour ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, ABits, A1Dy, A1h12, A1pm);
A1Hour=A1Hour+1;
if(A1Hour<24)
{
Clock.setA1Time(A1Day, A1Hour, A1Minute, A1Second, B1000, A1Dy, false, A1pm);// set alarm for every day
}
else
{
A1Hour=0;
Clock.setA1Time(A1Day, A1Hour, A1Minute, A1Second, B1000, A1Dy, false, A1pm);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter alarm1 minute set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetA1M=true;
while(SetA1M)
{
unsigned long RA1=millis()%1000;
if(RA1<500)
{
PriA1();
}
else
{
TicSet(3,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set minute ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, ABits, A1Dy, A1h12, A1pm);
A1Minute=A1Minute+1;
if(A1Minute<60)
{
Clock.setA1Time(A1Day, A1Hour, A1Minute, A1Second, B1000, A1Dy, false, A1pm);
}
else
{
A1Minute=0;
Clock.setA1Time(A1Day, A1Hour, A1Minute, A1Second, B1000, A1Dy, false, A1pm);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Alarm1 on or off ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetA1R=true;
while(SetA1R)
{
unsigned long RA1=millis()%1000;
if(RA1<500)
{
lcd.setCursor(0, 0);
PriA1();
}
else
{
lcd.setCursor(7, 0);
lcd.print(" ");
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set alarm on or off ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
digitalWrite(New,LOW);
if(Clock.checkAlarmEnabled(1))
{
Clock.turnOffAlarm(1);
}
else
{
Clock.turnOnAlarm(1);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter alarm2 hour set ~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
delay(200);
bool SetA2H=true;
while(SetA2H)
{
unsigned long RA2=millis()%1000;
if(RA2<500)// flash every 0.5s
{
PriA2();
}
else
{
TicSet(0,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set hour ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
Clock.getA2Time(A2Day, A2Hour, A2Minute, ABits, A2Dy, A2h12, A2pm);
A2Hour=A2Hour+1;
if(A2Hour<24)
{
Clock.setA2Time(A2Day, A2Hour, A2Minute, B100, A2Dy, false, A2pm);// set alarm for every day
}
else
{
A2Hour=0;
Clock.setA2Time(A2Day, A2Hour, A2Minute, B100, A2Dy, false, A2pm);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Enter alarm minute set ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetA2M=true;
while(SetA2M)
{
unsigned long RA2=millis()%1000;
if(RA2<500)
{
PriA2();
}
else
{
TicSet(3,1);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set minute ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
Clock.getA2Time(A2Day, A2Hour, A2Minute, ABits, A2Dy, A2h12, A2pm);
A2Minute=A2Minute+1;
if(A2Minute<60)
{
Clock.setA2Time(A2Day, A2Hour, A2Minute, B100, A2Dy, false, A2pm);
}
else
{
A2Minute=0;
Clock.setA2Time(A2Day, A2Hour, A2Minute, B100, A2Dy, false, A2pm);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Alarm1 on or off ~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
bool SetA2R=true;
while(SetA2R)
{
unsigned long RA2=millis()%1000;
if(RA2<500)
{
lcd.setCursor(0, 0);
PriA2();
}
else
{
lcd.setCursor(7, 0);
lcd.print(" ");
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ set alarm on or off ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(New))
{
digitalWrite(New,LOW);
if(Clock.checkAlarmEnabled(2))
{
Clock.turnOffAlarm(2);
}
else
{
Clock.turnOnAlarm(2);
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~ exit ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(buttonPress(Set))
{
lcd.clear();
delay(200);
goto exit;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
exit:;
}
/* ~~~~~~~~~~~~~~~~~~~~~~ Alarm1 on ~~~~~~~~~~~~~~~~~~~~~ */
void Alarm1()
{
if(Clock.checkIfAlarm(1))
{
long Rdt;
do
{
unsigned long Rt=millis()%1000;
if(Rt<500)// flash every 0.5s
{
Pritime();
delay(100);
digitalWrite(4,HIGH);
}
Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, ABits, A1Dy, A1h12, A1pm);
Clock.getTime(year, month, date, DoW, hour, minute, second);
if (hour==0)
{
hour=24;
}
Rdt=hour*60+minute*1-A1Hour*60-A1Minute*1;
}
while(Rdt>=0&&Rdt<1);// continu 30s
}
else
{
digitalWrite(4,LOW);
}
}
void Alarm2()
{
if(Clock.checkIfAlarm(2))
{
long Rdt;
do
{
unsigned long Rt=millis()%1000;
if(Rt<500)// flash every 0.5s
{
Pritime();
delay(100);
digitalWrite(4,HIGH);
}
Clock.getA2Time(A2Day, A2Hour, A2Minute, ABits, A2Dy, A2h12, A2pm);
Clock.getTime(year, month, date, DoW, hour, minute, second);
if (hour==0)
{
hour=24;
}
Rdt=hour*60+minute*1-A2Hour*60-A2Minute*1;
}
while(Rdt>=0&&Rdt<1);// continu 30s
}
else
{
digitalWrite(4,LOW);
}
}
无言创客
发表于 2019-7-4 07:07:18
楼主您好,很抱歉打扰您。在使用您的这篇代码时,在闹钟响的那部分,如果闹钟开关是关闭状态,但是闹钟时间到还是响了,请问楼主这个怎么解?
一个小小小小白
发表于 2020-3-7 20:43:51
楼主大神,到设置时间的时候就会出现乱码,把前面两个地址都试了可是没什么效果,这是为什么啊?