我們都知道Raspberry Pi是一個基于ARM微處理器的精彩開發(fā)平臺。憑借其高計算能力,它可以在電子愛好者或?qū)W生手中創(chuàng)造奇跡。只有當(dāng)我們知道如何使其與現(xiàn)實世界交互并通過某些輸出設(shè)備分析數(shù)據(jù)時,所有這些都是可能的。有許多傳感器可以從實時世界中檢測某些參數(shù)并將其傳輸?shù)綌?shù)字世界,我們在LCD屏幕或其他顯示器中查看它們。但是,使用帶有PI的LCD屏幕來顯示少量數(shù)據(jù)總是不經(jīng)濟(jì)的。這是我們更喜歡使用 16x2 字母數(shù)字 LCD 顯示器或 7 段顯示器的地方。
今天我們將用樹莓派連接 4 位七段顯示模塊并在其上顯示時間。
盡管 16x2 字母數(shù)字 LCD 比 7 段顯示器舒適得多,但在少數(shù)情況下,7 段顯示器比 LCD 顯示器更方便。LCD的缺點是字符大小小,如果您只是打算顯示一些數(shù)值,那么對于您的項目來說將是矯枉過正的。7段在光線條件差的情況下也具有優(yōu)勢,可以從比普通LCD屏幕更寬的角度觀看。所以,讓我們開始了解它。
7 段和 4 位 7 段顯示模塊:
7段顯示器中有七個段,每個段內(nèi)部都有一個LED,通過點亮相應(yīng)的段來顯示數(shù)字。就像如果您希望 7 段顯示數(shù)字“5”一樣,您需要通過使它們相應(yīng)的引腳變高來發(fā)光段 a、f、g、c 和 d。有兩種類型的7段顯示器:共陰極和共陽極,這里我們使用共陰極七段顯示器。
現(xiàn)在我們知道如何在單個 7 段顯示器上顯示所需的數(shù)字字符。但是,很明顯,我們需要一個以上的 7 段顯示器來傳達(dá)任何超過一位數(shù)字的信息。因此,在本教程中,我們將使用4 位 7 段顯示模塊,如下所示。
正如我們所看到的,有四個七段顯示器連接在一起。我們知道每個 7 段模塊將有 10 個引腳,對于 4 個七段顯示器,總共會有 40 個引腳,任何人都會忙于將它們焊接在點板上,所以我強烈建議任何人購買模塊或制作自己的 PCB 以使用 4 位 7 段顯示器。其連接原理圖如下所示:
要了解4 位七段模塊的工作原理,我們必須研究上述原理圖,如圖所示,所有四個顯示器的 A 引腳都連接在一起,作為一個 A,對于 B,C 也是如此。直到DP。所以,基本上如果觸發(fā) A 打開,那么所有四個 A 都應(yīng)該變高吧?
但是,這不會發(fā)生。我們還有從D0到D3(D0,D1,D2和D3)的另外四個引腳,可用于控制四個顯示器中的哪個應(yīng)該變高。例如:如果我需要我的輸出只出現(xiàn)在第二個顯示器上,那么只有D1應(yīng)該設(shè)置為高電平,同時保持其他引腳(D0、D2和D3)為低電平。簡單地說,我們可以使用從 D0 到 D3 的引腳選擇哪個顯示器必須處于活動狀態(tài),以及使用從 A 到 DP 的引腳顯示哪個字符。
將 4 位 7 段模塊與樹莓派連接:
讓我們看看如何,如何將這個 4 位 7 段模塊與我們的 Raspberry Pi 連接起來。7 段模塊有 16 個引腳,如下所示。您的模塊可能更少,但不要擔(dān)心它仍然會具有以下內(nèi)容
7 或 8 段引腳(此處引腳從 1 到 8 開始)
接地引腳(此處為引腳 11)
4 位引腳(此處為引腳 13 至 16)
下面給出的是將4 位七段顯示模塊與樹莓派連接來的樹莓派數(shù)字時鐘原理圖:
下表還將幫助您進(jìn)行連接并驗證其是否符合上面顯示的原理圖。
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 | 數(shù)字 1 | 13 |
10 | GPIO 8 | 引腳 24 | 數(shù)字 2 | 14 |
11 | GPIO 25 | 引腳 22 | 數(shù)字 3 | 15 |
12 | GPIO 24 | 引腳 18 | 數(shù)字 4 | 16 |
13 | 地 | 地 | 地 | 11 |
確定模塊上的引腳,就可以繼續(xù)連接了。在樹莓派中發(fā)現(xiàn) GPIO 引腳可能是一項具有挑戰(zhàn)性的任務(wù),因此我為您提供了這張 GPIO 引腳的圖片。
對樹莓派進(jìn)行編程:
在這里,我們使用Python編程語言來編程RPi。有很多方法可以對樹莓派進(jìn)行編程。在本教程中,我們使用Python 3 IDE,因為它是最常用的一個。
我們將討論我們將在該項目的 PYHTON 程序中使用的一些命令,
首先,我們將從庫中導(dǎo)入GPIO文件,下面的功能使我們能夠?qū)I的GPIO引腳進(jìn)行編程。我們還將“GPIO”重命名為“IO”,因此在程序中,每當(dāng)我們想引用GPIO引腳時,我們都會使用“IO”一詞。我們還導(dǎo)入了時間和日期時間,以從 Rsp Pi 讀取時間值。
import RPi.GPIO as GPIO
import time, datetime
有時,當(dāng)我們嘗試使用的GPIO引腳可能正在執(zhí)行其他一些功能時。在這種情況下,我們將在執(zhí)行程序時收到警告。以下命令告訴 PI 忽略警告并繼續(xù)程序。
IO.setwarnings(False)
我們可以參考 PIO 的 GPIO 引腳,可以通過板上的引腳編號或功能編號來引用。就像板上的“PIN 29”是“GPIO5”。所以我們在這里告訴要么我們要用“29”或“5”來表示這里的引腳。GPIO。BCM 表示我們將使用 5 表示 GPIO5 引腳 29。
IO.setmode (GPIO.BCM)
與往常一樣,我們應(yīng)該從初始化引腳開始,這里的段引腳和數(shù)字引腳都是輸出引腳。出于編程目的,我們?yōu)槎我_形成數(shù)組,并在將它們聲明為 GPIO 后將它們初始化為“0”。外
segment8 = (26,19,13,6,5,11,9,10)
for segment in segment8:
GPIO.setup(segment, GPIO.OUT)
GPIO.output(segment, 0)
同樣,對于數(shù)字引腳,我們將其聲明為輸出引腳,并默認(rèn)將它們設(shè)置為“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
我們必須形成數(shù)組以在七段顯示器上顯示每個數(shù)字。要顯示一個數(shù)字,我們必須控制所有 7 個段引腳(不包括點引腳),也就是說,它們必須關(guān)閉或打開。例如,為了顯示數(shù)字 5,我們進(jìn)行了以下安排
S.No | Rsp Pi GPIO 編號 | 7 段名稱 |
顯示“5”的狀態(tài)。 (0-> 關(guān)閉,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 |
同樣,我們有所有數(shù)字和字母的序列號。您可以自己編寫或使用下面的圖表。
有了這些數(shù)據(jù),我們可以在 python 程序中為每個數(shù)字形成數(shù)組,如下所示。
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]
如果您按照該程序進(jìn)行操作,將有一個函數(shù)將每個字符顯示在我們的 7 段顯示器上,但是,讓我們暫時跳過它并進(jìn)入無限循環(huán)。從樹莓派讀取當(dāng)前時間并在四個變量之間拆分時間值。例如,如果時間為 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)
我們必須分別在四位數(shù)字上顯示這四個變量值。要將變量值寫入數(shù)字,我們可以使用以下行。在這里,我們通過使其變高來顯示在數(shù)字 1 上,然后將調(diào)用函數(shù) print_segment(變量)以在段顯示上顯示變量中的值。您可能想知道為什么我們在那之后會有延遲,為什么我們在此之后關(guān)閉此數(shù)字。
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
原因是,正如我們所知,我們一次只能顯示一個數(shù)字,但是我們要顯示四個數(shù)字,并且只有當(dāng)所有四個數(shù)字都顯示時,用戶才能看到完整的四位數(shù)字。
那么,如何同時顯示所有 4 位數(shù)字?
幸運的是,我們的 MPU 比人眼快得多,所以我們實際上要做的是:我們一次顯示一個數(shù)字,但我們做得非常快,如上所示。
我們選擇一位數(shù)字顯示它等待 2ms(可變 delay_time),以便 MPU 和 7 段可以處理它,然后關(guān)閉該數(shù)字并移動到下一個數(shù)字并執(zhí)行相同的操作,直到我們到達(dá)最后一個數(shù)字。人眼無法觀察到這種 2ms 的延遲,所有四個數(shù)字似乎同時處于 ON 狀態(tài)。
最后要學(xué)習(xí)的是了解print_segment(變量)函數(shù)的工作原理。在這個函數(shù)中,我們使用到目前為止聲明的數(shù)組。因此,無論我們發(fā)送到此函數(shù)的任何變量都應(yīng)該具有介于 (0-9) 之間的值,變量字符將接收此值并將其與實際值進(jìn)行比較。此處將變量與“1”進(jìn)行比較。同樣,我們將與 0 到 9 的所有數(shù)字進(jìn)行比較。如果是匹配項,我們使用數(shù)組并將每個值分配給其各自的段引腳,如下所示。
def print_segment(charector):
if charector == 1:
for i in range(7):
GPIO.output(segment8[i], one[i])
使用 Raspberry Pi 在 4 位 7 段上顯示時間:
使用此處給出的原理圖和代碼進(jìn)行連接并相應(yīng)地對樹莓派進(jìn)行編程。完成所有操作后,只需啟動程序,您應(yīng)該會在七段顯示中找到當(dāng)前時間。但是,在此之前,您必須檢查一些事情
確保您已將樹莓派設(shè)置為當(dāng)前時間,以防萬一它在離線時間運行。
使用適配器而不是筆記本電腦/計算機(jī)為您的 Raspberry pi 供電,因為 7 段顯示器消耗的電流量很高,并且您的 USB 端口無法獲取它。
如果一切按預(yù)期工作,那么您應(yīng)該在下面找到類似這樣的內(nèi)容。
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
+關(guān)注
關(guān)注
34文章
4438瀏覽量
168445 -
顯示模塊
+關(guān)注
關(guān)注
1文章
50瀏覽量
23604
發(fā)布評論請先 登錄
相關(guān)推薦
七段顯示 7segment display
七段LED顯示譯碼器,七段LED顯示譯碼器原理分析
如何以10進(jìn)位顯示8位數(shù)的七段顯示器?
使用ATmega328的七段顯示驅(qū)動程序
![使用ATmega328的<b class='flag-5'>七段</b><b class='flag-5'>顯示</b>驅(qū)動程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論