8266+DS3231时钟之开发个时钟遇到的N个坑【一】

2023-05-16

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

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

最近玩这个8266上瘾了,正好手上有一块DS3231,就想着做一个互联网时钟玩玩,哪知道本以为很简单的一个东西却做了我一周的时间,踩平了N个坑。既然掉坑里了又爬了出来就会有所收获,赶快过来记录一下,备忘备忘。
第一个坑,关于I2C引脚的问题。
我用的是nodeMCU 8266-E 的开发板,所查了一下乐鑫原厂的技术资料,资料上清楚的写着如下:
在这里插入图片描述
我也没多想,就把DS3231的SCL和SDA直接接上了IO4 和IO2。结果就是死活读不到数据。后来抱着试试的心态想着程序没错的话应该就是硬件的问题,上度娘上查了前人的文章,发现有两个博主连接的是GPIO5 和GPIO4 ,于是抱着试试的态度果断打出如下代码。
#define SCL 5 //d1 I2C-SCL
#define SDA 4 //d2 I2C-SDA
结果一运行,立刻搞定。。。就这么一个低级坑,就坑了我一天时间。要不是自已有怀疑精神,这个坑估计能把我埋了。

第二个坑更深了,但现在看来简单一句话就是DS3231在启动后,至少20秒内不能用setYear(),setHour()等这些个设置语句。
这里补充一下,我用的是arduino 的IDE环境。因此自然使用的是arduino提供的官方下载的DS3231驱动。https://www.arduino.cc/reference/en/libraries/ds3231/。
我的时钟原本就是在联上网后会有一个自动对时功能,从NTP上取下网络时间,然后设置给DS3231,就为了这个功能,恶梦开始了,程序一运行,怎么都无法读出准确的时间,反而读出一堆乱码。我又开始了自查程序。查了N遍怎么都不可能错了,然后开始分析官方提供的驱动,发现也没有问题。然后很偶然的把一开机就设置时间的功能去掉,发现一切正常上了。经过反复比较,反复查看DS3231的技术资料,都没有对这一情况进行说明。这里权猜测是因为DS3231在开机上电的一段时间里寄存器初始化等作业不允许用设置指定吧。但可以用读取指令。

第三个坑最深。。为了解决这个坑,上网各种搜查都没能找到好的办法,最后还是根据驱动程序源码并合理猜测才得以解决。这个坑是关于闹钟设置并输出中断的功能的。功能就是通过APP设置闹钟写入DS3231里,时间到后,必须从INT/SQW这个端口输出中断信号给8266,8266再去处理这个中断。但是我遇到几个问题。一是每次一设完闹钟参数,3231就直接输出了一个低电平,也就是说设完闹钟中断就启动了,不管时间到没到。二是我对8266读中断的模式设为LOW也就是低电平触发,但这里死活都没办法触发。。。这两个问题中的第一个必须涉及到寄存器的解释,
在这里插入图片描述
另一个是状态寄存器
在这里插入图片描述
详细的内容网上有大把的资料,需要的话可以去查,这里只讲和这个坑有关的内容。
根据上面的两个寄存器解释。要想让低电平有效的中断在闹钟启动后触发,必须完成这几个寄存器置位。
1 控制寄存器的INTCN置1
2 控制寄存器的A1IE和A2IE置1
3 闹钟时间到时对状态寄存器的A1F或A2F的置位
这样就能使中断触发。
可是我设置了1,2两部后,才用setA1Time()命令后,INT-SQW就一直处于低电平,也就是闹钟时间没到,中断就有效了。这让我很无语,又是一通各种查,把驱动源码又看了N遍。最好才明白了,3231会自已偷偷的置位A1F或A2F。也就是说,3231不会自已清除A1F或A2F的标志,必须手工去清除。搞清楚这点后,一切就简单 了。如下:

//时钟初始化   同步闹钟
   //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方波)
   RTC.enableOscillator(true,false,0);
   RTC.checkIfAlarm(1);  //该函数检测完后状态寄存器A1F或A2F就把标志位清0
   RTC.checkIfAlarm(2);
   

   ReadData(EEPROMBase1,Alarm1);
   ReadData(EEPROMBase2,Alarm2);
      
   if (Alarm1.flag==1){
      RTC.setA1Time(Alarm1.ADay,Alarm1.AHour,Alarm1.AMinute,Alarm1.ASecond,Alarm1.AlarmBits1,Alarm1.ADy,Alarm1.AH12,Alarm1.APM);
      //把控制寄存器的INTCN位和A1IE位置1,使能闹钟一的中断。一旦状态寄存器的A1F因为闹钟时间到而置1则在INTCN输出中断
      RTC.turnOnAlarm(1); 
      if (RTC.checkAlarmEnabled(1)){   
        Serial.println("闹钟1启动,定时为每日的:"+String(Alarm1.AHour)+":"+String(Alarm1.AMinute));  
         DebugeTime(1,Temp); 
      };  
   }else {
    RTC.turnOffAlarm(1);
    
   }
   
   if (Alarm2.flag==1){
      RTC.setA2Time(Alarm2.ADay,Alarm2.AHour,Alarm2.AMinute,Alarm2.AlarmBits2,Alarm2.ADy,Alarm2.AH12,Alarm2.APM);
      //把控制寄存器的INTCN位和A2IE位置1,使能闹钟一的中断。一旦状态寄存器的A2F因为闹钟时间到而置1则在INTCN输出中断
      RTC.turnOnAlarm(2);
      if (RTC.checkAlarmEnabled(2)){   
        Serial.println("闹钟2启动,定时为每日的:"+String(Alarm1.AHour)+":"+String(Alarm1.AMinute));   
        DebugeTime(2,Temp); 
      };  
   }else{
    RTC.turnOffAlarm(2);
     
   }

上面的关键就是那几个RTC对象相关的方法的执行顺序。
第二个问题就是关于8266中断触发的问题。由于用的是arduino IDE环境 所以经常会把arduino的语句与8266混用,尽管大多是一样的,但还是有区别。比如,中断的触发。arduino可以用(LOW, HIGH ,FALLING,CHANGE,RISING).而8266就只有三种(FALLING,CHANGE,RISING)。
先写到这里,详细的驱动程序 的分析明天再写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8266+DS3231时钟之开发个时钟遇到的N个坑【一】 的相关文章

  • 【ROS2】【源码展示】ROS2中Rviz2增加一个可以实现收发节点双击修改图表等功能的插件panel

    使用说明 源代码在这里 xff0c 本文基于源代码进行功能增加和修改 主要应用Qt中的一些方法 xff0c 结合ros2中rviz2对增加panel功能的一些封装 实现双击修改图表中的内容 xff0c 节点的收发 xff0c 图表根据收到的
  • 【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端

    Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想 xff1a 使用一个固定窗口在图像上进行任意方向的滑动 xff0c 对比滑动前后的窗口中的像素灰度变化程度 xff0c 如果存在
  • 在Ubuntu上安装samba服务器

    文章目录 在Ubuntu上安装samba服务器为什么要使用SambaSamba创建一个共享目录安装Samba服务器配置Samba服务器开启Samba服务器添加samba用户在window上共享Linux目录参考 在Ubuntu上安装samb
  • 51单片机点亮LED和使用定时器中断控制蜂鸣器发声

    初学51单片机第一个实验一般都是以点亮LED灯开始 xff0c 以下是使用Proteus仿真软件的实验效果 实验需要仿真仪器 xff1a 示波器 LED 电压表 蜂鸣器 AT89C51 实验电路图 xff1a 实验代码 xff1a incl
  • Python中的joblib.Parallel函数

    Joblib是一个可以将Python代码转换为并行计算模式的包 xff0c 可以大大简化我们写并行计算代码的步骤 我们可以通过操作该包内的函数来实现目标代码的并行计算 xff0c 从而提高代码运行效率 下面举一个简单的例子来说明 xff1a
  • Microsoft Mathematics(微软数学软件)

    microsoft mathematics是微软公司发布的一款功能强大 xff0c 且非常专业的数学软件 xff0c 同时也是由微软官方出品的数学公式编辑软件 xff0c 可以帮助用户更好的计算标准数学函数变量之间的数学关系 xff0c 以
  • UartAssist,串口调试助手

    UartAssist是一款功能非常强大 xff0c 且实用性极高的串口调试助手 xff0c 该软件不仅支持常用的110 115200bps波特率 xff0c 而且不论是它的端口号 校验位 数据位 停止位等各种数据 xff0c 在这里通通都可
  • ARCHPR(压缩密码暴力破解软件)

    常年是用电脑的小伙伴 xff0c 应该都有过忘记压缩包密码的情况 xff0c 那么这个时候该怎么办呢 xff1f 别慌 xff0c 不妨来试试ARCHPR吧 xff01 该软件不仅支持所有版本的ZIP PKZip WinZip RAR Wi
  • 佳佳数据恢复软件免费版

    佳佳数据恢复软件免费版是一款功能优异 xff0c 且操作简单的电脑数据恢复应用 xff0c 该软件不但是支持免费试用的 xff0c 而且还不限恢复文件个数和大小 xff0c 能够高效率的将误删除 误格式化 分区打不开 误清空回收站 磁盘丢失
  • 文件md5校验工具

    文件md5校验工具是一款方便实用 xff0c 且绿色迷你的md5码查询对比工具 xff0c 该工具有着精妙的摘要算法 xff0c 能够帮助用户进行查看任意文件的md5验证码 毕竟只有一个文件在传输过程中损坏 xff0c 亦或者内容被修改过
  • 视频转换处理软件

    视频转换处理软件是一款专业 易用 高效的视频处理工具 xff0c 软件内置了格式转换 视频剪切 视频转GIF 视频加水印 视频优化 旋转和翻转等六大功能 xff0c 并每个功能模块也都是互相独立的 xff0c 这也就是说 xff0c 用户在
  • 视频剪切软件

    视频剪切是一款功能强势 操作简单的视频剪切工具 xff0c 它不但可以帮助用户将视频中的精彩片段剪切出来 xff0c 轻松制作需要的短片视频 xff0c 而且还支持任意设置输出视频的视频属性和音频属性 xff0c 并支持MP4 rmvb a
  • 神奇电商宝贝下载软件

    神奇电商宝贝下载软件是一款专业 易用 高效的电商软件 xff0c 可帮助用户快速获取1688 天猫 淘宝 速卖通 企业叮咚等平台店铺中的主图视频 详情视频 主图图片 详情图片等所有信息 xff0c 从而轻松满足电商用户的所有需求 而且该软件
  • 布谷鸟算法

    布谷鸟算法是将布谷鸟育雏行为与Levy飞行算法相结合的一种算法 在布谷鸟算法中 xff0c 有两个算法或者说两个位置更新是关键 xff1a 第一个是布谷鸟寻找最优解时的算法 xff1a 一个是布谷鸟寻找鸟窝下蛋的寻找路径是采用早已就有的萊维

随机推荐