from machine import Pin, PWM, ADC, I2C
from utime import ticks_ms, ticks_diff, sleep_ms
from pico_i2c_lcd import I2cLcd
from dht import DHT22
rgb_red = PWM(Pin(18))
rgb_green = PWM(Pin(17))
rgb_blue = PWM(Pin(16))
rgb_red.freq(1000)
rgb_green.freq(1000)
rgb_blue.freq(1000)
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)
I2C_ADDR = i2c.scan()[0]
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
botao_variavel = Pin(19, Pin.IN, Pin.PULL_UP)
botao_modo = Pin(20, Pin.IN, Pin.PULL_UP)
potenciometro = ADC(28)
sensor_dht = DHT22(Pin(15))
ultimo_estado_var = 1
ultimo_estado_modo = 1
medicao = "temperatura"
modo = "automatico"
def transformarVarPwm(var, var_min, var_max, pwm_min, pwm_max):
if var < var_min:
var = var_min
elif var > var_max:
var = var_max
pwm_porcentagem = pwm_min + (var - var_min) / (var_max - var_min) * (pwm_max - pwm_min)
pwm = int((pwm_porcentagem / 100) * 65535)
return pwm
def corIntensidadeLed(var, medicao, modo, valor_pot):
if medicao == "temperatura" and modo == "automatico":
pwm_temp = transformarVarPwm(var, 18, 30, 30, 100)
lcd.move_to(0, 0)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Modo: AUTO")
lcd.move_to(0, 1)
lcd.putstr(f"Temp: {var}C")
if var <= 18:
rgb_green.duty_u16(0)
rgb_red.duty_u16(0)
rgb_blue.duty_u16(pwm_temp)
elif var >= 19 and var <= 24:
rgb_red.duty_u16(0)
rgb_blue.duty_u16(0)
rgb_green.duty_u16(pwm_temp)
elif var >= 25 and var <= 29:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(pwm_temp)
rgb_green.duty_u16(pwm_temp)
elif var >= 30:
rgb_blue.duty_u16(0)
rgb_green.duty_u16(0)
rgb_red.duty_u16(pwm_temp)
elif medicao == "temperatura" and modo == "manual":
lcd.move_to(0, 0)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Modo: MANUAL")
lcd.move_to(0, 1)
lcd.putstr(f"Temp: {var}C")
if var <= 18:
rgb_green.duty_u16(0)
rgb_red.duty_u16(0)
rgb_blue.duty_u16(valor_pot)
elif var >= 19 and var <= 24:
rgb_red.duty_u16(0)
rgb_blue.duty_u16(0)
rgb_green.duty_u16(valor_pot)
elif var >= 25 and var <= 29:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(valor_pot)
rgb_green.duty_u16(valor_pot)
elif var >= 30:
rgb_blue.duty_u16(0)
rgb_green.duty_u16(0)
rgb_red.duty_u16(valor_pot)
elif medicao == "umidade" and modo == "automatico":
pwm_umid = transformarVarPwm(var, 30, 70, 30, 100)
lcd.move_to(0, 0)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Modo: AUTO")
lcd.move_to(0, 1)
lcd.putstr(f"Umid: {var}%")
if var <= 30:
rgb_green.duty_u16(0)
rgb_blue.duty_u16(0)
rgb_red.duty_u16(pwm_umid)
elif var >= 31 and var <= 50:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(pwm_umid)
rgb_green.duty_u16(pwm_umid)
elif var >= 51 and var <= 70:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(0)
rgb_green.duty_u16(pwm_umid)
elif var >= 71:
rgb_red.duty_u16(0)
rgb_green.duty_u16(0)
rgb_blue.duty_u16(pwm_umid)
elif medicao == "umidade" and modo == "manual":
lcd.move_to(0, 0)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Modo: MANUAL")
lcd.move_to(0, 1)
lcd.putstr(f"Umid: {var}%")
if var <= 30:
rgb_green.duty_u16(0)
rgb_blue.duty_u16(0)
rgb_red.duty_u16(valor_pot)
elif var >= 31 and var <= 50:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(valor_pot)
rgb_green.duty_u16(valor_pot)
elif var >= 51 and var <= 70:
rgb_blue.duty_u16(0)
rgb_red.duty_u16(0)
rgb_green.duty_u16(valor_pot)
elif var >= 71:
rgb_red.duty_u16(0)
rgb_green.duty_u16(0)
rgb_blue.duty_u16(valor_pot)
tempo = ticks_ms()
while True:
agora = ticks_ms()
valor_pot = potenciometro.read_u16()
estado_var = botao_variavel.value()
estado_modo = botao_modo.value()
if estado_var == 0 and ultimo_estado_var == 1:
if medicao == "temperatura":
medicao = "umidade"
elif medicao == "umidade":
medicao = "temperatura"
print(f"Medição alterada para: {medicao.upper()}")
sleep_ms(200)
ultimo_estado_var = estado_var
if estado_modo == 0 and ultimo_estado_modo == 1:
if modo == "automatico":
modo = "manual"
elif modo == "manual":
modo = "automatico"
print(f"Modo alterado para: {modo.upper()}")
sleep_ms(200)
ultimo_estado_modo = estado_modo
if medicao == "temperatura":
if ticks_diff(agora, tempo) > 2000:
sensor_dht.measure()
temp = round(sensor_dht.temperature(), 1)
corIntensidadeLed(temp, medicao, modo, valor_pot)
tempo = agora
elif medicao == "umidade":
if ticks_diff(agora, tempo) > 2000:
sensor_dht.measure()
umid = round(sensor_dht.humidity(), 1)
corIntensidadeLed(umid, medicao, modo, valor_pot)
tempo = agora
sleep_ms(1)POT
Botões
(Variável - Modo)
LED e SENSOR