# Importamos las bibliotecas necesarias para el manejo de hardware y dispositivos
from machine import Pin, ADC, PWM, I2C  # Importa las clases Pin, ADC, PWM, y I2C de la biblioteca machine
from utime import sleep, sleep_ms  # Importa las funciones de suspensión de la biblioteca utime
from dht import DHT22  # Importa la clase DHT22 para manejar el sensor de temperatura y humedad
from ssd1306 import SSD1306_I2C  # Importa la clase SSD1306_I2C para controlar la pantalla OLED

# Definimos las dimensiones de la pantalla OLED
alto = 64  # Altura de la pantalla en píxeles
ancho = 128  # Ancho de la pantalla en píxeles

# Configuramos la comunicación I2C con la pantalla OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))  # Inicializa el bus I2C con los pines SCL y SDA
oled = SSD1306_I2C(ancho, alto, i2c)  # Crea una instancia del objeto SSD1306_I2C para la pantalla OLED

# Configuramos el sensor DHT22
dht = DHT22(Pin(15))  # Inicializa el sensor DHT22 en el pin 15

# Verificamos la conexión del bus I2C y mostramos el resultado en la consola
print(i2c.scan(), "conectada")  # Escanea los dispositivos en el bus I2C y muestra el resultado

# Bucle principal del programa
while True:
    # Medimos la temperatura y humedad
    dht.measure()  # Realiza la medición del sensor
    tem = dht.temperature()  # Obtiene la temperatura medida
    hum = dht.humidity()  # Obtiene la humedad medida

    # Limpiamos la pantalla OLED
    oled.fill(0)  # Llena la pantalla con color negro (apagada)

    # Dibujamos el marco en la pantalla OLED
    oled.pixel(64, 60, 1)  # Dibuja un píxel blanco en la posición (64, 60)
    oled.vline(0, 0, 20, 1)  # Dibuja una línea vertical blanca desde (0, 0) hasta (0, 20)
    oled.vline(120, 0, 20, 1)  # Dibuja una línea vertical blanca desde (120, 0) hasta (120, 20)
    oled.hline(0, 0, 120, 1)  # Dibuja una línea horizontal blanca desde (0, 0) hasta (120, 0)
    oled.hline(0, 20, 120, 1)  # Dibuja una línea horizontal blanca desde (0, 20) hasta (120, 20)

    # Mostramos los datos en la pantalla OLED
    oled.text("Datos", 10, 10, 1)  # Muestra el texto "Datos" en la posición (10, 10)
    oled.text("Tem:", 0, 30, 1)  # Muestra el texto "Tem:" en la posición (0, 30)
    oled.text("Hum:", 0, 40, 1)  # Muestra el texto "Hum:" en la posición (0, 40)
    oled.text(str(tem), 60, 30, 1)  # Muestra la temperatura medida en la posición (60, 30)
    oled.text(str(hum), 60, 40, 1)  # Muestra la humedad medida en la posición (60, 40)

    # Actualizamos la pantalla OLED para mostrar los cambios
    oled.show()  # Refresca la pantalla para mostrar el contenido actualizado

    # (Opcional) Pausa entre mediciones para evitar una actualización demasiado rápida
    sleep(2)  # Pausa la ejecución del programa durante 2 segundos
$abcdeabcde151015202530354045505560fghijfghij
$abcdeabcde151015202530354045505560fghijfghij