mirror of
https://github.com/node-red/node-red-nodes.git
synced 2025-12-26 23:16:47 +01:00
Add Pi LCD node for simple LCD modules
This commit is contained in:
184
hardware/PiLcd/nrlcd.py
Normal file
184
hardware/PiLcd/nrlcd.py
Normal file
@@ -0,0 +1,184 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# HD44780 LCD Test Script for
|
||||
# Raspberry Pi
|
||||
#
|
||||
# Original Author : Matt Hawkins
|
||||
# Site : http://www.raspberrypi-spy.co.uk
|
||||
# Modified to use PINS not BCM : Dave Conway-Jones
|
||||
|
||||
#import
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
import sys
|
||||
import os, select
|
||||
|
||||
# Turn off warnings if you run it a second time...
|
||||
GPIO.setwarnings(False)
|
||||
|
||||
# Define initial Pins to LCD mapping
|
||||
LCD_RS = 26
|
||||
LCD_E = 24
|
||||
LCD_D4 = 22
|
||||
LCD_D5 = 18
|
||||
LCD_D6 = 16
|
||||
LCD_D7 = 12
|
||||
|
||||
# Define some device constants
|
||||
LCD_WIDTH = 20 # Maximum characters per line
|
||||
LCD_CHR = True
|
||||
LCD_CMD = False
|
||||
|
||||
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
|
||||
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
|
||||
LCD_LINE_3 = 0xA0 # LCD RAM address for the 3rd line
|
||||
LCD_LINE_4 = 0xE0 # LCD RAM address for the 4th line
|
||||
|
||||
# Timing constants
|
||||
E_PULSE = 0.00005
|
||||
E_DELAY = 0.00005
|
||||
|
||||
def lcd_init():
|
||||
# Initialise display
|
||||
lcd_byte(0x33,LCD_CMD)
|
||||
lcd_byte(0x32,LCD_CMD)
|
||||
lcd_byte(0x28,LCD_CMD)
|
||||
lcd_byte(0x0C,LCD_CMD)
|
||||
lcd_byte(0x06,LCD_CMD)
|
||||
lcd_byte(0x01,LCD_CMD)
|
||||
|
||||
def lcd_string(message):
|
||||
# Send string to display
|
||||
message = message.ljust(LCD_WIDTH," ")
|
||||
for i in range(LCD_WIDTH):
|
||||
lcd_byte(ord(message[i]),LCD_CHR)
|
||||
|
||||
def lcd_byte(bits, mode):
|
||||
# Send byte to data pins
|
||||
# bits = data
|
||||
# mode = True for character
|
||||
# False for command
|
||||
GPIO.output(LCD_RS, mode) # RS
|
||||
|
||||
# High bits
|
||||
GPIO.output(LCD_D4, False)
|
||||
GPIO.output(LCD_D5, False)
|
||||
GPIO.output(LCD_D6, False)
|
||||
GPIO.output(LCD_D7, False)
|
||||
if bits&0x10==0x10:
|
||||
GPIO.output(LCD_D4, True)
|
||||
if bits&0x20==0x20:
|
||||
GPIO.output(LCD_D5, True)
|
||||
if bits&0x40==0x40:
|
||||
GPIO.output(LCD_D6, True)
|
||||
if bits&0x80==0x80:
|
||||
GPIO.output(LCD_D7, True)
|
||||
|
||||
# Toggle 'Enable' pin
|
||||
time.sleep(E_DELAY)
|
||||
GPIO.output(LCD_E, True)
|
||||
time.sleep(E_PULSE)
|
||||
GPIO.output(LCD_E, False)
|
||||
time.sleep(E_DELAY)
|
||||
|
||||
# Low bits
|
||||
GPIO.output(LCD_D4, False)
|
||||
GPIO.output(LCD_D5, False)
|
||||
GPIO.output(LCD_D6, False)
|
||||
GPIO.output(LCD_D7, False)
|
||||
if bits&0x01==0x01:
|
||||
GPIO.output(LCD_D4, True)
|
||||
if bits&0x02==0x02:
|
||||
GPIO.output(LCD_D5, True)
|
||||
if bits&0x04==0x04:
|
||||
GPIO.output(LCD_D6, True)
|
||||
if bits&0x08==0x08:
|
||||
GPIO.output(LCD_D7, True)
|
||||
|
||||
# Toggle 'Enable' pin
|
||||
time.sleep(E_DELAY)
|
||||
GPIO.output(LCD_E, True)
|
||||
time.sleep(E_PULSE)
|
||||
GPIO.output(LCD_E, False)
|
||||
time.sleep(E_DELAY)
|
||||
|
||||
# Main program loop
|
||||
if len(sys.argv) > 1:
|
||||
pins = sys.argv[1].lower().split(',')
|
||||
if len(pins) != 6:
|
||||
print "Bad number of pins supplied"
|
||||
print " "+pins
|
||||
sys.exit(0)
|
||||
|
||||
LCD_RS = int(pins[0])
|
||||
LCD_E = int(pins[1])
|
||||
LCD_D4 = int(pins[2])
|
||||
LCD_D5 = int(pins[3])
|
||||
LCD_D6 = int(pins[4])
|
||||
LCD_D7 = int(pins[5])
|
||||
|
||||
GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers
|
||||
GPIO.setup(LCD_RS, GPIO.OUT) # RS
|
||||
GPIO.setup(LCD_E, GPIO.OUT) # E
|
||||
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
|
||||
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
|
||||
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
|
||||
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
|
||||
|
||||
# Initialise display
|
||||
lcd_init()
|
||||
|
||||
# Send some test
|
||||
lcd_byte(LCD_LINE_1, LCD_CMD)
|
||||
lcd_string("Node-RED")
|
||||
lcd_byte(LCD_LINE_2, LCD_CMD)
|
||||
lcd_string("LCD online")
|
||||
time.sleep(2) # 2 second delay
|
||||
lcd_byte(0x01,LCD_CMD)
|
||||
|
||||
# Flush stdin so we start clean
|
||||
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
|
||||
os.read(sys.stdin.fileno(), 4096)
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
data = data.rstrip("\r\n\t")
|
||||
if data == "c:lose": # cleanup and exit
|
||||
GPIO.cleanup(LCD_RS)
|
||||
GPIO.cleanup(LCD_E)
|
||||
GPIO.cleanup(LCD_D4)
|
||||
GPIO.cleanup(LCD_D5)
|
||||
GPIO.cleanup(LCD_D6)
|
||||
GPIO.cleanup(LCD_D7)
|
||||
sys.exit(0)
|
||||
elif data == "clr:": # clear the display
|
||||
lcd_init()
|
||||
elif data.startswith("1:"):
|
||||
lcd_byte(LCD_LINE_1, LCD_CMD)
|
||||
lcd_string(data[2:])
|
||||
elif data.startswith("2:"):
|
||||
lcd_byte(LCD_LINE_2, LCD_CMD)
|
||||
lcd_string(data[2:])
|
||||
elif data.startswith("3:"):
|
||||
lcd_byte(LCD_LINE_3, LCD_CMD)
|
||||
lcd_string(data[2:])
|
||||
elif data.startswith("4:"):
|
||||
lcd_byte(LCD_LINE_4, LCD_CMD)
|
||||
lcd_string(data[2:])
|
||||
else: # default to line 1
|
||||
lcd_byte(LCD_LINE_1, LCD_CMD)
|
||||
lcd_string(data)
|
||||
except EOFError: # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup(LCD_RS)
|
||||
GPIO.cleanup(LCD_E)
|
||||
GPIO.cleanup(LCD_D4)
|
||||
GPIO.cleanup(LCD_D5)
|
||||
GPIO.cleanup(LCD_D6)
|
||||
GPIO.cleanup(LCD_D7)
|
||||
sys.exit(0)
|
||||
|
||||
else:
|
||||
print "Bad params"
|
||||
print " sudo nrlcd.py RS,E,D4,D5,D6,D7"
|
||||
sys.exit(0)
|
||||
Reference in New Issue
Block a user