2017-03-01 2 views
0

Ich habe ein kleines lokales IoT-Netzwerk mit einer Handvoll Wemos D1-Knoten in der Arduino IDe programmiert. Einige von ihnen haben zwei angeschlossene Sensoren, z.B. Regen und Feuchtigkeit. Ich möchte jede Minute Werte senden, eine Minute den Regen, eine Minute die Feuchtigkeit. Im Folgenden Code funktioniert im Allgemeinen mit delay(5000); für beide, aber wenn ich so etwas wie delay(60000); haben der Knoten offenbar nur der regen beginnt die Veröffentlichung und überspringt die Luftfeuchtigkeit (ich habe ein mosquitto_sub -h myIP -v -t '#' für messaged zu hören laufen.MQTT client.publish() und delay()

Das ist mein loop() ist, wo alle das Erfassen und Senden passiert:

void loop() { 
    if (!client.connected() && WiFi.status() == 3) { 
     reconnect(); 
    } 
    client.loop(); 

    int val = digitalRead(rainSensor);  // read the input pin 
    rain_str = String(val); 
    rain_str.toCharArray(rain, rain_str.length() + 1); 
    client.publish(rainTopic, rain); 
    delay(60000); 

    int val2 = analogRead(humidSensor);  // read the input pin 
    humid_str = String(val2); 
    humid_str.toCharArray(humid, humid_str.length() + 1); 
    client.publish(humidTopic, humid); 
    delay(60000); 
} 
+0

Vielleicht wird Ihre Verbindung geschlossen, nachdem Sie 60 Sekunden gewartet haben? Haben Sie 'Serial' Debugging hinzugefügt, um den Zustand des' client' Objektes zu bestimmen ('boolean PubSubClient :: connected()') und wenn der Code nach dem 'delay()' erreicht wird? –

+0

Nur eine Anmerkung: anstelle von 'feuchte_str.toCharArray (feuchte, feuchte_str.Länge() + 1); client.publish (humidTopic, feuchtig); '' client.publish (feedTopic, feuchte_str.c_str()) '' verwenden, oder direkt 'sprintf()' von 'val2' über' feuchte', letzteres ist möglich deklariert vom Typ 'char []' mit ausreichend großer Größe, um dynamische Speicherauslastung zu vermeiden, die durch 'String' verursacht wird. –

+0

Sie können mehr Traktion auf http://arduino.stackexchange.com/ erhalten – phuzi

Antwort

1

Sie eine MQTT_CONNECTION_TIMEOUT erhalten, wenn Sie nicht die client.loop() Funktion innerhalb MQTT_KEEPALIVE Sekunden (typischerweise 15 s)

Achten Sie darauf, zu nennen sind. Rufen Sie client.loop() in einem viel kürzeren Intervall auf. Verwenden Sie einen Zähler, um bis 60 oder besser zu zählen, verwenden Sie eine Timer-Funktion wie die Ticker-Bibliothek.