# imports
import machine
import math
import time
from machine import ADC, Pin, Timer
#######################################
# Pin and constant definitions
#######################################
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 3
interrupt_pin = Pin(16, Pin.IN, Pin.PULL_UP)
Adc_pin = ADC(Pin(26))
digit_list_hex = [
0x40,
0x79,
0x24,
0x30,
0x19,
0x12,
0x02,
0x78,
0x00,
0x10,
0x08,
0x03,
0x46,
0x21,
0x06,
0x0E,
0x7F
]
#######################################
# Global variables
#######################################
display_value = 0
display_digits = [0, 0, 0, 0]
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT - 1
display_timer = None
btn_pressed = False
debounce_timer = None
#######################################
# Function definitions
#######################################
def debounce_callback(timer):
global btn_pressed
btn_pressed = True
def read_analogue_voltage(pin):
global debounce_timer
if debounce_timer is None:
debounce_timer = Timer()
debounce_timer.init(mode=Timer.ONE_SHOT, period=200, callback=debounce_callback)
def disable_display_timer():
global display_timer
if display_timer:
display_timer.deinit()
display_timer = None
def enable_display_timer():
global display_timer
if not display_timer:
display_timer = Timer()
display_timer.init(period=30, mode=Timer.PERIODIC, callback=scan_display)
def scan_display(timer_int):
global current_display_index, display_digits
digit_index = DISPLAY_COUNT - 1 - current_display_index
digit = display_digits[digit_index]
display_digit(
digit,
current_display_index,
current_display_index == DECIMAL_PRECISION and DECIMAL_PRECISION != 0
)
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 >= 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 not dp_enable 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)
def display_value_test():
global display_value
disable_display_timer()
current_display_index = 0
for i in range(len(digit_list_hex)):
display_digit(i, -1, i % 2 != 0)
time.sleep(0.5)
for i in range(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()
def setup():
global segment_pins, display_select_pins, btn_pressed, debounce_timer
for i in range(SEVEN_SEGMENT_START_PIN + 8, SEVEN_SEGMENT_START_PIN + 8 + DISPLAY_COUNT):
pin = Pin(i, Pin.OUT)
pin.value(0)
display_select_pins.append(pin)
for i in range(SEVEN_SEGMENT_START_PIN, SEVEN_SEGMENT_START_PIN + 8):
pin = Pin(i, Pin.OUT)
pin.value(1)
segment_pins.append(pin)
interrupt_pin.irq(trigger=Pin.IRQ_FALLING, handler=read_analogue_voltage)
enable_display_timer()
print("MicroPython v1.22.0 on 2023-12-27; Raspberry Pi Pico with RP2040")
print("Type ""help()"" for more information.")
while True:
if btn_pressed:
btn_pressed = False
if debounce_timer:
debounce_timer.deinit()
debounce_timer = None
digital_value = Adc_pin.read_u16()
voltage = float((digital_value / (2**16 - 1)) * 3.3)
print("Voltage: {:.3f} V".format(voltage))
scaled_value = int(voltage * 1000)
display_digits[0] = (scaled_value // 1000) % 10
display_digits[1] = (scaled_value // 100) % 10
display_digits[2] = (scaled_value // 10) % 10
display_digits[3] = scaled_value % 10
time.sleep(0.2)
if __name__ == '__main__':
setup()
display_value_test()