Newer
Older
devtimer / devtimer.py
@tundra tundra on 23 Mar 2018 3 KB initial checkin
#!/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