# Importar las librerías y módulos necesarios
from machine import Pin, I2C, ADC # Importar clases para control de pines y comunicación
import dht # Importar módulo para el sensor DHT22
import ssd1306 # Importar módulo para la pantalla OLED
from hcsr04 import HCSR04 # Importar módulo para el sensor ultrasónico
from time import sleep # Importar función para introducir pausas de tiempo
from servo import Servo # Importar clase para control del servo motor
from neopixel import NeoPixel # Importar clase para control de LEDs NeoPixel
# Definir la clase para controlar los sensores
class Sensorcontrol:
def __init__(self):
# Inicializar los componentes y pines
self.dht_sensor = dht.DHT22(Pin(15)) # Inicializar el sensor DHT22 en el pin 15
self.ultrasonic_sensor = HCSR04(trigger_pin=2, echo_pin=4, echo_timeout_us=10000) # Configurar el sensor ultrasónico
self.servo = Servo(Pin(14)) # Inicializar el servo motor en el pin 14
self.pot_pin = Pin(27, Pin.IN) # Configurar el pin para el potenciómetro como entrada
self.adc = ADC(self.pot_pin) # Configurar el conversor analógico-digital (ADC)
self.button = Pin(5, Pin.IN) # Configurar el pin para el botón como entrada
# Función para medir temperatura y humedad
def measure_temperature_humidity(self):
self.dht_sensor.measure() # Realizar la medición de temperatura y humedad
return self.dht_sensor.temperature(), self.dht_sensor.humidity() # Devolver los valores medidos
# Función para medir la distancia
def measure_distance(self):
try:
distance = self.ultrasonic_sensor.distance_cm() # Medir la distancia en centímetros
return distance
except OSError as ex:
print('ERROR obteniendo distancia:', ex) # Manejo de error en caso de problema con el sensor
return None
# Función para controlar el servo motor
def control_servo(self):
self.servo.write_angle(15) # Mover el servo a 15 grados
sleep(2) # Pausa de 2 segundos
self.servo.write_angle(165) # Mover el servo a 165 grados
sleep(2) # Pausa de 2 segundos
self.servo.write_angle(90) # Mover el servo a 90 grados (posición neutral)
sleep(2) # Pausa de 2 segundos
# Función para leer el valor del potenciómetro
def read_potentiometer(self):
pot_value = self.adc.read() # Leer el valor analógico del potenciómetro
return pot_value
# Función para detectar el estado del botón
def detect_button(self):
button_state = self.button.value() # Leer el estado del botón (0 si está presionado, 1 si no)
return not button_state # Devolver True si el botón está presionado, False si no
# Definir la clase para controlar la pantalla y los LEDs
class controlPantalla:
def __init__(self):
# Inicializar la comunicación I2C y los componentes relacionados
self.i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # Configurar la comunicación I2C
self.display = ssd1306.SSD1306_I2C(128, 64, self.i2c) # Configurar la pantalla OLED
self.neo_pixel = NeoPixel(Pin(5), 16) # Configurar los LEDs NeoPixel
# Función para cambiar los colores de los LEDs NeoPixel
def change_neo_pixel_colors(self):
for _ in range(5): # Repetir el patrón de parpadeo 5 veces
for x in range(0, 16, 2): # Cambiar solo los índices pares (amarillos)
self.neo_pixel[x] = (255, 0, 0) # rojo claro
self.neo_pixel.write() # Actualizar los LEDs NeoPixel
sleep(0.5) # Pausa de 0.5 segundos
for x in range(0, 16, 2): # Apagar los índices pares
self.neo_pixel[x] = (0, 0, 0) # Apagar LED NeoPixel
self.neo_pixel.write() # Actualizar los LEDs NeoPixel
sleep(0.5) # Pausa de 0.5 segundos
for x in range(1, 16, 2): # Cambiar solo los índices impares (celestes)
self.neo_pixel[x] = (0, 0, 255) # Celeste claro
self.neo_pixel.write() # Actualizar los LEDs NeoPixel
sleep(0.5) # Pausa de 0.5 segundos
for x in range(1, 16, 2): # Apagar los índices impares
self.neo_pixel[x] = (0, 0, 0) # Apagar LED NeoPixel
self.neo_pixel.write() # Actualizar los LEDs NeoPixel
sleep(0.5) # Pausa de 0.5 segundos
# Función para mostrar valores en la pantalla OLED
def show_on_display(self, value1, value2):
self.display.fill(0) # Llenar la pantalla con color negro
self.display.text(str(value1), 20, 20) # Mostrar el primer valor en la posición (20, 20)
self.display.text(str(value2), 20, 40) # Mostrar el segundo valor en la posición (20, 40)
self.display.show() # Actualizar la pantalla OLED
# Función principal
def main():
# Crear instancias de las clases para controlar sensores y pantalla
sensor_control = Sensorcontrol()
pantalla_control = controlPantalla()
while True:
# Medir temperatura y humedad
temperature, humidity = sensor_control.measure_temperature_humidity()
print('Temperatura:', temperature, '°C')
print('Humedad:', humidity, '%')
sleep(0.5) # Pausa de 0.5 segundos
# Cambiar los colores de los LEDs NeoPixel
pantalla_control.change_neo_pixel_colors()
# Mostrar valores en la pantalla OLED
pantalla_control.show_on_display(temperature, humidity)
sleep(0.5) # Pausa de 0.5 segundos
# Medir distancia y controlar el servo motor
distance = sensor_control.measure_distance()
if distance is not None:
print('Distancia:', distance, 'cm')
sleep(1) # Pausa de 1 segundo
sensor_control.control_servo()
# Leer el valor del potenciómetro
pot_value = sensor_control.read_potentiometer()
print('Valor del potenciómetro:', pot_value)
sleep(0.1) # Pausa de 0.1 segundos
# Detectar el estado del botón
button_pressed = sensor_control.detect_button()
if button_pressed:
print('Botón pulsado')
else:
print('Botón no pulsado')
sleep(0.1) # Pausa de 0.1 segundos
# Iniciar el programa si se ejecuta como script principal
if __name__ == "__main__":
main()