# Importa as classes necessárias da biblioteca 'machine' e a biblioteca 'time'
from machine import Pin, ADC, PWM
import time
# --- Configuração dos Pinos ---
# Define o pino GPIO 34 como o pino de leitura do LDR.
# Usamos um pino que seja apenas de entrada e tenha ADC (Analog-to-Digital Converter).
ldr_pin = 34
# Define o pino GPIO 23 como o pino de controle do LED.
# Este pino suporta PWM (Pulse-Width Modulation) para controlar o brilho.
led_pin = 23
# --- Inicialização dos Componentes ---
# 1. Configura o LDR
# Cria um objeto ADC (Conversor Analógico-Digital) associado ao pino do LDR.
adc_ldr = ADC(Pin(ldr_pin))
# Configura a atenuação para 11dB. Isso permite que o pino leia a faixa completa
# de tensão de 0 a 3.3V, o que é essencial para o nosso divisor de tensão.
adc_ldr.atten(ADC.ATTN_11DB)
# 2. Configura o LED com PWM
# Cria um objeto PWM no pino do LED. PWM é a técnica para "dimerizar" (controlar o brilho) um LED.
led_pwm = PWM(Pin(led_pin))
# Define a frequência do PWM em 1000 Hz. Uma frequência alta evita a cintilação (flicker) visível.
led_pwm.freq(1000)
print("Sistema de iluminação automática iniciado. Pressione Ctrl+C para parar.")
# --- Loop Principal ---
# O código dentro deste loop será executado continuamente.
while True:
try:
# Lê o valor analógico do LDR.
# read_u16() retorna um valor entre 0 (muito claro) e 65535 (muito escuro).
valor_ldr = adc_ldr.read_u16()
# --- Lógica de Controle ---
# O valor do LDR é INVERSO ao brilho do LED que queremos.
# LDR alto (escuro) -> LED deve ser forte.
# LDR baixo (claro) -> LED deve ser fraco/desligado.
#
# A função duty_u16() do PWM também vai de 0 (desligado) a 65535 (brilho máximo).
# Para inverter a lógica, simplesmente subtraímos o valor do LDR do máximo (65535).
valor_brilho_led = 65535 - valor_ldr
# Define o brilho do LED usando o valor calculado.
led_pwm.duty_u16(valor_brilho_led)
# Imprime os valores no console para podermos monitorar e depurar.
# É uma boa prática para entender o que o sensor está lendo.
print(f"Valor LDR: {valor_ldr} -> Brilho LED: {valor_brilho_led}")
# Pequena pausa de 0.1 segundos para não sobrecarregar o processador
# e para que a leitura no console seja legível.
time.sleep(0.1)
except KeyboardInterrupt:
# Se o usuário pressionar Ctrl+C no console, o programa para de forma limpa.
print("Programa interrompido.")
led_pwm.deinit() # Desliga o PWM
break