# Importing Libraries.
import machine
import math
import time
from machine import ADC
#-------------------------------------------------
# Pin And Constant Definitions.
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 3
last_button_time = 0 # To Keep Track Of When The Button Was Last Pressed.
DEBOUNCE_DELAY = 200 # 200 Ms Debounce Time.
button_pin = None
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.
should_display = False
display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT -1 # To Keep Track Of Which Digit Is Currently Being Displayed.
display_timer = None
counter_timer = None
#-------------------------------------------------
# Function Definitions.
#-------------------------------------------------
# Function To Read The ADC Pin And To Convert The Digital Value To A Voltage Level In The 0-3.3V Range, This Function Updates The Value Of The display_value Global Variable.
def read_analogue_voltage(pin=26):
global display_value, current_display_index
adc = ADC(machine.Pin(pin))
adc_value = adc.read_u16()
voltage = (adc_value / 65535.0) * 3.3
print("Voltage:", round(voltage, 3), "V")
display_value = int(round(voltage * 1000)) # For Example: 1.031 V becomes 1031
current_display_index = DISPLAY_COUNT - 1
#-------------------------------------------------
# Function To Disable Timer That Triggers Scanning 7 Segment Displays.
def disable_display_timer():
global display_timer
display_timer.deinit()
#-------------------------------------------------
# Function To Enable Timer That Triggers Scanning 7 Segment Displays.
def enable_display_timer():
global display_timer
display_timer.init(period=30, mode=machine.Timer.PERIODIC, callback=scan_display)
#-------------------------------------------------
# Function To Handle Scanning 7 Segment Displays, Display The Value Stored In The display_value Global Variable, On Available 7-Segment Display.
def scan_display(timer_int):
global current_display_index, display_value
# Turn Off All Digits
for pin in display_select_pins:
pin.value(0)
# Extract Digit Starting From Right (least significant)
digit = (display_value // (10 ** current_display_index)) % 10
show_dp = (current_display_index == 3)
display_digit(digit, current_display_index, show_dp)
current_display_index = (current_display_index + 1) % DISPLAY_COUNT
#-------------------------------------------------
# Function Display The Given Value On The Display With The Specified Index.
def display_digit(digit_value, digit_index, dp_enable=False):
if digit_value < 0 or digit_value > 15:
digit_value = 16
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)
for pin in display_select_pins:
pin.value(0)
if 0 <= digit_index < DISPLAY_COUNT:
display_select_pins[digit_index].value(1)
#-------------------------------------------------
# Function To Test Avaiable 7-Segment Displays.
def display_value_test():
global display_value
disable_display_timer()
current_display_index = 0
for i in range(0, len(digit_list_hex)):
display_digit(i, -1, i % 2 != 0)
time.sleep(0.5)
for i in range(0, 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()
#-------------------------------------------------
# Function To Setup GPIO/ADC Pins, Timers And Interrupts.
def setup():
global segment_pins, display_select_pins
global display_timer, button_pin
button_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP) # Active LOW.
button_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=handle_button_press) # Set Up Push Button Interrupt For Press.
# Set Up Display Select 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)
# Set Up Seven Segment Pins.
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)
display_timer = machine.Timer()
enable_display_timer()
#-------------------------------------------------
# Function For Button Deboucing.
def handle_button_press(pin):
global last_button_time
now = time.ticks_ms()
if time.ticks_diff(now, last_button_time) < DEBOUNCE_DELAY:
return
time.sleep_ms(20)
if pin.value() == 0:
last_button_time = now
read_analogue_voltage()
#-------------------------------------------------
if __name__ == '__main__':
setup()