Last active
September 5, 2015 18:29
-
-
Save aallan/dc2eddd5a0bbbc610925 to your computer and use it in GitHub Desktop.
Prints the current IP address for eth0 and eth1 to the SainSmart I2C 16×2 LCD panel using the ThinkBowl I2C library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import socket | |
import fcntl | |
import struct | |
from i2clibraries import i2c_lcd_smbus | |
def get_ip_address(ifname): | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
return socket.inet_ntoa(fcntl.ioctl( | |
s.fileno(), | |
0x8915, # SIOCGIFADDR | |
struct.pack('256s', ifname[:15]) | |
)[20:24]) | |
lcd = i2c_lcd_smbus.i2c_lcd(0x27,1, 2, 1, 0, 4, 5, 6, 7, 3) | |
lcd.command(lcd.CMD_Display_Control | lcd.OPT_Enable_Display) | |
lcd.backLightOn() | |
lcd.writeString( "e0 " ) | |
lcd.writeString( get_ip_address('eth0' ) ) | |
lcd.setPosition( 2, 0 ) | |
lcd.writeString( "e1 " ) | |
lcd.writeString( get_ip_address('eth1' ) ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import smbus | |
from time import * | |
# Older version of library that uses smbus, no longer updated | |
# For new projects use i2c_lcd | |
class i2c_lcd: | |
# Commands | |
CMD_Clear_Display = 0x01 | |
CMD_Return_Home = 0x02 | |
CMD_Entry_Mode = 0x04 | |
CMD_Display_Control = 0x08 | |
CMD_Cursor_Display_Shift = 0x10 | |
CMD_Function_Set = 0x20 | |
CMD_DDRAM_Set = 0x80 | |
# Options | |
OPT_Increment = 0x02 # CMD_Entry_Mode | |
OPT_Display_Shift = 0x01 # CMD_Entry_Mode | |
OPT_Enable_Display = 0x04 # CMD_Display_Control | |
OPT_Enable_Cursor = 0x02 # CMD_Display_Control | |
OPT_Enable_Blink = 0x01 # CMD_Display_Control | |
OPT_Display_Shift = 0x08 # CMD_Cursor_Display_Shift | |
OPT_Shift_Right = 0x04 # CMD_Cursor_Display_Shift 0 = Left | |
OPT_2_Lines = 0x08 # CMD_Function_Set 0 = 1 line | |
OPT_5x10_Dots = 0x04 # CMD_Function_Set 0 = 5x7 dots | |
def __init__(self, addr, port, en, rw, rs, d4, d5, d6, d7, backlight = -1): | |
self.addr = addr | |
self.bus = smbus.SMBus(port) | |
self.en = en | |
self.rs = rs | |
self.rw = rw | |
self.d4 = d4 | |
self.d5 = d5 | |
self.d6 = d6 | |
self.d7 = d7 | |
self.backlight = backlight | |
self.backlight_state = False | |
# Activate LCD | |
initialize_i2c_data = 0x00 | |
initialize_i2c_data = self._pinInterpret(self.d4, initialize_i2c_data, 0b1) | |
initialize_i2c_data = self._pinInterpret(self.d5, initialize_i2c_data, 0b1) | |
self._enable(initialize_i2c_data) | |
sleep(0.2) | |
self._enable(initialize_i2c_data) | |
sleep(0.1) | |
self._enable(initialize_i2c_data) | |
sleep(0.1) | |
# Initialize 4-bit mode | |
initialize_i2c_data = self._pinInterpret(self.d4, initialize_i2c_data, 0b0) | |
self._enable(initialize_i2c_data) | |
sleep(0.01) | |
self.command(self.CMD_Function_Set | self.OPT_2_Lines) | |
self.command(self.CMD_Display_Control | self.OPT_Enable_Display | self.OPT_Enable_Cursor) | |
self.command(self.CMD_Clear_Display) | |
self.command(self.CMD_Entry_Mode | self.OPT_Increment | self.OPT_Display_Shift) | |
def clear(self): | |
self.command(self.CMD_Clear_Display) | |
sleep(0.1) | |
def home(self): | |
self.command(self.CMD_Return_Home) | |
sleep(0.1) | |
def command(self, data): | |
self._write(data) | |
def setPosition(self, line, pos): | |
if line == 1: | |
address = pos | |
elif line == 2: | |
address = 0x40 + pos | |
elif line == 3: | |
address = 0x14 + pos | |
elif line == 4: | |
address = 0x54 + pos | |
self.command(self.CMD_DDRAM_Set + address) | |
def writeChar(self, char): | |
self._write(ord(char), False) | |
def writeString(self, string): | |
for c in string: | |
self.writeChar(c) | |
def backLightOn(self): | |
if self.backlight >= 0: | |
self.bus.write_byte(self.addr, self._pinInterpret(self.backlight, 0x00, 0b1)) | |
self.backlight_state = True | |
def backLightOff(self): | |
if self.backlight >= 0: | |
self.bus.write_byte(self.addr, self._pinInterpret(self.backlight, 0x00, 0b0)) | |
self.backlight_state = False | |
def _write(self, data, command=True): | |
i2c_data = 0x00 | |
#Add data for high nibble | |
hi_nibble = data >> 4 | |
i2c_data = self._pinInterpret(self.d4, i2c_data, (hi_nibble & 0x01)) | |
i2c_data = self._pinInterpret(self.d5, i2c_data, ((hi_nibble >> 1) & 0x01)) | |
i2c_data = self._pinInterpret(self.d6, i2c_data, ((hi_nibble >> 2) & 0x01)) | |
i2c_data = self._pinInterpret(self.d7, i2c_data, ((hi_nibble >> 3) & 0x01)) | |
# Set the register selector to 1 if this is data | |
if command != True: | |
i2c_data = self._pinInterpret(self.rs, i2c_data, 0x1) | |
# Toggle Enable | |
self._enable(i2c_data) | |
i2c_data = 0x00 | |
#Add data for high nibble | |
low_nibble = data & 0x0F | |
i2c_data = self._pinInterpret(self.d4, i2c_data, (low_nibble & 0x01)) | |
i2c_data = self._pinInterpret(self.d5, i2c_data, ((low_nibble >> 1) & 0x01)) | |
i2c_data = self._pinInterpret(self.d6, i2c_data, ((low_nibble >> 2) & 0x01)) | |
i2c_data = self._pinInterpret(self.d7, i2c_data, ((low_nibble >> 3) & 0x01)) | |
# Set the register selector to 1 if this is data | |
if command != True: | |
i2c_data = self._pinInterpret(self.rs, i2c_data, 0x1) | |
self._enable(i2c_data) | |
sleep(0.01) | |
def _pinInterpret(self, pin, data, value="0b0"): | |
if value: | |
# Construct mask using pin | |
mask = 0x01 << (pin) | |
data = data | mask | |
else: | |
# Construct mask using pin | |
mask = 0x01 << (pin) ^ 0xFF | |
data = data & mask | |
return data | |
def _enable(self, data): | |
# Determine if black light is on and insure it does not turn off or on | |
if self.backlight_state: | |
data = self._pinInterpret(self.backlight, data, 0b1) | |
else: | |
data = self._pinInterpret(self.backlight, data, 0b0) | |
self.bus.write_byte(self.addr, data) | |
self.bus.write_byte(self.addr, self._pinInterpret(self.en, data, 0b1)) | |
self.bus.write_byte(self.addr, data) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment