import machine
import math
import time
from machine import ADC
SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
VOLTAGE_PRECISION = 3
ADC_RESOLUTION = 65535
thermo = ADC(26)
button_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
digit_list_hex = [
0x40,
0x79,
0x24,
0x30,
0x19,
0x12,
0x02,
0x78,
0x00,
0x10,
0x08,
0x03,
0x46,
0x21,
0x06,
0x0E,
0x7F
]
display_value = 0
last_voltage = 0
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT - 1
display_timer = None
def read_voltage(adc):
global display_value, last_voltage
value = adc.read_u16()
voltage = (value / ADC_RESOLUTION) * 3.3
display_value = int(round(voltage, VOLTAGE_PRECISION) * (10 ** VOLTAGE_PRECISION))
last_voltage = voltage
print(f"The Voltage is : {voltage:.{VOLTAGE_PRECISION}f} V")
def scan_display(timer_int):
global current_display_index, display_value
digit = int((display_value // (10 ** current_display_index)) % 10)
display_digit(digit, current_display_index, current_display_index == VOLTAGE_PRECISION)
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 display_select_pins:
pin.value(0)
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)
if 0 <= digit_index < DISPLAY_COUNT:
display_select_pins[digit_index].value(1)
def setup():
global segment_pins, display_select_pins, display_timer
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)
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)
display_timer = machine.Timer()
display_timer.init(period=30, mode=machine.Timer.PERIODIC, callback=scan_display)
if __name__ == '__main__':
setup()
last_button_state = 1
while True:
current_state = button_pin.value()
if last_button_state == 1 and current_state == 0:
read_voltage(thermo)
last_button_state = current_state
time.sleep(0.05)