Manual

do

Maker

.

com

Controle da maturação da cerveja com ESP8266 (parte II de II)

Controle da maturação da cerveja com ESP8266 (parte II de II)

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.

NodeMCU Mini

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.

Modem-sleep - 15mA

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.

Light-sleep - 0.5mA

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.

Deep-sleep - 10 uA (!)

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.

Atenção

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?

Configurações dos recursos de energia com MicroPython

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.

Controle do LED RGB

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:

Azul

A temperatura está mais baixa do que deveria

Verde azulado

A temperatura está no nível ideal

Laranja

A temperatura está um pouco acima do que deveria

Vermelho

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.

Controle das cores

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()

Módulo de "soneca"

A rotina para esse ESP8266 é simples:

  • Pegar a temperatura
  • Enviar via MQTT para o broker
  • 1 segundo de status no LED RGB
  • Dormir

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á.

Rotina

A rotina contida no git do projeto se chama goToBed.py. Ela será enviada para  o ESP8266 e está sendo exemplificada mais abaixo.

Upload e download

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!

Edite o arquivo boot.py

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.

Incluir o suporte ao MQTT

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.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.