Arduino Delay

hi

hoffe hier kann mir jemand helfen.

Nun zu mein Problem,

ich will das er nach dem Delay automatisch ein OFF message an den MQTT Broker senden ist das möglich?

So das einschalten geht soweit und schaltet sich nach den 5 sekunden aus.
Nun will ich aber das der schalter nach den 5s automatisch auf aus geht (paperui)

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
const char* SSID = "";
const char* PSK = "";
const char* MQTT_BROKER = "";
 
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
 
void setup() {
    pinMode(13, OUTPUT);
    Serial.begin(115200);
    setup_wifi();
    client.setServer(MQTT_BROKER, 1883);
    client.setCallback(callback);
}
 
void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(SSID);
 
    WiFi.begin(SSID, PSK);
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
 
    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("Received message [");
    Serial.print(topic);
    Serial.print("] ");
    char msg[length+1];
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
        msg[i] = (char)payload[i];
    }
    Serial.println();
 
    msg[length] = '\0';
    Serial.println(msg);
 
    if(strcmp(msg,"ON")==0){
        digitalWrite(13, HIGH);
        delay (5000); // und zwar für 5 Sekunden (5000 Millisekunden).
        digitalWrite(13, LOW);
    }
    else if(strcmp(msg,"OFF")==0){
        digitalWrite(13, LOW);
        
    }
}
 
void reconnect() {
    while (!client.connected()) {
        Serial.println("Reconnecting MQTT...");
        if (!client.connect("ESP8266Client")) {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" retrying in 5 seconds");
            delay(5000);
        }
    }
    client.subscribe("/home/data/MeinZimmer");
    Serial.println("MQTT Connected...");
}
 
void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
}

Behandle callback() wie eine ISR, die so schnell wie möglich abläuft. In Deinem Fall reicht es ein Flag zu setzen, entweder daß überhaupt was angekommen ist, oder welche Message angekommen ist. Dann wartet loop() darauf, daß dieses Flag gesetzt wird und macht die restliche Arbeit. Und das möglichst ohne delay(), sonst könnte das mit dem callback() nicht so richtig funktioneren.

Und das lokale

   char msg[length+1];

ist zwar gut gemeint, dürfte aber kaum funktionieren. Compiliert das überhaupt?