# 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
0b1000000, # Minus Sign
]
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'