如何將 16x2 液晶顯示屏與 Arduino 進(jìn)行連接使用
簡(jiǎn)介
倘若你的 Arduino 項(xiàng)目不僅能發(fā)出閃爍的燈光或驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn),還能向你清晰地說(shuō)明它正在做什么的話,那會(huì)是怎樣的情景呢?
在本節(jié)課中,您將學(xué)習(xí)如何使用 16x2 液晶顯示屏來(lái)顯示信息,了解幕后所發(fā)生的情況,并使您的項(xiàng)目顯得更加精致和專業(yè)。
這是“Arduino 初學(xué)者教程”系列的第 14 課,也是這類課程中那種能讓學(xué)習(xí)過(guò)程感覺(jué)更加“真實(shí)”的一課。
讓我們開(kāi)始吧。
物資;供應(yīng)品
對(duì)于這個(gè)項(xiàng)目,您將需要:
?Arduino UNO
?I/O 擴(kuò)展護(hù)罩
?液晶顯示屏
?四針電線
了解液晶顯示屏模塊
這是隨“MindPlus Arduino 編程套裝”一同配備的液晶顯示屏模塊,正是我們?cè)诒鞠盗械?24 期內(nèi)容中一直使用的那套套裝。
乍一看,它似乎太過(guò)簡(jiǎn)單了:正面有一個(gè)屏幕,背面有一些電子元件,還有一個(gè)僅四個(gè)針腳的連接器,這已經(jīng)暗示著接線過(guò)程會(huì)相當(dāng)簡(jiǎn)便。
如果你仔細(xì)觀察顯示屏的底部前端,就會(huì)看到上面印著“LCD 1602”字樣。這個(gè)名稱確切地告訴我們這是何種類型的屏幕。
“16”指的是每行能夠顯示的字符數(shù)量,而“2”指的是行數(shù)。換句話說(shuō),這種顯示屏最多能在第一行顯示 16 個(gè)字符,在第二行也能顯示 16 個(gè)字符。
盡管我們稱之為“字符顯示”,但每個(gè)字符并非是一個(gè)單獨(dú)的完整塊狀物。如果你給屏幕通電并仔細(xì)觀察,就會(huì)發(fā)現(xiàn)每個(gè)字母或數(shù)字都是由一個(gè)由小點(diǎn)組成的網(wǎng)格構(gòu)成的。
具體來(lái)說(shuō),每個(gè)字符都是由一個(gè) 5×8 像素的矩陣構(gòu)成的。通過(guò)控制不同的像素開(kāi)啟或關(guān)閉,液晶顯示屏就能繪制出字母、數(shù)字和符號(hào)。
一旦你明白了這個(gè)細(xì)節(jié),這款顯示器的各種局限性和可能性也就變得清晰明了了。
您還會(huì)發(fā)現(xiàn)其他格式的液晶顯示屏。有些尺寸較小,比如 16x1 顯示屏,而有些則較大,比如 16x4。它們還具有不同的顏色,例如綠色或藍(lán)色。盡管存在這些差異,但其基本理念是相同的。
I2C 通信及其重要性
如果我們將模塊翻轉(zhuǎn)過(guò)來(lái),并將注意力集中在連接器上,就會(huì)立刻注意到兩個(gè)明顯的標(biāo)簽:SDA 和 SCL。這些標(biāo)簽告訴我們,這款液晶顯示屏采用的是 I2C 通信方式。
在 I2C 接口配置中,SDA 引腳負(fù)責(zé)傳輸數(shù)據(jù),而且有趣的是,它能夠雙向傳輸數(shù)據(jù)。
SCL 引腳傳輸時(shí)鐘信號(hào),該信號(hào)由主設(shè)備生成。在我們的例子中,Arduino 起到主設(shè)備的作用,控制著通信過(guò)程。
I2C 的最大優(yōu)勢(shì)之一在于它能讓多個(gè)設(shè)備共用同一對(duì)導(dǎo)線。只要每個(gè)設(shè)備都有其獨(dú)特的地址,您就可以將多個(gè)傳感器、顯示器和模塊連接到相同的 SDA 和 SCL 線路上。
這的確實(shí)非常強(qiáng)大,尤其對(duì)于初學(xué)者項(xiàng)目而言更是如此,因?yàn)樗艽_保布線保持整潔、簡(jiǎn)單,并且便于排查故障。
如果你之前使用過(guò) Arduino,那么你可能見(jiàn)過(guò)另一種不使用 I2C 協(xié)議的液晶顯示屏。這類顯示屏通常有較多的引腳,連接它們需要更多的線路連接和配置工作。因此,很多人最終會(huì)購(gòu)買(mǎi)一個(gè) I2C 適配器,并將其焊接到標(biāo)準(zhǔn)液晶顯示屏的背面。
該適配器通常會(huì)包含一個(gè)名為 PCF8574 的芯片。這個(gè)芯片充當(dāng) I2C 輸入/輸出擴(kuò)展器的功能。簡(jiǎn)單來(lái)說(shuō),它就是為顯示屏添加 I2C 通信功能的部件。值得一提的是,這個(gè)芯片不僅適用于液晶顯示屏,還可以用于控制 LED、傳感器以及其他模塊。
現(xiàn)在理論部分就講到這里吧。咱們還是動(dòng)手去做點(diǎn)實(shí)際的東西吧。
在我們開(kāi)始項(xiàng)目之前,我想感謝 DFRobot 公司為我們提供了這次課程的贊助。
DFRobot 是全球領(lǐng)先的為創(chuàng)客、教育工作者和工程師提供硬件產(chǎn)品的企業(yè)之一。
在他們的在線商店里,您可以找到開(kāi)展下一個(gè)項(xiàng)目所需的各種物品,從電機(jī)、傳感器、微控制器到單板計(jì)算機(jī)、人工智能設(shè)備等等應(yīng)有盡有。
如果你打算打造一些酷炫的東西,我強(qiáng)烈建議你去看看他們的產(chǎn)品。他們的產(chǎn)品質(zhì)量上乘,價(jià)格也非常合理。
在本系列教程中,我使用的是“MindPlus Arduino 編程套件”,因?yàn)樗四汩_(kāi)展 Arduino 項(xiàng)目所需的一切工具。
再次感謝 DFRobot 對(duì)此系列的支持,感謝你們讓 STEM 教育能夠惠及更多人。
啟動(dòng)項(xiàng)目
那我們繼續(xù)吧,開(kāi)始組裝我們的第一個(gè)液晶顯示器項(xiàng)目。
首先將 I/O 擴(kuò)展板安裝到你的 Arduino UNO 上。這個(gè)擴(kuò)展板使得連接模塊變得更加容易,并且還能使所有部件保持整齊有序。
接下來(lái),使用四針電纜將液晶模塊連接到屏蔽板上。SCL 引腳連接到 A5,SDA 引腳連接到 A4。該顯示屏的工作電壓范圍為 3.3 至 5 伏,因此可以安全地與大多數(shù) Arduino 板配合使用。
一旦硬件準(zhǔn)備就緒,就前往本系列的 GitHub 倉(cāng)庫(kù)。在描述中會(huì)找到相關(guān)鏈接。打開(kāi)第 14 課的文件夾,復(fù)制名為“test-lcd”的文件,并將其粘貼到你的 Arduino IDE 中。
在上傳代碼之前,請(qǐng)確保已安裝了 DFRobot_RGBLCD1602 庫(kù)。完成此操作后,點(diǎn)擊“上傳”。
如果所有連接都正確無(wú)誤,您應(yīng)該會(huì)在屏幕上看到“第 14 課 - 液晶模塊”這一信息。這就是我們?nèi)〉玫牡谝粋€(gè)成功。
理解代碼
現(xiàn)在讓我們放慢速度,仔細(xì)看看這段代碼實(shí)際在做什么。
首先,我們要引入正確的庫(kù),并創(chuàng)建一個(gè)能夠控制液晶顯示屏的對(duì)象。你可以將這個(gè)對(duì)象視為我們與屏幕進(jìn)行直接通信的途徑。
在 setup() 函數(shù)內(nèi)部,我們初始化顯示屏、清除之前的所有數(shù)據(jù),并打印出我們的信息。需要記住的一個(gè)重要細(xì)節(jié)是,每行只能顯示 16 個(gè)字符。如果您的信息長(zhǎng)度超過(guò)這個(gè)限制,您就需要將其分兩行顯示,下面就是這樣的實(shí)現(xiàn)方式。
如果這部分內(nèi)容您仍覺(jué)得難以理解,別擔(dān)心。我有一整套關(guān)于 Arduino 編程基礎(chǔ)的課程,如果您想更深入地理解的話,那讀一讀也是很有幫助的。
但接下來(lái)便出現(xiàn)了有趣的問(wèn)題:倘若你的信息內(nèi)容實(shí)在太過(guò)冗長(zhǎng),以至于無(wú)法僅用兩行文字來(lái)表達(dá)清楚,那該怎么辦呢?
創(chuàng)建滾動(dòng)文字效果
我們不必試圖一次性展示所有內(nèi)容,而是可以采用一種滑動(dòng)或滾動(dòng)的效果,使得在任何特定時(shí)刻只有一部分信息是可見(jiàn)的。這種技術(shù)在許多實(shí)際設(shè)備中都有應(yīng)用,從打印機(jī)到工業(yè)控制面板等等。
要實(shí)際體驗(yàn)一下效果,請(qǐng)返回 GitHub 倉(cāng)庫(kù),復(fù)制名為“滑動(dòng)文本”的示例代碼,將其上傳至你的 Arduino 設(shè)備,然后觀察液晶顯示屏。您會(huì)看到一條長(zhǎng)長(zhǎng)的文本信息在屏幕上流暢地滾動(dòng)。
那么,這是如何運(yùn)作的呢?
這段示例的開(kāi)頭部分以及 setup() 函數(shù)與之前的示例幾乎完全相同,因此真正的重點(diǎn)在于 loop() 函數(shù)。這就是邏輯所在的地方。
核心思想是將信息不看作一條直線,而視為一個(gè)圓圈。想象一下文字寫(xiě)在一個(gè)環(huán)上。當(dāng)你讀到結(jié)尾時(shí),會(huì)立即回到開(kāi)頭重新開(kāi)始。這種方法使我們能夠?qū)崿F(xiàn)無(wú)限滾動(dòng)的效果,而無(wú)需擔(dān)心信息的起始位置或結(jié)束位置。
由于液晶顯示屏每次只能顯示 16 個(gè)字符,所以該代碼會(huì)構(gòu)建一個(gè)名為“visibleText”的臨時(shí)字符串。這個(gè)字符串準(zhǔn)確地表示了在特定時(shí)刻屏幕上應(yīng)顯示的內(nèi)容。
一個(gè) for 循環(huán)會(huì)運(yùn)行 16 次,每次對(duì)應(yīng)顯示窗口中的一列內(nèi)容。在每次迭代中,它都會(huì)從消息中選取下一個(gè)字符。
模運(yùn)算用于在字符串末尾到達(dá)時(shí)進(jìn)行循環(huán)處理,這就是為什么模運(yùn)算符在這里如此重要。它確保代碼不會(huì)超出邊界,并使文本能夠流暢地滾動(dòng)。
構(gòu)建完 16 位字符串后,該代碼會(huì)將其輸出到液晶顯示屏上,然后將位置向前移動(dòng)一個(gè)字符,并等待一段短暫的延遲。調(diào)整這個(gè)延遲時(shí)間會(huì)改變滾動(dòng)的速度。
其結(jié)果是呈現(xiàn)出一條清晰、流暢且連貫的滾動(dòng)信息。
本文編譯自hackster.io





