from machine import Pin, PWM, I2C
from utime import sleep_ms
from pico_i2c_lcd import I2cLcd
"""
Quando o encoder for girado no sentido horário, o CLK vai ficar 0 primeiro,
e depois o DT. Já quando for girado no sentido anti-horário, o DT vai ficar
0 primeiro e depois o CLK.
Aqui, o código analisa a mudança do CLK,
Assim, se o CLK mudar para 0 mas o DT estiver 1, é horário.
Mas, se o CLK mudar para 0 e o DT já estiver 0 também, é anti-horário.
https://docs.wokwi.com/pt-BR/assets/images/wokwi-ky-040-timing-cd6fe446378352c1416ef8817f1e5abf.png
"""
clk = Pin(16, Pin.IN)
dt = Pin(17, Pin.IN)
sw = Pin(18, Pin.IN)
servo = PWM(Pin(20))
servo.freq(50)
servo.duty_ns(550000)
ultimo_clk = 1
ultimo_sw = 1
sw_estado = 1
sw_estados = [1, 5, 10, 15, 20]
while True:
# Variáveis de valores dos inputs
valor_clk = clk.value()
valor_dt = dt.value()
valor_sw = sw.value()
duty_servo = servo.duty_ns()
# Verificar e contabiliza mudança no botão, seguindo a lista de graus
if valor_sw != ultimo_sw and valor_sw == 0:
if sw_estado == 20:
sw_estado = 1
sw_estado = sw_estados[sw_estados.index(sw_estado) + 1]
# Modifica o grau do servo de acordo com a direção do encoder
if valor_clk != ultimo_clk and valor_clk == 0:
mudanca_grau = int(sw_estado / 180 * (2488145 - 456000))
if valor_dt == 1:
servo.duty_ns(duty_servo + mudanca_grau)
if duty_servo + mudanca_grau > 2488145:
servo.duty_ns(2488145)
elif valor_dt == 0:
servo.duty_ns(duty_servo - mudanca_grau)
if duty_servo - mudanca_grau < 456000:
servo.duty_ns(456000)
ultimo_clk, ultimo_sw = valor_clk, valor_sw
sleep_ms(2)