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 4294967295 Microsekunden, also etwa 71 Minuten.

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>
#include <PubSubClient.h>

const char* ssid = "Accesspointname";
const char* password = "Password";
const char* mqtt_server = "10.10.10.2";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.hostname("ESPStatusLED");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);//empfangener Wert
  Serial.print("] ");
  String Fensterstatus = "";
  for (int i = 0; i < length; i++) { Fensterstatus = Fensterstatus + (char)payload[i];
    }
  Serial.print(Fensterstatus);
  Serial.println();
  
  if (Fensterstatus.equals("offen")) { 
Serial.print("jetzt mach was");
 digitalWrite(5, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(10000);                       // wait for a second
 digitalWrite(5, LOW);    // turn the LED off by making the voltage LOW
 delay(1000); 
}
ESP.deepSleep(5e6); hier 5 Sek Tiefschlaf / maximum ist 4294967295us, etwa 71 Minuten
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-BKF";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if (client.connect(clientId.c_str())) {
    if (client.connect("arduinoClientname", "mqttusername", "geheimespassword")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.subscribe("Fensterstatus/Bastelkellerfenster");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(5, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);    // wird in der Finalen Version deaktiert
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

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.
Ich werde als nächstes, mir ein ESP8266 in PCB Bauform besorgen und dann berichten.

, , , , ,