import machine
import time, sys
sev_seg = 0
sev_seg_digit = 8
display_value = 0
counter = None
prev_display_value = 0
digits = [
[0, 1, 1, 1, 1, 1, 1], # 0
[0, 0, 0, 0, 1, 1, 0], # 1
[1, 0, 1, 1, 0, 1, 1], # 2
[1, 0, 0, 1, 1, 1, 1], # 3
[1, 1, 0, 0, 1, 1, 0], # 4
[1, 1, 0, 1, 1, 0, 1], # 5
[1, 1, 1, 1, 1, 0, 1], # 6
[0, 0, 0, 0, 1, 1, 1], # 7
[1, 1, 1, 1, 1, 1, 1], # 8
[1, 1, 0, 1, 1, 1, 1], # 9
[1, 1, 1, 0, 1, 1, 1], # A
[1, 1, 1, 1, 1, 0, 0], # B
[0, 1, 1, 1, 0, 0, 1], # C
[1, 0, 1, 1, 1, 1, 0], # D
[1, 1, 1, 1, 0, 0, 1], # E
[1, 1, 1, 0, 0, 0, 1], # F
]
# On and Off Switch
switch = machine.Pin(15, machine.Pin.IN)
def disable_display_timer():
global scanner
scanner.deinit()
# Function to enable timer that triggers scanning 7 segment displays
def enable_display_timer(x):
x.init(period=90, mode=machine.Timer.PERIODIC, callback=scan_display)
# A function to adjust led brightness using PWM(Pulse With Modulation)
def PWM(x):
pwm = machine.PWM(machine.Pin(21))
pwm.freq(400000)
pwm.duty_u16(x)
# Function to handle scanning 7 segment displays
# Display the value stored in the display_value global variable
# on available 7-segment displays
def scan_display(timer_int):
global display_value, digit_pins
display_value = machine.ADC(machine.Pin(26)).read_u16()
m = int(((display_value * 3.3) / 65535) * 1000)
for i in range(len(digit_pins)):
display_digit(int(m % 10), i, i==3)
seg_pins[7].off()
digit_pins[i].on()
m /= 10
PWM(display_value)
# Function display the given value on the display with the specified index
# dp_enable specifies if the decimal pooint should be on or off
def display_digit(digit_value, digit_index, dp_enable=False):
global seg_pins, digit_pins
# Validity Check
if 0 > digit_value or digit_value > len(digits):
return
# Display Digit
val = digits[digit_value]
for i in range(7):
seg_pins[i].value(val[i])
# Position of Digit
if digit_index <= len(digit_pins):
digit_pins[digit_index].off()
else:
for i in range(4):
digit_pins[i].off()
# Decimal Point Check
if dp_enable:
seg_pins[7].on()
else:
seg_pins[7].off()
def setup():
global display_value, digit_pins, seg_pins, scanner
time.sleep(0.02)
# PINS (GPIO or ADC)
a = machine.Pin(sev_seg, machine.Pin.OUT)
b = machine.Pin(sev_seg + 1, machine.Pin.OUT)
c = machine.Pin(sev_seg + 2, machine.Pin.OUT)
d = machine.Pin(sev_seg + 3, machine.Pin.OUT)
e = machine.Pin(sev_seg + 4, machine.Pin.OUT)
f = machine.Pin(sev_seg + 5, machine.Pin.OUT)
g = machine.Pin(sev_seg + 6, machine.Pin.OUT)
dp = machine.Pin(sev_seg + 7, machine.Pin.OUT)
dig1 = machine.Pin(sev_seg_digit + 3, machine.Pin.OUT)
dig2 = machine.Pin(sev_seg_digit + 2, machine.Pin.OUT)
dig3 = machine.Pin(sev_seg_digit + 1, machine.Pin.OUT)
dig4 = machine.Pin(sev_seg_digit, machine.Pin.OUT)
# segments and digits of seven segment display
digit_pins = [dig1, dig2, dig3, dig4]
seg_pins = [g, f, e, d, c, b, a, dp]
# Timer setup
scanner = machine.Timer()
enable_display_timer(scanner)
if __name__ == "__main__":
setup()