# imports
import machine
import math
import time
#######################################
# Pin and constant definitions
#######################################
SEVEN_SEGMENT_START_PIN = 0
# ANALOGUE_INPUT_PIN = 26
DISPLAY_COUNT = 4
MEASUREMENT_COUNT = 16
DECIMAL_PRECISION = 3
ADC_RANGE = 65535
# HEX values for 7 segment display values
digit_list_hex = [
0x40, # 0
0x79, # 1
0x24, # 2
0x30, # 3
0x19, # 4
0x12, # 5
0x02, # 6
0x78, # 7
0x00, # 8
0x10, # 9
0x08, # A
0x03, # B
0x46, # C
0x21, # D
0x06, # E
0x0E, # F
0x7F # Empty
]
#######################################
# Global variables
#######################################
display_value = 0
segment_pins = []
display_select_pins = []
analogue_voltage_pin = None
current_display_index = 3 # to keep track of which digit is currently being displayed
display_timer = None
prev_analogue_voltage = -1
#######################################
# Function definitions
#######################################
pbpushed = False
st = 0
def pbutton(pin):
global pbpushed
global st
ct = time.ticks_ms()
if ct - st > 200:
pbpushed = True
st = ct
pb = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
pb.irq(trigger=machine.Pin.IRQ_FALLING, handler=pbutton)
def read_analogue_voltage(pin):
global display_value, prev_disp_val, display_timer
global prev_analogue_voltage, DECIMAL_PRECISION
read_value = pin.read_u16()
analogue_value = round((read_value * 3.3)/ 65535, 3)
new_display_value = analogue_value * 1000
max_value = 9999
if new_display_value > max_value:
new_display_value = max_value
print("too large")
if new_display_value != display_value:
print(f"voltage is {analogue_value} mV")
display_value = new_display_value
disable_display_timer()
current_display_index = 3
display_digit(16, -1)
time.sleep(0.1)
enable_display_timer()
def disable_display_timer():
global display_timer
display_timer.deinit()
def enable_display_timer():
global display_timer
display_timer.init(period = 4, mode = machine.Timer.PERIODIC, callback = scan_display)
def scan_display(timer_int):
global current_display_index, display_value
display = int((display_value // 10**current_display_index %10))
display_digit(display, current_display_index, current_display_index == 3)
current_display_index = current_display_index - 1
if current_display_index < 0:
current_display_index = 3
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)
for i in range(7):
segment_pins[i].value((digit_list_hex[digit_value] >> i) & 1)
segment_pins[7].value(1 if dp_enable ==False 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 setup():
global SEVEN_SEGMENT_START_PIN, DISPLAY_COUNT, analogue_voltage_pin, display_timer, display_select_pins,segment_pins
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)
analogue_voltage_pin = machine.ADC(26)
display_timer = machine.Timer()
enable_display_timer()
if __name__ == '__main__':
setup()
#display_value_test()
while True:
if pbpushed == True:
read_analogue_voltage(analogue_voltage_pin)
time.sleep(0.5)
pbpushed = False