import machine
import math
import time
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 3
digit_list_hex = [
0x40, 0x79, 0x24, 0x30, 0x19, 0x12,
0x02, 0x78, 0x00, 0x10, 0x08, 0x03,
0x46, 0x21, 0x06, 0x0E, 0x7F
]
display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = 0
display_timer = None
last_button_time = 0
adc = machine.ADC(26)
button_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
def disable_display_timer():
global display_timer
display_timer.deinit()
def enable_display_timer():
global display_timer
display_timer.init(period=10, mode=machine.Timer.PERIODIC, callback=scan_display)
def scan_display(timer):
global current_display_index, display_value
formatted = "{:04d}".format(round(display_value * 1000))
formatted = ''.join(reversed(formatted))
digit_char = formatted[current_display_index]
digit = int(digit_char)
show_dot = (current_display_index == DECIMAL_PRECISION)
display_digit(digit, current_display_index, show_dot)
current_display_index = (current_display_index + 1) % DISPLAY_COUNT
def display_digit(digit_value, digit_index, dp_enable=False):
if digit_value < 0 or digit_value > 9:
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(0 if dp_enable else 1)
if 0 <= digit_index < DISPLAY_COUNT:
display_select_pins[digit_index].value(1)
def update_reading():
global display_value
readings = [adc.read_u16() for _ in range(16)]
avg = sum(readings) / len(readings)
voltage = (avg * 3.3) / 65535
display_value = voltage
print(f"Voltage: {voltage:.3f} V")
def button_handler(pin):
global last_button_time
now = time.ticks_ms()
if time.ticks_diff(now, last_button_time) > 200:
last_button_time = now
update_reading()
def setup():
global segment_pins, display_select_pins, 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)
update_reading()
button_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_handler)
display_timer = machine.Timer()
enable_display_timer()
setup()
while True:
time.sleep(1)