嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)

1、实时时钟(Real Time Clock)

RTC,全称为实时时钟(Real Time Clock),是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作,即使断电也能继续运行,并保持时间的精确度。

RTC一般用于需要准确时间的应用场合,如计算机系统的时间同步、数据采集系统的时间记录等。RTC可以提供秒、分、时、日、月、年等时间信息,还可以具备闹钟、定时器等功能。

在计算机系统中,RTC可以通过串行接口(如I2C、SPI接口)与主控芯片进行通信。主控芯片通过读取RTC的寄存器来获取当前时间,并可以通过写入寄存器来设置时间或功能。

除了计算机系统,RTC还可以用于其他电子设备中,如手机、电视等。

2、DS1302

(1)实时时钟芯片

DS1302是一款实时时钟芯片,由美国达拉斯半导体(Dallas Semiconductor)公司生产。它集成了时钟、日历和电池供电管理等功能。

DS1302通过3根线(数据线、时钟线和使能线)与外部控制器通信。它内部有一个32位的静态RAM,用于存储时间和日期等信息。它还有一个时钟输出引脚(CLKOUT),可以输出时钟信号。此外,DS1302还包括一个电池供电管理电路,可以在外部电源断开时维持时钟运行。

DS1302的主要特点如下:

  1. 时钟精度:±2分钟/月
  2. 工作电压:2V~5.5V
  3. 时钟频率:具有多个可选频率,最高可达到8MHz
  4. 时钟输出:可输出1Hz至32.768kHz的时钟信号
  5. 数据传输:采用串行方式传输,速率最高可达到2.048Mb/s
  6. 电源管理:具有电源失效检测和切换功能,可以自动切换到备用电池供电

DS1302广泛应用于各种需要实时时钟功能的设备,例如计算器、电子表、温度计、计步器、电子秤等。由于其低功耗和高精度的特点,它也常被用于嵌入式系统和物联网应用中。

(2)与树莓派接线

VCC:接树莓派的 3.3V 输出

GND:接树莓派的 Ground(地)

CLK:接树莓派的 GPIO21(BOARD 物理引脚编号40)

DAT:接树莓派的 GPIO20(BOARD 物理引脚编号38)

RST:接树莓派的 GPIO8(BOARD 物理引脚编号24)

(3)说明

DS1302的接线我特别说明下,我这里卡了一天,给我整懵了。我按照网上的接法接SLCK,ID_SD,CE0,运行程序老出问题,引脚功能报错,我估计接法不对,如果有同学整明白可以给我留言。我估计之前的接法是针对树莓派其他版本的。如果有时间还是要看下手册。

DS1302的接法还可以接到clk和IO引脚可以接树莓派SCL和SDA,不过不建议这样接,占用了OLED的引脚。如果接到这个IIC引脚上,通过sudo i2cdetect -y 1 命令也是查不到0x68这个1302器件ID。我这里也是搞了很长时间。

由于,DS1302的驱动在51和STM32都是通过IIC总线完成的,只要接到GPIO口,根据芯片手册的时序信号模拟IIC总线来发送与接收数据,主要有起始,结束、应答、非应答信号,再编写发送与接收字节函数,总之相比对程序员硬件软件要求比较高。在树莓派4B开发板中,DS1302也是基于IIC总线的,也有相应的C驱动和例程,但是我们还是用Pyhton来写。

3、DS1302驱动代码

import time
import RPi.GPIO
from datetime import datetime# 使用物理编码
SCL = 40
IO = 38
RST = 24# 数据读写的间隔
CLK_PERIOD = 0.00001# 关闭GPIO警告
RPi.GPIO.setwarnings(False)
# 配置树莓派GPIO接口 使用物理编码
RPi.GPIO.setmode(RPi.GPIO.BOARD)# 写入一个字节的数据
def writeByte(Byte):for Count in range(8):# 将SCL置为低电平 开启一次传输time.sleep(CLK_PERIOD)RPi.GPIO.output(SCL, 0)# 取一位数据进行写入Bit = Byte % 2Byte = int(Byte / 2)# 通过IO引脚进行写入time.sleep(CLK_PERIOD)RPi.GPIO.output(IO, Bit)# 将SCL置为高电平 结束一次传输time.sleep(CLK_PERIOD)RPi.GPIO.output(SCL, 1)# 读取一个字节的数据
def readByte():# 将IO引脚设置为输入RPi.GPIO.setup(IO, RPi.GPIO.IN, pull_up_down=RPi.GPIO.PUD_DOWN)Byte = 0for Count in range(8):# 先将SCL重置为高电平time.sleep(CLK_PERIOD)RPi.GPIO.output(SCL, 1)# 将SCL置为低电平 开启一次传输time.sleep(CLK_PERIOD)RPi.GPIO.output(SCL, 0)# 读取一位数据time.sleep(CLK_PERIOD)Bit = RPi.GPIO.input(IO)Byte |= ((2 ** Count) * Bit)return Byte# 重置一些数据
def resetDS1302():# SCL引脚设置为输出RPi.GPIO.setup(SCL, RPi.GPIO.OUT)# RST引脚设置为输出RPi.GPIO.setup(RST, RPi.GPIO.OUT)# IO引脚设置为输出RPi.GPIO.setup(IO, RPi.GPIO.OUT)# SCL和IO都置为低电平RPi.GPIO.output(SCL, 0)RPi.GPIO.output(IO, 0)time.sleep(CLK_PERIOD)# RST置为高电平RPi.GPIO.output(RST, 1)# 结束操作
def endDS1302():# SCL引脚设置为输出RPi.GPIO.setup(SCL, RPi.GPIO.OUT)# RST引脚设置为输出RPi.GPIO.setup(RST, RPi.GPIO.OUT)# IO引脚设置为输出RPi.GPIO.setup(IO, RPi.GPIO.OUT)# SCL和IO都置为低电平RPi.GPIO.output(SCL, 0)RPi.GPIO.output(IO, 0)time.sleep(CLK_PERIOD)# RST置为低电平RPi.GPIO.output(RST, 0)# 进行时间校准
def setDatetime(year, month, day,  hour, minute, second, dayOfWeek):# 引脚重置resetDS1302()# 设置写始终数据脉冲指令writeByte(int("10111110", 2))# 开始依次写数据# 写入秒数据,*16的作用是把十位右移4位 下面同writeByte((second % 10) | int(second / 10) * 16)# 写入分钟数据writeByte((minute % 10) | int(minute / 10) * 16)# 写入小时数据writeByte((hour % 10) | int(hour / 10) * 16)# 写入日期数据writeByte((day % 10) | int(day / 10) * 16)# 写入月份数据writeByte((month % 10) | int(month / 10) * 16)# 写入星期数据writeByte(dayOfWeek)# 写入年份数据writeByte((year % 100 % 10) | int(year % 100 / 10) * 16)# 结束数据写入writeByte(int("00000000", 2))# 结束任务endDS1302()# 获取DS1302硬件时钟实践
def getDatetime():# 重置引脚resetDS1302()# 0xBF指令,开始时钟脉冲串读取数据writeByte(int("10111111", 2))Data = ""# 依次读取# 先读出秒数据Byte = readByte()second = (Byte % 16) + int(Byte / 16) * 10# 分钟数据Byte = readByte()minute = (Byte % 16) + int(Byte / 16) * 10# 小时数据Byte = readByte()hour = (Byte % 16) + int(Byte / 16) * 10# 日期数据Byte = readByte()day = (Byte % 16) + int(Byte / 16) * 10# 月份数据Byte = readByte()month = (Byte % 16) + int(Byte / 16) * 10# 星期数据Byte = readByte()day_of_week = (Byte % 16)# 年数据Byte = readByte()year = (Byte % 16) + int(Byte / 16) * 10 + 2000# 结束任务endDS1302()return datetime(year, month, day, hour, minute, second)# 时间格式化
def format_time(dt):if dt is None:return ""fmt = "%m/%d/%Y %H:%M"return dt.strftime(fmt)def parse_time(s):fmt = "%m/%d/%Y %H:%M"return datetime.strptime(s, fmt)

主要有2个函数,一个是setDatetime(year, month, day,  hour, minute, second, dayOfWeek),一个是getDatetime()。日期参数可以删掉,也可以随便给一个。在主程序中如果要引用这个驱动文件.py,使用 from ds1302 import * 。

4、主程序

from datetime import datetimefrom ds1302 import *import time# 初始化程序def datetime_setup():print ('')print ('')print (getDatetime())  # 获取时间信息print ('')print ('')ds_a = input( "Do you want to setup date and time?(y/n/c)\n c:Set the current time to the system time\n")     # 是否更新时间if ds_a == 'y' or ds_a == 'Y':                                           # 重新更新时间ds_date = input("Input date:(YYYY MM DD) ")                          # 输入年月日ds_time = input("Input time:(HH MM SS) ")                            # 输入时分秒ds_date = list(map(lambda x: int(x), ds_date.split()))                  # 判断格式        ds_time = list(map(lambda x: int(x), ds_time.split()))                  # 判断格式print ('')print ('')setDatetime(ds_date[0], ds_date[1], ds_date[2], ds_time[0], ds_time[1], ds_time[2],33) # 设置时间dt = getDatetime()             # 获取当前时间print ("You set the date and time to:", dt)  # 打印出当前时间if ds_a == 'c' or ds_a == 'C':    current_datetime()print ("current time is:", getDatetime()) # 循环函数def datetime_loop():while True:dt= getDatetime()  # 获取时间print (dt)       # 打印出时间time.sleep(1) # 延时1S# 释放资源def resource_destory():endDS1302()				# 释放资源#获取当前时间写入ds1302def current_datetime():current = datetime.now()year = current.yearmonth = current.monthday = current.dayhour = current.hourminute = current.minutesecond = current.secondweek = current.weekday()setDatetime(year,month,day,hour,minute,second,week)# 程序入口if __name__ == '__main__':		datetime_setup()try:datetime_loop()         # 循环函数except KeyboardInterrupt:  	# 当按下Ctrl+C时,将执行destroy()子程序。resource_destory()      # 释放资源

启动后可以不设置时间n,可以设置时间y,也可以读取系统时间设置到DS1302(C)。设置后,每隔一秒读取寄存器日期时间值,打印到屏幕上面。也可以显示到OLED上面。

显示到OLED上面需要把之前的显示封装成函数,在主程序中获取日期时间后调用。

5、问题

具体显示的结果参考之前的接线实物图,但是OLED显示会出现闪烁问题,就是用time.sleep(1)导致的,这个和C中的delay函数一样,对于这个问题,解决办法,是将获取时间函数直接放到OLED显示函数里面。

def Oled_display(x,y):global devicedevice = load_device()font = ImageFont.truetype('STKAITI.TTF',16)while True:with canvas(device) as draw:draw.rectangle(device.bounding_box, outline=0, fill=0)draw.text((x,y),str(getDatetime()),font=font, fill='white')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言函数:编程世界的魔法钥匙(2)-学习笔记

引言 注:由于这部分内容比较抽象,而小编我又是一个刚刚进入编程世界的计算机小白,所以我的介绍可能会有点让人啼笑皆非。希望大家多多包涵!万分感谢!待到小编我学有所成,一定会把这块知识点重新介绍一遍&a…

[Day 32] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI中的神經網絡技術 神經網絡(Neural Networks)是人工智能(AI)領域的一個重要分支,靈感來自於生物神經系統。本文將深入探討神經網絡的基本概念、結構、工作原理及其在AI中的應用,並通過Python代碼詳細解釋…

HarmonyOS Web组件(二)

1. HarmonyOS Web组件 官方文档 1.1. 混合开发的背景和好处 混合开发(Hybrid Development)是一种结合原生应用和Web应用的开发模式,旨在同时利用两者的优势。随着移动应用需求的多样化和复杂化,单一的开发方式往往难以满足所有…

sass版本更新,不推荐使用嵌套规则后的声明

目前在 Sass 中不推荐使用嵌套规则后的声明,在 为了通知用户即将进行的更改,并给他们时间进行更改 与之兼容的样式表。在未来的版本中,Dart Sass 将更改为 匹配纯 CSS 嵌套生成的顺序。Deprecation Warning: Sasss behavior for declarations…

Pytorch学习笔记【B站:小土堆】

文章目录 1 基础环境配置(CPU版)2 PyTorch学习2.1 Dataset和DataLoader2.1.1 Dataset2.1.2 DataLoader 2.2 Tensorboardadd_scalaradd_imageadd_graph 2.3 Transforms2.3.1 ToTensor2.3.2 Normalize2.3.3 Resize2.3.4 Compose 2.4 torchvision中的数据集…

pnpm build打包时占内溢出

这两天在打包H5网页的时候失败,总是提示下方错误 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 严重错误:堆限制附近标记压缩无效分配失败 - JavaScript 堆内存不足 尝试了多种方法&…

Linux源码安装的Redis如何配置systemd管理并设置开机启动

文章目录 实验前提实验 实验前提 已完成源码安装并能正常启动redis /usr/local/bin/redis-server能正常启动redis 实验 vim /etc/systemd/system/redis.service内容如下: [unit] Descriptionredis-server Afternetwork.target[Service] Typeforking ExecStart/…

【Blockly图形化积木编程二次开发学习笔记】5.自动保存与恢复

文章目录 引用使用 引用 <script src"./blockly/appengine/storage.js"></script>使用 <script>window.setTimeout(BlocklyStorage.restoreBlocks, 0); // 从本地存储中恢复块BlocklyStorage.backupOnUnload(); // 用户离开页面时自动将块备份到…

降雨量预测 | Matlab基于ARIMA-RBF降雨量预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 降雨量预测 | Matlab基于ARIMA-RBF降雨量预测 注&#xff1a;程序和数据放在一个文件夹。 程序语言为matlab&#xff0c;程序可出预测效果图&#xff0c;指标图; 代码特点&#xff1a;参数化编程、参数可方便更改、代…

web前端学习笔记Day02

web学习Day02 一、页面布局 盒子模型 盒子将页面的所有标签都包含在了一个矩形区域content(内容区域)->padding(内边距区域)->border(边框区域)->margin(外边距区域) div标签: 一行只能显示一个&#xff08;独占一行&#xff09;width默认为父元素宽度&#xff0c…

Docker核心技术:Docker原理之Namespace

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Namespace&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1…

多模态AI:概念、用例、优势、挑战及发展未来

多模态实际上是在尝试复制人类的感知方式&#xff1a;我们将视觉、声音和触觉等感官输入结合起来&#xff0c;形成对现实的更细致入微的感知&#xff0c;并利用这些数据来做出决定或采取行动。多模态模式也在尝试做同样的事情。 多模态AI的应用范围正在不断扩大&#xff0c;那么…

使用 useLazyAsyncData 提升数据加载体验

title: 使用 useLazyAsyncData 提升数据加载体验 date: 2024/7/19 updated: 2024/7/19 author: cmdragon excerpt: 摘要&#xff1a;本文介绍useLazyAsyncData函数在Nuxt 3中的使用&#xff0c;以提升数据加载体验。此函数支持异步获取数据并在组件中处理挂起与错误状态&…

IOCTLance:一款针对x64 WDM驱动程序的漏洞检测工具

关于IOCTLance IOCTLance是一款针对x64 WDM驱动程序的漏洞检测工具&#xff0c;该工具来源于CODE BLUE 2023上展示的一个名为“使用符号执行和污点分析增强 WDM 驱动程序漏洞检测 ”的项目。该工具能够有效增强检测Windows驱动程序模型&#xff08;WDM&#xff09;驱动程序中各…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串&#xff0c;如下所示&#xff0c;a、b、c、d、e五个元素从左到右组成了一个有序的列表&#xff0c;列表中的…

微软史诗级的蓝屏

本周经历了微软的蓝屏&#xff0c;一直到周末还在加班处理公司的问题。 个人终端受到的影响较大&#xff0c;服务器上也受到了影响。因为蓝屏的事情导致不少麻烦&#xff0c;据同事说因为蓝屏的问题&#xff0c;MGH 的手术安排也受到了影响。 目前我们也在着手处理有部署 Wind…

基于SpringBoot+Vue的网吧管理系统(带1w+文档)

基于SpringBootVue的网吧管理系统(带1w文档) 基于SpringBootVue的网吧管理系统(带1w文档) 网吧管理系统&#xff0c;为了随时随地查看网吧管理信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理网吧的方式方法&#xff0c;更提供了其他想要了解网吧管理信息及…

【云原生】Prometheus 服务自动发现使用详解

目录 一、前言 二、Prometheus常规服务监控使用现状​​​​​​​ 2.1 Prometheus监控架构图 2.2 Prometheus服务自动发现的解决方案 三、Prometheus服务自动发现介绍 3.1 什么是Prometheus服务自动发现 3.2 Prometheus自动服务发现策略 3.3 Prometheus自动服务发现应用…

SQL39道常见题型

SQL1 查询所有列 现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果。 select * from user_profile 结果&#xff1a; SQL2 查询多列 还是上面那个输入&#xff0c;题目换成&#xff1a;现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#…

Springboot同时支持http和https访问

springboot默认是http的 一、支持https访问 需要生成证书&#xff0c;并配置到项目中。 1、证书 如果公司提供&#xff0c;则直接使用公司提供的证书&#xff1b; 如果公司没有提供&#xff0c;也可自己使用Java自带的命令keytool来生成&#xff1a; &#xff08;1&#x…