from machine import Pin, ADC
import time
# Define GPIO pins for segments (adjust according to your wiring)
segments = [
Pin(0, Pin.OUT), # a
Pin(1, Pin.OUT), # b
Pin(2, Pin.OUT), # c
Pin(3, Pin.OUT), # d
Pin(4, Pin.OUT), # e
Pin(5, Pin.OUT), # f
Pin(6, Pin.OUT) # g
]
# Define GPIO pins for digit selection (4 digits)
digits = [
Pin(8, Pin.OUT), # D1
Pin(9, Pin.OUT), # D2
Pin(10, Pin.OUT), # D3
Pin(11, Pin.OUT) # D4
]
# Initialize ADC
adc = ADC(Pin(26))
# Set ADC width and attenuation
adc.width(ADC.WIDTH_10BIT) # 10-bit resolution (0-1023)
adc.atten(ADC.ATTN_11DB) # Attenuation for maximum range
def display_number(value):
# Function to display a number on the 4-digit 7-segment display
# Assumes common cathode display; adjust logic for common anode if needed
# Convert number to 4-digit format
value_str = "{:04d}".format(value)
# Loop through each digit
for digit_index, digit_pin in enumerate(digits):
# Activate the current digit
digit_pin.value(1)
# Get the corresponding segment states for the current digit
segment_states = get_segment_states(value_str[digit_index])
# Display the current segment states
for segment_index, segment_pin in enumerate(segments):
segment_pin.value(segment_states[segment_index])
# Display the segment for a short duration (adjust delay if necessary)
time.sleep_ms(5)
# Turn off all segments for smooth transition to the next digit
for segment_pin in segments:
segment_pin.value(0)
# Deactivate the current digit
digit_pin.value(0)
def get_segment_states(digit):
# Function to get segment states for a given digit (0-9)
# Modify this based on your 7-segment display configuration
# This assumes common cathode; adjust for common anode if needed
segments_off = 0
segments_on = 1
# Define segment states for each digit (0-9)
segments_map = {
'0': (segments_on, segments_on, segments_on, segments_on, segments_on, segments_on, segments_off),
'1': (segments_off, segments_on, segments_on, segments_off, segments_off, segments_off, segments_off),
'2': (segments_on, segments_on, segments_off, segments_on, segments_on, segments_off, segments_on),
'3': (segments_on, segments_on, segments_on, segments_on, segments_off, segments_off, segments_on),
'4': (segments_off, segments_on, segments_on, segments_off, segments_off, segments_on, segments_on),
'5': (segments_on, segments_off, segments_on, segments_on, segments_off, segments_on, segments_on),
'6': (segments_on, segments_off, segments_on, segments_on, segments_on, segments_on, segments_on),
'7': (segments_on, segments_on, segments_on, segments_off, segments_off, segments_off, segments_off),
'8': (segments_on, segments_on, segments_on, segments_on, segments_on, segments_on, segments_on),
'9': (segments_on, segments_on, segments_on, segments_on, segments_off, segments_on, segments_on),
}
return segments_map.get(digit, (segments_off, segments_off, segments_off, segments_off, segments_off, segments_off, segments_off))
# Main loop to continuously read and display analog value
while True:
# Read analog value (0-1023)
analog_value = adc.read_u16() # Read 16-bit value for better resolution
# Display analog value on 4-digit 7-segment display
display_number(analog_value)
# Delay between readings (adjust as needed)
time.sleep(0.5)