Mantendo suas placas IoT vivas mesmo quando travam (#dev #devlog #iot #micropython #raspberrypipico #pipico #rpipico)

Overview
Você tem um projeto IoT legal, tipo um sistema para regar suas plantas automaticamente, ou uma estação meteorológica customizada. No seu código micropython, você adicionou todos os tratamentos de erros e fez tudo certinho, então você coloca a placa em um canto e tem certeza de que vai funcionar perfeitamente... até que do nada ela para de funcionar. Neste post eu mostro uma forma de resolver isso, e provavelmente é mais simples do que você imagina!
Decidi criar este post porque, enquanto lia artigos e tutoriais, nenhum deles tinha essa informação, e isso pode ajudar qualquer projeto de longa duração.
O problema: Você cria try catches e adiciona mecanismos para reiniciar a placa se algo der errado, mas quando um sensor trava, ou uma requisição http demora demais e a placa congela, o que a gente geralmente faz é desligar e ligar de novo manualmente.
Porém, existe uma solução simples para isso: O WatchDog Timer!
O WDT (ou WatchDog Timer) é uma ferramenta nativa do micropython localizada no módulo machine e disponível para
pyboard, WiPy, esp8266, esp32, rp2040 e mimxrt.
Quando você inicializa o WDT, define um timeout de até 8388 ms, e depois disso, precisa chamar o método feed()
a cada Nms (N é igual ao timeout que você definiu), ou a placa vai reiniciar sozinha.
1import machine
2import time
3
4wdt = machine.WDT(timeout=8000)
5
6while True:
7 read_sensor_1()
8
9 wdt.feed()
10
11 send_data_from_sensor_1()
12
13 wdt.feed()
14
15 time.sleep(1)
No código acima, inicializamos o WDT com um timeout de 8000ms, e chamamos o método feed() entre a chamada para
cada uma das operações, para evitar que a placa reinicie. Se read_sensor_1() ou send_data_from_sensor_1() demorar
demais (> 8000 ms), a placa vai reiniciar automaticamente, independente da causa.
Como você pode ver, é bem direto e fácil de adicionar em um código IoT existente, e vai reiniciar a placa, dando ao sistema uma chance de começar de novo.
Para adicionar observabilidade complementar, nos meus projetos eu também incluo:
- Salvo erros em um arquivo, quando a placa não está conectada à rede.
- Ao iniciar, a placa envia os arquivos de log de erros, reportando tudo para uma API dedicada.
- Integrei as placas com meu sistema de Open Telemetry, para poder ver o que as placas estão fazendo em um dashboard do Grafana.
- Como último recurso, para poder ver o que a placa está fazendo, adicionei um mini LCD barato que mostra o status atual da placa.
Não vou entrar em detalhes sobre isso, porque é um assunto completamente diferente. :)
Espero ter ajudado! :)
Referências: