Mobiler Alarmgeber mit ESP8266 einfach erstellen

In diesem Video ist zu sehen, wie ein ESP8266 als mobile Signalstation errichtet werden kann.
Er soll als Informationsgeber dienen und zum Beispiel am Wohnungseingang zeigen, ob alle Türen und Fenster geschlossen sind.
Beschrieben wird im Video, die benötigte Hardware und wie sie verdrahtet werden kann.
Das Auslesen der Werte aus dem IOBroker, das per Javascript automatisiert in die zuvor erstellten MQTT Knotenpunkte übertragen wird.
Sowie wie ein ESP-Microcontroller in den Tiefschlaf geschickt werden kann.
Diese Tiefschlafzeit ist begrenzt auf etwa 71 Minuten = 4294967295 Microsekunden.

Zum Schluss ist noch zu sehen, das mit Tinkercad ein einfaches Gehäuse erstellt wurde und mit einem 3D Drucker erzeugt wurde.

Arbeitsumgebung in diesem Tutorial, ist ein Zigbee Magnet Sensor von Aqara der seine Werte über das Deconz Gateway an den IOBroker bereits mitteilt.

Hardware:

Test-VersionVersion 5 Volt
NodeMCU ESP8266ESP8266 D1 Mini
Rote LEDRote LED
Widerstand 220 OhmWiderstand 220 Ohm
BatteriehalterungBatteriehalterung
Mikroschalter rastend
Streifenrasterplatine

Power Modes:
Um bei dieser mobilen Lösung die Lebensdauer der Batterie zu verlängern, wird der Deep-Sleep Mode aktiviert, in dem der Anschluss D0 mit RST verbunden wird.
Hier eine Übersicht der weiteren Modi beim ESP8266 und welche Bereiche dabei deaktiviert werden.


Modem – SleepLight – SleepDeep – Sleep
CPUAnPauseAus
System ClockAnAusAus
Wi-FiAusAusAus
RealTimeClockAnAnAn
Stromverbrauch15 mA0.9 mA20 µA

Verdrahtung Test-Version:

Verdrahtung Version 5V:

Quellcode:

// MQTT ist im Status Qos 0
// Werte werden per Javascript bereitgestellt
// Abschließend als finale Version werden alle Serial.print deaktiviert

#include <ESP8266WiFi.h>       // Bibliothek für WLAN-Funktionalität
#include <PubSubClient.h>      // Bibliothek für MQTT-Kommunikation

// WLAN-Zugangsdaten
const char* ssid = "euer SSID Name";
const char* password = "Password";

// IP-Adresse des MQTT-Brokers
const char* mqtt_server = "10.10.10.2";

// Erstellen eines WLAN-Clients und MQTT-Clients
WiFiClient espClient;
PubSubClient client(espClient);

// Zeitstempel für letzte Nachricht (nicht genutzt, aber vorbereitet)
unsigned long lastMsg = 0;

// Puffer für Nachrichten (nicht genutzt, aber vorbereitet)
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

// Funktion zur Verbindung mit dem WLAN
void setup_wifi() {
  delay(10);  // kurze Pause vor Verbindungsaufbau

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);  // SSID ausgeben

  WiFi.mode(WIFI_STA);  // Station-Modus (kein Access Point)
  WiFi.hostname("ESPStatusLED");  // Hostname setzen
  WiFi.begin(ssid, password);     // Verbindung mit WLAN starten

  // Warten bis WLAN verbunden ist
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");  // Fortschritt anzeigen
  }

  randomSeed(micros());  // Zufallszahlengenerator initialisieren

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());  // Lokale IP-Adresse ausgeben
}

// Callback-Funktion: Wird aufgerufen, wenn eine MQTT-Nachricht empfangen wird
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);  // Thema (Topic) der Nachricht
  Serial.print("] ");

  String Fensterstatus = "";
  // Payload (Nachrichteninhalt) in String umwandeln
  for (int i = 0; i < length; i++) {
    Fensterstatus = Fensterstatus + (char)payload[i];
  }

  Serial.print(Fensterstatus);
  Serial.println();

  // Wenn das Fenster "offen" ist, LED einschalten
  if (Fensterstatus.equals("offen")) {
    Serial.print("jetzt mach was");
    digitalWrite(5, HIGH);  // LED an (GPIO5 = D1)
    delay(10000);           // 10 Sekunden warten
    digitalWrite(5, LOW);   // LED aus
    delay(1000);            // 1 Sekunde warten
  }

  // Mikrocontroller in den Tiefschlaf versetzen (5 Sekunden)
  // Maximalwert: 4294967295 Mikrosekunden ≈ 71 Minuten
  ESP.deepSleep(5e6);  // 5 Sekunden = 5.000.000 Mikrosekunden
}

// Funktion zur Wiederverbindung mit dem MQTT-Broker
void reconnect() {
  // Solange keine Verbindung besteht, erneut versuchen
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    // Zufällige Client-ID generieren
    String clientId = "ESP8266Client-BKF";
    clientId += String(random(0xffff), HEX);

    // Verbindung mit MQTT-Broker herstellen (mit Benutzername & Passwort)
    if (client.connect("arduinoClientname", "mqttusername", "geheimespassword")) {
      Serial.println("connected");

      // Nach erfolgreicher Verbindung das gewünschte Topic abonnieren
      client.subscribe("Fensterstatus/Bastelkellerfenster");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());  // Fehlercode ausgeben
      Serial.println(" try again in 5 seconds");
      delay(5000);  // 5 Sekunden warten vor erneutem Versuch
    }
  }
}

// Setup-Funktion: Wird einmal beim Start ausgeführt
void setup() {
  pinMode(5, OUTPUT);        // GPIO5 (D1) als Ausgang setzen (für LED)
  Serial.begin(115200);      // Serielle Schnittstelle starten (nur für Debugging)
  setup_wifi();              // WLAN-Verbindung aufbauen
  client.setServer(mqtt_server, 1883);  // MQTT-Server konfigurieren (Port 1883)
  client.setCallback(callback);         // Callback-Funktion für eingehende Nachrichten setzen
}

// Hauptschleife: Wird ständig wiederholt
void loop() {
  // Wenn MQTT-Verbindung unterbrochen ist, erneut verbinden
  if (!client.connected()) {
    reconnect();
  }
  client.loop();  // MQTT-Client am Leben halten (Nachrichten empfangen/verarbeiten)
}

Javascript im IOBroker:

on({id: "deconz.0.Sensors.11.open", change: "ne"}, function (obj) { UpdateLEDStatus(); });
function UpdateLEDStatus()
{
var Fensterstatus = "zu";
// Status Bastelkellerfenster
Fensterstatus = "zu";
if ( getState("deconz.0.Sensors.11.open").val == true ) { Fensterstatus = "offen"; }
setState('mqtt.0.Fensterstatus.Bastelkellerfenster', Fensterstatus ); 
}

Video:

Gehäuse:
Download der Gehäuse Print Datei unter Thingiverse


Nicht im Video zu sehen:

Signalgeber Version mit 3 Volt:

Mit dem im Video gesetzten Einstellungen, konnte diese Lösung etwa 48 Stunden laufen. Dann lieferten die AA-Akku´s (4×1,2Volt) nicht mehr ausreichend Spannung.
Mit Erhöhung der Tiefschlafzeit und Verringerung der Einschaltzeit der LED waren es dann fast 5 Tage.

Eine zweite 3Volt Variante mit einer Lithium CR123a Batterie, brachte keine wesentliche Verbesserung.

Mein privates Fazit: Diese Lösung verbraucht im Deep-Sleep Mode immer noch zu viel Strom.
Der Deep Sleep Mode bei ESP8266 ist begrenzt in Funktionalität. Somit wurde die Lösung inzwischen mit einem ESP32-C3 im Deep Sleep Mode Hibernation umgesetzt. Siehe

ESP32 Sleep-Modi verstehen und testen


, , , , , ,
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzerkomfort bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst und hilft uns zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.