Manual
do
Maker
.
com
Como citado na parte I, agora vamos para o código, que lhes entrego pronto. Porém aqui foi um bocado de trabalho braçal, utilizando para a parte interna o NodeMCU Mini. Não se lembra do que é "parte interna"? Ok, se você não leu a parte I desse artigo, sugiro que o faça antes de seguirmos, basta clicar aqui. De qualquer modo, vou explicar o que foi feito.
Ele será utilizado internamente no frigobar por uma razão muito específica. Eu coloquei 3 fios separados entre a porta e o frigobar justamente para ver se vazaria ar frio. Pressionando a porta contra o frigobar eu percebi que saía ar frio, mas eu não tenho certeza se esse ar vazaria, causando consumo excessivo e umidade do lado de fora do frigobar. Então optei por colocar um ESP8266 do lado de dentro do frigobar e, acreditem ou não, o sinal passa tranquilamente pela forma. Eu pensei que se formaria algo como uma gaiola de faraday, mas não houve nenhum tipo de interferência. Logo, entrou a segunda questão; o calor gerado pelo próprio ESP8266 tem influência sobre a refrigeração? Bem, eu acredito que tenha. Ele chega a consumir 170mA em modo de rede, mas é possível deixar tudo desabilitado e ele dormindo, de forma que ele reduz seu consumo, gera pouquissimo calor e assim a bateria pode durar bem mais. Mas para entender o quanto mais, vamos ver os modos que o ESP8266 pode trabalhar.
Nesse modo a CPU permanece trabalhando com recursos periféricos ativos, como PWM e I²S. Quando nesse modo, você pode operar tais recursos periféricos, enquanto o WiFi fica "dormindo", isto é, não transmite nem recebe.
A CPU suspende aplicações periféricas. Sem transmissão de dados, o circuito WiFi pode ser desligado e a CPU suspendida para economizar energia.
Desse modo a conexão WiFi obviamente está desligada. Talvez seja a melhor opção, considerando um wake a cada 10 segundos para fazer o envio da informação de temperatura para o MQTT e então voltar a dormir.
Os modos de economia de energia só podem ser habilitados em modo station porque em modo softap esse recurso não funciona. Mas considerando que o ESP8266 que será utilizado deverá comunicar-se com a rede local para enviar informações ao MQTT broker, já deve estar claro que o modo AP passará longe, certo?
E claro que não poderia faltar o acesso aos recursos de hardware, não é mesmo? Então vejamos como utilizar tais recursos, antes de vê-los disponibilizados no código. Mais uma vez, por tópico.
Deep-sleep
Todos os periféricos e o próprio ESP8266 serão desligados, exceto o RTC interno, utilizado para fazer o 'wake up'. Isso reduz drasticamente o consumo de corrente e é um excelente modo de operar com o ESP8266 a partir de bateria, como será nesse caso.
Para utilizar esse modo, o GPIO16 deverá ser conectado ao pino de reset (RST). A partir daí, você pode utilizar o código a seguir para fazer uso do recurso.
import machine
#configura alarm0 para levantar o dispositivo
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
#levanta o dispositivo apos 10 segundos
rtc.alarm(rtc.ALARM0, 10000)
#coloca pra dormir
machine.deepsleep()
Quando o chip retorna de um deep sleep, ele é completamente reiniciado, incluindo memória, ou seja, não sobra nada. Os scripts de boot serão então reexecutados e em um deles será incluida a rotina de envio da temperatura para o MQTT. Claro que existem resets causados pelo WDT (watchdog timer), comum quando um código é mal escrito e bloqueia alguma tarefa de background do ESP8266. para tratar a causa do reset, é ideal adicionar também um controle e no caso de ser algo problemático, envia um aviso ao MQTT. O tratamento básico do reset pode ser feito como abaixo:
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('Despertando do sono...')
else:
print('Ops. Um hard reset...')
Frequência da CPU
Esse NodeMCU mini vai consumir uma quantidade infinitesimal de recursos; resumidamente, coletar temperatura, exibir visualmente no LED o status e voltar a dormir. Garanta que o clock esteja no mais baixo:
import machine
if machine.freq == 160000000:
machine.freq(80000000)
Com isso já demos uma enxugada. O modo de economia de energia será um recurso no nosso código, portanto será inserido em um método.
Se você optar por colocar pelo lado de fora do frigobar, com certeza o resultado visual será mais legal; imagine o dispositivo levantar a cada 10 segundos e exibir o status da temperatura interna? Não vai mostrar o valor, mas dá pra saber se está dentro da range ou não. Para isso, o primeiro passo é definir as cores e eu escolhi assim:
A temperatura está mais baixa do que deveria
A temperatura está no nível ideal
A temperatura está um pouco acima do que deveria
Está realmente acima do que deveria
Tendo definido as cores, é necessário fazer o controle do LED RGB. Na biblioteca pronta isso está definido em um método, bastando chamar a função com o resultado da temperatura assim:
import frigobar
frigobar.alarm(frigobar.temp())
Mas para que você não fique sem saber como funciona, vou detalhar abaixo.
Os pinos são:
15 |
12 |
13 |
Mas não basta por em high ou low; é necessário controlar a intensidade. Para isso, utilizaremos PWM, controlando o duty cycle e a frequência. Um exemplo básico para acender o LED azul com intensidade média:
from machine import PWM, Pin
blue = PWM(Pin(13))
blue.duty(100)
blue.freq(100)
A intensidade você pode controlar com duty() e a frequência fará o LED piscar se for muito baixa. Para desconfigurar o pino, utilize:
blue.deinit()
A rotina para esse ESP8266 é simples:
Essa rotina será chamada no boot.py, que é um dos scripts de inicialização do MicroPython. Se você reparar, dentro dele não tem rotinas, apenas funções, justamente por isso vamos fazer a mesma coisa, criar o script da rotina completa e inserí-lo no boot. Essa rotina você poderá pegar no git do projeto, não se preocupe. Para inserir no arquivo boot.py, primeiro você deve fazer o download dele, depois apagá-lo da origem, modificá-lo em seu computador e então fazer o upload novamente. Vamos lá.
A rotina contida no git do projeto se chama goToBed.py. Ela será enviada para o ESP8266 e está sendo exemplificada mais abaixo.
E para fazer esse upload, utilize o modo WEBREPL, citado nesse artigo, na sessão "Habilitar o WEBREPL no MicroPython". Faça o upload para o ESP8266, então faça o download do boot.py. Fez o download? Agora apague o original:
import os
os.listdir('.')
os.remove('boot.py')
os.listdir('.')
O método "os.listdir()" não é nem um pouco necessário, mas se você quiser ver o antes e o depois, não é uma má ideia. Enquanto você não fizer o upload do boot.py novamente, não reinicie o ESP8266!
O arquivo boot.py original tem isso:
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import gc
import webrepl
webrepl.start()
gc.collect()
Adicione um import e chame a função de dormir:
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import goToBed
import gc
import webrepl
webrepl.start()
gc.collect()
goToBed.now()
Aqui tem o lado bom e o lado ruim. O lado bom é que agora ele só iniciará para executar a rotina e voltará a dormir! O lado ruim é que se você quiser interromper essa rotina, terá que subir um firmware novo porque não há mais tempo para interrupção do boot, "exceto" você subscreva o ESP8266 a um tópico tipo "beer/dontSleep". Se estiver em 1, não dorme. É a única maneira que me ocorre para interromper a rotina de sleep e é a solução adotada aqui. Enfim, concluida a alteração, faça o upload do boot.py para o ESP8266 novamente e então reinicie-o.
O MQTT é o supra-sumo desse controle, porque é o protocolo da IoT e pode ter total controle sobre o ESP8266, que você poderá gerenciar através do seu smartphone. Para incluir o suporte ao MQTT em seu MicroPython, siga esse artigo.
E como você pode notar, o artigo já ficou demasiado extenso, portanto vou dar uma trapaceada e fazer a parte III de II, não fique aborrecido, ok? E acompanhe!!!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.