Então, você construiu um projeto usando o Módulo WiFi ESP8266 NodeMcu v3 – Lolin conectado a uma bateria ou a um power bank. Mas, depois de um tempo, percebeu que a bateria não dura muito neste sistema. Como podemos resolver isso? Uma boa opção é usar o Sleep mode do ESP8266. Com a revolução da IoT, está crescendo, a cada dia, o número de dispositivos conectados. No futuro, a maioria dos dispositivos será conectada entre si e se comunicará em tempo real. Um dos problemas enfrentados por esses dispositivos é o consumo de energia. Esse fator é crítico e decisivo para qualquer dispositivo e projeto IoT. O ESP8266 é um dos módulos mais populares para qualquer projeto IoT. Neste artigo, aprendemos como economizar energia ao usar o ESP8266. Iremos carregar os dados do sensor de temperatura TMP36 para a nuvem utilizando WiFi e MQTT. Depois, o ESP8266 irá dormir por um intervalo de 30 segundos.
Existem 3 tipos de Sleep mode no ESP8266: Modem-sleep, Light-sleep e Deep-sleep.
Item | Modem-sleep | Light-sleep | Deep-sleep |
Wi-Fi | OFF | OFF | OFF |
System clock | ON | OFF | OFF |
RTC | ON | ON | ON |
CPU | ON | Pending | OFF |
Corrente consumida | 15 mA | 0.4 mA | ~20 uA |
Corrente Média (DTIM = 1) | 16.2 mA | 1.8 mA | – |
Corrente Média (DTIM = 3) | 15.4 mA | 0.9 mA | – |
Corrente Média (DTIM = 10) | 15.2 mA | 0.55 mA | – |
NOTA IMPORTANTE: O consumo de energia da tabela é referente ao ESP8266 chip. Se você estiver usando uma placa de desenvolvimento, eles têm componentes passivos que consomem mais corrente.
Modem-Sleep
Modo padrão para o ESP8266. No entanto, só é ativado quando você está conectado a um ponto de acesso. Enquanto estiver no modo de suspensão do modem, o ESP8266 reduzirá o consumo de modem (WiFi). Para isso, desliga o próprio modem entre os intervalos do DTIM Beacon. Este intervalo é definido pelo seu roteador.
Consumo: ~15mA.
Light-Sleep
Executa a mesma função que Modem-sleep, mas também desliga o relógio do sistema e suspende a CPU. A CPU não é desligada, fica pendente. Com este modo, é possível acordar o CPU com um sinal enviado (HIGH/LOW) para um pino definido no firmware, continuando seu código normalmente. Como o anterior, este modo também possui o “Automatic sleep”, que faz o MCU dormir entre os intervalos do DTIM.
Consumo: ~0.4mA.
Deep-Sleep
Tudo está desligado, exceto o Real Time Clock (RTC), usado pelo computador para mantém a medição de tempo. Esta é a melhor opção na questão de consumo, já que praticamente todo o MCU fica desligado. É útil quando precisamos, por exemplo, enviar dados de um sensor a cada 5 minutos para um banco de dados ou gravar na EEPROM para, futuramente, ser enviado, caso não haja conexão com a internet.
Consumo: ~20μA.
Para mais detalhes, leia a documentação.
Para desenvolver os exemplos, iremos precisar de:
Forma de acordar
Depois de colocar o ESP8266 no modo Deep-sleep, existem diferentes maneiras de acorda-lo:
Neste exemplo, é impresso na serial “Entrando em Deep-Sleep por 30 segundos”, adormecemos por 30 segundos, acordando, em seguida, e repetindo o ciclo.
É importante observar que o tempo de suspensão é em microssegundos (µs).
Circuito
Ligação para o Deep Sleep
Para habilitar o Deep-sleep, precisamos vincular o pino RST ao GPIO 16 no ESP8266. No NodeMCU, o GPIO 16 é representado como D0.
Se dermos uma olhada na pinagem do NodeMCU, podemos ver que o GPIO 16 é o WAKE.
Código:
/** * Exemplo mostrando como colocar o ESP8266 no modo Deep-sleep */ void setup() { Serial.begin(115200); Serial.setTimeout(2000); while(!Serial) { } Serial.println("Acordado!"); Serial.println("Entrando em Deep-Sleep por 30 segundos"); ESP.deepSleep(30e6); // 30e6 = 30000000 microssegundos = 30 segundos } void loop() { }
NOTA IMPORTANTE: Não conecte o GPIO16 ao RST antes de fazer o upload do código, pois você pode ter dificuldade em fazer o upload do código. Conecte o GPIO16 ao pino RST somente após o upload do código.
O pino RST é mantido em um sinal HIGH enquanto o ESP8266 está funcionando. No entanto, quando o pino RST recebe um sinal LOW, ele reinicia o microcontrolador.
ESP.deepSleep(30e6); // 30e6 = 30000000 microssegundos = 30 segundos
Após usar o comando acima, o MCU irá dormir até que o tempo acabe (30 segundos). Quando o tempo definido estourar (Acabar), o RTC irá gerar um pulso LOW no pino GPIO16, que está conectado ao pino RST, fazendo com que o MCU seja reiniciado completamente.
Você também pode ativar o ESP8266 com um despertador externo, como pressionar uma chave botão R13-507 ou um interruptor magnético reed switch. Você só precisa colocar o ESP8266 no modo de deep-sleep por um período indefinido de tempo e, em seguida, definir o pino RST para LOW para acordar o ESP8266.
Para testar essa configuração, conecte um botão à sua placa ESP8266, conforme mostrado no diagrama esquemático a seguir. Quando você pressiona o botão, o pino RST fica LOW.
Código:
/** * Exemplo de como acordar o ESP8266 do modo Deep-sleep com botão */ void setup() { Serial.begin(115200); Serial.setTimeout(2000); while(!Serial) { } Serial.println("Acordado!"); Serial.println("Estou acordado, mas vou entrar no modo de deep sleep até que o pino RESET esteja conectado a um sinal LOW"); ESP.deepSleep(0); } void loop() {}
Nesse exemplo, o ESP8266 envia a leitura do sensor de temperatura TMP36 para um serviço de MQTT gratuito (broker.mqtt-dashboard.com) a cada 30 segundos e dorme em seguida. Caso queira criar seu próprio broker, leia nosso post: Automação com Broker MQTT e Raspberry Pi
Circuito
Código:
/** * @file SleepMode_Test.ino * @author Saulo Aislan * @brief Firmware que ler o sensor de temperatura, envia os dados * via MQTT e entra no modo Deep Sleep, permanecendo por 30 segundos. * @version 0.1 * * @copyright Copyright (c) 2022 * */ /* Inclusão de bibliotecas */ #include <ESP8266WiFi.h> #include <PubSubClient.h> /* WiFi credenciais */ const char* WIFI_SSID = "**********"; const char* WIFI_PASS = "**********"; /* MQTT credenciais */ const char* mqttServer = "broker.mqtt-dashboard.com"; const int mqttPort = 1883; WiFiClient espClient; PubSubClient client(espClient); /** * @brief Conecta ao WiFi */ void connectToWifi() { Serial.println(); Serial.print("Conectando a "); Serial.println(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASS); // WiFi fix: https://github.com/esp8266/Arduino/issues/2186 WiFi.persistent(false); WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); unsigned long wifiConnectStart = millis(); while (WiFi.status() != WL_CONNECTED) { if (WiFi.status() == WL_CONNECT_FAILED) { Serial.println("Falha ao conectar no WiFi. Por favor verifique as credenciais: "); } delay(500); Serial.println("..."); if (millis() - wifiConnectStart > 5000) { Serial.println("Falha ao conectar no WiFi"); return; } } Serial.println(""); Serial.println("WiFi conectado"); Serial.println("IP: "); Serial.println(WiFi.localIP()); } /** * @brief Envia os dados via MQTT * @param double tempC Temperatura em Celsius */ void publishMsg(double tempC) { client.setServer(mqttServer, mqttPort); bool ret = false; String msg = "{Temperatura:" + String(tempC) + "}"; while (!client.connected() && !ret) { Serial.println("Conectando ao MQTT..."); if (client.connect("EletrogateClient")) { Serial.println("Conectado com Sucesso"); ret = client.publish("topic/eletrogate", (char*) msg.c_str()); delay(5000); } else { Serial.print("Falha: "); Serial.print(client.state()); } } } void setup() { Serial.begin(115200); while (!Serial) { } Serial.println("-------------------------------------"); Serial.println("Rodando o Firmware de Deep Sleep!"); Serial.println("-------------------------------------"); connectToWifi(); /* Conecta ao WiFi */ int temp = analogRead(A0); /* Pino do sensor de Tmeperatura */ double tempC = (((temp / 1024.0) * 3.2) - 0.5) * 100.0; /* Conversão para Celsius */ Serial.println(); Serial.print("Temperatura: "); Serial.print(tempC); Serial.println(" C°"); publishMsg(tempC); /* Envia os dados via MQTT */ Serial.println("Entrando em Deep-Sleep por 30 segundos"); ESP.deepSleep(30e6); // 30e6 is 30 microseconds } void loop(){}
Neste exemplo, o firmware executa os seguintes passos:
Para visualizar os dados do broker MQTT, estou usando o MQTT Explorer, disponível nesse link. Mas, você pode usar o software de sua preferência. As configurações da conexão para esse exemplo são as seguintes:
Devemos adicionar “topic/eletrogate” com QoS 0(zero) no tópico subscriber
No vídeo podemos observar o ESP8266 conectando ao WiFi, coletando a temperatura, enviando via MQTT e indo dormir por 30 segundos. Também podemos observar o recebimento da temperatura no MQTT Explorer a cada 30 segundos.
Aprendemos sobre os diferentes modos de operação do ESP8266 e diferentes modos de suspensão. Agora que você sabe como colocar o ESP8266 para dormir, pode tornar seus projetos e dispositivos mais energicamente eficientes. Para mais materiais como esse, continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá, você encontra todos os componentes necessários para desenvolver esse e muitos outros projetos! Que a força estejam com vocês e até mais!
Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!