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 |
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) |
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.
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.
Heb je ook andere urls? nL shop ofzo?
Deze werken niet meer?
Hier werken de links zonder problemen, gebruik je misschien een adblocker?
Ja ik gebruik idd pihole.
Maar links naar een snel leverende nl shop zijn denk ik:
https://www.hobbyelectronica.nl/product/logic-level-converter-bi-directional/
En scherm https://www.hobbyelectronica.nl/product/hd44780-16×2-karakters-lcd-display-module-geel-backlight/
En backpack https://www.hobbyelectronica.nl/product/i2c-lcd-interface-voor-16×2-en-20×4-displays/
Maar werkt dan dat script nog?
Gaat al mis bij de eerste code: import smbus
“ImportError: No module named smbus”
Misschien heb je inmiddels zelf al de oplossing voor die melding gevonden:
Je zal smbus moeten installeren (bijvoorbeeld via command-line).
Beetje Googlen brengt mij bij:
http://skpang.co.uk/blog/archives/575