Temporitzar l'encesa de la nostra lampareta pot ser útil: si ens adormim, passat el temps prefixat s'apagarà automàticament.
Aquesta sembla bona idea, i pot ajudar a fer la nostra lampareta més eficient i sostenible. Som-hi!
Necessites ajuda per fer el programa? 👀 👉
Tip: utilitza una variable que prengui un valor quan el LED estigui encés i un altre quan estigui apagat. Jo he fet estat_led = 0 o 1.
🤔 El problema d'utilitzar pauses en l'execució (sleep) és que el microcontrolador queda inutilitzat durant el temps definit i no podrà fer cap altra tasca com per exemple, respondre al polsador si volem apagar-la manualment.
Podem fer un temporitzador pseudo-intel·ligent amb una variable comptador que es reiniciï en prémer el polsador si el LED s'encén.
Aquesta variable, si no s'ha premut el botó per apagar, ha de sumar 1 a cada bucle d'execució (la durada del bucle ha de ser molt curta, proposo màxim 100 ms).
Quan comptador arribi a un valor prefixat (consigna), el LED s'apagarà.
* El valor de la consigna no serà el nombre de segons abans que s'apagui, sinó el nombre de vegades que s'ha de comprovar.
Necessites ajuda per fer el programa? 👀 👉
I si ho fem amb interrupcions???
Millorem-ho més
L'apagada sobtada de la llum pot ser una mica perturbadora. Caldria trobar una estratègia d'avís que no pot ser l'atenuació del nivell de llum per limitacions que trobaríem més endavant.
Se m'ha acudit que el LED abans d'apagar-se faci uns quants parpelleixos 👉
# afegim la classe deepsleep, que permet gestionar el son profund
from machine import Pin, Timer, deepsleep
import time
# variables globals
led = Pin(23, Pin.OUT)
boto = Pin(15, Pin.IN)
estat_led = False
temps_inici_encesa = 0
temps_encesa = 5000
parpadeos_restantes = 5 # Número de parpadeos antes de apagar el LED
parpadeo_intervalo = 500 # Intervalo entre parpadeos en milisegundos
# Función interrupció
def interrupcio(pin):
global estat_led, temps_inici_encens
if not estat_led:
estat_led = True
led.value(1)
temps_inici_encesa = time.ticks_ms()
else:
estat_led = False
led.value(0) # Apaga el LED
# Configura la interrupció del botó
boto.irq(trigger=Pin.IRQ_RISING, handler=interrupcio)
# Configura un temporitzador per controlar el temps d'encesa del LED
temporizador = Timer(-1)
def manejar_temporizador(t):
global estat_led, parpadeos_restantes
if estat_led:
temps_actual = time.ticks_ms()
if time.ticks_diff(temps_actual, temps_inici_encesa) > temps_encesa:
if parpadeos_restantes > 0:
led.value(not led.value()) # Alterna el estado del LED (enciende/apaga)
parpadeos_restantes -= 1
else:
estat_led = False
led.value(0) # Asegúrate de que el LED esté apagado
entrar_en_deep_sleep() # quan s'apagui el led es cridarà l'execució d'aquesta funció
# inicia el temporizador perquè s'executi cada 100 ms
temporizador.init(period=100, mode=Timer.PERIODIC, callback=manejar_temporizador)
def entrar_en_deep_sleep():
print("Entrando en deep sleep...") # per comprovació
boto_wake = Pin(15, mode=Pin.IN) # Configura el pin del botón como el trigger para despertar
import esp32
esp32.wake_on_ext0(pin=boto_wake, level=esp32.WAKEUP_ANY_HIGH)
deepsleep()
while True:
pass