from machine import Pin, ADC, Timer
from utime import sleep_ms, ticks_ms, ticks_diff
from math import log
adc_reader = ADC(26)
button1 = Pin(16, Pin.IN, Pin.PULL_UP)
maxVolts = 3.3
adc_res = 2**16
SEVEN_SEGMENT_START_PIN = 2
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
]
seg_value = 0
seg_pins = [Pin(2), Pin(3), Pin(4), Pin(5), Pin(6), Pin(7), Pin(8), Pin(9)]
dig_pins = [Pin(13), Pin(12), Pin(11), Pin(10)]
current_display_index = DISPLAY_COUNT - 1
display_timer = None
debounce_delay = 100
last_button_state = button1.value()
last_button_time = 0
def disable_display_timer():
global display_timer
display_timer.deinit()
def enable_display_timer():
global display_timer
display_timer.init(period=30, mode=Timer.PERIODIC, callback=scan_display)
def scan_display(timer_int):
global current_display_index, seg_value
digit = int((seg_value * 1000 // 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
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 dig_pins:
pin.value(0)
mask = digit_list_hex[digit_value]
for i in range(7):
seg_pins[i].value((mask >> i) & 1)
seg_pins[7].value(1 if dp_enable == False else 0)
if digit_index == -1:
for pin in dig_pins:
pin.value(1)
elif 0 <= digit_index < DISPLAY_COUNT:
dig_pins[digit_index].value(1)
def read_analogue_voltage(pin):
return pin.read_u16()
def setup():
global seg_pins, dig_pins
global display_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)
dig_pins.append(pin)
for i in range(SEVEN_SEGMENT_START_PIN, SEVEN_SEGMENT_START_PIN + 8):
pin = Pin(i, Pin.OUT)
pin.value(1)
seg_pins.append(pin)
display_timer = Timer()
enable_display_timer()
def handle_button_interrupt(pin):
global last_button_state, last_button_time, seg_value
current_time = ticks_ms()
if ticks_diff(current_time, last_button_time) < debounce_delay:
return
last_button_time = current_time
button_state = pin.value()
if button_state != last_button_state:
print("\nInterrupt triggered")
last_button_state = button_state
adc_reader_value = read_analogue_voltage(adc_reader)
adc_reader_voltage = adc_reader_value / (adc_res-1) * maxVolts
adc_reader_value2 = read_analogue_voltage(adc_reader2)
adc_reader_voltage2 = adc_reader_value2 / (adc_res-1) * maxVolts
seg_value = adc_reader_voltage
print(f"Voltage: {adc_reader_voltage} volts")
print(f"Voltage 2: {adc_reader_voltage2} volts (Value: {adc_reader_value2})")
def main():
button1.irq(trigger=Pin.IRQ_FALLING, handler=handle_button_interrupt)
if __name__ == '__main__':
setup()
main()