LCD scherm (16×2) via I2C aansturen

Voor de Raspberry Pi zijn een aantal ‘klaar en klaar’ LCD schermen beschikbaar zoals bijvoorbeeld de PiFace CAD. Het nadeel van deze oplossingen is de hoge prijs van rond de 30€, voor slechts enkele euro’s kun je zelf een dergelijk scherm maken. In dit stappenplan gaan we een generiek LCD scherm voorzien van een I2C backpack en level shifter aansluiten op een Raspberry Pi. Hierna kunnen we deze aansturen met een speciaal Python script. De kosten van de gebruikte componenten ligt rond de €3.

Gebruikte componenten

16×2 Character LCD met IIC/I2C Backpack Module
Logic Level Shifter Bi-directioneel
10x Dupont verbindingskabel (female/female)

Door gebruik te maken van de bovenstaande links steun je raspberrytips, bedankt!

Raspberry Pi 3 model B
Raspbian Stretch (2018-03-13 kernel 4.9.)

Aansluitschema

De I2C module kan gevoed worden met 5V of 3.3V maar geeft de beste helderheid als je gebruik maakt van 5V. De GPIO pins van de Raspberry Pi zijn echter niet 5V ’tolerant’ vandaar dat we een I2C level shifter gebruiken. Op de level shifter wordt zowel 3.3V als 5V als referentie aangesloten.

Raspberry Pi Level Shifter I2C backpack
3.3V (PIN #1) LV
SDA (PIN #3) LV1
SCL (PIN #5) LV2
GND (PIN #6) GND
5V (PIN #2) HV
5V (PIN #3) VCC
HV1 SDA
HV2 SCL
GND GND

i2c backpack raspberry pi

Python script

Om tekst op het LCD scherm te krijgen gebruiken we een Python-script dat de I2C interface aanstuurt. Om toegang te krijgen tot de I2C interface dient deze op de Raspberry Pi geactiveerd te zijn, dit kan je doen met de raspi-config tool.

sudo raspi-config

Ga naar ‘Advanced options’ en ‘enable’ de I2C optie.

Hierna na kunnen we het onderstaande Python script gaan testen.

#!/usr/bin/python
import smbus
import time
import datetime
I2C_ADDR = 0x27 # I2C device address
LCD_WIDTH = 16 # Maximum characters per line
# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
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 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("RASPBERRYTIPS.NL",LCD_LINE_1)
lcd_string( str(now.hour) + ":" + str(now.minute) ,LCD_LINE_2)
time.sleep(1)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)
view raw lcdi2c.py hosted with ❤ by GitHub

Kopieer of download het Python script:

wget https://raspberrytips.nl/lcdi2c.py

Activeer het script:

sudo python lcdi2c.py

Op het scherm verschijnt de url van deze website en op de tweede regel de actuele tijd. Je kunt natuurlijk ook zelf informatie weergeven zoals bijvoorbeeld waardes van sensoren.

raspberry pi i2c led display backpack

I2C Script parameters

lcd_init()
Reset en activeer het LCD scherm.

lcd_string("tekst",LCD_LINE_1)
Plaats ’tekst’ maximaal 16 characters op de eerste regel LCD_LINE_1, voor de tweede regel kun je gebruik maken van LCD_LINE_2.

Origineel artikel geplaatst op 29-06-2016 laatste update 5-4-2018 om 10:41

5 gedachten over “LCD scherm (16×2) via I2C aansturen”

Plaats een reactie

%d bloggers liken dit: