这节课,来学习如何控制双位数码管来显示时间的秒数。
电路原理
要使用一个电子元器件,首先是要掌握它的电路原理图,来看一下双位数码管的电路原理图:
关键看最下面的电路原理图
10号引脚和5号引脚,分别是数码管第一个数字和第二个数字的公共阳极。
如果要让数码管1的A管亮起来,需要10号引脚高电压,3号引脚低电压
如果要让数码管2的A管亮起来,需要5号引脚高电压,3号引脚低电压
再看一种情况:
让数码管1的A管亮B管亮,同时让数码管2的A管不亮B管亮
需要10号引脚高电压,3号9号引脚低电压
需要5号引脚高电压,3号高电压,9号低电压
由于2个不同数码管的A管的阴极共用了3号引脚,发现有冲突了:
要让数码管亮起来,10号和5号引脚必然是高电压
那么如果2个A管,一个要亮,另一个要不亮的时候,3号引脚因为共用,所以就无法实现了。
那么解决这个问题的办法是什么呢?
刷新机制
大家知道,看电影是由一张一张的静态图片连续播放来实现的,这是利用了人眼的视觉残留效应
也就是当光线进入人眼之后,会残留大约0.04秒,因此只要在1秒种之内连续播放25张图片,人眼就认为是连续的动画
大家家里常用的日光灯也是这个原理,日光灯并非一直亮着的,而是在以很快的频率进行亮灭亮灭,
当闪烁的频率达到每秒25次以上的时候,人眼就认为是一直亮着的。
可以利用这个原理,来实现2个数码管的看起来同时不同的数字。
办法就是对3号引脚的使用进行分时分配,也就是0.01秒用于数码管1的A管,然后接下来的0.01秒用于数码管2的A管
这样,1秒钟之内可以刷新50次,确保没有闪烁感
这样,3号引脚就可以通过分时分配用于2个数码管了,也就是让2个数码管闪烁足够快来实现目标。
全部灯管接线
树莓派GPIO的7号口,用杜邦线连接到单位数码管的10号引脚
树莓派GPIO的8号口,用杜邦线连接到单位数码管的5号引脚
树莓派GPIO的11号口,用杜邦线连接到单位数码管的3号引脚
树莓派GPIO的12号口,用杜邦线连接到单位数码管的9号引脚
树莓派GPIO的13号口,用杜邦线连接到单位数码管的8号引脚
树莓派GPIO的15号口,用杜邦线连接到单位数码管的6号引脚
树莓派GPIO的16号口,用杜邦线连接到单位数码管的7号引脚
树莓派GPIO的18号口,用杜邦线连接到单位数码管的4号引脚
树莓派GPIO的21号口,用杜邦线连接到单位数码管的1号引脚
树莓派GPIO的22号口,用杜邦线连接到单位数码管的2号引脚
实际接线图如下:
显示数字01
首先做一个循环,然后显示左边数字位0,然后休眠0.01秒,然后关闭左边数字显示,然后显示右边数字1,然后休眠0.01秒,然后关闭右边数字显示
继续循环,也就是循环一次为0.02秒,那么1秒钟,需要循环大约50次
假设总共亮3秒钟,总共循环次数为150次
要显示左边数字0,需要将ABCDEF管亮起来
需要7号口为True,8号口为False,也就是右边先不亮
需要11/12/13/15/16/18设置为False,21/22设置为True
休眠0.01秒
然后先将7号口设置为False,8号口设置为True,也就是左边不亮,右边亮
显示数字1,需要将BC管亮起来
需要12/13设置为False,11/15/16/18/21/22设置为True
可以使用函数来分别定义从数字0和1的显示控制
编写代码如下:
运行结果如下:
显示当前时间秒数
先增加数字2到9的显示函数
然后在循环内部,根据datetime模块的now函数取得当前的秒数
将秒数分成左边的数字和右边的数字,显示出来
假设总共循环2分钟,也就是120秒,大约总共循环次数为6000次
可以将循环次数设置为6000次
编写代码如下:
运行结果如下:
课后作业
1.考虑如何实现将前面温度传感器获得的温度数据显示到这个双位数码管上,温度超过15度则蜂鸣器报警。