0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用树莓派连接4位七段显示模块并在其上显示时间

科技观察员 来源:circuitdigest 作者:阿斯文斯·拉吉 2023-01-01 09:56 次阅读

我们都知道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段显示器:共阴极和共阳极,这里我们使用共阴极七段显示器。


pYYBAGOs8-OAFXXbAAAWC9KsOAg347.gif

现在我们知道如何在单个 7 段显示器上显示所需的数字字符。但是,很明显,我们需要一个以上的 7 段显示器来传达任何超过一位数字的信息。因此,在本教程中,我们将使用4 位 7 段显示模块,如下所示。

poYBAGOs8-WALcgsAABpEzb-Txk831.jpg

正如我们所看到的,有四个七段显示器连接在一起。我们知道每个 7 段模块将有 10 个引脚,对于 4 个七段显示器,总共会有 40 个引脚,任何人都会忙于将它们焊接在点板上,所以我强烈建议任何人购买模块或制作自己的 PCB 以使用 4 位 7 段显示器。其连接原理图如下所示:

poYBAGOs8-eAe7vPAABRASJcGTI318.gif

要了解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 位七段显示模块与树莓派连接来的树莓派数字时钟原理图:

pYYBAGOs8-iAJEBzAACrsQrk4J8408.png

下表还将帮助您进行连接并验证其是否符合上面显示的原理图。

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

pYYBAGOs8-yAJUCDAADerbCCqlw199.jpg

确定模块上的引脚,就可以继续连接了。在树莓派中发现 GPIO 引脚可能是一项具有挑战性的任务,因此我为您提供了这张 GPIO 引脚的图片。

对树莓派进行编程

在这里,我们使用Python编程语言来编程RPi。有很多方法可以对树莓派进行编程。在本教程中,我们使用Python 3 IDE,因为它是最常用的一个。

我们将讨论我们将在该项目的 PYHTON 程序中使用的一些命令,

首先,我们将从库中导入GPIO文件,下面的功能使我们能够对PI的GPIO引脚进行编程。我们还将“GPIO”重命名为“IO”,因此在程序中,每当我们想引用GPIO引脚时,我们都会使用“IO”一词。我们还导入了时间和日期时间,以从 Rsp Pi 读取时间值。

import RPi.GPIO as GPIO
import 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 1
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, 0) #Off initially
#Digit 2
GPIO.setup(8, GPIO.OUT)
GPIO.output(8, 0) #Off initially
#Digit 3
GPIO.setup(25, GPIO.OUT)
GPIO.output(25, 0) #Off initially
#Digit 4
GPIO.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

同样,我们有所有数字和字母的序列号。您可以自己编写或使用下面的图表。

poYBAGOs8-2AfgrpAABVFs9DcBE685.gif

有了这些数据,我们可以在 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.hour
minute = now.minute
h1 = hour/10
h2 = hour % 10
m1 = minute /10
m2 = minute % 10
print (h1,h2,m1,m2)
我们必须分别在四位数字上显示这四个变量值。要将变量值写入数字,我们可以使用以下行。在这里,我们通过使其变高来显示在数字 1 上,然后将调用函数 print_segment(变量)以在段显示上显示变量中的值。您可能想知道为什么我们在那之后会有延迟,为什么我们在此之后关闭此数字。

GPIO.output(7, 1) #Turn on Digit One
print_segment (h1) #Print h1 on segment
time.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 端口无法获取它。

如果一切按预期工作,那么您应该在下面找到类似这样的内容。

poYBAGOs8-6AIVsTAADRGK4qArU319.jpg


import RPi.GPIO as GPIO

import time, datetime


now = datetime.datetime.now()


GPIO.setmode(GPIO.BCM)

GPIO.setwarnings(False)



#GPIO ports for the 7seg pins

segment8 = (26,19,13,6,5,11,9,10)




for segment in segment8:

GPIO.setup(segment, GPIO.OUT)

GPIO.output(segment, 0)



#Digit 1

GPIO.setup(7, GPIO.OUT)

GPIO.output(7, 0) #Off initially

#Digit 2

GPIO.setup(8, GPIO.OUT)

GPIO.output(8, 0) #Off initially

#Digit 3

GPIO.setup(25, GPIO.OUT)

GPIO.output(25, 0) #Off initially

#Digit 4

GPIO.setup(24, GPIO.OUT)

GPIO.output(24, 0) #Off initially



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]



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.hour

minute = now.minute

h1 = hour/10

h2 = hour % 10

m1 = minute /10

m2 = minute % 10

print (h1,h2,m1,m2)




delay_time = 0.001 #delay to create virtual effect





GPIO.output(7, 1) #Turn on Digit One

print_segment (h1) #Print h1 on segment

time.sleep(delay_time)

GPIO.output(7, 0) #Turn off Digit One


GPIO.output(8, 1) #Turn on Digit One

print_segment (h2) #Print h1 on segment

GPIO.output(10, 1) #Display point On

time.sleep(delay_time)

GPIO.output(10, 0) #Display point Off

GPIO.output(8, 0) #Turn off Digit One


GPIO.output(25, 1) #Turn on Digit One

print_segment (m1) #Print h1 on segment

time.sleep(delay_time)

GPIO.output(25, 0) #Turn off Digit One


GPIO.output(24, 1) #Turn on Digit One

print_segment (m2) #Print h1 on segment

time.sleep(delay_time)

GPIO.output(24, 0) #Turn off Digit One



#time.sleep(1)



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4278

    浏览量

    164195
  • 显示模块
    +关注

    关注

    1

    文章

    46

    浏览量

    23524
收藏 人收藏

    评论

    相关推荐

    如何将柔性传感器与树莓连接并在LCD屏幕上显示其值

    在这个项目中,我们将学习如何将柔性传感器与树莓连接并在LCD屏幕上显示其值。
    的头像 发表于 12-31 09:33 3412次阅读
    如何将柔性传感器与<b class='flag-5'>树莓</b>派<b class='flag-5'>连接</b><b class='flag-5'>并在</b>LCD屏幕上<b class='flag-5'>显示</b>其值

    labview8七段数码显示

    网友奉献的,表示感谢.七段显示器你可以输入任意的整数数字会自动转成七段显示器(Cluster Array)lv8.6:[hide][/hide]lv9.0:[hide] [/hide]
    发表于 12-12 11:11

    用簇实现七段数码管显示系统时间

    用簇实现七段数码管显示系统时间
    发表于 08-14 17:52

    七段数码管显示

    共阳的四七段数码管怎样动态显示数字啊,因为个人认为A、B C D E F G DP 都是分别公用的,个人认为四只数码管只能显示一样的数字,不能显示
    发表于 06-22 22:18

    树莓晴雨表天气时钟

    ` 本帖最后由 348081236 于 2016-2-18 17:44 编辑 在本教程我将展示如何用树莓2和BMP180 I2C 传感器做一个简单的Adafruit 4
    发表于 12-28 15:05

    七段数码管显示程序

    请问,如果用两个74HC575驱动两个七段数码管,并将两个数码管的DS、SH_CP、ST_CP连在一起,只有使能端OE是分开的,那我怎么写程序来选择控制两个数码管显示单片机上温度传感器采集的温度值两位数呢?求程序,谢谢!
    发表于 05-19 09:53

    七段显示 7segment display

    请问这些设计图哪里有问题??第一张不对 ? 求助!!!!我设计 把学生号码显示七段显示(7segment display)奇数=1 剩下的为0例如 我的学生号99801
    发表于 09-27 18:40

    如何在七段显示显示4个字符

    大家好,不,我不知道如何在七段显示显示4个字符;)我的问题是:为什么我必须将50MHz时钟计算到1KHz? (因此,每
    发表于 05-15 12:42

    请问我如何才能将七段显示器与Spartan 3e入门套件连接

    今天我购买了4七段显示器。我有共阴极和共阳极显示器。我如何将它与我的Spatran 3e连接
    发表于 06-05 08:40

    何用PIC16f887在复接七段显示显示一个四数字?

    伙计们,我试图用PIC16f887在复接七段显示显示一个四数字。但是我不能使四数字在四个七段
    发表于 10-30 10:06

    七段数码管显示方法有哪几种方式?其代码怎样去编写?

    什么是七段数码管?七段数码管的结构是由哪些部分组成的?七段数码管显示方法有哪几种方式?其代码怎样去编写?
    发表于 07-14 06:57

    数码管分为哪几种?七段数码管的显示原理是什么?

    什么是七段数码管?七段数码管有哪些优点以及应用?数码管分为哪几种?七段数码管的显示原理是什么?
    发表于 07-19 07:57

    七段数码管显示电子钟设计

    状态监控16、七段数码管显示电子钟17、闪烁灯18、电子秒表19、跑马灯20、函数发生器21、环境温度采集系统[直接添加扣+3098024513]...
    发表于 09-06 07:46

    如何利用51单片机实现七段数码管的显示

    如何利用51单片机实现七段数码管的显示
    发表于 10-21 06:54

    DIY一个大型七段显示

    描述巨型模块七段显示器对于我正在进行的一个最近的项目,我需要一个大型七段显示器。我可以找到一些现成的,大约两三英寸高——但我需要更大的。出
    发表于 07-11 06:16