这个时钟系列目前五篇分别是:

《8266+DS3231时钟之开发个时钟遇到的N个坑【一】》
《8266+ds3231时钟之arduino官网发布的DS3231库的分析【二】》
《8266+DS3231时钟之DS3231具体实现及代码【三】》
《8266+DS3231时钟之显示TM1638的使用【四】上》
《8266+DS3231时钟之显示TM1638的使用【四】下》
《8266+DS3231时钟之语音MP3-TF-16P模块使用【五】》
有兴趣的可以去看看,如果觉得对你有帮助,请点个赞。

前一段在做时钟的过程中写了两篇关于DS3231的文章,具体见链接
《8266+DS3231时钟之开发个时钟遇到的N个坑【一】》
《8266+ds3231时钟之arduino官网发布的DS3231库的分析【二】》

有兴趣的可以去看看,如果觉得对你有帮助,请点个赞。
今天有点时间,具体在DS3231库的基础上,把实现过程代码呈现出来。我会把整个钟的制作过程,分析及代码几往篇写出来,是对自已制作的一个总结,也希望能帮助到和我一样对嵌入式系统有兴趣的人。
上一篇对DS3231库的分析里,对每一个函数及作用进行了分析。但在实际写代码的过程中,其实还是有不少地方需要注意的,因此这里根据时钟的使用过程顺序,分析一下具体的实现。

概述

我的时钟的主要功能:
1、时钟的显示(主要显示日期和时分)
2、时钟的自动对时
3、闹钟一的设置与取消
4、闹钟二的设置与取消

1、首先当然是硬件连接

2、其次当然是软件环境配置

要用DS3231,配置DS3231的相应使用环境 ,首先当然是需要引入相关的头文件,生成对象。具体代码如下:

#include <Wire.h>
#include <DS3231.h>
//时钟管脚定义
#define SCL 5    //GPIO5 对应NODEMCU的d1      I2C-SCL
#define SDA 4    //GPIO4 对应NODEMCU的d2       I2C-SDA
#define INT_SQW 14   //GPIO14 对应NODEMCU的 D5     中断及方波1HZ
//.......DS3231 RTC;      //创建DT3231时钟对象

3、闹钟数据结构的设置

/对应APP状态的各类数据结构///
struct AlarmSet_type{    //闹钟设置数据结构byte flag=0;byte ADay=0;byte AHour=0;byte AMinute=0;byte ASecond=1;//怀疑没有0秒,所以设一个1秒byte AlarmBits1=0x08;   //闹钟一控制字的设置,详见我上一篇《arduino官网发布的DS3231库的分析》byte AlarmBits2=0x40;  //闹钟二控制字的设置,详见我上一篇《arduino官网发布的DS3231库的分析》bool ADy=false;//日期以月日格式。bool AH12=false; //24小时制bool APM=false; //};
AlarmSet_type Alarm1;   //建立闹钟一
AlarmSet_type Alarm2;  //建立闹钟二
AlarmSet_type NowAlarm;//暂存现在的闹钟设置

Alarm1 、Alarm2 、NowAlarm 用于接下来设置闹钟或同步APP与闹钟的数据时用。这里需要先定义一下。

4、初始化

void setup(){//....................Wire.begin();  //启动I2c总线时钟初始化   同步闹钟/////enableOscillator(bool TF, bool battery, byte frequency)//当第一位TF为true 控制寄存器的 ~EOSC to 0  and INTCN to 0.,//注意该函数把EOSC置0则启动振荡器,同时把把INTCN置0(第二位battery为true VCC<VPF时会输出1HZ方波)//使用时要用turnOnAlarm()把INTCN打开,否则会一直输出方波中断RTC.enableOscillator(true,false,0);RTC.checkIfAlarm(1);  //该函数检测完后状态寄存器A1F或A2F就把标志位清0RTC.checkIfAlarm(2);RTC.turnOnAlarm(1); //置INTCN为1,否则在INT/SQW会一直输出1HZ方波RTC.turnOnAlarm(2); /设置闹钟中断输出设置秒闪功能///pinMode(INT_SQW,INPUT_PULLUP); interrupts();attachInterrupt(digitalPinToInterrupt(INT_SQW),alarm_interrupt,FALLING);  //8266经过实践发现,只支持CHANGE RISING FALLING 。DS3231在闹钟启动时,会在int/sqw接口处输出一个低电平做为中断信号。secondTicker.attach(1,second_interrupt,SecondInterruptMode);//每秒触发一次带参数的中断程序//...................
}

经过以上几个步骤,DS3231就可以正常我们的要求开始工作了。接下来的大量工作就是和具体的显示,设置,以及其它辅助功能相关了。

5、显示

由于我搭的实验环境用的是某宝上买的基于TM1638显示驱动的一个现成模块。下一篇文章我会具体介绍这个模块的使用,这里只需要知道这部分是针对DS3231的具体显示功能就行了。下面先上一张该 模块的图,有个直观的认识:

由于是实验环境,为了省事,我用的这个8数码管的显示模块,把前四个数码管定义成月日的显示。后四个数码管定义为时分的显示。
因此对应的显示函数如下:

void GetTime(){    //给显示变量赋值showtime[0]=RTClib::now().month()/10;     //月 showtime[1]=RTClib::now().month()%10;     showtime[2]=RTClib::now().day()/10;      //日showtime[3]=RTClib::now().day()%10;showtime[4]=RTClib::now().hour()/10;      //时showtime[5]=RTClib::now().hour()%10;showtime[6]=RTClib::now().minute()/10;    //分showtime[7]=RTClib::now().minute()%10;
}

上面这段代码只是把对应的DS3231赋值给showtime[]数组,该 数组用于对应TM1638的显示,由于要显示秒的功能,因此在设计时有一个秒中断函数负责具体的时间显示:


ICACHE_RAM_ATTR void second_interrupt(int mode){ //时钟每秒中断if (mode==0){        //模式0 用于秒闪灯工作以及显示时间。模式1可能是显示提示正在配网等//显示时间if ( showtime[7]!=RTClib::now().minute()%10 ) {   //只要比较,分不同就重新显示GetTime();                   //获取DS3231的时间TM1638.Disp8(showtime);     //显示}  }}

6、对时函数

 void autoAdjust(){    //自动对时Serial.println("<<<<<<<如果联网了,才执行自动对时功能>>>>>>>>>>");if (WiFi.status() == WL_CONNECTED){RTC.setClockMode(false);  // set to 24hRTC.setYear((Blinker.year()%100));  //取年的最后两位RTC.setMonth(Blinker.month());RTC.setDate(Blinker.mday());RTC.setDoW(Blinker.wday());RTC.setHour(Blinker.hour());RTC.setMinute(Blinker.minute());RTC.setSecond(Blinker.second());}}

由于我用的是blinker点灯科技的APP,所以自动对时我就不需要去写复杂的NTP授时程序 了,直接从Blinker的对应时间函数里读需出来就行了。因为BLINKER的时间函数了是从NTP相关函数封装来的,所有也是用的互联网授时网站的标准时间。

7、闹钟设置

功能上,我取消了复杂又难以理解的按键设置功能,取而代之的是用APP上的操作来设置闹钟。这些具体实现在以后介绍,这里只需要知道 一下在APP上设置好时分后,把设置下载到DC3231。这此代码是放在对应的BLINKER的回设函数上

void btnOne_callback(const String & state){RTC.setA1Time(Alarm1.ADay,Alarm1.AHour,Alarm1.AMinute,Alarm1.ASecond,Alarm1.AlarmBits1,Alarm1.ADy,Alarm1.AH12,Alarm1.APM);RTC.turnOnAlarm(1);if (RTC.checkAlarmEnabled(1)){ //检测控制寄存器中的A1IE位置1否texOne.print("每天响铃"+String(Alarm1.AHour)+"时"+String(Alarm1.AMinute)+"分");};
}

8、闹钟取消

void btnCancel1_callback(const String & state){RTC.turnOffAlarm(1); //只设置了控制寄存器中的A1IE位置0,INTCN位不变}

9、闹钟中断触发

ICACHE_RAM_ATTR void alarm_interrupt(){Serial.println("alarm 中断启动。。。。。。。");ReadData(EEPROMBase3,Mp3Data);if (Mp3Data.flag=1){   //有设置就播设置的音乐,没有的话默认播第一首//循环播放mp3.SetCmdByte(0x06,CMD_assign_cyclic,0x00,(uint8_t)Mp3Data.music>>8,(uint8_t)(Mp3Data.music&0x00FF));}else{mp3.SetCmdByte(0x06,CMD_assign_cyclic,0x00,0x00,0x01); }}

中断程序只要知道是去触发闹铃的语名就行了。

到这里,时钟相关的功能已都基本实现,上面涉及的到功能对应的关键语句都已完整呈现。

8266+DS3231时钟之DS3231具体实现及代码【三】相关推荐

  1. 8266+DS3231时钟之显示TM1638的使用【四】下

    这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟之arduino官网发布的DS3231库的分析[二]> ...

  2. 8266+DS3231时钟之显示TM1638的使用【四】上

    今天继续8266+DS3231时钟项目的显示部分功能的详解. 这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟 ...

  3. 8266+DS3231时钟之语音MP3-TF-16P模块使用【五】

    这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟之arduino官网发布的DS3231库的分析[二]> ...

  4. 8266+ds3231时钟之arduino官网发布的DS3231库的分析【二】

    这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟之arduino官网发布的DS3231库的分析[二]> ...

  5. 张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231

    原文:张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231 GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/ ...

  6. 用四位数码管和DS3231时钟模块做车载电子时钟

    用四位数码管和DS3231时钟模块做车载电子时钟 本来咱车上收音模块上是有一个时钟的,但换了导航以后,发现时钟不好用了:主界面上有时钟,但位置太靠左侧,俺的大手握方向盘刚好挡住视线,而且在播放音乐时, ...

  7. 实时时钟芯片DS3231应用笔记,使用指南,FAQ全集

     编者按:Maxim Integrated新型实时时钟(RTC) DS3231,内部集成了TCXO.RTC和32.768kHz晶体,并采用低成本.标准型.16引脚SOIC封装.在-40°C至+85°C ...

  8. 时钟传感器—DS3231

    时钟传感器-DS3231 DS3231概述 DS3231引脚 DS3231寄存器 DS3231 操作 DS3231概述 DS3231是一款高精度I2C实时时钟器件 内部带温度补偿.闰年补偿 提供两个可 ...

  9. 基于DS3231时钟模块的stm32 Hal库程序,源码

    关于DS3231模块介绍我在我的博客基于DS3231时钟模块的stm32 程序,源码中有介绍 ,大家可以自己看下.我这篇直接讲HAL的代码. 一.配置IO /**/****************** ...

最新文章

  1. php rabbmq教程_RabbitMQ+PHP 教程六(RPC)
  2. Android跨进程通信二——AIDL
  3. 华为鸿蒙发布2.0,华为做到了!鸿蒙2.0正式发布,苹果安卓有危机?
  4. 优酷上线4K修复版经典剧漫 高清修复计划5年焕新5000部经典
  5. Linux命令之reset - 终端屏幕混乱的终结者
  6. 假如明天灾难来临_北京医保容灾
  7. python产生随机值-random模块
  8. spring cloud SnakeYAML RCE
  9. sql面试题:问题1:查询每个同学的学生编号、学生姓名、选课总数...问题2:查询“张三”老师所授课程的学生中,成绩最高的学生信息...
  10. 面包板入门电子制作 学习笔记10
  11. 基于matlab的-数字调制技术仿真
  12. 计算机自定义桌面设置在哪里设置,如何在windows10桌面设置自定义图片?查看方法...
  13. Python学习之道-串口Modbus开发
  14. GIT CZ的错误解决
  15. 用selenium爬取拉勾网职位信息及常见问题处理
  16. 【微信小程序】-- WXML 模板语法 - 数据绑定(九)
  17. PCB设计---无源晶振和有源晶振
  18. 6月25日科技资讯 |微信解封快手链接;AWS证实宕机;微软公司内部疑禁用Slack
  19. groupby函数分组统计
  20. multisim 9计算机仿真在电子电路设计中的应用光盘,NI Multisim11在电力电子技术教学中的实践应用.pdf...

热门文章

  1. zookeeper知识点扫盲
  2. java jframe_Java窗口(JFrame)从零开始(1)——JFrame窗口
  3. 赵小楼《天道》《遥远的救世主》深度解析(23)丁元英唯一的真朋友韩楚风
  4. Linux系统开启IPv6任播(anycast)地址
  5. Java游戏服务器开发之二十--xml配置文件
  6. Android获取本机号码、IMEI等
  7. VUE axios 415 错误
  8. 便利贴--22{Avue表格自定义以及适应高度}
  9. 【TPMS】 -接收端1
  10. WIN7频繁提示资源管理器已停止正确解决办法