czwartek, 28 marca
Shadow

Raspberrypi – 4×20 LCD I2C

Zegar z wykorzystaniem wyświetlacza LCD 4×20 z konwerterem I2c. Opisywałem już wersję 2×16 którą można zobaczyć tu.Tym razem opiszę większą wersje 4×20.

lcd 4x20 i2c raspberry

Potrzebne komponenty:

– RaspberryPi lub odpowiednik z zainstalowanym Raspbianem
– wyświetlacz 4×20 zgodny z HD44780 wraz z konwerterem I2C
– przewody połączeniowe
– oprogramowanie do obsługi opiszę poniżej

W pierwszej kolejności musimy podłączyć nasz ekran do maliny

RaspberryPi LCD moduł i2c
5V (pin 2) VCC
GND (pin 6) GND
SDA (pin 3) SDA
SCL (pin 5) SLC

Sprawdź działanie I2C

Po podłączeniu modułu do magistrali I2C można sprawdzić, czy jest faktycznie wykrywany. Możesz to zrobić za pomocą narzędzi I2C, jeśli ich nie zainstalowałeś, możesz to zrobić za pomocą:

sudo apt-get install i2c-tools

Następnie sprawdź, czy moduł jest widoczny:

i2cdetect -y 1

sprawdzenie adresu i2c lcd 4x20

To co wyświetlane jest na LCD możemy zmienić w liniach od 78-81 mowa to o:

lcd_string("Wydawnictwo",LCD_LINE_1)
lcd_string("Tranzystor.pl",LCD_LINE_2)
lcd_string(str(now.day)+'/'+str(now.month)+'/'+str(now.year),LCD_LINE_3)
lcd_string(str(now.hour)+':'+str(now.minute),LCD_LINE_4)

Kod w Pythonie

można pobać z

wget https://www.tranzystor.pl/pliki/raspberry/lcd_4x20_i2c.py

lub dostępny jest poniżej.

#!/usr/bin/python
#Pobrano z www.tanzystor.pl
import sys
import smbus
import time
import datetime
import subprocess

I2C_ADDR = 0x3F # I2C device address
LCD_WIDTH = 20 # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x82
LCD_LINE_2 = 0xC1
LCD_LINE_3 = 0x93
LCD_LINE_4 = 0xD5

LCD_BACKLIGHT = 0x08 # On 0X08 / Off 0x00

ENABLE = 0b00000100 # Enable bit

E_PULSE = 0.0005
E_DELAY = 0.0005

bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def run_cmd(cmd):
return subprocess.check_output(cmd, shell=True).decode('utf-8')

def lcd_init():
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)

def lcd_byte(bits, mode):

bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

bus.write_byte(I2C_ADDR, bits_high)
lcd_toggle_enable(bits_high)

bus.write_byte(I2C_ADDR, bits_low)
lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
time.sleep(E_DELAY)
bus.write_byte(I2C_ADDR, (bits | ENABLE))
time.sleep(E_PULSE)
bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
time.sleep(E_DELAY)

def lcd_string(message,line):

message = message.ljust(LCD_WIDTH," ")

lcd_byte(line, LCD_CMD)

for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)

def main():

lcd_init()

while True:

now = datetime.datetime.now()

lcd_string("Wydawnictwo",LCD_LINE_1)
lcd_string("Tranzystor.pl",LCD_LINE_2)
lcd_string(str(now.day)+'/'+str(now.month)+'/'+str(now.year),LCD_LINE_3)
lcd_string(str(now.hour)+':'+str(now.minute),LCD_LINE_4)

time.sleep(60)

if __name__ == '__main__':

try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)

5/5 - (2 ocena/y)

1 Comment

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *


Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.