Como usar os modos de suspensão do ESP8266 no MicroPython

Os aplicativos de rede consomem muita energia. Se tais aplicações forem alimentadas por bateria, existe o risco de a bateria se esgotar devido às altas demandas de energia das funções de rede.

Freqüentemente, a energia também é desperdiçada em atividades não essenciais do microcontrolador. Por exemplo, a alimentação pode permanecer ligada para vários periféricos integrados, independentemente da sua utilização ou relevância na aplicação. Felizmente, placas de desenvolvimento Wi-Fi como ESP8266 e ESP32 oferecem modos de suspensão para economizar consumo de energia líquida, que são recomendados em aplicações de rede.

Isso economiza energia da bateria para o aplicativo, em vez de desperdiçá-la nos periféricos do controlador. Aqui discutiremos os modos de suspensão nas placas ESP8266 e ESP32 e exploraremos como eles podem ser usados ​​no MicroPython.

Os modos de suspensão
No ESP8266, existem três modos de suspensão:

1. Suspensão do modem. O Wi-Fi é desligado no modo de suspensão do modem enquanto a CPU, o relógio do sistema e o RTC permanecem ligados. Neste estado, a corrente do substrato consumida pelo SoC é de 15 mA.

Se cada beacon transmitir a mensagem de indicação de tráfego de entrega (DTIM) através do módulo Wi-Fi, o consumo de energia será de aproximadamente 16,2 mA. Se cada três beacons transmitirem o DTIM, o consumo de energia será de aproximadamente 15,4 mA. E se o DTIM for transmitido a cada 10 beacons, o consumo de energia será de aproximadamente 15,2 mA.

Observe que a mensagem DTIM é transmitida pelo módulo Wi-Fi a cada três beacons por padrão.

2. Sono leve
A CPU permanece pendente em modo de suspensão leve quando o Wi-Fi e o relógio do sistema estão desligados. O RTC responsável por manter a data e hora permanece ativado. Neste estado, a corrente do substrato consumida pelo SoC é de 0,4 mA. Se cada beacon transmitir o DTIM através do módulo Wi-Fi, o consumo de energia será de aproximadamente 1,8 mA. Se cada três beacons transmitirem o DTIM, o consumo de energia será de aproximadamente 0,9 mA. E se o DTIM for transmitido a cada 10 beacons, o consumo de energia será de cerca de 0,55 mA.

Novamente, o valor DTIM padrão nas configurações de rede é três.

3. Sono profundo
No modo de hibernação profunda, a CPU, o relógio do sistema e o Wi-Fi são desligados e apenas o RTC permanece ligado para manter a data e hora. O controlador permanece em estado inativo e nenhum DTIM é transmitido. As operações normais do controlador são retomadas somente quando o controlador “desperta” do sono profundo. Neste modo, a corrente consumida pelo SoC ESP8266 é reduzida para 20 uA.

Apenas o ESP8266 oferece todos os modos de suspensão. Por padrão, o MicroPython oferece suporte apenas aos modos de suspensão leve e profunda. Portanto, é necessário um módulo específico do ESP para o modo de suspensão do modem.

Se um SoC entrar no modo de hibernação profunda, o consumo líquido de energia de uma placa de interrupção poderá estar em mA. Os componentes e periféricos integrados – como LEDs, regulador de energia, chip serial USB e outras interfaces – ainda podem consumir energia significativa, independentemente do fato de o próprio SoC estar em estado inativo, consumindo apenas alguns micro-ampères de corrente .

Acordando em ESP8266

Dependendo da porta, diferentes fontes de ativação estão disponíveis. Por exemplo, no ESP8266, apenas duas fontes de despertar estão disponíveis: o temporizador e a externa.

No despertar com temporizador, o RTC integrado é usado para despertar
o SoC de um sono profundo após um período especificado.

No despertar externo, o SoC fica em repouso profundo até que o botão de reset seja pressionado. No ESP8266, o botão reset deve estar conectado ao GPIO16 para que a placa seja ativada. Em uma placa breakout, o botão de reset pode já estar conectado ao GPIO16 integrado ou exigir uma conexão externa.

O ciclo do sono profundo

O modo de suspensão profunda é útil em aplicações de rede alimentadas por bateria. O chip então permanece em hibernação profunda ou inativo, apenas despertando periodicamente para executar as tarefas atribuídas. As tarefas podem incluir fazer leituras de um sensor, enviar os dados do sensor para um servidor por meio de um protocolo IoT (como MQTT ou CoAP) e executar uma ação no local com base nas leituras do sensor ou nos insights recebidos pela rede.

Depois que a tarefa é executada pela aplicação do usuário, o chip volta a dormir. Esse ciclo de sono profundo, despertar, realizar tarefas incorporadas/IoT e voltar a dormir continua indefinidamente.

MicroPython
O módulo de máquina do MicroPython fornece essas funções para o gerenciamento de energia das placas suportadas.

máquina.lightsleep((time_ms)): coloca a porta em modo de suspensão leve. Se o tempo em milissegundos for especificado como argumento, o modo de suspensão leve durará o tempo máximo especificado. A porta poderá ser ativada antes do tempo limite se uma fonte a acionar. Se nenhum argumento for passado, o modo de suspensão leve dura até ser interrompido por uma fonte de despertar.

máquina.deepsleep((time_ms)): coloca a porta em modo de hibernação profunda. Se o tempo em milissegundos for especificado como argumento, o modo de suspensão profunda durará o tempo máximo especificado. A porta poderá ser ativada antes do tempo limite se uma fonte a acionar. Se nenhum argumento for passado, o modo de suspensão profunda continua até ser interrompido por uma fonte de ativação. Acordar do modo de suspensão profunda é o mesmo que uma reinicialização de hardware.

máquina.wake_reason : este método retorna a fonte de ativação. O valor de retorno pode ser machine.WLAN_WAKE, machine.PIN_WAKE ou machine.RTC_WAKE, dependendo se a origem de ativação é WLAN, alteração de pino ou RTC. Este método pode ser usado para registrar o motivo da ativação em uma variável ou imprimir o motivo da ativação no console.

No entanto, a fonte de despertar deve ser configurada antes de solicitar sono leve ou profundo. Além disso, machine.wake_reason só pode ser chamado depois pedindo o sono leve ou profundo.

O módulo máquina oferece mais uma função útil para o gerenciamento de energia da porta. Este é o machine.idle . Chamar esse método bloqueia o clock da CPU, fazendo com que a porta entre em modo de suspensão, onde a porta acorda quando uma interrupção é recebida.

Modos de suspensão do MicroPython no ESP8266

O modo de suspensão do ESP8266 pode ser acessado usando as funções relacionadas à energia do módulo da máquina ou as funções do ESP8266, que estão disponíveis através do especialmente módulo.

Essas funções permitem apenas que o usuário coloque o ESP8266 nos modos de suspensão leve ou profunda (conforme discutido acima). Mas as funções específicas do módulo esp permitem que o usuário coloque o ESP8266 em um sono leve, profundo ou modem.

O especialmente O módulo pode ser importado para um script MicroPython usando esta instrução: importar esp

O especialmente O módulo fornece essas funções para colocar o ESP8266 em diferentes modos de suspensão…

esp.sleep_type((sleep_type)): define ou obtém o modo de suspensão ESP8266. Se o método for chamado com um argumento, ele define o ESP8266 para o modo de suspensão especificado. Se o método for chamado sem argumentos, ele retornará o modo de suspensão do ESP8266.

Os parâmetros podem ser definidos através destes argumentos: SLEEP_NONE, SLEEP_MODEM e SLEEP_LIGHT. Se definido como SLEEP_NONE, o ESP8266 permanece no modo ativo ou retoma o modo ativo do modo de suspensão. Se definido como SLEEP_MODEM, o ESP8266 é colocado no modo sleep do modem. Se definido como SLEEP_LIGHT, o ESP8266 é colocado em modo de suspensão leve.

esp.deepsleep(time_us=0, /): coloca o ESP8266 em hibernação profunda por um tempo especificado (em microssegundos). Se um tempo de suspensão for especificado, o RTC integrado será usado como temporizador. Se a hora não for especificada como argumento, o ESP8266 entra em sono profundo até que haja um despertar externo.

Quer o ESP8266 seja colocado em sono profundo ou leve usando as funções relacionadas à energia do módulo da máquina ou funções do especialmente módulo, o GPIO16 deve estar conectado ao botão reset para que o temporizador de despertar funcione. Isso normalmente é feito por uma conexão de circuito externo na maioria das placas breakout ESP8266.

Trabalhando o temporizador de despertar

Para despertar com temporizador, conecte o GPIO16 ao botão de reset do ESP8266.

Para detectar o despertar, um LED piscará depois que o ESP8266 acordar de qualquer modo de suspensão. Para que isso funcione, conecte um LED ao GPIO2 conforme mostrado abaixo.

Para colocar o ESP8266 no modo de suspensão do modem e depois acordar de um temporizador, use o especialmente módulo. Este script MicroPython coloca o ESP8266 no modo de suspensão do modem e pisca um LED, que está conectado ao GPIO2, toda vez que o ESP8266 acorda por causa do temporizador.

importar esp
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)

def modem_sleep(mseg):
rtc = máquina.RTC
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, mseg)
esp.sleep_type(SLEEP_MODEM)

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)
print('Estou acordado, mas vou dormir com o modem')

#sleep por 10 segundos (10.000 milissegundos)
modem_sleep(10000)

Para colocar o ESP8266 no modo de suspensão leve e depois acordar do cronômetro, use o especialmente módulo ou funções relacionadas à energia do módulo da máquina. Este script MicroPython coloca o ESP8266 em um modo de suspensão leve usando o especialmente módulo e pisca um LED, que está conectado ao GPIO2, toda vez que o ESP8266 acorda por causa do temporizador.

importar esp
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)
def light_sleep(mseg):
rtc = máquina.RTC
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, mseg)
esp.sleep_type(SLEEP_LIGHT)

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)

print('Estou acordado, mas vou dormir um pouco')

#sleep por 10 segundos (10.000 milissegundos)
sono_leve(10000)

Este script MicroPython coloca o ESP8266 em modo de suspensão leve usando o módulo da máquina, piscando um LED conectado ao GPIO2 toda vez que o ESP8266 acorda por causa do temporizador.

máquina de importação
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)
def light_sleep(mseg):
rtc = máquina.RTC
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, mseg)
máquina.lightsleep

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)

print('Estou acordado, mas vou dormir um pouco')

#sleep por 10 segundos (10.000 milissegundos)
sono_leve(10000)

Para colocar o ESP8266 em modo de hibernação profunda e depois acordar do cronômetro, use o especialmente módulo ou funções relacionadas à energia do módulo da máquina. Este script MicroPython coloca o ESP8266 em modo de suspensão profunda usando o especialmente módulo e pisca um LED, que é conectado ao GPIO2 toda vez que o ESP8266 acorda por causa do temporizador.

importar esp
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)
def deep_sleep(mseg):
rtc = máquina.RTC
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, mseg)
esp.deepsleep

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)

print('Estou acordado, mas vou dormir profundamente')

#sleep por 10 segundos (10.000 milissegundos)
sono_profundo(10000)

Este script MicroPython coloca o ESP8266 em modo de hibernação profunda usando o módulo da máquina e pisca um LED, conectado ao GPIO2, toda vez que o ESP8266 acorda por causa do temporizador.

máquina de importação
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)
def deep_sleep(mseg):
rtc = máquina.RTC
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, mseg)
máquina.deepsleep

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)

print('Estou acordado, mas vou dormir profundamente')

#sleep por 10 segundos (10.000 milissegundos)
sono_profundo(10000)

Trabalhando o despertar externo

No ESP8266, o despertar externo é acionado sempre que o botão reset é pressionado. Este despertar só é útil quando o ESP8266 está no modo de hibernação profunda. O botão de reinicialização na placa de interrupção pode ser pressionado para a ativação externa ou um botão puxado para cima pode ser conectado ao pino de reinicialização.

Para colocar o ESP8266 no modo de hibernação profunda e depois acordar via externo, use o especialmente módulo ou funções relacionadas à energia do módulo da máquina. Este script MicroPython coloca o ESP8266 em modo de suspensão profunda usando o especialmente módulo e pisca um LED, conectado ao GPIO2, toda vez que o ESP8266 acorda de um reset externo.

importar esp
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)
print('Estou acordado, mas vou dormir profundamente')
dormir (1)
esp.deepsleep

Este script MicroPython coloca o ESP8266 em modo de hibernação profunda usando o módulo da máquina e pisca um LED, conectado ao GPIO2, toda vez que o ESP8266 acorda de uma reinicialização externa.

máquina de importação
do Pin de importação da máquina
do tempo importar sono
led = Pino (2, Pino.OUT)

#LED pisca
led.valor(1)
dormir (1)
led.valor(0)
dormir (1)

# espere 5 segundos para que você possa acordar o ESP para estabelecer uma comunicação serial mais tarde
# você deve remover esta linha de suspensão no seu script final
dormir (5)
print('Estou acordado, mas vou dormir profundamente')
dormir (1)
máquina.deepsleep

Para uma reinicialização externa, os métodos esp.deepsleep ou machine.deepsleep são chamados sem argumentos. Essas chamadas colocam o ESP8266 em hibernação profunda até que um despertar externo seja detectado através do botão de reset. O botão conectado ao botão de reset do despertar externo deve ser puxado para cima.

Aprenda a usar os modos de suspensão e ativação do ESP32 no MicroPython aqui.

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.