Kiến thức tổng hợp

Hướng dẫn Raspberry pi giao tiếp LCD 16×2 với module i2c bằng python

Nếu bạn định sử dụng màn hình LCD với Raspberry Pi của mình , thì có khả năng bạn sẽ cần lập trình nó bằng Python vào một lúc nào đó. Python có lẽ là ngôn ngữ lập trình phổ biến nhất để viết mã trên Raspberry Pi và nhiều dự án và ví dụ bạn sẽ tìm thấy được viết bằng Python. Dưới đây hãy cùng tham khảo Hướng dẫn Raspberry pi giao tiếp LCD 16×2 với module i2c bằng python cùng với hocwiki nhé.

Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách kết nối màn hình LCD của bạn và lập trình nó bằng Python, sử dụng thư viện RPLCD. Tôi sẽ bắt đầu với việc chỉ cho bạn cách kết nối nó ở chế độ 8 bit hoặc chế độ 4 bit. Sau đó, tôi sẽ giải thích cách cài đặt thư viện và cung cấp các ví dụ để in và định vị văn bản, xóa màn hình và điều khiển con trỏ. Tôi cũng sẽ cung cấp cho bạn các ví dụ để cuộn văn bản, tạo ký tự tùy chỉnh, in dữ liệu từ cảm biến và hiển thị ngày, giờ và địa chỉ IP của Pi của bạn.

Tôi đang sử dụng màn hình LCD 16X2 ở đây, nhưng các ví dụ sẽ hoạt động với bất kỳ màn hình LCD nào sử dụng trình điều khiển Hitachi HD44780.

Bạn cũng có thể kết nối màn hình LCD thông qua I2C, chỉ sử dụng hai dây, nhưng nó yêu cầu một số phần cứng bổ sung. Hãy xem bài viết của chúng tôi, Cách thiết lập I2C LCD trên Raspberry Pi  để xem cách thực hiện.

Tôi cũng sẽ xem xét cách lập trình LCD với C trong một bài viết khác, nhưng bây giờ chúng ta hãy tập trung vào Python…

Đây là phiên bản video của hướng dẫn này, nơi bạn có thể xem tất cả các chương trình ví dụ bên dưới trong thời gian thực:

KẾT NỐI MÀN HÌNH LCD

Có hai cách để kết nối màn hình LCD với Raspberry Pi của bạn – ở chế độ 4 bit hoặc 8 bit. Chế độ 4 bit sử dụng 6 chân GPIO, trong khi chế độ 8 bit sử dụng 10. Vì nó sử dụng ít chân hơn nên chế độ 4 bit là phương pháp phổ biến nhất, nhưng tôi sẽ giải thích cách thiết lập và lập trình màn hình LCD theo cả hai cách.

Mỗi ký tự và lệnh được gửi đến màn hình LCD dưới dạng một byte (8 bit) dữ liệu. Ở chế độ 8 bit, byte được gửi cùng một lúc qua 8 dây dữ liệu, mỗi dây một bit. Trong chế độ 4 bit, byte được chia thành hai bộ 4 bit – bit trên và bit dưới, được gửi lần lượt qua 4 dây dữ liệu.

Về mặt lý thuyết, chế độ 8 bit truyền dữ liệu nhanh gấp đôi so với chế độ 4 bit, vì toàn bộ byte được gửi cùng một lúc. Tuy nhiên, trình điều khiển LCD cần một thời gian tương đối lâu để xử lý dữ liệu, vì vậy cho dù đang sử dụng chế độ nào, chúng tôi không thực sự nhận thấy sự khác biệt về tốc độ truyền dữ liệu giữa chế độ 8 bit và 4 bit.

ĐẤU DÂY MÀN HÌNH LCD Ở CHẾ ĐỘ 8 BIT

Để kết nối màn hình LCD của bạn ở chế độ 8 bit, hãy thiết lập nó như sau:

Chiết áp đèn nền và độ tương phản là 10K Ohm, nhưng chúng có thể được thay thế bằng điện trở 1K đến 3K Ohm nếu bạn muốn.

ĐẤU DÂY MÀN HÌNH LCD Ở CHẾ ĐỘ 4 BIT

Để kết nối màn hình LCD với Raspberry Pi của bạn ở chế độ 4 bit, hãy thiết lập nó như sau:

Chiết áp ở đây cũng có thể được thay thế bằng điện trở 1K hoặc 3K Ohm.

LẬP TRÌNH MÀN HÌNH LCD VỚI PYTHON

Nếu đây là lần đầu tiên bạn viết và chạy một chương trình Python, bạn có thể muốn đọc Cách viết và chạy chương trình Python trên Raspberry Pi , phần này sẽ giải thích mọi thứ bạn cần biết để chạy các ví dụ bên dưới.

Chúng tôi sẽ sử dụng một thư viện Python cung cấp rất nhiều chức năng hữu ích. Nó được gọi là thư viện RLPCD, và được viết bởi Danilo Bargen .

CÀI ĐẶT THƯ VIỆN RPLCD

Thư viện RPLCD có thể được cài đặt từ Chỉ mục gói Python hoặc PIP. Nó có thể đã được cài đặt trên Pi của bạn, nhưng nếu chưa, hãy nhập mã này tại dấu nhắc lệnh để cài đặt nó:

sudo apt-get install python-pip

Sau khi bạn cài đặt PIP, hãy cài đặt thư viện RPLCD bằng cách nhập:

sudo pip install RPLCD

Các chương trình ví dụ bên dưới sử dụng số pin vật lý của Raspberry Pi, không sử dụng số BCM hoặc GPIO. Tôi giả sử rằng bạn đã kết nối màn hình LCD của mình theo cách như trong sơ đồ ở trên, nhưng tôi sẽ chỉ cho bạn cách thay đổi kết nối chân cắm nếu bạn cần.

GHI VÀO MÀN HÌNH Ở CHẾ ĐỘ 8 BIT

Hãy bắt đầu với một chương trình đơn giản sẽ hiển thị “Xin chào thế giới!” trên màn hình LCD. Nếu bạn có màn hình LCD có kích thước khác với màn hình 16 × 2 mà tôi đang sử dụng (như màn hình 20 × 4), hãy thay đổi số cột và hàng trong dòng 2 của mã. cols=đặt số cột và rows=đặt số hàng. Bạn cũng có thể thay đổi các chân được sử dụng cho các chân RS, E và dữ liệu của màn hình LCD. Các chân dữ liệu được đặt là pins_data=[D0, D1, D2, D3, D4, D5, D6, D7].

Chuỗi văn bản được ghi vào màn hình bằng  lcd.write_string()hàm:

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[40, 38, 36, 32, 33, 31, 29, 23])

lcd.write_string(u’Hello world!’)

GHI VÀO MÀN HÌNH Ở CHẾ ĐỘ 4 BIT

Ở chế độ 4 bit, chỉ các chân LCD D4, D5, D6 và D7 được sử dụng cho dữ liệu. Chúng được đặt ở  pins_data=[D4, D5, D6, D7]dòng 2 bên dưới:

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

lcd.write_string(u’Hello world!’)

ĐỊNH VỊ VĂN BẢN

Văn bản có thể được định vị ở bất kỳ đâu trên màn hình bằng cách sử dụng  lcd.cursor_pos = (ROW, COLUMN). Các hàng được đánh số bắt đầu từ số 0, vì vậy hàng trên cùng là hàng 0 và hàng dưới cùng là hàng 1. Tương tự, các cột được đánh số bắt đầu từ 0, vì vậy đối với màn hình LCD 16 × 2, các cột được đánh số từ 0 đến 15. Đối với ví dụ, đoạn mã dưới đây đặt “Hello world!” bắt đầu từ hàng dưới cùng, cột thứ tư:

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

lcd.cursor_pos = (1, 3) 

lcd.write_string(u’Hello world!’)

XÓA MÀN HÌNH

Chức năng lcd.clear()sẽ xóa màn hình. Đoạn mã sau sẽ in “Hello world!” vào màn hình trong hai giây trước khi xóa nó:

import time

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

lcd.write_string(u’Hello world!’)

time.sleep(2)

lcd.clear()

VĂN BẢN NHẤP NHÁY

Kết hợp lcd.clear()và time.sleep()trong một vòng lặp while sẽ tạo ra hiệu ứng văn bản nhấp nháy:

import time

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

while True:

    lcd.write_string(u”Hello world!”)

    time.sleep(1)

    lcd.clear()

    time.sleep(1)

Nhấn Ctrl-C để thoát khỏi chương trình.

BẬT VÀ TẮT CON TRỎ

Thư viện RPLCD cung cấp một số chức năng để điều khiển con trỏ. Bạn có thể có con trỏ khối, con trỏ gạch dưới hoặc con trỏ nhấp nháy. Sử dụng các chức năng sau để đặt con trỏ:

  • Con trỏ khối nhấp nháy: lcd.cursor_mode = CursorMode.blink
  • Con trỏ dòng: lcd.cursor_mode = CursorMode.line
  • Con trỏ tắt: lcd.cursor_mode = CursorMode.hide

Đoạn mã dưới đây đặt một con trỏ nhấp nháy sau ký tự cuối cùng của văn bản:

from RPLCD import CharLCD

from RPLCD import CursorMode

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

lcd.write_string(u’Hello world!’)

lcd.cursor_mode = CursorMode.blink

#lcd.cursor_mode = CursorMode.line

#lcd.cursor_mode = CursorMode.hide

NGẮT DÒNG

Văn bản sẽ tự động chuyển sang dòng tiếp theo nếu độ dài của văn bản lớn hơn độ dài cột trên màn hình LCD của bạn. Bạn cũng có thể kiểm soát nơi chuỗi văn bản ngắt xuống dòng tiếp theo bằng cách chèn vào \n\rnơi bạn muốn ngắt xảy ra. Đoạn mã dưới đây sẽ in “Xin chào” lên hàng trên cùng và “thế giới!” xuống hàng dưới cùng.

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

lcd.write_string(u’Hello\n\rworld!’)

IN NGÀY VÀ GIỜ

Chương trình này sẽ hiển thị ngày và giờ trên màn hình LCD:

from RPLCD import CharLCD

import time

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

while True:

    lcd.write_string(“Time: %s” %time.strftime(“%H:%M:%S”))

    lcd.cursor_pos = (1, 0)

    lcd.write_string(“Date: %s” %time.strftime(“%m/%d/%Y”))

IN ĐỊA CHỈ IP CỦA BẠN

Chương trình này sẽ in địa chỉ IP của kết nối ethernet của bạn với màn hình LCD. Để in IP của kết nối WiFi của bạn, chỉ cần thay đổi eth0ở dòng 19 thành wlan0:

from RPLCD import CharLCD

import socket

import fcntl

import struct

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

def get_ip_address(ifname):

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    return socket.inet_ntoa(fcntl.ioctl(

        s.fileno(),

        0x8915, 

        struct.pack(‘256s’, ifname[:15])

    )[20:24])

lcd.write_string(“IP Address:”) 

lcd.cursor_pos = (1, 0)

lcd.write_string(get_ip_address(‘eth0’))

NHÂN VẬT TÙY CHỈNH

Mỗi ký tự trên màn hình LCD là một mảng 5 × 8 pixel. Bạn có thể tạo bất kỳ mẫu hoặc ký tự nào bạn có thể nghĩ ra và hiển thị trên màn hình dưới dạng ký tự tùy chỉnh. Hãy xem  trang web này để biết một công cụ tương tác tạo ra mảng bit được sử dụng để xác định các ký tự tùy chỉnh.

Đầu tiên, chúng tôi xác định ký tự ở dòng 4 đến dòng 12 của đoạn mã dưới đây. Sau đó, chúng tôi sử dụng chức năng lcd.create_char(0-7, NAME)để lưu ký tự trong bộ nhớ CGRAM của LCD. Có thể lưu trữ tối đa 8 (0-7) ký tự cùng một lúc. Để in ký tự tùy chỉnh, chúng tôi sử dụng  lcd.write_string(unichr(0)), trong đó số trong unichr()là vị trí bộ nhớ (0-7) được xác định trong lcd.create_char().

IN MỘT KÝ TỰ TÙY CHỈNH DUY NHẤT

Hãy xem mã này, mã này sẽ in một ký tự khuôn mặt cười lên màn hình:

from RPLCD import CharLCD, cleared, cursor

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

smiley = (

    0b00000,

    0b01010,

    0b01010,

    0b00000,

    0b10001,

    0b10001,

    0b01110,

    0b00000,

)

lcd.create_char(0, smiley)

lcd.write_string(unichr(0))

IN NHIỀU KÝ TỰ TÙY CHỈNH

Chương trình này sẽ in các chữ cái Hy Lạp omega, pi và mu, cùng với các ký hiệu về nhiệt độ (nhiệt kế) và độ ẩm (giọt nước):

from RPLCD import CharLCD, cleared, cursor

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

omega = (

    0b00000,

    0b01110,

    0b10001,

    0b10001,

    0b10001,

    0b01010,

    0b11011,

    0b00000,

)

pi = (

    0b00000,

    0b00000,

    0b11111,

    0b01010,

    0b01010,

    0b01010,

    0b10011,

    0b00000,

)

mu = (

    0b00000,

    0b10010,

    0b10010,

    0b10010,

    0b10010,

    0b11101,

    0b10000,

    0b10000,

)

drop = (

    0b00100,

    0b00100,

    0b01010,

    0b01010,

    0b10001,

    0b10001,

    0b10001,

    0b01110,

)

temp = (

    0b00100,

    0b01010,

    0b01010,

    0b01110,

    0b01110,

    0b11111,

    0b11111,

    0b01110,

)

lcd.create_char(0, omega)

lcd.create_char(1, pi)

lcd.create_char(2, mu)

lcd.create_char(3, drop)

lcd.create_char(4, temp)

lcd.write_string(unichr(0))

lcd.write_string(unichr(1))

lcd.write_string(unichr(2))

lcd.write_string(unichr(3))

lcd.write_string(unichr(4))

Nhấp nháy

Chương trình này cuộn văn bản từ phải sang trái trong một vòng lặp vô hạn:

framebuffer = [

    ”,

    ”,

]

def write_to_lcd(lcd, framebuffer, num_cols):

    lcd.home()

    for row in framebuffer:

        lcd.write_string(row.ljust(num_cols)[:num_cols])

        lcd.write_string(‘\r\n’)

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

write_to_lcd(lcd, framebuffer, 16)

import time

long_string = ‘This string is too long to fit’

def loop_string(string, lcd, framebuffer, row, num_cols, delay=0.5): #DELAY= CONTROLS THE SPEED OF SCROLL

    padding = ‘ ‘ * num_cols

    s = padding + string + padding

    for i in range(len(s) – num_cols + 1):

        framebuffer[row] = s[i:i+num_cols]

        write_to_lcd(lcd, framebuffer, num_cols)

        time.sleep(delay)

while True:

    loop_string(long_string, lcd, framebuffer, 1, 16)

Bạn có thể thay đổi tốc độ cuộn trên dòng 19 nơi nó cho biết delay=0.5.

IN DỮ LIỆU TỪ CẢM BIẾN

Để trình bày cách in dữ liệu từ cảm biến, đây là chương trình hiển thị nhiệt độ từ  Cảm biến nhiệt độ kỹ thuật số DS18B20 . Có một số thiết lập để làm trước khi bạn có thể làm cho điều này hoạt động trên Raspberry Pi, vì vậy hãy xem hướng dẫn của chúng tôi về DS18B20  để biết cách thực hiện.

Nói chung, bạn lấy biến đầu vào từ cảm biến của mình và chuyển nó thành một số nguyên để thực hiện bất kỳ phép tính nào. Sau đó, chuyển đổi kết quả thành một chuỗi và xuất chuỗi ra màn hình bằng cách sử dụng  lcd.write_string(sensor_data()):

import os

import glob

import time

from RPLCD import CharLCD

lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23])

os.system(‘modprobe w1-gpio’)

os.system(‘modprobe w1-therm’)

base_dir = ‘/sys/bus/w1/devices/’

device_folder = glob.glob(base_dir + ’28*’)[0]

device_file = device_folder + ‘/w1_slave’

def read_temp_raw():

    f = open(device_file, ‘r’)

    lines = f.readlines()

    f.close()

    return lines

#CELSIUS CALCULATION

def read_temp_c():

    lines = read_temp_raw()

    while lines[0].strip()[-3:] != ‘YES’:

        time.sleep(0.2)

        lines = read_temp_raw()

    equals_pos = lines[1].find(‘t=’)

    if equals_pos != -1:

        temp_string = lines[1][equals_pos+2:]

        temp_c = int(temp_string) / 1000.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT’S AN INTEGER TO DO THE MATH

        temp_c = str(round(temp_c, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING

        return temp_c

#FAHRENHEIT CALCULATION

def read_temp_f():

    lines = read_temp_raw()

    while lines[0].strip()[-3:] != ‘YES’:

        time.sleep(0.2)

        lines = read_temp_raw()

    equals_pos = lines[1].find(‘t=’)

    if equals_pos != -1:

        temp_string = lines[1][equals_pos+2:]

        temp_f = (int(temp_string) / 1000.0) * 9.0 / 5.0 + 32.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT’S AN INTEGER TO DO THE MATH

        temp_f = str(round(temp_f, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING

        return temp_f

while True:

    lcd.cursor_pos = (0, 0)

    lcd.write_string(“Temp: ” + read_temp_c() + unichr(223) + “C”)

    lcd.cursor_pos = (1, 0)

    lcd.write_string(“Temp: ” + read_temp_f() + unichr(223) + “F”)

Chà, điều đó bao gồm hầu hết những gì bạn cần để bắt đầu lập trình màn hình LCD của mình với Python. Hãy thử kết hợp các chương trình để có được một số hiệu ứng thú vị. Bạn có thể hiển thị dữ liệu từ nhiều cảm biến bằng cách in và xóa màn hình hoặc định vị văn bản. Bạn cũng có thể tạo hoạt ảnh vui nhộn bằng cách cuộn các ký tự tùy chỉnh.

Nếu bạn có bất kỳ vấn đề hoặc câu hỏi, chỉ cần để lại bình luận bên dưới. Và hãy nhớ đăng ký nếu bạn muốn nhận được thông báo qua email khi chúng tôi xuất bản các bài viết mới. Ok, nói chuyện với bạn lần sau!

Đỗ Thủy

Trang web #hocwiki cung cấp kiến thức điện tử cơ bản về tụ điện , điện trở các kiến thức về mạch điện hy vọng sẽ mang lại cho các bạn những kiến thức điện tử online hữu ích nhất.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button