122 lines
3.8 KiB
Python
122 lines
3.8 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# GrovePi Example for using the Grove - LCD RGB Backlight (http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight)
|
|
#
|
|
# The GrovePi connects the Raspberry Pi and Grove sensors. You can learn more about GrovePi here: http://www.dexterindustries.com/GrovePi
|
|
#
|
|
# Have a question about this example? Ask on the forums here: http://forum.dexterindustries.com/c/grovepi
|
|
#
|
|
# History
|
|
# ------------------------------------------------
|
|
# Author Date Comments
|
|
# Initial Authoring
|
|
# Karan 7 Jan 16 Library updated to add a function to update the text without erasing the screen
|
|
# Released under the MIT license (http://choosealicense.com/licenses/mit/).
|
|
# For more information see https://github.com/DexterInd/GrovePi/blob/master/LICENSE
|
|
|
|
#
|
|
# NOTE:
|
|
# Just supports setting the backlight colour, and
|
|
# putting a single string of text onto the display
|
|
# Doesn't support anything clever, cursors or anything
|
|
|
|
import time,sys
|
|
|
|
if sys.platform == 'uwp':
|
|
import winrt_smbus as smbus
|
|
bus = smbus.SMBus(1)
|
|
else:
|
|
import smbus
|
|
import RPi.GPIO as GPIO
|
|
rev = GPIO.RPI_REVISION
|
|
if rev == 2 or rev == 3:
|
|
bus = smbus.SMBus(1)
|
|
else:
|
|
bus = smbus.SMBus(0)
|
|
|
|
# this device has two I2C addresses
|
|
DISPLAY_RGB_ADDR = 0x62
|
|
DISPLAY_TEXT_ADDR = 0x3e
|
|
|
|
# set backlight to (R,G,B) (values from 0..255 for each)
|
|
def setRGB(r,g,b):
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,0,0)
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,1,0)
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,0x08,0xaa)
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,4,r)
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,3,g)
|
|
bus.write_byte_data(DISPLAY_RGB_ADDR,2,b)
|
|
|
|
# send command to display (no need for external use)
|
|
def textCommand(cmd):
|
|
bus.write_byte_data(DISPLAY_TEXT_ADDR,0x80,cmd)
|
|
|
|
# set display text \n for second line(or auto wrap)
|
|
def setText(text):
|
|
textCommand(0x01) # clear display
|
|
time.sleep(.05)
|
|
textCommand(0x08 | 0x04) # display on, no cursor
|
|
textCommand(0x28) # 2 lines
|
|
time.sleep(.05)
|
|
count = 0
|
|
row = 0
|
|
for c in text:
|
|
if c == '\n' or count == 16:
|
|
count = 0
|
|
row += 1
|
|
if row == 2:
|
|
break
|
|
textCommand(0xc0)
|
|
if c == '\n':
|
|
continue
|
|
count += 1
|
|
bus.write_byte_data(DISPLAY_TEXT_ADDR,0x40,ord(c))
|
|
|
|
#Update the display without erasing the display
|
|
def setText_norefresh(text):
|
|
textCommand(0x02) # return home
|
|
time.sleep(.05)
|
|
textCommand(0x08 | 0x04) # display on, no cursor
|
|
textCommand(0x28) # 2 lines
|
|
time.sleep(.05)
|
|
count = 0
|
|
row = 0
|
|
while len(text) < 32: #clears the rest of the screen
|
|
text += ' '
|
|
for c in text:
|
|
if c == '\n' or count == 16:
|
|
count = 0
|
|
row += 1
|
|
if row == 2:
|
|
break
|
|
textCommand(0xc0)
|
|
if c == '\n':
|
|
continue
|
|
count += 1
|
|
bus.write_byte_data(DISPLAY_TEXT_ADDR,0x40,ord(c))
|
|
|
|
# Create a custom character (from array of row patterns)
|
|
def create_char(location, pattern):
|
|
"""
|
|
Writes a bit pattern to LCD CGRAM
|
|
|
|
Arguments:
|
|
location -- integer, one of 8 slots (0-7)
|
|
pattern -- byte array containing the bit pattern, like as found at
|
|
https://omerk.github.io/lcdchargen/
|
|
"""
|
|
location &= 0x07 # Make sure location is 0-7
|
|
textCommand(0x40 | (location << 3))
|
|
bus.write_i2c_block_data(DISPLAY_TEXT_ADDR, 0x40, pattern)
|
|
|
|
# example code
|
|
if __name__=="__main__":
|
|
setText("Hello world\nThis is an LCD test")
|
|
setRGB(0,128,64)
|
|
time.sleep(2)
|
|
for c in range(0,255):
|
|
setText_norefresh("Going to sleep in {}...".format(str(c)))
|
|
setRGB(c,255-c,0)
|
|
time.sleep(0.1)
|
|
setRGB(0,255,0)
|
|
setText("Bye bye, this should wrap onto next line")
|