# imports
from machine import Pin,ADC
import math
import time
from time import sleep
#######################################
# Pin and constant definitions
#######################################
analoge=ADC(Pin(26))
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 3
# 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
]
#######################################
# Global variables
#######################################
display_value = 0
pushed=None
last_time=0
voltages=[]
voltage=0
display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT -1
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):
global voltage,voltages,last_time,pushed,analoge
if time.ticks_diff(time.ticks_ms(),last_time) > 200:
last_time = time.ticks_ms()
pushed=1
if len(voltages)>16:
voltages=[]
for i in range(16):
analoge_value=analoge.read_u16()
voltage=(analoge_value / 65535)*3.3# We can use the pin parameter if needed
voltages.append(voltage)
voltage=sum(voltages)/len(voltages)
print(f"voltage :{int(voltage*1000)}mV")
# Function to disable timer that triggers scanning 7 segment displays
def disable_display_timer():
global display_timer
display_timer.deinit()
pass
# 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 displays
def scan_display(timer_int):
global current_display_index,voltage
# Extract the digit corresponding to the current display index
digit = int((voltage*1000 // math.pow(10, current_display_index))) % 10
###stopped here
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
pass
# Function display the given value on the display with the specified index
# dp_enable specifies if the decimal pooint should be on or off
def display_digit(digit_value, digit_index, dp_enable=False):
for pin in display_select_pins:
pin.value(0)
mask = digit_list_hex[digit_value]
for i in range(7): # 7 segments from A to G
segment_pins[i].value((mask >> 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)
pass
#function to handle the interrupt
interrupt_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
interrupt_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=read_analogue_voltage)
def display_value_test():
global voltage
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, counter_timer
# 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)
pass
display_timer = machine.Timer()
enable_display_timer()
if __name__ == '__main__':
while 1:
if pushed==1:
setup()
pushed=0
sleep(.5)