'''imports'''
import machine
import math
import time
'''
Pin and constant definitions
'''
sevseg_pins = 8 # including DP
sevseg_dig = 4
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 3
'''HEX values for 7 segment display values'''
digit_list_hex = [
0x40, # 0
0x79, # 1
0x24, # 2
0x30, # 3
0x19, # 4
0x12, # 5
0x02, # 6
0x78, # 7
0x00, # 8
0x10, # 9
0x08, # A
0x03, # B
0x46, # C
0x21, # D
0x06, # E
0x0E, # F
0x7F # Empty
]
'''
Global variables
'''
display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT -1 # to keep track of which digit is currently being displayed
display_timer = None
counter_timer = None
last_button_time_click = 0
button_click = "no"
'''
Function definitions
'''
def interrupt_callback(pin):
global last_button_time_click, button_click
program_start = time.ticks_ms()
time_between_buttons = program_start - last_button_time_click
if time_between_buttons > 250: #I made the debouncing to 250 because it still bounced at 200
last_button_time_click = program_start
button_click = "yes"
'''Function to read the ADC pin and
to convert the digital value to a voltage level in the 0-3.3V range
This function updates the value of the display_value global variable'''
def read_analogue_voltage():
global display_value, analog_val
digital_val = anal_signal.read_u16()
'''Calculate analog value'''
analog_val = round(float((digital_val/(2**16-1)) * 3.3), 3)
print(analog_val, "Volts")
display_value = int(analog_val * 1000)
'''Function to disable timer that triggers scanning 7 segment displays'''
def disable_display_timer():
global display_timer
display_timer.deinit()
'''Function to enable timer that triggers scanning 7 segment displays'''
def enable_display_timer():
global display_timer
display_timer.init(period=30, mode=machine.Timer.PERIODIC, callback=scan_display)
'''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 current_display_index, display_value
'''Extract the digit corresponding to the current display index'''
digit = int((display_value // math.pow(10, current_display_index))) % 10
'''Display the digit,
enable the decimal point if the current digit index equals to the set decimal precision'''
display_digit(digit, current_display_index,
current_display_index == DECIMAL_PRECISION and 0 != DECIMAL_PRECISION)
'''Move to the next display'''
current_display_index = (current_display_index - 1)
if current_display_index < 0:
current_display_index = DISPLAY_COUNT -1
'''Function display the given value on the display with the specified index
dp_enable specifies if the decimal point should be on or off'''
def display_digit(digit_value, digit_index, dp_enable=False):
'''Ensure the value is valid'''
if digit_value < 0 or digit_value > len(digit_list_hex):
return
'''Deselect all display select pins'''
for pin in display_select_pins:
pin.value(0)
'''Set the segments according to the digit value'''
mask = digit_list_hex[digit_value]
for i in range(7): # 7 segments from A to G
segment_pins[i].value((mask >> i) & 1)
'''Set the DP if it's enabled'''
segment_pins[7].value(1 if dp_enable == False else 0)
'''If digit_index is -1, activate all display select pins'''
if digit_index == -1:
for pin in display_select_pins:
pin.value(1)
# Otherwise, ensure the index is valid and activate the relevant display select pin
elif 0 <= digit_index < DISPLAY_COUNT:
display_select_pins[digit_index].value(1)
'''Function to test avaiable 7-segment displays'''
def display_value_test():
global display_value
disable_display_timer()
current_display_index = 0
for i in range(0, len(digit_list_hex)):
display_digit(i, -1, i % 2 != 0)
time.sleep(0.5)
for i in range(0, len(digit_list_hex)):
display_digit(i, DISPLAY_COUNT - 1 - (i % DISPLAY_COUNT), True)
time.sleep(0.5)
display_digit(16, -1, False)
enable_display_timer()
'''Function to setup GPIO/ADC pins, timers and interrupts'''
def setup():
global anal_signal
global segment_pins, display_select_pins
global display_timer, counter_timer
button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
button.irq(trigger=machine.Pin.IRQ_FALLING, handler=interrupt_callback)
anal_signal = machine.ADC(26)
'''Set up display select pins'''
for i in range(SEVEN_SEGMENT_START_PIN + 8, SEVEN_SEGMENT_START_PIN + 8 + DISPLAY_COUNT):
pin = machine.Pin(i, machine.Pin.OUT)
pin.value(0)
display_select_pins.append(pin)
'''Set up seven segment pins'''
for i in range(SEVEN_SEGMENT_START_PIN, SEVEN_SEGMENT_START_PIN + 8):
pin = machine.Pin(i, machine.Pin.OUT)
pin.value(1)
segment_pins.append(pin)
'''Start the timer interrupt for scanning'''
display_timer = machine.Timer()
enable_display_timer()
def main():
time.sleep(.05)
global button_click, analog_val
print("Program starting")
print("Note: the value shown in the Seven-Segment display is in Volts")
while True:
if button_click == "yes":
button_click = "no"
read_analogue_voltage()
time.sleep(.5)
time.sleep(.05)
if __name__ == "__main__":
setup()
# display_value_test()
main()