# imports
import machine
import math
import time
#######################################
# Pin and constant definitions
#######################################
ANALOG_PIN = machine.Pin(26, machine.Pin.IN)
SEGMENT_PINS = [machine.Pin(0, machine.Pin.OUT), machine.Pin(1, machine.Pin.OUT), machine.Pin(2, machine.Pin.OUT), machine.Pin(3, machine.Pin.OUT), machine.Pin(4, machine.Pin.OUT), machine.Pin(5, machine.Pin.OUT), machine.Pin(6, machine.Pin.OUT)]
DECIMAL_POINT_PIN = machine.Pin(7, machine.Pin.OUT)
SELECT_PINS = [machine.Pin(11, machine.Pin.OUT), machine.Pin(10, machine.Pin.OUT), machine.Pin(9, machine.Pin.OUT), machine.Pin(8, machine.Pin.OUT)]
BUTTON_PIN = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
#######################################
# Global variables
VOLTAGE_RANGE = 3.3
#######################################
display_value = 0
#######################################
# 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
adc = machine.ADC(26)
value = adc.read()
voltage = (value / 1023) * VOLTAGE_RANGE
display_value = voltage
pass
# Function to disable timer that triggers scanning 7 segment displays
def disable_display_timer():
timer.deinit()
pass
# Function to enable timer that triggers scanning 7 segment displays
def enable_display_timer():
timer.init(period=500, mode=machine.Timer.PERIODIC, callback=scan_display)
pass
# 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):
digits = []
for i in range(4):
digit_value = int(display_value * 10 ** i) % 10
digits.append(digit_value)
for i, digit in enumerate(digits):
display_digit(digit, i)
pass
# 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):
for pin in SEGMENT_PINS:
pin.off()
DECIMAL_POINT_PIN.off()
SELECT_PINS[digit_index].on()
if dp_enable:
DECIMAL_POINT_PIN.on()
for i in range(7):
if (digit_value >> i) & 1:
SEGMENT_PINS[i].on()
pass
# Function to test avaiable 7-segment displays
def display_value_test():
for i, pin in enumerate(SEGMENT_PINS):
pin.on()
time.sleep(0.5)
pin.off()
pass
# Function to setup GPIO/ADC pins, timers and interrupts
def setup():
for pin in SEGMENT_PINS:
pin.init(machine.Pin.OUT)
DECIMAL_POINT_PIN.init(machine.Pin.OUT)
for pin in SELECT_PINS:
pin.init(machine.Pin.OUT)
ANALOG_PIN.init(machine.Pin.IN)
timer = machine.Timer(0)
timer.init(period=500, mode=machine.Timer.PERIODIC, callback=scan_display)
BUTTON_PIN.irq(trigger=machine.Pin.IRQ_FALLING, handler=read_analogue_voltage, debounce=200)
pass
if __name__ == '__main__':
setup()
display_value_test()
while True:
# Read the analog input from the slide potentiometer or other sensors
analog_value = read_analog_voltage(ANALOG_PIN)
# Update the display value
display_value = analog_value
# Delay to control the update rate
time.sleep(0.1)
pass