# Tip of the hat to https://github.com/johnlr/raspberrypi-tm1637 for # this code. This has been very slightly modified, but is mostly his # work. from time import sleep from wiringpi import pinMode, digitalRead, digitalWrite, GPIO """ A --- F | | B -G- E | | C --- D """ class TM1637: I2C_COMM1 = 0x40 I2C_COMM2 = 0xC0 I2C_COMM3 = 0x80 digit_to_segment = [ 0b0111111, # 0 0b0000110, # 1 0b1011011, # 2 0b1001111, # 3 0b1100110, # 4 0b1101101, # 5 0b1111101, # 6 0b0000111, # 7 0b1111111, # 8 0b1101111, # 9 0b1110111, # A 0b1111100, # b 0b0111001, # C 0b1011110, # d 0b1111001, # E 0b1110001 # F ] def __init__(self, clk, dio, brightness): self.clk = clk self.dio = dio self.brightness = brightness pinMode(self.clk, GPIO.INPUT) pinMode(self.dio, GPIO.INPUT) digitalWrite(self.clk, GPIO.LOW) digitalWrite(self.dio, GPIO.LOW) def bit_delay(self): sleep(0.001) return def set_segments(self, segments, pos=0): # Write COMM1 self.start() self.write_byte(self.I2C_COMM1) self.stop() # Write COMM2 + first digit address self.start() self.write_byte(self.I2C_COMM2 + pos) for seg in segments: self.write_byte(seg) self.stop() # Write COMM3 + brightness self.start() self.write_byte(self.I2C_COMM3 + self.brightness) self.stop() def start(self): pinMode(self.dio, GPIO.OUTPUT) self.bit_delay() def stop(self): pinMode(self.dio, GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() pinMode(self.dio, GPIO.INPUT) self.bit_delay() def write_byte(self, b): # 8 Data Bits for i in range(8): # CLK low pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() pinMode(self.dio, GPIO.INPUT if b & 1 else GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() b >>= 1 pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() return # End of class 'TM1637'