from machine import Pin, ADC, PWM
import time
from iot_data_hub import IoTDataHub
from defs import KEY
# Configuração dos Sensores e Potenciômetro
sensor_luz = ADC(Pin(34)) # Sensor de luminosidade LDR no GPIO34
sensor_presenca = Pin(35, Pin.IN) # Sensor de presença PIR no GPIO35
potenciometro = ADC(Pin(32)) # Potenciômetro no GPIO32 para simular o dimmer
luz = PWM(Pin(2), freq=1000) # Atuador de luz (LED) no GPIO2, agora usando PWM
intensidade_luz = 0 # Variável para armazenar a intensidade atual da luz
controle_manual = False # Flag para verificar se o controle é manual ou automático
tempo_manual = 0 # Contador de tempo para controle manual
def ajustar_intensidade(intensidade):
""" Ajusta a intensidade da luz via PWM """
intensidade = max(0, min(1023, intensidade)) # Limita o valor entre 0 e 1023
luz.duty(intensidade) # Ajusta a intensidade do LED (0-1023)
print(f"Intensidade ajustada para: {intensidade}")
def mapear_valor(valor, in_min, in_max, out_min, out_max):
""" Mapeia um valor de uma faixa para outra """
return (valor - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
def mensagem_recebida(topico, valor):
global intensidade_luz, controle_manual, tempo_manual
print(f"Recebi no topico {topico} o valor {valor}")
controle_manual = True # Ativa o controle manual sempre que a luz é ligada ou ajustada
tempo_manual = time.time() # Marca o tempo da última interação manual
if topico == "luz":
if valor == "on":
controle_manual = True # Garantir que o controle manual está ativo
tempo_manual = time.time()
# Ler e aplicar o valor do potenciômetro imediatamente
valor_pot = potenciometro.read()
intensidade_luz = mapear_valor(valor_pot, 0, 4095, 0, 1023)
ajustar_intensidade(intensidade_luz)
elif valor == "off":
intensidade_luz = 0 # Desliga a luz
ajustar_intensidade(0)
else:
# Supondo que o valor seja uma intensidade manualmente configurada
intensidade_luz = int(valor)
ajustar_intensidade(intensidade_luz)
# Publica o estado atual da luz
client.publish("luz_estado", f"{'on' if intensidade_luz > 0 else 'off'}")
client.publish("luz_intensidade", f"{intensidade_luz}")
# Configurando o cliente IoT para o FlowFuse
client = IoTDataHub(
"Wokwi-GUEST",
"",
KEY,
mensagem_recebida,
verbose=True
)
client.subscribe("luz") # Inscrevendo no tópico para controle de luz
while True:
nivel_luminosidade = sensor_luz.read() # Leitura do sensor de luminosidade (0-4095)
presenca_detectada = sensor_presenca.value() # Leitura do sensor de presença
# Verifica se o tempo do controle manual expirou (e.g., 10 segundos de inatividade)
if controle_manual and (time.time() - tempo_manual > 10):
controle_manual = False # Volta ao controle automático após 10 segundos de inatividade manual
# Se o controle não for manual, ajusta a intensidade automaticamente
if not controle_manual:
intensidade_luz = mapear_valor(4095 - nivel_luminosidade, 0, 4095, 0, 1023) # Mapeia para PWM
if presenca_detectada:
ajustar_intensidade(intensidade_luz)
else:
ajustar_intensidade(0) # Desliga a luz se não houver presença
else:
# Se o controle manual estiver ativo, lê o potenciômetro e ajusta a intensidade
valor_pot = potenciometro.read()
intensidade_luz = mapear_valor(valor_pot, 0, 4095, 0, 1023)
ajustar_intensidade(intensidade_luz)
print(f"Controle manual ativo: Potenciômetro={valor_pot}, Intensidade={intensidade_luz}")
# Publica os dados dos sensores e a intensidade da luz para o FlowFuse
client.publish("luminosidade", f"{nivel_luminosidade}")
client.publish("presenca", f"{presenca_detectada}")
client.publish("luz_intensidade", f"{intensidade_luz}")
# Publica o estado atual da luz
client.publish("luz_estado", f"{'on' if intensidade_luz > 0 else 'off'}")
print(f"Luminosidade={nivel_luminosidade}, Presença={presenca_detectada}, Intensidade da Luz={intensidade_luz}")
time.sleep(1)