Trabalhando com Sinais de Interrupção na ESP32 com MicroPython

Resumo

Use machine.Pin e machine.ExtInt para lidar com interrupções no ESP32 com MicroPython. Defina uma função de manipulador de interrupção, configure o pino como entrada, crie um objeto ExtInt que vincule o pino, o manipulador e o modo de disparo (por exemplo, ExtInt.IRQ_FALLING), e opcionalmente habilite/desabilite ou troque os manipuladores. Lembre-se de fazer a debouncing e mantenha os manipuladores de interrupção curtos.

Usar sinais de interrupção no ESP32 com MicroPython envolve o uso das classes Pin e ExtInt do módulo machine. Aqui está um detalhamento de como fazer isso:

1. Importando Módulos Necessários:

from machine import Pin, ExtInt

2. Definindo a Função do Manipulador de Interrupção:

Esta função será executada quando a interrupção for acionada. Ela recebe o objeto do pino como argumento.

def interrupt_handler(pin):
    print("Interrupção acionada no pino:", pin)
    # Adicione sua lógica de tratamento de interrupção aqui
    # ...

3. Configurando o Pino como Entrada com Pull-up/Pull-down:

Você precisa configurar o pino que acionará a interrupção. Especifique o número do pino, defina-o como entrada (Pin.IN) e, opcionalmente, habilite um resistor de pull-up ou pull-down.

interrupt_pin = Pin(14, Pin.IN, Pin.PULL_UP)  # Exemplo: Pino 14 com pull-up

4. Criando o Objeto ExtInt:

Este objeto vincula o pino ao manipulador de interrupção e especifica o modo de disparo.

interrupt = ExtInt(interrupt_pin, ExtInt.IRQ_FALLING, Pin.PULL_UP, interrupt_handler)
  • interrupt_pin: O objeto Pin que você configurou.
  • ExtInt.IRQ_FALLING: O modo de disparo. As opções comuns incluem:
    • ExtInt.IRQ_RISING: Acionado em uma borda de subida (baixo para alto).
    • ExtInt.IRQ_FALLING: Acionado em uma borda de descida (alto para baixo).
    • ExtInt.IRQ_RISING_FALLING: Acionado em ambas as bordas de subida e descida.
  • Pin.PULL_UP: Isso deve corresponder à configuração de pull-up/pull-down que você usou ao configurar o pino. Use Pin.PULL_DOWN se você usou um resistor de pull-down. Se nenhum pull-up/pull-down for usado, omita este argumento ou defina-o como None.
  • interrupt_handler: A função a ser chamada quando a interrupção ocorrer.

5. (Opcional) Desabilitando a Interrupção:

Você pode desabilitar temporariamente a interrupção:

interrupt.disable()

6. (Opcional) Reabilitando a Interrupção:

interrupt.enable()

7. (Opcional) Trocando Manipuladores de Interrupção:

Se você precisar mudar a função que manipula a interrupção:

def new_interrupt_handler(pin):
    print("Novo manipulador de interrupção acionado!")
 
interrupt.irq(handler=new_interrupt_handler, trigger=ExtInt.IRQ_FALLING) # O disparo também pode ser alterado

Exemplo Completo (Interrupção na Borda de Descida com Pull-up):

from machine import Pin, ExtInt
 
def interrupt_handler(pin):
    print("Botão pressionado!")
 
interrupt_pin = Pin(14, Pin.IN, Pin.PULL_UP)
interrupt = ExtInt(interrupt_pin, ExtInt.IRQ_FALLING, Pin.PULL_UP, interrupt_handler)
 
# Seu loop principal do programa pode rodar aqui...
while True:
    pass  # Seu código vai aqui

Considerações Chave:

  • Debouncing: Botões físicos podem “quicar”, causando múltiplas interrupções em um único pressionamento. Você provavelmente precisará implementar debouncing em seu interrupt_handler para evitar isso. Um debouncing de software simples envolve um pequeno atraso e a verificação do estado do pino novamente.
  • Contexto de Interrupção: O manipulador de interrupção é executado em um contexto de interrupção, o que significa que ele não deve realizar operações de longa duração ou usar funções que não sejam seguras para interrupções. Mantenha o manipulador curto e focado em tarefas essenciais.
  • Escolha do Pino: Nem todos os pinos do ESP32 suportam interrupções. Consulte a documentação do ESP32 para uma lista de pinos capazes de interrupção.
  • Disparo por Borda vs. Disparo por Nível: A classe ExtInt suporta principalmente o disparo por borda. Se você precisar de interrupções disparadas por nível, pode ser necessário explorar abordagens alternativas ou usar um temporizador para sondar periodicamente o estado do pino.

Esta explicação abrangente deve ajudá-lo a usar efetivamente os sinais de interrupção em seu ESP32 com MicroPython. Lembre-se de adaptar o código e os números dos pinos à sua configuração de hardware específica. Se você tiver uma aplicação particular em mente, fornecer mais detalhes permitirá um exemplo mais personalizado.