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.
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
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)
Dodał bym jeszcze w lini 1 oraz 2 obciążenie procesora odra wolną pamięć RAM.