# imports
import machine
import math
import time
from machine import Pin, Timer
from time import sleep
#######################################
# Pin and constant definitions
#######################################
adc_output= machine.ADC(machine.Pin(26))
button = Pin(16, Pin.IN, Pin.PULL_UP)
seven_segment_start_pin = 0
display_count = 4
decimal_precision = 3
#######################################
# Global variables
#######################################
digit_list_hex = [
0x40, # 0
0x79, # 1
0x24, # 2
0x30, # 3
0x19, # 4
0x12, # 5
0x02, # 6
0x78, # 7
0x00, # 8
0x10, # 9
]
display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = display_count -1
display_timer = None
timer_int= machine.Timer()
debounce=machine.Timer()
#######################################
# Function definitions
#######################################
# 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(pin): # We can use the pin parameter if needed
# global display_value
global display_value
global adc_output
# Converting the adc's input into milivolts and assigning its value to display_value
voltage_level = 3.3
adc_data = adc_output.read_u16()
volt_output= (adc_data/65535) * voltage_level
milivolts = int(volt_output * 1000)
display_value = milivolts
debounce.init(mode= Timer.ONE_SHOT, period=200, callback=debounce_callback)
# Function for the button debouncing
def debounce_callback(timer):
if button.value()==0:
print(f'{display_value} mv')
button.value()==1
# 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
digit = int((display_value// math.pow(10, current_display_index))) %10
display_digit(digit, current_display_index, current_display_index == decimal_precision and 0 != decimal_precision)
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
# checks if the value is invalid or valid
def display_digit(digit_value, digit_index, dp_enable=False):
if digit_value < 0 or digit_value > len(digit_list_hex):
return
for pin in display_select_pins:
pin.value(0)
mask = digit_list_hex[digit_value]
for i in range(7):
segment_pins[i].value((mask >> i) & 1)
segment_pins[7].value(1 if dp_enable == False else 0)
if digit_index == -1:
for pin in display_select_pins:
pin.value(1)
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)
sleep(0.5)
for i in range(0, len(digit_list_hex)):
display_digit(i, display_count -1 -(i % display_count), True)
sleep(0.5)
display_digit(16, -1 , False)
enable_display_timer()
# Function to setup GPIO/ADC pins, timers and interrupts
def setup():
global segment_pins, display_select_pins
global display_timer
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)
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)
display_timer = machine.Timer()
enable_display_timer()
scan_display(timer_int)
button.irq(trigger= Pin.IRQ_FALLING, handler = read_analogue_voltage)
if __name__ == '__main__':
setup()
display_value_test()