Arduino als mobiler Signalgeber

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:

Version 1Version 2
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 Version1:

Verdrahtung Version2:

Quellcode:
ArduinoIDE:

// 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

, , ,