我們都知道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 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 |
同樣,我們有所有數字和字母的序列號。您可以自己編寫或使用下面的圖表。
有了這些數據,我們可以在 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 端口無法獲取它。
如果一切按預期工作,那么您應該在下面找到類似這樣的內容。
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
+關注
關注
34文章
4296瀏覽量
164866 -
顯示模塊
+關注
關注
1文章
46瀏覽量
23535
發布評論請先 登錄
相關推薦
評論