# #############################################################################
# ** Proyecto : 205 - Led RGB polimorfismo
# ** 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 : 14-05-2025, 2:00 pm,
# **
# ** Led RGB utilizando polimorfismo
# **
# ** Versión : 1
# ** Revisión : A
# ** Release : 0
# ** Bugs & Fixes :
# ** Date : 14-05-2025
# **
# ** By : Jorge Anzaldo
# ** contact : [email protected]
# ** twitter x : @janzaldob
# #############################################################################
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# : Librerias / Bibliotecas / Modulos | :
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
from machine import Pin
import time
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# | Definición y Desarrollo de Clases |
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import time
from machine import Pin
class Led:
def __init__(self, *pines):
self._leds = [Pin(pin, Pin.OUT) for pin in pines]
print(f'{self.__class__.__name__} construido con pines: {pines}')
def mensaje(self,texto):
print(texto)
def prender(self,tiempo=0.1):
print("Led Prendido")
for led in self._leds:
led.on()
time.sleep(tiempo)
def apagar(self,tiempo=0.0):
for led in self._leds:
led.off()
time.sleep(tiempo)
def parpadear(self,veces=3):
for i in range(veces):
self.prender(.2)
self.apagar(.2)
def pausar(self,tiempo=1):
time.sleep(tiempo)
class Torreta(Led):
def __init__(self, *pines):
super().__init__(*pines)
def prender(self,tiempo=0.0):
self.mensaje("Torreta Prendida")
for led in self._leds:
led.on()
super().pausar(tiempo)
def apagar(self,tiempo=0.0):
self.mensaje("Torreta apagando")
super().apagar()
super().pausar(tiempo)
def parpadear(self,veces=3):
self.mensaje("Torreta Parpadeando")
for i in range(veces):
self.prender()
super().pausar(0.5)
self.apagar()
super().pausar(0.5)
class LedRGB(Led):
def __init__(self, rojo, verde, azul):
super().__init__(rojo, verde, azul)
def prender(self,tiempo=0.5):
self.mensaje("Encendiendo LED RGB: Blanco")
for led in self._leds:
led.on()
super().pausar(tiempo)
def apagar(self,tiempo=0.5):
self.mensaje("Apagando LED RGB")
for led in self._leds:
led.off()
super().pausar(tiempo)
def parpadear(self,veces=3):
self.mensaje("Torreta Parpadeando")
for i in range(veces):
self.prender()
self.apagar()
def color(self, color):
if color == 0 :
self.mensaje("Led RGB Rojo")
self._leds[0].on()
elif color == 1 :
self.mensaje("Led RGB Verde")
self._leds[1].on()
elif color == 2 :
self.mensaje("Led RGB Azul")
self._leds[2].on()
else :
self.prender()
super().pausar()
self.apagar()
# ===============================================================================
# || ||
# || 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__':
# Crear instancias
led = Led(2)
torre = Torreta(13,12,14,27,26,25,33,32)
ledRGB = LedRGB(17,16,4)
# Demostración de polimorfismo
dispositivos = [led, torre, ledRGB] #usando listas
while True:
# Cada dispositivo ejecuta sus propias implementaciones
for dispositivo in dispositivos:
dispositivo.prender(0.3)
dispositivo.pausar(0.5)
dispositivo.parpadear(2)
dispositivo.apagar(0.3)
dispositivo.pausar(1)
# Funcionalidad específica de LedRGB
for color in range(4):
ledRGB.color(color)
# ********************************************************************************
#
#
#
# R E F E R E N C I A S / C O M E N T A R I O S
#
# *********************************************************************************
'''
machine.Pin: Clase que permite manipular los pines físicos del microcontrolador (entradas/salidas).
time.sleep(x): Pausa el programa por x segundos (aquí usado para animaciones con LEDs).
*pines: Permite recibir varios pines como argumentos.
self._leds: Lista que guarda los objetos Pin ya configurados como salida.
Pin(pin, Pin.OUT): Configura el pin como salida digital (para encender/apagar LEDs).
La línea comentada self._leds = [Pin(pin, Pin.OUT) for pin in pines] es una versión más compacta usando
list comprehension.
Hereda de la clase Led → reutiliza su funcionalidad.
super().__init__() llama al constructor de la clase padre para inicializar los pines.
Crea un objeto torre de la clase Torreta, con los pines GPIO 13, 12, 14 y 27.
En un ciclo infinito, ejecuta prenderID(), que:
Enciende LEDs uno a uno.
Los apaga todos.
---------------------------------------------
Crea un objeto torre de la clase Torreta, con los pines GPIO 13, 12, 14 y 27.
En un ciclo infinito, ejecuta prenderID(), que:
Enciende LEDs uno a uno.
Los apaga todos.
----------------------------------------------
Resumen
Torreta
↳ Hereda de Led
↳ Gestiona lista de pines como salidas
↳ .prender() → todos encendidos
↳ .apagar() → todos apagados
↳ .prenderID() → encender uno a uno + apagar
----------------------------------------------
Diagra
Inicio
↓
Crear instancia de Torreta con pines (13, 12, 14, 27)
↓
[Inicio del bucle infinito]
↓
Llamar a torre.prenderID()
↓
┌─────────────────────────────────────────────┐
│ Método prenderID(): │
│ Para cada LED en la lista _leds: │
│ - Encender el LED │
│ - Esperar 0.1 segundos │
│ Llamar a self.apagar() │
│ - Para cada LED en _leds: │
│ - Apagar el LED │
│ - Esperar 0.1 segundos │
└─────────────────────────────────────────────┘
↓
[Fin del bucle infinito]
-------------------------------------------------
Descripción del flujo:
Inicio: El programa comienza creando una instancia de la clase Torreta, pasando los pines GPIO 13, 12, 14 y 27 como argumentos. Estos pines están conectados a los LEDs.
Bucle Infinito: El programa entra en un bucle infinito (while True:) donde repetidamente llama al método prenderID() de la instancia torre.
Método prenderID(): Este método enciende cada LED en la lista _leds uno por uno, esperando 0.1 segundos entre cada encendido. Después de encender todos los LEDs, llama al método apagar().
Método apagar(): Este método apaga cada LED en la lista _leds uno por uno, esperando 0.1 segundos entre cada apagado.
-------------------------------------------------
Esquema de Conexión de Hardware para el ESP32
Para conectar los LEDs al ESP32, sigue este esquema:
Componentes necesarios:
4 LEDs
4 resistencias de 220 Ω
Cables de conexión
Protoboard (opcional)
Conexiones:
LED Anodo (+) conectado a GPIO Cátodo (−) conectado a
1 GPIO 13 GND a través de resistencia de 220 Ω
2 GPIO 12 GND a través de resistencia de 220 Ω
3 GPIO 14 GND a través de resistencia de 220 Ω
4 GPIO 27 GND a través de resistencia de 220 Ω
Notas:
Resistencias: Es importante colocar una resistencia de 220 Ω en serie con cada LED para limitar la corriente y evitar dañar tanto el LED como el pin del ESP32.
Conexión a GND: El cátodo de cada LED debe conectarse al pin GND del ESP32 a través de su respectiva resistencia.
GPIOs utilizados: Asegúrate de que los pines GPIO 13, 12, 14 y 27 estén configurados como salidas en tu código, como se muestra en la clase Led.
Precaución: Algunos pines del ESP32 tienen funciones especiales o restricciones. Por ejemplo, los GPIOs 34 a 39 son de solo entrada y no deben usarse para controlar LEDs. Para más detalles sobre los pines del ESP32, puedes consultar la referencia de pines del ESP32 .
----
'''