# from Seeed Studio Wiki
# http://wiki.seeed.cc/Raspberry_Pi_Relay_Board_v1.0/
class RelayBoards():
def __init__(self, bus_address=1, *board_addresses):
import smbus
# 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
self.bus = smbus.SMBus(bus_address)
self.boards = [RelayBoard(self.bus, addr) for addr in board_addresses]
def __getitem__(self, i):
return self.boards[i]
def __len__(self):
return len(self.boards)
class RelayBoard():
n_relays = 4
def __init__(self, bus, board_address=0x20):
self.bus = bus
self.DEVICE_ADDRESS = board_address # 7 bit address (will be left shifted to add the read write bit)
self.DEVICE_REG_MODE1 = 0x06
self.DEVICE_REG_DATA = 0xff
self.get_state()
def get_state(self):
self.DEVICE_REG_DATA = self.bus.read_byte_data(self.DEVICE_ADDRESS, self.DEVICE_REG_MODE1)
def set_state(self):
self.bus.write_byte_data(self.DEVICE_ADDRESS, self.DEVICE_REG_MODE1, self.DEVICE_REG_DATA)
def is_on(self, i):
self.get_state()
return (self.DEVICE_REG_DATA & (0x1 << i)) == 0
def on(self, i, sync=True):
if sync:
self.get_state()
self.DEVICE_REG_DATA &= ~(0x1 << i)
self.set_state()
def off(self, i, sync=True):
if sync:
self.get_state()
self.DEVICE_REG_DATA |= (0x1 << i)
self.set_state()
def flip(self, i):
if self.is_on(i):
self.off(i, sync=False) # already know state from above
else:
self.on(i, sync=False)
def all_on(self):
self.DEVICE_REG_DATA &= ~(0xf << 0)
self.set_state()
def all_off(self):
self.DEVICE_REG_DATA |= (0xf << 0)
self.set_state()