import machine
import time
import dht
from machine import Pin, PWM, SoftI2C
from ssd1306 import SSD1306_I2C
from neopixel import NeoPixel
# Configuración de pines
servo_pin = 14
neopixel_pin = 12
potentiometer_pin = 13
button_pin = 27
buzzer_pin = 32
ultrasonic_trigger_pin = 2
ultrasonic_echo_pin = 4
# Inicialización de componentes
servo = PWM(Pin(servo_pin), freq=50)
neopixel = NeoPixel(Pin(neopixel_pin), 3) # Usar 3 neopixels
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
oled = SSD1306_I2C(128, 64, i2c)
temperature_sensor = dht.DHT22(Pin(15))
potentiometer = machine.ADC(Pin(potentiometer_pin))
button = Pin(button_pin, Pin.IN)
buzzer = PWM(Pin(buzzer_pin), freq=2000)
# Clase para el control ambiental
class EnvironmentalControl:
def __init__(self):
self.min_temp = 18
self.max_temp = 26
self.current_temp = 0
self.fan_speed = 0
def measure_temperature(self):
"""Medir la temperatura ambiente utilizando el sensor DHT22."""
temperature_sensor.measure()
self.current_temp = temperature_sensor.temperature()
def adjust_neopixels(self):
"""Ajustar los neopixels según la temperatura."""
if self.min_temp <= self.current_temp <= 22:
neopixel[0] = (0, 0, 255) # Azul
neopixel[1] = (0, 0, 0)
neopixel[2] = (0, 0, 0)
elif 22 < self.current_temp <= self.max_temp:
neopixel[0] = (0, 0, 0)
neopixel[1] = (0, 255, 0) # Verde
neopixel[2] = (0, 0, 0)
else:
neopixel[0] = (0, 0, 0)
neopixel[1] = (0, 0, 0)
neopixel[2] = (255, 0, 0) # Rojo
servo.duty(180)
def ultrasonic_detect(self):
"""Detectar un objeto cercano con el sensor ultrasónico."""
trigger = Pin(ultrasonic_trigger_pin, Pin.OUT)
echo = Pin(ultrasonic_echo_pin, Pin.IN)
trigger.on()
time.sleep_us(10)
trigger.off()
pulse_start = time.ticks_us()
pulse_end = time.ticks_us()
while echo.value() == 0:
pulse_start = time.ticks_us()
while echo.value() == 1:
pulse_end = time.ticks_us()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration / 58
return distance <= 5 # Retorna True si el objeto está a 5 cm o menos
def abanico ():
servo.duty(180) # Mover el servo a 180 grados (posición de dispensado)
time.sleep(1.5) # Mantener la posición durante 1.5 segundos
servo.duty(0)
# Función principal
def main():
control = EnvironmentalControl()
system_on = True # Inicialmente encendido
while True:
if button.value() == 0:
system_on = not system_on # Cambiar el estado del sistema
if system_on:
# Medir temperatura
control.measure_temperature()
# Ajustar neopixels
control.adjust_neopixels()
neopixel.write()
# Ajustar velocidad del ventilador
pot_value = potentiometer.read_u16()
control.fan_speed = int(pot_value / 65535 * 180) # Mapear el valor a un rango de 0-1023
servo.duty(control.fan_speed)
# Verificar temperatura y activar buzzer
if control.current_temp > 26:
buzzer.duty(512) # Activar el zumbador
else:
buzzer.duty(0) # Desactivar el zumbador
# Detectar objeto cercano con el sensor ultrasónico
if control.ultrasonic_detect():
servo.duty(0) # Detener el servo si hay un objeto cercano
# Mostrar información en pantalla OLED
oled.fill(0)
oled.text("Temp: {:.1f} C".format(control.current_temp), 0, 0)
oled.text("Fan Speed: {}".format(control.fan_speed), 0, 20)
oled.text("System ON", 0, 40)
oled.show()
else:
# Apagar todo cuando el sistema está apagado
neopixel.fill((0, 0, 0))
neopixel.write()
servo.duty(0)
buzzer.duty(0)
oled.fill(0)
oled.text("System OFF", 0, 0)
oled.show()
time.sleep(0.5)
# Ejecutar la función principal
main()