"""
# ############################################################################
# ** Archivo : HolaLed.py
# ** Proyecto : Parpadeo de Leds
# ** Procesador : Tensilica Xtensa LX6
# ** 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-03-2025, 9:45 pm ,
# ** Descripción :
# ** El programa prende y apaga led interno pin (2) - parpadeo por Timer
# ** tambien prende y apaga led externo pin (13) - parpadeo por Software
# ** por un periodo de 1 sengundo
# **
# ** Versión : 1.1
# ** Revisión : A
# ** Release : 0
# ** Bugs & Fixes :
# ** Date : 17/02/2025
# **
# ** @author
# ** Autores :
# ATEAM Development Group:
# ** - Antulio Morgado Valle
# ** - Jorge Anzaldo Bustos
# ** contact : <[email protected]> <[email protected]>
# ** twitter x : @janzaldob
# ##############################################################################
"""
# END header
"""
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# : :
# : Librerias / Bibliotecas / Modulos : # : :
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
"""
from machine import Pin, Timer # https://docs.micropython.org/en/latest/library/machine.Pin.html
import time # https://docs.micropython.org/en/latest/library/time.html
# END includes
""""
# +------------------------------------------------------------------------------+
# | |
# | DEFINICION Y DESARROLLO DE CLASES O FUNCIONES DEL PROGRAMADOR |
# | |
# +------------------------------------------------------------------------------+
"""
# Función que será llamada por el temporizador
def parpadear_led(timer):
led_monitor.value(not led_monitor.value()) # Cambia el estado del LED (toggle)
def blinking_led():
led_testigo.on() # encender led https://docs.micropython.org/en/latest/library/machine.Pin.html#machine.Pin.value
time.sleep(1) # espera por 1 segundo https://docs.micropython.org/en/latest/library/time.html#time.sleep
led_testigo.off() # apagar led
time.sleep(1) # espera por 1 segundo
# Crear un objeto Timer. Usar -1 para seleccionar cualquier temporizador de hardware disponible.
# La documentación de MicroPython recomienda usar -1 para mayor compatibilidad.
timer = Timer(1)
# Inicializar el temporizador:
# - period=500: Intervalo de 500 milisegundos.
# - mode=Timer.PERIODIC: Modo periódico (se repite automáticamente).
# - callback=parpadear_led: La función que se ejecuta en cada interrupción.
timer.init(period=500, mode=Timer.PERIODIC, callback=parpadear_led)
# END classes & definitions
"""
# +------------------------------------------------------------------------------+
# | |
# | V A R I A B L E S G L O B A L E S |
# | |
# +------------------------------------------------------------------------------+
"""
led_monitor = Pin(2,Pin.OUT) # Asigna la variable led_monitor a la salida del GPIO 2
led_testigo = Pin(4,Pin.OUT) # Asigna la variable led_testigo a la salida del GPIO 13
# END global variables
"""
# ===============================================================================
# || ||
# || 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__': # https://docs.python.org/es/3.10/library/__main__.html
# El Programa principal comienza aquí !!!
# +++++++++++++++++++++++ Secuencia Principal ++++++++++++++++++++++++++++++++++
# El programa principal puede seguir ejecutándose sin bloquearse
print("El temporizador está funcionando. El LED debería parpadear.")
# +++++++++++++++++++++++ Lazo Principal ++++++++++++++++++++++++++++++++++++++++
# El Lazo del Programa principal está aquí !!!
while True:
time.sleep(1)
# Puedes añadir más lógica aquí sin afectar la precisión del parpadeo del
blinking_led()
# END main
"""
# ____________________________________________________________________________
# | |
# | FUNCIONES PROTOTIPO |
# |____________________________________________________________________________|
# Las Funciones Prototipo van aquí !
"""
# END functions
"""
# ******************************************************************************
#
# R E F E R E N C I A S / C O M E N T A R I O S
#
# *** ¿QUÉ ES PYTHON? ***
#
# Python es un lenguaje de programación de alto nivel, limpio, elegante, ágil y
# sencillo, con una curva de aprendizaje muy corta.
#
# Durante su ejecución no se compila, sino que un intérprete lo procesa (scripting),
# lo que permite experimentar –de forma interactiva– mientras se programa.
#
# Gracias al uso de expresiones comunes Python requiere menos líneas de código
# para realizar tareas básicas. También dispone de una librería estándar así como
# multitud de librerías no oficiales, que permite ejecutar funciones y tareas
# complejas con mayor facilidad que otros lenguajes.
#
# Permite programar en varios estilos (programación multiparadigma):
# programación orientada a objetos, imperativa o funcional y sus aplicaciones
# son muy versátiles: desarrollo web, cómputo científico, procesamiento de datos,
# inteligencia artificial, etc.
#
# https://www.python.org/
#
# *** ¿QUÉ ES MICROPYTHON? ***
# Es un pequeño pero eficiente interprete del Lenguaje de Programación Python,
# optimizado para funcionar en microcontroladores y ambientes restringidos.
#
# Un intérprete se define como la capa lógica de software entre el código y el hardware,
# dicho de otro modo, es el encargado de procesar el código de programación y
# hacer posible que el hardware (ordenador, microcontrolador…) ejecute las acciones
# en él descritas.
#
# MicroPython está implementado a partir del intérprete estándar de Python 3.4
# con características seleccionadas de versiones posteriores-.
#
# Debido a las limitaciones de recursos de los microcontroladores, en su mayoría los
# módulos de la biblioteca estándar se han simplificado, pero proporcionando sus
# funcionalidades principales –un subconjunto de las funcionalidades totales-.
# MicroPython también dispone de módulos específicos dentro de la biblioteca estándar
# que permiten al programador el acceso al hardware del microcontrolador.
#
# Hay algunas características que MicroPython tiene y es lo que lo hace único y
# diferente de otros sistemas embebidos:
#
# Dispone, así como el Lenguaje de Programación Python, de multitud de librerías
# para la ejecución de tareas.
#
# Tiene un editor de código propio muy sencillo.
#
# Es extensible. Para los usuarios avanzados de MicroPython, pueden extender de Python
# a funciones de más bajo nivel como C o C++, pudiendo mezclar códigos que requieran
# de ejecución más rápida a bajo nivel con MicroPython.
#
# Con MicroPython, se pueden hacer muchas cosas, como controlar las entradas/salidas de
# un microcontroladores haciendo parpadear un LED, obteniendo lecturas de señales
# analógicas y digitales, generando señales PWM, controlando servomotores, pantallas
# OLED, pantallas NeoPixel, realizando comunicación I2C, SPI, etc.
#
# En algunos microcontroladores como el ESP32 también permite conexiones de Red y WiFi.
#
# https://docs.micropython.org/
#
# https://docs.micropython.org/en/latest/esp32/tutorial/intro.html
#
#+******************************************************************************
#+ D O C U M E N T A C I Ó N
#+******************************************************************************
#+ La documentación va aquí!:
#+------------------------------------------------------------------------------
#+ Descripción de la Conexión al Led Testigo:
#+------------------------------------------------------------------------------
#+
#+ Los leds se pueden conectar a cualquier pin que se declare como DigitalOut.
#+ El dispositivo puede drenar hasta 20ma por todas sus salidas a un voltaje de
#+ 3.3V, pero se recomienda no exceder de 1mA por salida.
#+ Esto se logra poniendo una resistencia limitadora de mínimo 330 Ohms.
#+
#+ 3.3V o 5V
#+ O
#+ |
#+ |
#+ /
#+ \ 1K
#+ /
#+ \ UTILIZANDO LÓGICA NEGATIVA
#+ |
#+ ___|___
#+ \ /
#+ \ /
#+ \ /
#+ __\/__
#+ |
#+ |__________________________ PIN (Digital Out)
#+
#+
#+
#+
#+ 1K
#+
#+ _________/\ /\ /\ _____ PIN (Digital Out)
#+ | \/ \/ \/
#+ |
#+ |
#+ ___|___
#+ \ /
#+ \ /
#+ \ / UTILIZANDO LÓGICA POSITIVA
#+ __\/__
#+ |
#+ |
#+ |
#+ ___|___
#+ _____
#+ ___
#+ _
#+
#+ GND
#+
#+------------------------------------------------------------------------------
#+ Descripción del Conexionado del Buzzer Piezoeléctrico
#+------------------------------------------------------------------------------
#+
#+
#+
#+
#+ 10
#+ Vcc -----/\/\/\/-------|
#+ |
#+ |
#+ | +
#+ ( )
#+ ( )
#+ ( o ) BUZZER
#+ ( )
#+ ( )
#+ |
#+ |
#+ |
#+ ___|___
#+ _____
#+ ___
#+ _
#+
#+ GND
#+
#+------------------------------------------------------------------------------
#+ Conexión al Potenciometro:
#+------------------------------------------------------------------------------
#+
#+ Como recomendación hay que poner un filtro pasa bajas para evitar que el
#+ ruido al convertidor analógico/digital.
#+
#+ 3.3V
#+ O
#+ |
#+ |
#+ | Conexión de los Potenciometros
#+ |
#+ /
#+ \ 10K
#+ / 100
#+ \ <----/\/\/\/\--------------> PIN (AnalogIn Pin)
#+ \ |
#+ / |
#+ \ ----- 0.1uF
#+ | -----
#+ | |
#+ | |
#+ | |
#+ ___|___ ___|___
#+ _____ _____
#+ ___ ___
#+ _ _
#+
#+ GND GND
#+
#+
#+ Conexión al Joy Stick Keyes
#+
#+ 1 2 3 4 5
#+ GND Vcc VrX VrY SW
#+
#+
#
#+------------------------------------------------------------------------------
#+ Conexión hacia la Terminal Serial de la PC
#+------------------------------------------------------------------------------
#+
#+ Los Transeptores recomedados para se pueden conectar a los siguientes pines
#+ de las UART's que posee el ESP32 por medio del siguiente conexionado.
#+
#+ UART1 CABLE CP2102 PL2303 CH340G FT232RL
#+ GPIO_1 Tx ------> Rx 3 2 2 3
#+ GPIO_3 Rx <------ Tx 4 3 3 2
#+ 3V3 ------ 3V3 5 5 4 1
#+ GND ------ GND 2 1 1 4
#+******************************************************************************
# END documentation
#+------------------------------------------------------------------------------
#| EJERCICIO
#|
#| 1.- Modificar este programa para:
#| a) El Led Monitor (GPIO2) parpadee por la interrupción Ticker a razón de
#| 500 ms para cada estado (Encendido/Apagado) creando el vector de
#| interrupción ("TimerInt_OnInterrupt").
#| b) Convertir el código del Lazo Principal en la función "Blinking_Led"
#| y añadir los siquientes Leds:
#| - Led_Rojo (GPIO13),
#| - Led_Verde (GPIO12) y
#| - Led_Azul (GPIO14)
#| para que parpadeen al igual que el primero pero a diferentes velocidades.
#| c) Añadir los Leds al vector de Interrupción para que parapdeen a la
#| mitad y al doble de la velocidad del "Led Monitor" de la interrupción.
#|
#| 2.- Añadir el potenciometro al canal analógico (GPIO36) y modificar las
#| propiedades del tercer Led a PwmOut mediante una nueva
#| función llamada Sighing_Led() o Led_Suspirante() de forma que:
#| a) Varie la intensidad del Led. Utilice valores de tipo flotante que
#| vayan de 0.0 a 1.0 en incrementos de 0.05 de modo que cuando
#| llegue a 1.0 (100% de Modulación), entonces la intensidad comienza
#| a disminuir hasta llegar nuevamente a 0.0 (0% de Modulación) para
#| comenzar nuevamente a aumentar la intensidad en un ciclo interminable.
#| b) Sincronizar los incrementos del Led con cada cambio en el "Led Monitor"
#| por medio de un Semáforo o Bandera (flag).
#|
#| 3.- Utilizar la función "GoToXY()" para ubicar los mensajes en una posición fija
#| en la pantalla de la "Terminal" para los leds
#| a) Led Monitor
#| b) Led Testigo o Parpadeante
#| c) Led Desvanecido
#| d) Led Suspirante
#|
#| (*) Sugerencias:
#| a) Crear las funciones variables y mensajes:
#| void Sighing_Led(void); # Función para el Led Suspirante
#| bool flag = FALSE; # Bandera o semáforo para sincronizar eventos
#| GoToXY(int col,ren); # Ubica el cursor en la columna y renglon especificado
#| PC_Terminal.printf("Led Rojo Activo... \n\r"); # Led Rojo Encendido
#| PC_Terminal.printf("Led Verde Activo... \n\r"); # Led Verde Encendido
#| PC_Terminal.printf("Led Rojo Azul... \n\r"); # Led Azul Encendido
#| PC_Terminal.printf(" \n\r"); # Borra el Mensaje anterior
#| PC_Terminal.printf("\rLa funcion Blinking ha ocurrido %d Veces ... \n\r",cuenta_v);
#| PC_Terminal.printf("\rLa Interrupción ha ocurrido %d Veces ... \n\r",cuenta_v);
#| b) Renombrar los Leds de la función "Blinking_Led" por ejemplo:
#| Led_Rojo (GPIO_12) # Led_Parpadeante_1
#| Led_Verde (GPIO_13) # Led_Parpadeante_2
#| Led_Azul (GPIO_14) # Led_Parpadeante_3
#| y utilizar un Led RGB
#| c) Añadir dos Leds al Vector de Interrupción que se llamen:
#| Led_Ambar (GPIO_4) # Led_Monitor_2
#| Led_Naranja (GPIO_16) # Led_Monitor_3
#| d) Nombrar a los Leds con PWM (Led_Desvanecido y Led Suspirante) como
#| Led_Fading (GPIO_17) # Led_Desvaneciente
#| Led_Sighing (GPIO_5) # Led_Suspirante
#| y utilizar un Led Bicolor
#|
#+------------------------------------------------------------------------------+
#|
#| EXAMEN
#|
#|
#|
#| 1.- Como opera le vector de interrupción del Ticker (TimerInt_OnInterrupt)?
#| a) Cada cuando ocurre la interrupción?
#| b) Que hace una vez que atiende la interrupción?
#| c) que significan las instrucciones:
#| if (!cuenta) { }
#| Led_Monitor = !Led_Monitor;
#|
#| 2.- Como opera le función para el parpadeo de los leds (Blinking_Led)?
#| a) Que pasa durante la ejecución de la instrucción "wait()" o "wait_ms()"?
#| b) Que ocurre si a la secuencia agregas otro led que lo enciendes y apagas
#| utilizando la instrucción wait(), como afecta esto a la función?.
#|
#|
#+------------------------------------------------------------------------------
#+
#+ Powered by
#+
#+ T H E A N T U L I U ' S T E A M R&D Unltd
#+
#+ Research, Development, Systems, Equipment, Support & Spare Parts.
#+ (C) Copyright 1989-2025, All Rights Reserved
#+
#+ Welcome to The Beaners Proyect Community!
#+-------------------------------------------------------------------------------
"""
# END code
# END program
# END file