from time import sleep
from rp2 import PIO
from machine import ADC, Pin, PWM
sleep(0.1) # Wait for USB to become ready
# Setting up the PWM on pin 12
p12 = Pin(12)
pwm12 = PWM(p12)
pwm12.freq(50)
pwm12.duty_u16(0x7fff) #50%
# Configuring the ADC at pin 27
p27 = Pin(27)
potentiometer = ADC(p27)
@rp2.asm_pio(out_init=[PIO.OUT_LOW]*8, sideset_init=[PIO.OUT_LOW]*2)
def sevseg():
wrap_target()
label("0")
pull(noblock) .side(3) # 0
mov(x, osr) .side(3) # 1
out(pins, 24) .side(2) # 2
out(pins, 8) .side(1) # 3
jmp("0") .side(3) # 6
wrap()
sm = rp2.StateMachine(0, sevseg, freq=2000, out_base=Pin(2), sideset_base=Pin(0))
sm.active(1)
digits = [
0b00111111, # 0
0b00000110, # 1
0b01011011, # 2
0b01001111, # 3
0b01100110, # 4
0b01101101, # 5
0b01111101, # 6
0b00000111, # 7
0b01111111, # 8
0b01100111, # 9
]
fulscale = 0b10001110
def segmentize(num):
return (
digits[num % 10]
| digits[num // 10 % 10] << 8
)
# In real application, remove printf and sleep
while True:
val = potentiometer.read_u16()
valscaled = int(val / 10) + 1
percentage = (valscaled * 100)/0xFFFF
print(f'Potentiometer {val} | {percentage:.2f}%')
pwm12.duty_u16(val)
# Display percentage on segments
intpercentage = int(percentage)
sm.put(segmentize(intpercentage));
sleep(0.1)