import machine
import time
SEVEN_SEGMENT_DATA_PINS = [0, 1, 2, 3, 4, 5, 6, 7]
DIGIT_SELECT_PINS = [8, 9, 10, 11]
SENSOR_PINS = [26, 27, 28]
BUTTON_PIN_NUM = 14
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 1
digit_list_hex = [
0x3F, # 0
0x06, # 1
0x5B, # 2
0x4F, # 3
0x66, # 4
0x6D, # 5
0x7D, # 6
0x07, # 7
0x7F, # 8
0x6F, # 9
]
display_value = 0
sensors = []
sensor_index = 0
segment_pins = []
digit_select_pins = []
display_timer = None
debounce_timer = None
current_display_index = 0
def read_analogue_voltage(adc):
global display_value
raw = adc.read_u16()
voltage = (raw / 65535.0) * 3.3
print(f"Raw ADC Value: {raw}, Voltage: {voltage}")
scale = 10 ** DECIMAL_PRECISION
display_value = int(voltage * scale)
def disable_display_timer():
global display_timer
if display_timer:
display_timer.deinit()
def enable_display_timer():
global display_timer
display_timer.init(freq=200, mode=machine.Timer.PERIODIC, callback=scan_display)
def scan_display(timer_int):
global current_display_index, display_value
for pin in digit_select_pins:
pin.value(0)
divisor = 10 ** (DISPLAY_COUNT - current_display_index - 1)
digit_val = (display_value // divisor) % 10
dp_enable = (current_display_index == DISPLAY_COUNT - DECIMAL_PRECISION - 1)
display_digit(digit_val, current_display_index, dp_enable)
current_display_index = (current_display_index + 1) % DISPLAY_COUNT
def display_digit(digit_value, digit_index, dp_enable=False):
for pin in digit_select_pins:
pin.value(0)
code = digit_list_hex[digit_value]
if dp_enable:
code |= 0x80
for i, pin in enumerate(segment_pins):
pin.value((code >> i) & 1)
digit_select_pins[digit_index].value(1)
def button_handler(pin):
global sensor_index, debounce_timer
print("Button Pressed!")
disable_display_timer()
read_analogue_voltage(sensors[sensor_index])
print(f"Sensor {sensor_index} value: {display_value}")
sensor_index = (sensor_index + 1) % len(sensors)
enable_display_timer()
pin.irq(handler=None)
debounce_timer.init(mode=machine.Timer.ONE_SHOT, period=200, callback=lambda t: pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_handler))
def display_value_test():
global display_value
for v in [0, 1, 12, 123, 1234]:
display_value = v
time.sleep(1)
def setup():
global segment_pins, digit_select_pins, sensors
global display_timer, debounce_timer
segment_pins = [machine.Pin(n, machine.Pin.OUT) for n in SEVEN_SEGMENT_DATA_PINS]
digit_select_pins = [machine.Pin(n, machine.Pin.OUT) for n in DIGIT_SELECT_PINS]
for p in segment_pins + digit_select_pins:
p.value(0)
sensors = [machine.ADC(n) for n in SENSOR_PINS]
btn = machine.Pin(BUTTON_PIN_NUM, machine.Pin.IN, machine.Pin.PULL_UP)
display_timer = machine.Timer()
debounce_timer = machine.Timer()
enable_display_timer()
btn.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_handler)
if __name__ == '__main__':
setup()