D1 Mini Deeplseep Akkulaufzeit

  • von

Wenn man einen D1 mini mit einem Akku und einem Solarpanel betreiben will, ist die große Frage wie lange der Akku eigentlich hält. Das soll jetzt kein technischer Artikel über Kapazitäten und Ladeverhalten von Akkus werden. Es geht einfach nur mal darum eine Testschaltun aufzubauen und zu sehen, wie lange der D1 Mini Daten liefert. Dafür habe ich eine Schaltung mit folgenden Komponenten aufgebaut.

Komponenten

  • D1 Mini
  • Akku 650 mAh, 3,7 V
  • Solarpanel 5,5 V (laut Amazon)
  • Laderegler TP4056
  • Temperatursensor DHT11

Ziel der Schaltung ist es alle x Minuten die Temperatur per MQTT an einen ioBroker zu senden.

Schaltung

Schaltung

Deepsleep

Im Normalbetrieb benötigt der D1 Mini ca. 70 mA Strom. Da kann man sich leicht ausrechnen, dass ein 650 mAh Akku im Winter nicht reicht, um den D1 die ganze Nacht zu betrieben. Das ist aber auch nicht nötig, da es mir reicht alle 15 oder 30 Minuten die aktuelle Temperatur auszulesen. Dafür kann der Deepsleep Modus genutzt werden. Hierbei schaltet der D1 fast alle Funktionen inklusive WLAN ab und wacht dann nur noch alle x Minuten auf. Im Schlafmodus benötigt er dann laut Internet nur noch 0,17 mA. Dafür ist er aber in der Schlafphase nicht von aussen über WLAN zu erreichen. Die Programmierung des D1 muss für den Deepsleep Modus entsprechend angepasst werden.

Programmierung

Normalerweise wird der Hauptcode in der loop Funktion für den D1 angelegt. Diese wird bei dem Deepsleep Modus aber nicht genutzt, da die loop Schöleife im Deepsleep nicht ausgeführt wird. Das heißt, dass alle Befehle in der setup Funktion ausgeführt werden müssen.
Achtung!!! Bei einem D1, der im Tiefschlaf ist, kann der Sketch nicht mit der IDE übertragen werden. Drücken Sie dafür die Reset Taste, wenn die IDE versucht die Daten zu übertragen.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Der Befehl, um den D1 in den Deepsleep Modus zu versetzen lautet ESP.deepSleep(x), wobei x in Microsekunden angegeben wird. 15 Minuten ensprechen 900000000 Mikrosekunden.

void setup() {
  // put your setup code here, to run once:
  ESP.deepSleep(900000000);
}

void loop() {
  // put your main code here, to run repeatedly:

}

WiFi

Um einen Wert per MQTT zu melden, muss der D1 mit dem WLAN verbunden sein. Hier zu wird die Bibliothek ESP8266WiFi.h benötigt. Zusätzlich werden auch noch Texte an die serielle Ausgabe gesendet. Wir wollen ja sehen, ob das genze funktioniert.

#include <ESP8266WiFi.h>

const char* SSID = "WLAN_SSID";
const char* PSK = "WLAN_Passwort";

void setup() {
  // put your setup code here, to run once:
  Serial.begin (9600);
  Serial.println("Setup");
  setup_wifi();
  Serial.println("Gehe für 15 Minuten in den Tiefschlaf");
  ESP.deepSleep(900000000);
}

void setup_wifi() {
    WiFi.begin(SSID, PSK);
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
    }
    Serial.println(WiFi.localIP());
}

void loop() {
  // put your main code here, to run repeatedly:

}

Der D1 sollte nun alle 15 Minuten die Zeilen „Setup“, „Gehe für 15 Minuten in den Tieflschlaf“ und die IP Adresse auf der Konsole der IDE ausgeben.

Ausgabe

MQTT

Nun wird noch MQTT benötigt, um Informationen z.B. an den ioBroker zu senden. Dafür wird die Bibliothek PubSubClient.h und die Zugangsdaten für den MQTT Server benötigt.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "WLAN_SSID";
const char* PSK = "WLAN_Passwort";

const char* mqttServer = "IP des MQQT Servers";
const int mqttPort = Port des MQTT Servers;
const char* mqttUser = "MQTT_USER";
const char* mqttPassword = "MQTT_PASSWORT";

PubSubClient client(espClient);

void setup() {
  // put your setup code here, to run once:
  Serial.begin (9600);
  Serial.println("Setup");
  setup_wifi();
  setup_mqtt();
  Serial.println("Gehe für 15 Minuten in den Tiefschlaf");
  ESP.deepSleep(900000000);
}

void setup_wifi() {
    WiFi.begin(SSID, PSK);
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
    }
    Serial.println(WiFi.localIP());
}

void setup_mqtt(){
   client.setServer(mqttServer, mqttPort);
    while (!client.connected()) {
      Serial.println("Connecting to MQTT...");
 
      if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
 
        Serial.println("connected");  
 
      } else {
 
        Serial.print("failed with state ");
        Serial.print(client.state());
        delay(2000);
 
      } 
   }
  client.publish("esp/test", "Ich bin kurz aufgewacht.");    
}

void loop() {
  // put your main code here, to run repeatedly:

}

Damit sollte nun alle 15 Minuten auf dem MQTT Server die Nachricht „Ich bin kurz aufgewacht.“ übermittelt werden.

Temperatursensor

Immer nur die Nachricht „Ich bin kurz aufgewacht.“ zu erhalten ist ja auch ein bisschen langweilig. Also fragen wir nun einen Temperatusensor ab und schicken diesen Wert an den MQTT Server. Dafür gibt es die Bibliothek DHT.h

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

#define DHT_TYPE DHT11
const int DHT_PIN = 5;
DHT dht(DHT_PIN, DHT_TYPE);

const char* SSID = "WLAN_SSID";
const char* PSK = "WLAN_Passwort";

const char* mqttServer = "IP des MQQT Servers";
const int mqttPort = Port des MQTT Servers;
const char* mqttUser = "MQTT_USER";
const char* mqttPassword = "MQTT_PASSWORT";

PubSubClient client(espClient);

void setup() {
  // put your setup code here, to run once:
  Serial.begin (9600);
  Serial.println("Setup");
  setup_wifi();
  setup_mqtt();

  pinMode(DHT_PIN, INPUT);
  dht.begin();   
  delay(5000);  
  float t = dht.readTemperature();
  client.publish("esp/temperatur", t );

  Serial.println("Gehe für 15 Minuten in den Tiefschlaf");
  ESP.deepSleep(900000000);
}

void setup_wifi() {
    WiFi.begin(SSID, PSK);
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
    }
    Serial.println(WiFi.localIP());
}

void setup_mqtt(){
   client.setServer(mqttServer, mqttPort);
    while (!client.connected()) {
      Serial.println("Connecting to MQTT...");
 
      if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
 
        Serial.println("connected");  
 
      } else {
 
        Serial.print("failed with state ");
        Serial.print(client.state());
        delay(2000);
 
      } 
   }
  client.publish("esp/test", "Ich bin kurz aufgewacht.");    
}

void loop() {
  // put your main code here, to run repeatedly:

}