概述
向任何項目添加LCD會立即使它提高一個檔次。本教程說明了如何使用6個GPIO引腳將廉價的HDD44780兼容LCD連接到Raspberry Pi。盡管還有其他方法可以使用I2C或UART進行連接,但這是直接使用裸機的最直接方法。
此技術(shù):
允許使用廉價LCD
不需要任何 i2c驅(qū)動程序
不會竊取Pi上唯一的串行端口。
示例Python代碼發(fā)送日期,時間和Pi的IP地址到顯示器。如果您在無頭模式下運行Pi,一眼就能確定IP地址非常方便。
要遵循本教程,您將需要
標(biāo)準(zhǔn)LCD 16x2 +其他功能
Pi T-Cobbler Plus,Pi Cobbler Plus用于模型B +/Pi 2或原始Pi補鞋匠
(2)半尺寸面包板
連接線
A Raspberry Pi(與所有26pin和40pin Pi兼容
您幾乎可以將任何字符LCD與本教程-適用于16x1、16x2、20x2、20x4 LCD。它不適用于40x4 LCD
將補鞋匠連接到LCD
LCD
每當(dāng)遇到帶有16個連接器的LCD顯示器時,最有可能使用HD44780控制器。這些設(shè)備提供相同的引出線,使其相對易于使用。 LCD使用并行接口,這意味著我們需要樹莓派的許多引腳來控制它。在本教程中,我們將使用4個數(shù)據(jù)引腳(4位模式)和兩個控制引腳。
數(shù)據(jù)引腳很簡單。他們正在將數(shù)據(jù)發(fā)送到顯示器(高/低切換)。我們將僅使用寫入模式,而不讀取任何數(shù)據(jù)。
寄存器選擇引腳有兩種用途。拉低時,它可以向LCD發(fā)送命令(例如移至或清除屏幕的位置)。這稱為寫指令或命令寄存器。當(dāng)以另一種方式切換(1)時,寄存器選擇引腳進入數(shù)據(jù)模式,并將其用于將數(shù)據(jù)發(fā)送到屏幕。
讀/寫引腳將被拉低(僅寫)。 ),因為我們只希望基于此設(shè)置寫入LCD。
啟用引腳將被切換為將數(shù)據(jù)寫入寄存器。
LCD引腳排列
接地
VCC- 5v不是3.3v
電位器的對比度調(diào)整(VO)
寄存器選擇(RS)。 RS = 0:命令,RS = 1:數(shù)據(jù)
讀/寫(R/W)。 R/W = 0:寫,R/W = 1:讀(我們將不使用此引腳)
時鐘(啟用)。觸發(fā)下降沿
位0 (4位操作中不使用)
位1 (4位操作中不使用)
位2 (在4位操作中不使用)
位3 (在4位操作中不使用)
第4位
第5位
第6位
第7位
背光LED陽極( +)
背光LED陰極(-)
在接線前,請檢查LCD是否具有LED背光,而不是EL背光。 LED背光使用10-40mA的功率,EL背光使用200 + ma! EL背光燈通常價格便宜但無法使用,請確保不要使用背光燈,否則Pi會過載。一些帶有LED背光的廉價LCD在LCD模塊的背光上沒有電阻,如果不確定,請在15針和5V引腳之間連接一個1Kohm電阻,而不是直接連接。 所有Adafruit液晶顯示器都具有帶內(nèi)置電阻器的LED背光燈,因此您不需要額外的電阻器!
5v LCD vs 3.3v Pi
樹莓派GPIO設(shè)計for3.3v,但我們的LCD是5v設(shè)備。 使用5v顯示屏很好,但前提是我們要從Pi向外發(fā)送數(shù)據(jù)。我們不會在補鞋匠上使用3.3v電源軌,我們將顯示器的 RW (讀/寫)引腳連接到GND,因為我們不希望顯示器發(fā)送5v信號進入Pi。
別越過溪流!
接線圖
首先,將補鞋匠電源引腳連接到面包板電源導(dǎo)軌。補鞋匠提供的+ 5.0V連接至紅色條紋導(dǎo)軌(紅色線),補鞋匠提供的GND連接至藍色條紋導(dǎo)軌(黑色線)
為了將數(shù)據(jù)發(fā)送至LCD,我們將其接線為遵循
LCD的引腳#1接地
LCD的引腳#2達到+ 5V
引腳#3(Vo)連接到電位計的中間
4號針(RS)連接到補鞋匠#22
Pin#5(RW)接地
Pin #6(EN)連接到補鞋匠#17
跳過LCD引腳#7,#8,#9和#10
引腳#11(D4)連接到補鞋匠#25
Pin#12(D5)連接到Cobbler#24
Pin#13(D6)連接到Cobber#23
Pin#14(D7)連接到Cobber#18
針#15(LED +)轉(zhuǎn)到+ 5V(紅線)
針#16(LED-)接地(黑色線)
然后連接電位計,左引腳接地(黑線),右引腳接地+ 5V(紅線)
以下是T-Cobbler Plus版本的草圖:
》素描以26針的補鞋匠覆盆子Pi(v1,v2)
準(zhǔn)備LCD
開始之前,請進行以下操作確保您有一個帶0.1“公頭的排針和一個10K電位器。所有Adafruit字符LCD都帶有這些部件,因此您應(yīng)該一切順利。
大多數(shù)LCD都有頂部有16個針腳的條帶,如果標(biāo)頭稍長,請將其斷開,直到其正確的長度
接下來,您需要將接頭連接到LCD。 您必須執(zhí)行此操作,僅嘗試“壓入” LCD是不可行的!
首先連接補鞋匠的 5V 和 GND 線到面包板。然后將針腳#1,#2和#15,#16連接到面包板電源導(dǎo)軌,如圖所示。背光應(yīng)點亮。如果沒有,請檢查接線!
接下來,進行對比電位計,如上圖所示,中間引腳連接到LCD引腳#3,另兩個引腳連接到5V并接地。
扭轉(zhuǎn)電位計,直到您看到LCD的第一行充滿了方框。如果看不到方框,請檢查接線!
完成 RS,RW,EN,D4,D5,D6,和 D7 引腳的接線,如圖所示
就是這樣!現(xiàn)在您可以運行Python腳本在屏幕上繪制文本了!
必要的軟件包
最新的Raspbian
您的Pi必須運行最新版本的Raspbian。本教程使用Raspbian Stretch(2018年11月)編寫。如果尚未為Raspberry Pi準(zhǔn)備SD卡,請查閱我們的指南。安裝完成后,請確保并運行以下命令以確保您的安裝軟件包是最新的。
下載:文件
復(fù)制代碼
$ sudo apt-get update -y
$ sudo apt-get upgrade -y $ sudo apt-get update -y
$ sudo apt-get upgrade -y
安裝pip3
pip3已與完整的Raspbian安裝一起安裝,但Raspbian Lite并未安裝包括pip3,因此需要按如下所示進行安裝。
下載:文件
復(fù)制代碼
$ sudo apt-get install python3-pip $ sudo apt-get install python3-pip
安裝adafruit-blinka
下載:文件
復(fù)制代碼
$ sudo pip3 install adafruit-blinka $ sudo pip3 install adafruit-blinka
安裝adafruit-circuitpython-charlcd
下載:文件
C opy代碼
$ sudo pip3 install adafruit-circuitpython-charlcd $ sudo pip3 install adafruit-circuitpython-charlcd
Python腳本
以下代碼可以下載到您的樹莓派上,并運行以在LCD顯示屏上獲取機器的日期,時間和IP地址。
代碼
下載:Project Zip 或 Drive_a_16x2_LCD_with_the_Raspberry_Pi.py | 在Github上查看
復(fù)制代碼
from subprocess import Popen, PIPE
from time import sleep
from datetime import datetime
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
# Modify this if you have a different sized character LCD
lcd_columns = 16
lcd_rows = 2
# compatible with all versions of RPI as of Jan. 2019
# v1 - v3B+
lcd_rs = digitalio.DigitalInOut(board.D22)
lcd_en = digitalio.DigitalInOut(board.D17)
lcd_d4 = digitalio.DigitalInOut(board.D25)
lcd_d5 = digitalio.DigitalInOut(board.D24)
lcd_d6 = digitalio.DigitalInOut(board.D23)
lcd_d7 = digitalio.DigitalInOut(board.D18)
# Initialise the lcd class
lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6,
lcd_d7, lcd_columns, lcd_rows)
# looking for an active Ethernet or WiFi device
def find_interface():
find_device = “ip addr show”
interface_parse = run_cmd(find_device)
for line in interface_parse.splitlines():
if “state UP” in line:
dev_name = line.split(‘:’)[1]
return dev_name
# find an active IP on the first LIVE network device
def parse_ip():
find_ip = “ip addr show %s” % interface
find_ip = “ip addr show %s” % interface
ip_parse = run_cmd(find_ip)
for line in ip_parse.splitlines():
if “inet ” in line:
ip = line.split(‘ ’)[5]
ip = ip.split(‘/’)[0]
return ip
# run unix shell command, return as ASCII
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
output = p.communicate()[0]
return output.decode(‘a(chǎn)scii’)
# wipe LCD screen before we start
lcd.clear()
# before we start the main loop - detect active network device and ip address
sleep(2)
interface = find_interface()
ip_address = parse_ip()
while True:
# date and time
lcd_line_1 = datetime.now().strftime(‘%b %d %H:%M:%S ’)
# current ip address
lcd_line_2 = “IP ” + ip_address
# combine both lines into one update to the display
lcd.message = lcd_line_1 + lcd_line_2
sleep(2)
from subprocess import Popen, PIPE
from time import sleep
from datetime import datetime
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
# Modify this if you have a different sized character LCD
lcd_columns = 16
lcd_rows = 2
# compatible with all versions of RPI as of Jan. 2019
# v1 - v3B+
lcd_rs = digitalio.DigitalInOut(board.D22)
lcd_en = digitalio.DigitalInOut(board.D17)
lcd_d4 = digitalio.DigitalInOut(board.D25)
lcd_d5 = digitalio.DigitalInOut(board.D24)
lcd_d6 = digitalio.DigitalInOut(board.D23)
lcd_d7 = digitalio.DigitalInOut(board.D18)
# Initialise the lcd class
lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6,
lcd_d7, lcd_columns, lcd_rows)
# looking for an active Ethernet or WiFi device
def find_interface():
find_device = “ip addr show”
interface_parse = run_cmd(find_device)
for line in interface_parse.splitlines():
if “state UP” in line:
dev_name = line.split(‘:’)[1]
return dev_name
# find an active IP on the first LIVE network device
def parse_ip():
find_ip = “ip addr show %s” % interface
find_ip = “ip addr show %s” % interface
ip_parse = run_cmd(find_ip)
for line in ip_parse.splitlines():
if “inet ” in line:
ip = line.split(‘ ’)[5]
ip = ip.split(‘/’)[0]
return ip
# run unix shell command, return as ASCII
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
output = p.communicate()[0]
return output.decode(‘a(chǎn)scii’)
# wipe LCD screen before we start
lcd.clear()
# before we start the main loop - detect active network device and ip address
sleep(2)
interface = find_interface()
ip_address = parse_ip()
while True:
# date and time
lcd_line_1 = datetime.now().strftime(‘%b %d %H:%M:%S ’)
# current ip address
lcd_line_2 = “IP ” + ip_address
# combine both lines into one update to the display
lcd.message = lcd_line_1 + lcd_line_2
sleep(2)
下載代碼
為了簡單起見,將此文件放在您的主目錄中。 wget命令使事情變得簡單。
下載:文件
復(fù)制代碼
$ wget https://raw.githubusercontent.com/adafruit/Adafruit_Learning_System_Guides/master/Drive_a_16x2_LCD_with_the_Raspberry_Pi/Drive_a_16x2_LCD_with_the_Raspberry_Pi.py $ wget https://raw.githubusercontent.com/adafruit/Adafruit_Learning_System_Guides/master/Drive_a_16x2_LCD_with_the_Raspberry_Pi/Drive_a_16x2_LCD_with_the_Raspberry_Pi.py
運行代碼
以下命令將啟動該程序,您應(yīng)該會看到LCD顯示屏上顯示了日期,時間和IP地址。
下載:文件
復(fù)制代碼
$ sudo python3 。/Drive_a_16x2_LCD_with_the_Raspberry_Pi.py $ sudo python3 。/Drive_a_16x2_LCD_with_the_Raspberry_Pi.py
在每次啟動時顯示時間和IP
擁有一個可以手動運行的腳本是一件好事,但花時間和時間來做不是很好Raspberry Pi啟動時,顯示屏上會彈出IP地址嗎?這是使用初始化腳本完成的,該腳本在每次Raspberry Pi啟動時都會運行我們的Python代碼。
下載服務(wù)文件
以下命令將使您可以將lcd.service文件直接下載到您的Pi。 p》
下載:文件
復(fù)制代碼
$ wget https://raw.githubusercontent.com/adafruit/Adafruit_Learning_System_Guides/master/Drive_a_16x2_LCD_with_the_Raspberry_Pi/lcd.service $ wget https://raw.githubusercontent.com/adafruit/Adafruit_Learning_System_Guides/master/Drive_a_16x2_LCD_with_the_Raspberry_Pi/lcd.service
下載:Project Zip 或 lcd.service | 在Github上查看
復(fù)制代碼
[Unit]
Description=LCD date|time|ip
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/python3 Drive_a_16x2_LCD_with_the_Raspberry_Pi.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=network-online.target
[Unit]
Description=LCD date|time|ip
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/python3 Drive_a_16x2_LCD_with_the_Raspberry_Pi.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=network-online.target
放置lcd.service文件
lcd.service文件需要復(fù)制到正確的位置,并且可以使用systemctl命令來啟動|停止|啟用服務(wù)。在啟用此功能之前,最好先進行測試,因為系統(tǒng)上的路徑可能存在細(xì)微差別。
下載:文件
復(fù)制代碼
$ sudo cp lcd.service /etc/systemd/system $ sudo cp lcd.service /etc/systemd/system
測試lcd.service
下載:文件
復(fù)制代碼
$ sudo systemctl daemon-reload
$ sudo systemctl start lcd.service
$ ps auxww | grep -i 16x2 $ sudo systemctl daemon-reload
$ sudo systemctl start lcd.service
$ ps auxww | grep -i 16x2
以下命令讀取對服務(wù)文件的更新,啟動lcd.service并確認(rèn)該進程正在運行。如果腳本顯示在“ ps”命令輸出中,則說明您已正確完成所有操作,現(xiàn)在可以啟用服務(wù)并重新啟動。該服務(wù)應(yīng)在啟動時自動激活。
啟用lcd.service
下載:文件
復(fù)制代碼
$ sudo systemctl enable lcd.service $ sudo systemctl enable lcd.service
現(xiàn)在,每次啟動時,LCD都會在啟動時自動顯示日期/時間/ip地址。這意味著您無需插入監(jiān)視器即可知道何時可以訪問Pi以及IP地址是什么。
時區(qū)
最后,但并非最不重要:我的Pi已配置了UT(通用時間)。我更喜歡根據(jù)我的時區(qū)(山)來查看時間。這是在Pi上為任何位置配置時間的方法。這是一次配置設(shè)置,將在兩次重啟之間保留。
我們可以使用raspi-config輕松設(shè)置時區(qū)。選擇以下內(nèi)容:
本地化選項
更改時區(qū)
大陸/國家/地區(qū)
時區(qū)
運行raspi-config
下載:文件
復(fù)制代碼
$ sudo raspi-config $ sudo raspi-config
責(zé)任編輯:wv
-
lcd
+關(guān)注
關(guān)注
34文章
4407瀏覽量
166950 -
樹莓派
+關(guān)注
關(guān)注
116文章
1696瀏覽量
105457
發(fā)布評論請先 登錄
相關(guān)推薦
評論