No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【自造學堂】Arduino如何透過I2C控制LCD模組

   

作者:黃小棟

OLYMPUS DIGITAL CAMERA

 

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模組的規格如下:

OLYMPUS DIGITAL CAMERA

LCD模組正面

此款LCD模組是最基本,並且也是最常見字元型LCD,其所使用的電壓為5V,因為Arduino開發板I/O Port所使用的電壓位準為5V,所以選擇它。再來此LCD模組具有2行顯示,每行可顯示16個字元,最後是採I2C通訊傳輸。所以模組只有四隻接腳,分別為Vcc、GND、SDA、SCL。

OLYMPUS DIGITAL CAMERA

LCD模組背面

LCD模組硬體接線圖

此模組的接線方式也非常容易,只需將模組Vcc接腳接至Arduino的5V接腳,模組GND接腳接至Arduino的GND接腳,再來是模組SDA接腳接至Arduino的A4接腳,最後是模組SCL接腳接至Arduino的A5接腳,即可完成接線。

OLYMPUS DIGITAL CAMERA

LCD模組接線

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時鐘,敬請期待!

(責任編輯:小波)

黃 小棟

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: 黃 小棟

機電整合工程師,喜歡遊山玩水。多次參與Maker活動;曾自行設計和製作水下無人載具,現在則是平日手縫泰迪熊。

Share This Post On
468 ad

36 Comments

  1. 請問有ARDUINO 觸控模組的函式庫下載嗎?

    Post a Reply
  2. 請問一下,我所使用的是LCM 1602A V0 腳外接一個可變1K電阻來調整對比,但不知接電後為何可變電阻燒毀? 請問是否接太大? 有大大可指點嗎

    Post a Reply
    • 建議請到FB社團來請教高手,網址:https://www.facebook.com/groups/makerpro.cc/

      Post a Reply
  3. 根據我通靈您的編譯結果,應該是No such file or directory

    Post a Reply
  4. 我在Arduino開新檔,然後把原來的程式貼上,上傳,編譯會就成功。
    上面的編譯不成功是開一個資料夾存這個程式。
    這是甚麼原因。
    謝謝妳。

    Post a Reply
  5. #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個白色方塊?? 這是怎麼回事? 壞了嗎?

    Post a Reply
  6. 請問可分享嗎?想給學生試試

    Post a Reply
    • 可以的,分享時請註明出處即可~

      Post a Reply
  7. 想請問一下,我的前面倒入了Wire與LiquidCrystal_I2C函式庫,卻在LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);出現問題,想請問一下要如何解決。

    Post a Reply
  8. 請問有 hh
    hh
    hh
    hh
    hh
    hh

    一整排(輸入字元時),第二排空白,這是甚麼問題

    Post a Reply
  9. 請問我的lcd可以出現輸入字元,像”HELLO WORLD” 之類的。但如果用監控視窗輸入字元,像數字及英文,都會出現hh
    hh
    hh
    下往上看 底部 >>>> hh 上
    hh
    hh
    請問是甚麼問題(有出現無效程式庫,但可正常運作),謝謝

    Post a Reply
  10. 改成這樣就可以執行
    #include
    #include

    Post a Reply
  11. LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
    為何POSITIVE無法被宣告

    Post a Reply
  12. 試著將這行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又是怎麼得到的?感激不盡

    Post a Reply
  13. 請問出現程式第二行include錯誤,是否為導入程式庫問題?
    或其他?請不吝指導感謝

    Post a Reply
    • 第二行和第三行應該是要導入函式庫沒錯,但原文的程式部份有缺漏,應該改為:
      //引入Wire與LiquidCrystal_I2C函式庫
      #include
      #include

      Post a Reply
      • 我也是一樣錯在第二航#include要怎麼修改才會成功?

        Post a Reply
        • 把那兩行改成
          #include 小於Wire.h大於
          #include 小於LiquidCrystal_I2C.h大於
          大於小於符號沒辦法直接打出來 因為html文法

          Post a Reply
    • 我想是因為<>符號被網站解讀為html語法,所以沒有顯示出來。

      Post a Reply
  14. 為什麼我的led,只有背光亮,但沒有字顯示出來?

    Post a Reply
    • 您好,我們是MakerPRO編輯部,根據作者回覆給上一個發問者的回答是:「I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!」
      再麻煩您試試看囉,有任何問題歡迎提問:)
      謝謝您

      Post a Reply
  15. 為什麼我的led,只有背光亮,但沒有字出來??

    Post a Reply
    • 您好,我們是MakerPRO編輯部,感謝您的提問,這是技術問題的部分,我們再請作者來回答噢:)

      Post a Reply
    • I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。

      Post a Reply
    • I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!

      Post a Reply
    • 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);

      Post a Reply
      • 試著將這行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模組也沒說明書新手上路真的看不懂,麻煩您解答一下

        Post a Reply
      • 試著將這行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又是怎麼得到的?感激不盡

        Post a Reply
    • 和上面那鐵樣試試調旋鈕
      「I2C背後會有一個藍色的可調電阻旋鈕,向左或向右調整一下就可以看到字了,可能是lcd出廠時對比值太高或太低。I2C背後有一個藍色的可調電阻,試著調整一下就可以看到字了!」

      Post a Reply
  16. 你好,如果我要讓多塊mege板做連接,那我master的程式部分要怎麼依序讓他呼叫多塊slave板?謝謝。

    Post a Reply
  17. 想請問文中的A4及A5這兩隻腳位怎麼定義

    Post a Reply

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *