ESP32

Múltiplas interrupções externas com ESP32

Configurar a UART do ESP32

Interrupções externas com ESP32

Dessa vez eu gostaria de mostrar uma implementação um pouco diferente. Funciona tudo certinho, mas tenho absoluta certeza de que alguém experiente em RTOS não faria assim, porque eu consegui comprovar formas de gerar inconsistência. Mas do jeito que escrevi no exemplo, vai dar pra ver alguns recursos interessantes; um deles, o controle do LED onboard do ESP32, utilizando os recursos de controle nativos do ESP-IDF. Outro recurso bem legal (pelo menos eu achei) é gerar tarefas que finalizam, a partir de uma interrupção. Com isso, uma mesma tarefa pode ser executada múltiplas vezes. Mas, do jeito que implementei só causaria conflitos em uma situação de uso real. Aqui a “sirene” com ESP32 pode ser executada múltiplas vezes e, rodando duas vezes o resultado é fascinante! O processador faz round-robin nas tarefas e parece que tem 2 dispositivos em paralelo!



Vou colocar o código e em seguida comento um pouco mais.

Primeiramente, se já não tem mais nada da API do Arduino, com excessão da função Serial. Isso é bem divertido, porque até a manipulação do GPIO já está sendo feita com os recursos do ESP-IDF. Acredito que já dê pra usar uma IDE melhor e escrever diretamente no formato main() invés de setup()loop(). Ainda estou indeciso de qual IDE utilizar para programar o ESP32, mas no próximo artigo já será totalmente nele e aí sim, vamos ver se as coisas continuam funcionando no “ambiente nativo”. :-)

Quem manja bem de FreeRTOS vai encontrar facilmente maneiras melhores de implementar isso que dispus acima. Eu poderia ter colocado uma flag pra não deixar acontecer sobre-execução ou outro recurso baseado em tempo, daí uma task extra para tal finalidade etc. Daí você lê eu escrevendo isso e pensa: “Se não é a melhor maneira, porque fez assim”? – Minha humilde resposta – Não tenha receio de fazer nada, desde que isso não ponha a vida de ninguém em risco. É importante testar, sentir as dificuldades e estudar como contorná-las. Tendo um modelo funcional, agora consigo ver como funciona o que quero, então posso modificar livremente para assimilar os conceitos. Se você também está iniciando, atreva-se comigo, diversão não falta pra quem gosta de aprender. E conforme eu sentir confiança como tenho em outras plataformas, os resultados serão melhores.

Se chegou nesse post através do facebook, twitter ou linkedin e tem boas sugestões a respeito, comente, por favor. Será um prazer melhorar!

Veja o video da brincadeira. O LED fica acesso por 2 segundos e apaga. Dentro da função que acende e apaga o LED, tem um delay entre essas duas operações. Mas como é uma task, ela não influencia no restante do processamento.

Repare que a interrupção para o pino do LED foi desabilitada e é reabilitada na função loop(). Não dá (pelo menos eu não sei como) pra reabilitar a interrupção dentro da ISR que atende à interrupção, por isso coloquei no loop, mas poderia ser uma tarefa específica que analisa flags com um mutex, ou um timer disparado pela ISR ou alguma outra coisa.

Com qualquer uma das tasks que reagem à interrupção em execução, é possível executar a outra, sem interferência. Já na sirene, sugiro que você execute duas vezes pra ver que interessante. Agora, o video:

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!