diff --git a/devtimer.py b/devtimer.py new file mode 100755 index 0000000..6041217 --- /dev/null +++ b/devtimer.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +import subprocess +from time import time, sleep, localtime + +from wiringpi import wiringPiSetupGpio, pinMode, digitalRead, digitalWrite, GPIO +wiringPiSetupGpio() + +CLK = 21 +DIO = 20 + +""" + 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): + self.clk = clk + self.dio = dio + self.brightness = 0x09 # 0x0f + + 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 + + +def show_elapsed(tm, elapsed): + min = elapsed // 60 + sec = elapsed % 60 + d0 = tm.digit_to_segment[min // 10] + d1 = tm.digit_to_segment[min % 10] + d2 = tm.digit_to_segment[sec // 10] + d3 = tm.digit_to_segment[sec % 10] + tm.set_segments([d0, 0x80 + d1, d2, d3]) + +if __name__ == "__main__": + + tm = TM1637(CLK, DIO) + + start_time = int(time()) + show_elapsed(tm, 0) + + while True: + sleep(.05) + show_elapsed(tm, int(time())-start_time) + if int(time())-start_time == 5999: + start_time = int(time()) + + + +# tm.set_segments([0, 0, 0, 0]) +# value = 0 +# digits = [] +# th = value // 1000 +# hu = (value % 1000) // 100 +# tn = (value % 100) // 10 +# on = value % 10 +# digits = [tm.digit_to_segment[th], tm.digit_to_segment[hu], tm.digit_to_segment[tn], tm.digit_to_segment[on]] +# tm.set_segments(digits) +# sleep(.05) + +# if value == 9999: +# value = 0 +# else: +# value += 1