# ############################################################################
# ** 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")
# 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 G L O B A L E S |
# +-------------------------------------------------------------------------------
# Configuración del sensor y led
sensor = dht.DHT22(machine.Pin(15)) # Pin 15 para el sensor DHT22
led = machine.Pin(2,machine.Pin.OUT) # Pin 2 como salida para el LED
listaTemperaturasyHumedad = ListaEnlazada()
contador = 1
# ===============================================================================
# || ||
# || 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:
sensor.measure() # Tomar medición
temperatura = sensor.temperature()
humedad = sensor.humidity()
# Obtener la hora actual (ESP32 necesita un RTC configurado para obtener la hora real)
hora_actual = time.localtime() # (Año, Mes, Día, Hora, Minuto, Segundo, DíaSemana, DíaAño)
hora_formato = "{:02d}:{:02d}:{:02d}".format(hora_actual[3], hora_actual[4], hora_actual[5])
# Formatear la lectura con la hora incluida
lectura = f"{contador} .- {hora_formato} - T:{temperatura}°C, H:{humedad}%"
contador +=1
listaTemperaturasyHumedad.insertar(lectura) # Guardar lectura en la lista
print(f"-- Lectura guardada: {lectura}")
led.off()
listaTemperaturasyHumedad.mostrar() # Mostrar lista de mediciones
time.sleep(10) # Esperar 5 segundos para la siguiente lectura
led.on()
usoMemoria()
except Exception as e:
print("Error al leer el sensor:", e)