# ############################################################################
# ** Proyecto : aplicacion de DHT22 con listas enlazadas
# ** Plataforma : ESP32 / WROOM
# ** Herramienta : https://www.wokwi.com
# ** : Thonny aplicacion de escritorio descargar en www.thonny.org
# ** Compilador : wokwi Simulador online
# ** Version : 1.0
# ** Fecha/Hora : 22-10-2024, 9:45 pm ,
# ** Descripción :
# ** Este programa elabora una lista simple enlazada utilizando sensor DHT22
# **
# ** Versión : 1.1
# ** Revisión : A
# ** Release : 0
# ** Bugs & Fixes :
# ** Date : 24/03/2025
# **
# ** By : Jorge Anzaldo
# ** contact : [email protected]
# ** twitter x : @janzaldob
# #############################################################################
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# : Librerias / Bibliotecas / Modulos | :
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
import machine
import dht
import time
import gc
# +-------------------------------------------------------------------------------
# | DEFINICION Y DESARROLLO DE CLASES O FUNCIONE DE PROGRAMADOR |
# +-------------------------------------------------------------------------------
class Nodo:
def __init__(self, dato):
self.dato = dato
self.siguiente = None # Puntero al siguiente nodo
class ListaEnlazada:
def __init__(self):
self.inicio = None # Inicio de la lista
def insertar(self, dato): # Insertar al inicio
nuevo_nodo = Nodo(dato)
nuevo_nodo.siguiente = self.inicio
self.inicio = nuevo_nodo
def eliminar(self, dato): # Eliminar un nodo por su dato
actual = self.inicio
anterior = None
while actual:
if actual.dato == dato:
if anterior:
anterior.siguiente = actual.siguiente
else:
self.inicio = actual.siguiente
del actual
return True # Nodo eliminado
anterior = actual
actual = actual.siguiente
return False # Nodo no encontrado
def mostrar(self): # Mostrar todos los datos
actual = self.inicio
while actual:
print(actual.dato, end=" -> \n")
actual = actual.siguiente
print("None")
class SensorTH:
def __init__(self,nombre="Sensor 1",pinSensor=15,pinLed=2,time=1):
self.nombre = nombre
self.sensor = dht.DHT22(machine.Pin(pinSensor))
self.led = machine.Pin(pinLed,machine.Pin.OUT)
self.time = time
self.sensor.measure() # Tomar medición
self.temperatura = self.sensor.temperature()
self.humedad = self.sensor.humidity()
self.contador = 1
self.datos = ListaEnlazada()
def detectar(self):
self.led.on()
# Obtener la hora actual (ESP32 necesita un RTC configurado para obtener la hora real)
self.hora_actual = time.localtime() # (Año, Mes, Día, Hora, Minuto, Segundo, DíaSemana, DíaAño)
self.hora_formato = "{:02d}:{:02d}:{:02d}".format(self.hora_actual[3], self.hora_actual[4], self.hora_actual[5])
# Formatear la lectura con la hora incluida
self.lectura = f"{self.contador} .- {self.hora_formato} - T:{self.temperatura}°C, H:{self.humedad}%"
self.datos.insertar(self.lectura) # Guardar lectura en la lista
print(f"{self.nombre} \n -- Lectura guardada: {self.lectura}")
time.sleep(self.time)
self.contador += 1
self.led.off()
time.sleep(1)
def mostrar(self):
self.datos.mostrar()
# Obtener memoria libre y usada
def usoMemoria():
gc.collect() # Forzar la recolección de basura para obtener datos más precisos
mem_libre = gc.mem_free() # Bytes de RAM libre
mem_usada = gc.mem_alloc() # Bytes de RAM en uso
mem_total = mem_libre + mem_usada # Memoria total disponible en el heap
print(f"Memoria Total: {mem_total} bytes")
print(f"Memoria Usada: {mem_usada} bytes")
print(f"Memoria Libre: {mem_libre} bytes")
# +-------------------------------------------------------------------------------
# | V A R I A B L E S / O B J E T O S - G L O B A L E |
# +-------------------------------------------------------------------------------
sensor1 = SensorTH("Sensor 1",15,2)
sensor2 = SensorTH("Sensor 2",16,4)
sensor3 = SensorTH("Sensor 3",12,14)
sensor4 = SensorTH("Sensor 4",25,26)
# ===============================================================================
# || ||
# || P R O G R A M A / F U N C I O N P R I N C I P A L ||
# || ||
# ===============================================================================
if __name__ == "__main__":
while True:
try:
sensor1.detectar()
sensor2.detectar()
sensor3.detectar()
sensor4.detectar()
except Exception as e:
print("Error al leer el sensor:", e)