世界新消息丨如何用树莓派连接4位七段显示模块并在其上显示时间
我们都知道Raspberry Pi是一个基于ARM微处理器的精彩开发平台。凭借其高计算能力,它可以在电子爱好者或学生手中创造奇迹。只有当我们知道如何使其与现实世界交互并通过某些输出设备分析数据时,所有这些都是可能的。有许多传感器可以从实时世界中检测某些参数并将其传输到数字世界,我们在LCD屏幕或其他显示器中查看它们。但是,使用带有PI的LCD屏幕来显示少量数据总是不经济的。这是我们更喜欢使用 16x2 字母数字 LCD 显示器或 7 段显示器的地方。
今天我们将用树莓派连接 4 位七段显示模块并在其上显示时间。
(相关资料图)
尽管 16x2 字母数字 LCD 比 7 段显示器舒适得多,但在少数情况下,7 段显示器比 LCD 显示器更方便。LCD的缺点是字符大小小,如果您只是打算显示一些数值,那么对于您的项目来说将是矫枉过正的。7段在光线条件差的情况下也具有优势,可以从比普通LCD屏幕更宽的角度观看。所以,让我们开始了解它。
7 段和 4 位 7 段显示模块:
7段显示器中有七个段,每个段内部都有一个LED,通过点亮相应的段来显示数字。就像如果您希望 7 段显示数字“5”一样,您需要通过使它们相应的引脚变高来发光段 a、f、g、c 和 d。有两种类型的7段显示器:共阴极和共阳极,这里我们使用共阴极七段显示器。
现在我们知道如何在单个 7 段显示器上显示所需的数字字符。但是,很明显,我们需要一个以上的 7 段显示器来传达任何超过一位数字的信息。因此,在本教程中,我们将使用4 位 7 段显示模块,如下所示。
正如我们所看到的,有四个七段显示器连接在一起。我们知道每个 7 段模块将有 10 个引脚,对于 4 个七段显示器,总共会有 40 个引脚,任何人都会忙于将它们焊接在点板上,所以我强烈建议任何人购买模块或制作自己的 PCB以使用 4 位 7 段显示器。其连接原理图如下所示:
要了解4 位七段模块的工作原理,我们必须研究上述原理图,如图所示,所有四个显示器的 A 引脚都连接在一起,作为一个 A,对于 B,C 也是如此。直到DP。所以,基本上如果触发 A 打开,那么所有四个 A 都应该变高吧?
但是,这不会发生。我们还有从D0到D3(D0,D1,D2和D3)的另外四个引脚,可用于控制四个显示器中的哪个应该变高。例如:如果我需要我的输出只出现在第二个显示器上,那么只有D1应该设置为高电平,同时保持其他引脚(D0、D2和D3)为低电平。简单地说,我们可以使用从 D0 到 D3 的引脚选择哪个显示器必须处于活动状态,以及使用从 A 到 DP 的引脚显示哪个字符。
将 4 位 7 段模块与树莓派连接:
让我们看看如何,如何将这个 4 位 7 段模块与我们的 Raspberry Pi 连接起来。7 段模块有 16 个引脚,如下所示。您的模块可能更少,但不要担心它仍然会具有以下内容
7 或 8 段引脚(此处引脚从 1 到 8 开始)
接地引脚(此处为引脚 11)
4 位引脚(此处为引脚 13 至 16)
下面给出的是将4 位七段显示模块与树莓派连接来的树莓派数字时钟原理图:
下表还将帮助您进行连接并验证其是否符合上面显示的原理图。
S.No | Rsp Pi GPIO 编号 | RSP Pi 密码 | 7 段名称 | 7-Seg 引脚编号(在本模块中) |
1 | GPIO 26 | 引脚 37 | 段 A | 1 |
2 | GPIO 19 | 引脚 35 | B段 | 2 |
3 | 通用信息总局 13 | 引脚 33 | C段 | 3 |
4 | GPIO 6 | 引脚 31 | 段 d | 4 |
5 | GPIO 5 | 引脚 29 | 段 e | 5 |
6 | GPIO 11 | 引脚 23 | 段 f | 6 |
7 | GPIO 9 | 引脚 21 | 段 g | 7 |
8 | GPIO 10 | 引脚 19 | 段 DP | 8 |
9 | GPIO 7 | 引脚 26 | 数字 1 | 13 |
10 | GPIO 8 | 引脚 24 | 数字 2 | 14 |
11 | GPIO 25 | 引脚 22 | 数字 3 | 15 |
12 | GPIO 24 | 引脚 18 | 数字 4 | 16 |
13 | 地 | 地 | 地 | 11 |
确定模块上的引脚,就可以继续连接了。在树莓派中发现 GPIO 引脚可能是一项具有挑战性的任务,因此我为您提供了这张 GPIO 引脚的图片。
对树莓派进行编程:
在这里,我们使用Python编程语言来编程RPi。有很多方法可以对树莓派进行编程。在本教程中,我们使用Python 3 IDE,因为它是最常用的一个。
我们将讨论我们将在该项目的 PYHTON 程序中使用的一些命令,首先,我们将从库中导入GPIO文件,下面的功能使我们能够对PI的GPIO引脚进行编程。我们还将“GPIO”重命名为“IO”,因此在程序中,每当我们想引用GPIO引脚时,我们都会使用“IO”一词。我们还导入了时间和日期时间,以从 Rsp Pi 读取时间值。import RPi.GPIO as GPIOimport time, datetime有时,当我们尝试使用的GPIO引脚可能正在执行其他一些功能时。在这种情况下,我们将在执行程序时收到警告。以下命令告诉 PI 忽略警告并继续程序。IO.setwarnings(False)我们可以参考 PIO 的 GPIO 引脚,可以通过板上的引脚编号或功能编号来引用。就像板上的“PIN 29”是“GPIO5”。所以我们在这里告诉要么我们要用“29”或“5”来表示这里的引脚。GPIO。BCM 表示我们将使用 5 表示 GPIO5 引脚 29。IO.setmode (GPIO.BCM)与往常一样,我们应该从初始化引脚开始,这里的段引脚和数字引脚都是输出引脚。出于编程目的,我们为段引脚形成数组,并在将它们声明为 GPIO 后将它们初始化为“0”。外segment8 = (26,19,13,6,5,11,9,10)for segment in segment8:GPIO.setup(segment, GPIO.OUT)GPIO.output(segment, 0)同样,对于数字引脚,我们将其声明为输出引脚,并默认将它们设置为“0”#Digit 1GPIO.setup(7, GPIO.OUT)GPIO.output(7, 0) #Off initially#Digit 2GPIO.setup(8, GPIO.OUT)GPIO.output(8, 0) #Off initially#Digit 3GPIO.setup(25, GPIO.OUT)GPIO.output(25, 0) #Off initially#Digit 4GPIO.setup(24, GPIO.OUT)GPIO.output(24, 0) #Off initially
我们必须形成数组以在七段显示器上显示每个数字。要显示一个数字,我们必须控制所有 7 个段引脚(不包括点引脚),也就是说,它们必须关闭或打开。例如,为了显示数字 5,我们进行了以下安排
S.No | Rsp Pi GPIO 编号 | 7 段名称 | 显示“5”的状态。(0-> 关闭,1->打开) |
1 | GPIO 26 | 段 A | 1 |
2 | GPIO 19 | B段 | 1 |
3 | GPIO 13 | C段 | 0 |
4 | GPIO 6 | 段 d | 1 |
5 | GPIO 5 | 段 e | 1 |
6 | GPIO 11 | 段 f | 0 |
7 | GPIO 9 | 段 g | 1 |
同样,我们有所有数字和字母的序列号。您可以自己编写或使用下面的图表。
有了这些数据,我们可以在 python 程序中为每个数字形成数组,如下所示。
null = [0,0,0,0,0,0,0]zero = [1,1,1,1,1,1,0]one = [0,1,1,0,0,0,0]two = [1,1,0,1,1,0,1]three = [1,1,1,1,0,0,1]four = [0,1,1,0,0,1,1]five = [1,0,1,1,0,1,1]six = [1,0,1,1,1,1,1]seven = [1,1,1,0,0,0,0]eight = [1,1,1,1,1,1,1]nine = [1,1,1,1,0,1,1]如果您按照该程序进行操作,将有一个函数将每个字符显示在我们的 7 段显示器上,但是,让我们暂时跳过它并进入无限循环。从树莓派读取当前时间并在四个变量之间拆分时间值。例如,如果时间为 10.45,则变量 h1 将有 1,h2 将有 0,m1 将有 4v,m2 将有 5。now = datetime.datetime.now()hour = now.hourminute= now.minuteh1 = hour/10h2 = hour % 10m1 = minute /10m2 = minute % 10print (h1,h2,m1,m2)我们必须分别在四位数字上显示这四个变量值。要将变量值写入数字,我们可以使用以下行。在这里,我们通过使其变高来显示在数字 1 上,然后将调用函数 print_segment(变量)以在段显示上显示变量中的值。您可能想知道为什么我们在那之后会有延迟,为什么我们在此之后关闭此数字。GPIO.output(7, 1) #Turn on Digit Oneprint_segment (h1) #Print h1 on segmenttime.sleep(delay_time)GPIO.output(7, 0) #Turn off Digit One原因是,正如我们所知,我们一次只能显示一个数字,但是我们要显示四个数字,并且只有当所有四个数字都显示时,用户才能看到完整的四位数字。那么,如何同时显示所有 4 位数字?幸运的是,我们的 MPU 比人眼快得多,所以我们实际上要做的是:我们一次显示一个数字,但我们做得非常快,如上所示。我们选择一位数字显示它等待 2ms(可变 delay_time),以便 MPU 和 7 段可以处理它,然后关闭该数字并移动到下一个数字并执行相同的操作,直到我们到达最后一个数字。人眼无法观察到这种 2ms 的延迟,所有四个数字似乎同时处于 ON 状态。最后要学习的是了解print_segment(变量)函数的工作原理。在这个函数中,我们使用到目前为止声明的数组。因此,无论我们发送到此函数的任何变量都应该具有介于 (0-9) 之间的值,变量字符将接收此值并将其与实际值进行比较。此处将变量与“1”进行比较。同样,我们将与 0 到 9 的所有数字进行比较。如果是匹配项,我们使用数组并将每个值分配给其各自的段引脚,如下所示。def print_segment(charector):if charector == 1:for i in range(7):GPIO.output(segment8[i], one[i])
使用 Raspberry Pi 在 4 位 7 段上显示时间:
使用此处给出的原理图和代码进行连接并相应地对树莓派进行编程。完成所有操作后,只需启动程序,您应该会在七段显示中找到当前时间。但是,在此之前,您必须检查一些事情
确保您已将树莓派设置为当前时间,以防万一它在离线时间运行。
使用适配器而不是笔记本电脑/计算机为您的 Raspberry pi 供电,因为 7 段显示器消耗的电流量很高,并且您的 USB端口无法获取它。
如果一切按预期工作,那么您应该在下面找到类似这样的内容。
import RPi.GPIO as GPIOimport time, datetimenow = datetime.datetime.now()GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)#GPIO ports for the 7seg pinssegment8 = (26,19,13,6,5,11,9,10)for segment in segment8:GPIO.setup(segment, GPIO.OUT)GPIO.output(segment, 0)#Digit 1GPIO.setup(7, GPIO.OUT)GPIO.output(7, 0) #Off initially#Digit 2GPIO.setup(8, GPIO.OUT)GPIO.output(8, 0) #Off initially#Digit 3GPIO.setup(25, GPIO.OUT)GPIO.output(25, 0) #Off initially#Digit 4GPIO.setup(24, GPIO.OUT)GPIO.output(24, 0) #Off initiallynull = [0,0,0,0,0,0,0]zero = [1,1,1,1,1,1,0]one = [0,1,1,0,0,0,0]two = [1,1,0,1,1,0,1]three = [1,1,1,1,0,0,1]four = [0,1,1,0,0,1,1]five = [1,0,1,1,0,1,1]six = [1,0,1,1,1,1,1]seven = [1,1,1,0,0,0,0]eight = [1,1,1,1,1,1,1]nine = [1,1,1,1,0,1,1]def print_segment(charector):if charector == 1:for i in range(7):GPIO.output(segment8[i], one[i])if charector == 2:for i in range(7):GPIO.output(segment8[i], two[i])if charector == 3:for i in range(7):GPIO.output(segment8[i], three[i])if charector == 4:for i in range(7):GPIO.output(segment8[i], four[i])if charector == 5:for i in range(7):GPIO.output(segment8[i], five[i])if charector == 6:for i in range(7):GPIO.output(segment8[i], six[i])if charector == 7:for i in range(7):GPIO.output(segment8[i], seven[i])if charector == 8:for i in range(7):GPIO.output(segment8[i], eight[i])if charector == 9:for i in range(7):GPIO.output(segment8[i], nine[i])if charector == 0:for i in range(7):GPIO.output(segment8[i], zero[i])return;while 1:now = datetime.datetime.now()hour = now.hourminute = now.minuteh1 = hour/10h2 = hour % 10m1 = minute /10m2 = minute % 10print (h1,h2,m1,m2)delay_time = 0.001 #delay to create virtual effectGPIO.output(7, 1) #Turn on Digit Oneprint_segment (h1) #Print h1 on segmenttime.sleep(delay_time)GPIO.output(7, 0) #Turn off Digit OneGPIO.output(8, 1) #Turn on Digit Oneprint_segment (h2) #Print h1 on segmentGPIO.output(10, 1) #Display point Ontime.sleep(delay_time)GPIO.output(10, 0) #Display point OffGPIO.output(8, 0) #Turn off Digit OneGPIO.output(25, 1) #Turn on Digit Oneprint_segment (m1) #Print h1 on segmenttime.sleep(delay_time)GPIO.output(25, 0) #Turn off Digit OneGPIO.output(24, 1) #Turn on Digit Oneprint_segment (m2) #Print h1 on segmenttime.sleep(delay_time)GPIO.output(24, 0) #Turn off Digit One#time.sleep(1)