作者:黃小棟
Maker運動現在紅透半邊天,這裏也來開個自造教學專欄,和大家分享動手做的樂趣。該從什麼題目切入呢?當然要先來談談Maker最愛的Arduino如何使用,且從LCD模組的控制開始講起。
對!大家沒看錯,我們第一篇Arduino教學文主題,並不是從介紹Arduino的歷史到安裝IDE,再到燒入Blink的範例程式,而是直接教大家從使用LCD模組開始,因為坊間或者網路有很多資料可以查詢,所以這裡並不會做太多入門的講解。
好~話不多說,現在就進入主題吧!
研讀實作後,你將會知道:
大家研讀完這篇文章,並且實際操作之後,將會對「I2C匯流排」和「LCD」有初步的認識,以及模組與Arduino的接線,再來是撰寫初階程式來控制你的LCD模組,並且腦力激盪可做哪些專案上的應用。而關於進階控制技巧的部分,我們會留在後續的教學文中再慢慢講解。
研讀實作前,你必須知道:
大家研讀實作前,必須要知道的有以下幾點:
- 會安裝Arduino IDE和如何編譯與燒入程式到你的板子。(這是一定要知道的)
- 知道什麼是Blink的範例程式。(這還不知道沒關係,可以趕快上網Google一下)
- 了解Arduino程式語言的基本架構。(void setup()和void loop()的使用)
- 會安裝第三方資料庫。(這很重要,因為我們後續有很多教學文會安裝libraries)
基礎認識:什麼是I2C匯流排?
I2C匯流排能夠讓兩個裝置之間以穩定、高速、雙向的方式及最少的I/O引腳的情形來進行通訊。因為它使用兩條線來進行通訊,一條時脈線(SCL)和一條數據線(SDA),所以I2C匯流排所使用的通訊協定也被稱之為「雙線」通訊協定。
比較特別的是,I2C匯流排允許多個從屬裝置能共享同條通訊線路,但也就因為如此,開啟通訊的功能則是由匯流排主體來控制要與誰通訊。
我們這裡是由Arduino(iCShop貨號:368030500683)當作主體去做控制,並且板子內A4和A5的接腳分別具有SDA和SCL的功能。當大家需要使用I2C的功能時,就會用到Wire函式庫。而這函式庫,當大家在安裝Arduino IDE時就已經內建進去了,所以大家不用擔心,且看下文的詳細解說。
LCD模組規格及腳位介紹
LCD(liquid-crystal display)液晶螢幕顯示器的縮寫。我們都知道,這是一個很常見的顯示裝置,在大家的生活中絕對都有它的存在,舉凡小型的手錶、電子計算機,到大型的電視或者看板,都可見到LCD的蹤跡與應用。
筆者這次所使用的液晶螢幕顯示器(iCShop貨號:368030100095),要感謝iCShop的贊助提供,如果大家電子零件或模組上的需求,都可到他們的網站去詢問並購買,而我們所使用的LCD模組的規格如下:
此款LCD模組是最基本,並且也是最常見字元型LCD,其所使用的電壓為5V,因為Arduino開發板I/O Port所使用的電壓位準為5V,所以選擇它。再來此LCD模組具有2行顯示,每行可顯示16個字元,最後是採I2C通訊傳輸。所以模組只有四隻接腳,分別為Vcc、GND、SDA、SCL。
LCD模組硬體接線圖
此模組的接線方式也非常容易,只需將模組Vcc接腳接至Arduino的5V接腳,模組GND接腳接至Arduino的GND接腳,再來是模組SDA接腳接至Arduino的A4接腳,最後是模組SCL接腳接至Arduino的A5接腳,即可完成接線。
LCD模組程式範例
在講解程式之前,請大家先下載對於I2C_LCD的第三方資料庫(libraries)。大家可到這個網站去下載、解壓縮並安裝,筆者這邊下載使用的是NewliquidCrystal_1.3.4的版本。接下來就要教大家撰寫程式,我們這次所用的程式如下:
//引入Wire與LiquidCrystal_I2C函式庫 #include #include // 設定 LCD I2C 位址 // Set the pins on the I2C chip used for LCD connections: // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光 lcd.begin(16, 2); // 閃爍三次 for(int i = 0; i < 3; i++) { lcd.backlight(); // 開啟背光 delay(250); lcd.noBacklight(); // 關閉背光 delay(250); } lcd.backlight(); // 輸出初始化文字 lcd.setCursor(0, 0); // 設定游標位置在第一行行首 lcd.print("ICshop&MakerPRO"); delay(1000); lcd.setCursor(0, 1); // 設定游標位置在第二行行首 lcd.print("Hello, Maker!"); delay(8000); lcd.clear(); //顯示清除 } void loop() { lcd.setCursor(0, 0); // 設定游標位置在第一行行首 lcd.print("ICshop&MakerPRO"); lcd.setCursor(0, 1); // 設定游標位置在第二行行首 lcd.print(millis()/1000); }
這個程式的動作流程是啟動Arduino時,會先引用Wire與LiquidCrystal_I2C函式庫。
之後在初始化設定,則會先控制LCD模組閃爍背光三次,接著在第一行顯示「ICshop&MakerPRO」等字,延遲一秒,在第二行顯示「Hello, Maker!」等字,並且延遲八秒,再清除所有顯示。
最後進入主程式迴圈裡面,也同樣在第一行顯示「ICshop&MakerPRO」等字,並且在第二行顯示開機的時間。
結語
說明到這裡,相信大家應該都有順利完成I2C_1602_LCD模組的顯示吧!如果沒有的話,可以檢查一下,是不是哪條線路接錯了,或者是買到瑕疵品(筆者就有遇過)。
接著,大家可以想看看,是否拿這模組去做個時鐘、環境感測偵測器呢?講到這裡,相信大家都有很多想法,想要嘗試在自己的專案接上LCD模組來做顯示吧。
而在下一篇教學文裡,將會教大家如何使用RTC模組,並且與此I2C_LCD模組做結合,架構出自己的Maker時鐘,敬請期待!
(責任編輯:小波)
- 【Project】用D2000完成環境監控系統及基座 - 2017/07/20
- 【Tutorial】如何使用LinkIt 7697在MCS上監控溫溼度變化 - 2017/06/21
- 【實測心得】Intel Quark D2000有何優勢? - 2017/05/30
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2021/09/01
請問有ARDUINO 觸控模組的函式庫下載嗎?
2022/12/04
adc
2021/05/24
請問一下,我所使用的是LCM 1602A V0 腳外接一個可變1K電阻來調整對比,但不知接電後為何可變電阻燒毀? 請問是否接太大? 有大大可指點嗎
2021/05/24
建議請到FB社團來請教高手,網址:https://www.facebook.com/groups/makerpro.cc/
2020/07/28
根據我通靈您的編譯結果,應該是No such file or directory
2020/05/29
我在Arduino開新檔,然後把原來的程式貼上,上傳,編譯會就成功。
上面的編譯不成功是開一個資料夾存這個程式。
這是甚麼原因。
謝謝妳。
2019/11/11
#include
#include
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 設定 LCD I2C 位址
void setup()
{
lcd.begin(16, 2);
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(“Hello World!”);
delay(1000);
lcd.scrollDisplayLeft();
}
程式上傳後LCD 只有出現第二排的16個白色方塊?? 這是怎麼回事? 壞了嗎?
2019/07/10
請問可分享嗎?想給學生試試
2019/07/11
可以的,分享時請註明出處即可~
2018/08/30
想請問一下,我的前面倒入了Wire與LiquidCrystal_I2C函式庫,卻在LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);出現問題,想請問一下要如何解決。
2018/08/10
請問有 hh
hh
hh
hh
hh
hh
一整排(輸入字元時),第二排空白,這是甚麼問題
2018/08/10
請問我的lcd可以出現輸入字元,像”HELLO WORLD” 之類的。但如果用監控視窗輸入字元,像數字及英文,都會出現hh
hh
hh
下往上看 底部 >>>> hh 上
hh
hh
請問是甚麼問題(有出現無效程式庫,但可正常運作),謝謝
2018/07/06
改成這樣就可以執行
#include
#include
2018/05/31
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
為何POSITIVE無法被宣告
2018/05/27
試著將這行LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
改成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
麻煩請說明一下這兩行的作用?0X27和0X3F又是怎麼得到的?感激不盡
2017/12/04
請問出現程式第二行include錯誤,是否為導入程式庫問題?
或其他?請不吝指導感謝
2018/01/16
第二行和第三行應該是要導入函式庫沒錯,但原文的程式部份有缺漏,應該改為:
//引入Wire與LiquidCrystal_I2C函式庫
#include
#include
2018/06/08
我也是一樣錯在第二航#include要怎麼修改才會成功?
2019/07/20
把那兩行改成
#include 小於Wire.h大於
#include 小於LiquidCrystal_I2C.h大於
大於小於符號沒辦法直接打出來 因為html文法
2018/03/25
我想是因為<>符號被網站解讀為html語法,所以沒有顯示出來。
2017/10/25
為什麼我的led,只有背光亮,但沒有字顯示出來?
2017/11/06
您好,我們是MakerPRO編輯部,根據作者回覆給上一個發問者的回答是:「I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!」
再麻煩您試試看囉,有任何問題歡迎提問:)
謝謝您
2017/10/12
為什麼我的led,只有背光亮,但沒有字出來??
2017/10/19
您好,我們是MakerPRO編輯部,感謝您的提問,這是技術問題的部分,我們再請作者來回答噢:)
2017/10/19
I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。
2017/10/19
I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!
2017/12/27
I2C 1602有不同版本, 所以程式碼的位址會不同造成無法顯示
試著將這行LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
改成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
2018/05/27
試著將這行LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
改成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
這行是什麼意思?可以說明一下嗎?0x27和0x3F的值是怎麼來的?因為LCD模組也沒說明書新手上路真的看不懂,麻煩您解答一下
2019/01/11
PCF8574 0x27 和 PCF8574A 0x38
預設的address不一樣
https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf
2018/05/27
試著將這行LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
改成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
麻煩請說明一下這兩行的作用?0X27和0X3F又是怎麼得到的?感激不盡
2022/12/02
和上面那鐵樣試試調旋鈕
「I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!」
2017/08/14
你好,如果我要讓多塊mege板做連接,那我master的程式部分要怎麼依序讓他呼叫多塊slave板?謝謝。
2017/08/15
您好,我們是MakerPRO編輯部,感謝您的提問,這部分是技術問題我們再請作者來回答噢~
2017/08/15
您好,感謝您的提問,作者提供以下兩個連結的教學,希望對您有幫助噢~~
http://www.techbitar.com/how-to-network-many-arduinos-with-sensors-using-i2c.html
https://arduino169.blogspot.tw/2015/07/arduino-i2c-1-i2c-address-i2c.html
2017/07/10
https://www.arduino.cc/en/Reference/Wire
Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1
2017/07/04
想請問文中的A4及A5這兩隻腳位怎麼定義