203 lines
5.1 KiB
Python
203 lines
5.1 KiB
Python
import math
|
|
import RPi.GPIO as IO
|
|
import threading
|
|
from time import sleep, localtime
|
|
|
|
# IO.setwarnings(False)
|
|
IO.setmode(IO.BCM)
|
|
|
|
HexDigits = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
|
|
0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x49, 0x50, 0x40]
|
|
|
|
# 0 1 2 3 4 5 6
|
|
# 7 8 9 A B C D E F = r -
|
|
# 10 11 12 13 14 15 16 17 18
|
|
#
|
|
# 0
|
|
# ---
|
|
# | |
|
|
# 5 | 6 | 1
|
|
# ---
|
|
# | |
|
|
# 4 | | 2
|
|
# ---
|
|
# 3
|
|
#
|
|
|
|
ADDR_AUTO = 0x40
|
|
ADDR_FIXED = 0x44
|
|
STARTADDR = 0xC0
|
|
# DEBUG = False
|
|
|
|
|
|
# return array value of a certain character
|
|
def s2c(s):
|
|
if s>='0' and s<='9':
|
|
return(int(s))
|
|
elif s=='A':
|
|
return(10)
|
|
elif s=='B':
|
|
return(11)
|
|
elif s=='C':
|
|
return(12)
|
|
elif s=='D':
|
|
return(13)
|
|
elif s=='E':
|
|
return(14)
|
|
elif s=='F':
|
|
return(15)
|
|
|
|
elif s=='=':
|
|
return(16)
|
|
elif s=='r':
|
|
return(17)
|
|
elif s=='-':
|
|
return(18)
|
|
elif s=='O':
|
|
return(0)
|
|
|
|
else:
|
|
return(0x7f)
|
|
|
|
|
|
class TM1637:
|
|
__doublePoint = False
|
|
__Clkpin = 0
|
|
__Datapin = 0
|
|
__brightness = 1.0 # default to max brightness
|
|
__currentData = [0, 0, 0, 0]
|
|
|
|
def __init__(self, CLK, DIO, brightness):
|
|
self.__Clkpin = CLK
|
|
self.__Datapin = DIO
|
|
self.__brightness = brightness
|
|
IO.setup(self.__Clkpin, IO.OUT)
|
|
IO.setup(self.__Datapin, IO.OUT)
|
|
|
|
def cleanup(self):
|
|
"""Stop updating clock, turn off display, and cleanup GPIO"""
|
|
self.showclock(" ")
|
|
IO.cleanup()
|
|
|
|
def Clear(self):
|
|
b = self.__brightness
|
|
point = self.__doublePoint
|
|
self.__brightness = 0
|
|
self.__doublePoint = False
|
|
data = [0x7F, 0x7F, 0x7F, 0x7F]
|
|
self.Show(data)
|
|
# Restore previous settings:
|
|
self.__brightness = b
|
|
self.__doublePoint = point
|
|
|
|
def showclock(self,tstr):
|
|
"Show da clock"
|
|
|
|
if tstr[2]==':':
|
|
self.ShowDoublepoint(True)
|
|
else:
|
|
self.ShowDoublepoint(False)
|
|
|
|
self.Show1(0,s2c(tstr[0]))
|
|
self.Show1(1,s2c(tstr[1]))
|
|
self.Show1(2,s2c(tstr[3]))
|
|
self.Show1(3,s2c(tstr[4]))
|
|
|
|
def Show(self, data):
|
|
for i in range(0, 4):
|
|
self.__currentData[i] = data[i]
|
|
|
|
self.start()
|
|
self.writeByte(ADDR_AUTO)
|
|
self.br()
|
|
self.writeByte(STARTADDR)
|
|
for i in range(0, 4):
|
|
self.writeByte(self.coding(data[i]))
|
|
self.br()
|
|
self.writeByte(0x88 + int(self.__brightness))
|
|
self.stop()
|
|
|
|
def Show1(self, DigitNumber, data):
|
|
"""show one Digit (number 0...3)"""
|
|
if(DigitNumber < 0 or DigitNumber > 3):
|
|
return # error
|
|
|
|
self.__currentData[DigitNumber] = data
|
|
|
|
self.start()
|
|
self.writeByte(ADDR_FIXED)
|
|
self.br()
|
|
self.writeByte(STARTADDR | DigitNumber)
|
|
self.writeByte(self.coding(data))
|
|
self.br()
|
|
self.writeByte(0x88 + int(self.__brightness))
|
|
self.stop()
|
|
|
|
def SetBrightnessRaw(self, briteness):
|
|
"""Accepts raw brightness from 0 - 255"""
|
|
brightness=briteness>>5
|
|
print "BR=",brightness
|
|
if(self.__brightness != brightness):
|
|
self.__brightness = brightness
|
|
# self.Show(self.__currentData)
|
|
|
|
def ShowDoublepoint(self, on):
|
|
"""Show or hide double point divider"""
|
|
if(self.__doublePoint != on):
|
|
self.__doublePoint = on
|
|
self.Show(self.__currentData)
|
|
|
|
def writeByte(self, data):
|
|
for i in range(0, 8):
|
|
IO.output(self.__Clkpin, IO.LOW)
|
|
if(data & 0x01):
|
|
IO.output(self.__Datapin, IO.HIGH)
|
|
else:
|
|
IO.output(self.__Datapin, IO.LOW)
|
|
data = data >> 1
|
|
IO.output(self.__Clkpin, IO.HIGH)
|
|
|
|
# wait for ACK
|
|
IO.output(self.__Clkpin, IO.LOW)
|
|
IO.output(self.__Datapin, IO.HIGH)
|
|
IO.output(self.__Clkpin, IO.HIGH)
|
|
IO.setup(self.__Datapin, IO.IN)
|
|
|
|
while(IO.input(self.__Datapin)):
|
|
sleep(0.001)
|
|
if(IO.input(self.__Datapin)):
|
|
IO.setup(self.__Datapin, IO.OUT)
|
|
IO.output(self.__Datapin, IO.LOW)
|
|
IO.setup(self.__Datapin, IO.IN)
|
|
IO.setup(self.__Datapin, IO.OUT)
|
|
|
|
def start(self):
|
|
"""send start signal to TM1637"""
|
|
IO.output(self.__Clkpin, IO.HIGH)
|
|
IO.output(self.__Datapin, IO.HIGH)
|
|
IO.output(self.__Datapin, IO.LOW)
|
|
IO.output(self.__Clkpin, IO.LOW)
|
|
|
|
def stop(self):
|
|
IO.output(self.__Clkpin, IO.LOW)
|
|
IO.output(self.__Datapin, IO.LOW)
|
|
IO.output(self.__Clkpin, IO.HIGH)
|
|
IO.output(self.__Datapin, IO.HIGH)
|
|
|
|
def br(self):
|
|
"""terse break"""
|
|
self.stop()
|
|
self.start()
|
|
|
|
def coding(self, data):
|
|
if(self.__doublePoint):
|
|
pointData = 0x80
|
|
else:
|
|
pointData = 0
|
|
|
|
if(data == 0x7F):
|
|
data = 0
|
|
else:
|
|
data = HexDigits[data] + pointData
|
|
return data
|