from machine import Pin, PWM
from time import sleep
import cloud as cl
def pwm_angle(angle: float) -> float:
return int(((angle)/180 *2 + 0.5) / 20 * 1023)
def luminosity_to_pwm_angle(ldr_value: int):
MIN_ANALOG_VALUE, MAX_ANALOG_VALUE = 32, 4063
MAX_ANGLE = 180
angle = MAX_ANGLE - ((ldr_value - MIN_ANALOG_VALUE) / (MAX_ANALOG_VALUE - MIN_ANALOG_VALUE)) * MAX_ANGLE
return pwm_angle(angle)
power_button = Pin(18, Pin.IN)
cloud = cl.Cloud('Wokwi-GUEST', '')
is_on = int(cloud.read_status())
luminosity = int(cloud.read_luminosity())
pwm = luminosity_to_pwm_angle(luminosity)
servo = PWM(Pin(2), freq=50, duty=pwm)
leds_system_on = {
1: Pin(14, Pin.OUT),
0: Pin(12, Pin.OUT)
}
leds_system_on[0].off()
leds_system_on[1].off()
leds_system_on[is_on].on()
while True:
power_button_value = power_button.value()
if power_button_value and not previous_power_button_value:
is_on = abs(is_on - 1)
leds_system_on[is_on].on()
leds_system_on[abs(is_on - 1)].off()
cloud.update_fields(luminosity, is_on)
previous_power_button_value = power_button_value
if not is_on:
sleep(0.1)
continue
luminosity = cloud.read_luminosity()
if luminosity == None:
luminosity = 0
else:
luminosity = int(luminosity)
print('> Luminosity: ', luminosity)
pwm = luminosity_to_pwm_angle(luminosity)
print(f'> Moving blinds...')
servo.duty(pwm)
sleep(10)