import machine
import time
import onewire
import ds18x20
from time import sleep, sleep_ms, ticks_ms
from machine import I2C, Pin, ADC, PWM
from i2c_lcd import I2cLcd
import utime
AddressOfLcd = 0x27
i2c = machine.I2C(-1, machine.Pin(22), machine.Pin(21))
lcd = I2cLcd(i2c, AddressOfLcd, 4, 20)
white = machine.Pin(27, machine.Pin.OUT)
red = machine.Pin(13, machine.Pin.OUT)
green= machine.Pin(12, machine.Pin.OUT)
blue = machine.Pin(14, machine.Pin.OUT)
# Configura el pin GPIO al que está conectado el sensor de luz (LDR)
pin_ldr = machine.Pin(2, machine.Pin.IN) # Ajusta el número del pin según tu conexión
# Configura el pin GPIO al que está conectado el bus OneWire
pin = machine.Pin(4) # Ajusta el número del pin según tu conexión
pin_buzzer = machine.Pin(25, machine.Pin.OUT)
pin_potenciometro = machine.ADC(15)
pin_servo = machine.Pin(26, machine.Pin.OUT) # Ajusta el número del pin según tu conexión
servo = machine.PWM(pin_servo, freq=50)
valor_min_potenciometro = 0
valor_max_potenciometro = 4095
# Rango de grados del servo
grados_min = 0
grados_max = 180
# Configura el bus OneWire
ow = onewire.OneWire(pin)
ds = ds18x20.DS18X20(ow)
# Escanea los dispositivos en el bus OneWire
roms = ds.scan()
# Fracmento de codigo que despliega en el trblero si detecta el sensor
'''
if not roms:
print("No se encontraron dispositivos DS18B20 en el bus OneWire.")
else:
print(f"Se encontraron {len(roms)} dispositivos DS18B20 en el bus OneWire.")
print("Leyendo temperatura...")
'''
def sensor_luz():
# Lee el valor analógico del pin del LDR
valor_analogico = machine.ADC(pin_ldr).read()
# Puedes ajustar el rango de valores según tu sensor y ambiente
# En un LDR, los valores más bajos suelen indicar más luz
# y los valores más altos indican menos luz.
# Puedes invertir esto según tu configuración.
luz = 100 - (valor_analogico * 100 // 4095)
#print(f'Valor analógico: {valor_analogico}, Nivel de luz: {luz}%')
time.sleep(1) # Puedes ajustar la frecuencia de lectura según tus necesidades
if luz == 100:
lcd.move_to(0, 0)
lcd.putstr("Nivel de luz: " + str(luz) + "%")
if 9 < luz < 100:
lcd.move_to(0, 0)
lcd.putstr("Nivel de luz: " + str(luz) + " %")
if luz < 10:
lcd.move_to(0, 0)
lcd.putstr("Nivel de luz: "+ "0" + str(luz) + " %")
if luz < 50:
white.on()
else:
white.off()
def sensor_temp():
for rom in roms:
ds.convert_temp()
time.sleep_ms(750) # Espera a que la conversión termine
temperatura = ds.read_temp(rom)
# Fracmento de codigo que imprime los valores del sensor en el tablero
#print(f"Sensor {rom.hex()} - Temperatura: {temperatura:.2f}°C")
if temperatura >= 29:
red.on()
else:
red.off()
if 15 <= temperatura < 30:
green.on()
else:
green.off()
if temperatura < 15:
blue.on()
else:
blue.off()
time.sleep(1) # Espera un segundos antes de realizar otra lectura
lcd.move_to(0, 1)
lcd.putstr("Temperatura: " + str(temperatura))
def sensor_humo():
valor_potenciometro = pin_potenciometro.read()
# Mapea el valor del potenciómetro al rango de grados del servo
angulo = grados_min + (valor_potenciometro - valor_min_potenciometro) * (grados_max - grados_min) / (valor_max_potenciometro - valor_min_potenciometro)
# Configura el servo en el ángulo calculado
servo.duty(int(1023 * angulo / 180))
lcd.move_to(0, 2)
lcd.putstr("Particulas: " + str(valor_potenciometro))
if angulo > 100:
pin_buzzer.on()
time.sleep(10)
else:
pin_buzzer.off()
time.sleep(10)
try:
while True:
sensor_luz()
sensor_temp()
#sensor_humo()
except KeyboardInterrupt:
print("Lectura del sensor de temperatura DS18B20 detenida.")
except KeyboardInterrupt:
print('Lectura del sensor de luz detenida.')
except KeyboardInterrupt:
servo.duty(0) # Detiene el servo antes de salir
print('Control del servo detenido.')