from machine import Pin, I2C
from utime import sleep_ms
from ssd1306 import SSD1306_I2C
import dht
MODE = "WOKWI" # "WOKWI" / "PHYSICAL"
DHT_READ_INTERVAL_MS = 2000
DHT_GPIO = 15
SCL_PIN_GPIO = 18
SDA_PIN_GPIO = 19
# Tamaño de la OLED
WIDTH = 128
HEIGHT = 64
# Configuracion I2C
i2c = I2C(
0,
scl = Pin(SCL_PIN_GPIO),
sda = Pin(SDA_PIN_GPIO),
freq = 400000
)
# =============================================================================
# MODO DE USO / FUNCIONAMIENTO
# =============================================================================
if MODE == "PHYSICAL":
sensor_dht = dht.DHT11(Pin(DHT_GPIO))
else:
sensor_dht = dht.DHT22(Pin(DHT_GPIO))
# =============================================================================
# FUNCIONES DE APOYO
# =============================================================================
def mostrar_mensaje(oled, linea1="", linea2="", linea3="", linea4=""):
"""
Muestra hasta cuatro líneas de texto en la pantalla OLED.
Cada línea se ubica con una separación vertical de 14 píxeles.
"""
oled.fill(0)
oled.text(linea1, 0, 0)
oled.text(linea2, 0, 16)
oled.text(linea3, 0, 32)
oled.text(linea4, 0, 48)
oled.show()
def leer_dht():
"""
Lee temperatura y humedad del sensor DHT.
Devuelve:
- temperatura
- humedad
- mensaje de error, si ocurre alguno
"""
try:
sensor_dht.measure()
temperatura = sensor_dht.temperature()
humedad = sensor_dht.humidity()
return temperatura, humedad, None
except OSError as error:
return None, None, error
# =============================================================================
# ESCANEO DEL BUS I2C
# =============================================================================
print("Escaneando bus I2C...")
devices = i2c.scan()
print("Dispositivos encontrados:", [hex(d) for d in devices])
if not devices:
print("No se detectó ninguna pantalla I2C.")
print("Revisa conexiones: VCC, GND, SCL=18, SDA=19.")
else:
# Dirección típica de la pantalla OLED SSD1306: 0x3C
addr = devices[0]
print("Usando dirección:", hex(addr))
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=addr)
# -------------------------------------------------------------------------
# Prueba inicial de OLED
# -------------------------------------------------------------------------
mostrar_mensaje(
oled,
"SSD1306 OK",
"SCL: GPIO18",
"SDA: GPIO19",
"I2C: " + hex(addr)
)
sleep_ms(2000)
# -------------------------------------------------------------------------
# Mensaje inicial del sistema
# -------------------------------------------------------------------------
mostrar_mensaje(
oled,
"EcoPulse 9",
"Sistema listo",
"Modo: " + MODE,
"DHT GPIO: " + str(DHT_GPIO)
)
sleep_ms(2000)
# -------------------------------------------------------------------------
# Ciclo principal de lectura
# -------------------------------------------------------------------------
while True:
temperatura, humedad, error = leer_dht()
if error is None:
print("Temperatura:", temperatura, "C")
print("Humedad:", humedad, "%")
print("-------------------------")
mostrar_mensaje(
oled,
"EcoPulse 9",
"Temp: " + str(temperatura) + " C",
"Hum: " + str(humedad) + " %",
"Modo: " + MODE
)
else:
print("Error leyendo DHT:", error)
mostrar_mensaje(
oled,
"Error DHT",
"Revisa sensor",
"GPIO: " + str(DHT_GPIO),
"Modo: " + MODE
)
# Espera necesaria antes de una nueva medición
sleep_ms(DHT_READ_INTERVAL_MS)