#Control de iluminacion progresivo, con sensor de movimiento.
#Leandro Gatti, Federico Medina, Lucas Mendez. COMISION 8 UNLAM.
import machine
import time
import micropython
import network
from umqtt.simple import MQTTClient
from machine import ADC
from machine import Pin
from machine import PWM
GAMMA = 0.7
RL10 = 50
luz = ADC(Pin(33))
#luz.atten(ADC.ATTN_11DB)
#luz.width(ADC.WIDTH_12BIT)
pir = Pin(27, Pin.IN, Pin.PULL_DOWN)
led = PWM(32, freq=50)
led.duty(0)
Tiempo=3
ssid = 'Wokwi-GUEST'
wifipassword = ''
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("Conectando a la red Wi-Fi...")
timeout = 0
while not sta_if.isconnected() and timeout < 30:
print(". ", end="")
time.sleep(1)
timeout += 1
if sta_if.isconnected():
print("\nConectado a Wi-Fi")
print(sta_if.ifconfig())
else:
print("\nNo se pudo conectar a la red Wi-Fi")
raise Exception("No se pudo conectar a la red Wi-Fi")
# Configuración de Adafruit IO
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'Carlitos3296'
password = 'aio_lXgl95vl9S1CwLV0VgDxPv2lP5hy'
client_id = 'LuzYMovi'
topic_luz = 'Carlitos3296/feeds/sensor-luz'
topic_movimiento = 'Carlitos3296/feeds/sensor-movimiento'
topic_tiempo= 'Carlitos3296/feeds/control-de-tiempo'
client = MQTTClient(client_id, mqtt_server, port, user, password)
#Tiempo=1
def conecypubli(client, topic, msg):
try:
client.connect()
print("Conectado a Adafruit IO")
client.publish(topic, msg)
print("Mensaje enviado con éxito")
client.disconnect()
except OSError as e:
print("No se pudo conectar a Adafruit IO:", e)
#def conectarYenviar(topic, msg):
#dato= msg.decode('utf-8')
#topicrec= topic.decode('utf-8')
#if topicrec==topic:
#print(dato)
#try:
#client = MQTTClient(client_id, mqtt_server, port, user, password)
#client.set_callback(conectarYenviar)
#client.connect()
#client.subscribe(topic_tiempo)
#print("Conectado a Adafruit IO")
#msg= dato
#print("Valor de tiempo:" + msg)
#client.disconnect()
#except OSError as e:
#print("No se pudo conectar a Adafruit IO:", e)
def funcion_callback(topic, msg):
#completamos con la lógica que debe ejecutarse cuando se reciben mensajes del broker
#OJO que los argumentos topic y msg vienen codificados en UTF-8, por ende hay que convertirlos a string.
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Mensaje en tópico "+topicrec+":"+dato)
#if topicrec == topic_tiempo and "OFF" in dato: #Hacemos algo util.
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(funcion_callback) #Funcion Callback para recibir del broker mensajes
conexionMQTT.connect() #Hacemos la conexión.
conexionMQTT.subscribe(topic_tiempo) #Nos suscribimos a un tópico luego del connect
print("Conectado con Broker MQTT")
except OSError as e:
#Si falló la conexión, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
while True:
valorFuerza = luz.read()
print ("En 12 bits "+str(valorFuerza))
#Calculo para sacar el valor del Lux
ldr_voltage = 5 * valorFuerza / 4095
resistencia = 2000 * ldr_voltage / (1 - ldr_voltage / 5);
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistencia, (1 / GAMMA))
duty_value = int(valorFuerza * 1023 / 4095)
print(str(duty_value))
print("Lux "+str(lux))
time.sleep(5)
if lux < 100:
print("Es de noche")
if pir.value() == 1:
led.duty(duty_value)
conecypubli(client, topic_luz, "Valor de Lux: "+ str(lux))
conecypubli(client, topic_movimiento, "Movimiento detectado")
funcion_callback(topic_tiempo, Tiempo)
time.sleep(Tiempo)
else:
led.duty(0)
if lux > 100 :
print("Es de dia")
led.duty(0)