Arduino筆記(4):在2x16 LCD上顯示字串訊息(含使用I2C轉接板)

1602 LCD在我學習Arduino或 Raspberry Pi 的過程中,經常會用到,不論是顯示日期時間、溫濕度、計數器等,只要會需要顯示的,都可以用到這個元件。到目前已經做了上百個相關的實作,再回過頭來看一下這篇文章,覺得內容有點不足,利用最近重新複習的機會,更新一下照片,再補充一些內容到本篇文章,包括如何使用I2C匯流排控制1602,並加上幾個例子使用LCD做出跑馬燈的效果。[2020.09.04]。

練習使用 HD44780相容(或稱1602)液晶顯示 LCD(Liquid crystal display),在 2x16 的顯示幕印出 "Hi,Ceiling Test!", 並測量可變電阻的數值,也同時學習使用 analogRead() 函式及 LiquidCrystal Library。執行結果如下圖:
這是改用I2C轉接板後的照片,接線明顯少很多。

[1602顯示器接腳說明]

LCD顯示器若無背光則會有14個Pin,若有背光則會有16個,而接腳位置大多如下:
LCD接腳編號說明
1VSS (接地)
2VDD (5V電源輸入)
3VO 或稱 Vee:調整對比,需接一個1k的可變電阻
4Register Select(RS):1: D0 – D7 當作資料解釋,0: D0 – D7 當作指令解釋
5READ/WRITE(RW): 1: 從 LCD 讀取資料,0: 寫資料到 LCD
6Enable
7DB0
8DB1
9DB2
10DB3
11DB4
12DB5
13DB6
14DB7
15A(+) 背光:可接330 Ohm電阻到電源
16K(-) 背光:接地

看過一些HD44780相容的範例,Arduino對LCD的控制有兩個重要的Library,一個是LiquidCrystal,另一個是LCD4Bit,LCD4Bit是改良自LiquidCrystal,所以也提供了較多有趣的function及控制,最重要的是LCD4Bit使用的接腳較少,且可以控制多行顯示。使用 4-bit 模式主要的好處是節省 I/O 腳位,通訊的時候只會用到 4 個高位元 (D4-D7)。

[材料]

  • 麵包板 x 1
  • Arduino UNO 控制板 x 1
  • HD44780 相容 LCD x 1 (本實做使用 16 pin 有背光 LCD)
  • I2C/介面 LCD1602轉接板
  • 旋轉式可變電阻10K歐姆 x 1
  • 電阻330歐姆 x 1
  • 連接線 x n條

[接線圖]

LCD 1602與Arduino接線說明:
LCD1602Arduino
1. VSSGND
2. VDD+5V
3, V0 接可變電阻Output-
4. RS12
5. R/W11
6. Enable10
11. D45
12. D54
13. D63
14. D7 2
15. A 接330歐姆電阻,電阻另一端接+5V-
16. K 接GND-


I2C轉接板與Arduino連接說明:
LCD1602含(轉接板)Arduino
VCC+5V
GNDGND
SDASDA
SCLSCL



[程式一]

直接將LCD 1602接在Arduino上,使用LiquidCrystal的函數庫控制LCD,讀取可變電阻的數值後,顯示在LCD的第二行:
// 引用 LiquidCrystal Library
#include <LiquidCrystal.h>

// 建立 LiquidCrystal 的變數 lcd
//     LCD 接腳: RS, R/W, Enable, D4, D5, D6, D7 
// Arduino 接腳: 12, 11, 10, 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup() {
  // 設定 LCD 的行列數目 (2 x 16)
  lcd.begin(16, 2);

  // 設定類比串列速率
  Serial.begin(9600);

  // 列印 "Hello World" 訊息到 LCD 上
  lcd.print("Hi, Ceiling Test!");
}

void loop() {
  // 將游標設到 column 0, line 1,(line 1 是第2列(row))
  lcd.setCursor(0, 1);

  // 讀取A0的類比值
  int sensorValue = analogRead(A0);

  // 將類比的數值顯示在第二列
  lcd.print(sensorValue);

  // 顯示電阻值在串列視窗
  Serial.println(sensorValue);
  delay(2000);     // delay in between reads for stability
}

[結果一]

  • analogRead()這個函式讀取的值是 10 bit,也就是一個位於0到1023之間的值
  • analogRead()大約每秒鐘讀取10,000次
  • LCD顯示的數值會一直改變,因為用類比訊號讀取時,會有稍稍電流的變化而影響讀取值。


[程式二]

使用I2C介面轉換板與LCD 1602連接,透過LiquidCrystal_I2C函數庫控制LCD。這個程式是寫一個類似跑馬燈的字串,可以左右來回顯示:
#include <LiquidCrystal_I2C.h>  // 引用 LiquidCrystal_I2C Library

// 設定 LCD 位址為 0x27,有 16 個字元 2 列
LiquidCrystal_I2C lcd(0x27,16,2);  
int row=0;

void setup()
{
  lcd.init();           // 初始化 lcd 
  lcd.backlight();      // 設定背板為亮
}

void loop()
{
  lcd.clear();       
  lcd.setCursor(0,row);
  lcd.print("hello!"); 
  for(int i=0;i<10;i++)
  {
    lcd.scrollDisplayRight();   //往右移一格顯示
    delay(200);   
  }
  // 判斷目前行數, 是0行,將Row + 1,往下跳一行          
  if(row == 0){
     row = row + 1;
     lcd.clear();
     lcd.setCursor(10,1);
     lcd.print("hello!"); 
     delay(200);          
  }
   
  for(int i=0;i<10;i++)
  {
    lcd.scrollDisplayLeft();  //往左移一格顯示
    delay(200);
  }
  // 判斷目前行數, 是1行,將Row 改為0行         
  if(row == 1){
     row = 0;
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("hello!"); 
     delay(200);          
  }          
}

[結果二]


[參考資料]

3 留言

  1. 請問可以顯示出值,可是可變電阻很難調(調到清楚很容易就跑掉),可以怎麼解決?謝謝!

    回覆刪除
  2. 想請問您1602 I2C LCD 要如何設定

    回覆刪除

張貼留言

較新的 較舊