2017-03-01 267 views
0

我有一個小的本地IoT網絡,在Arduino IDe中編寫了一些Wemos D1節點。其中一些有兩個連接的傳感器,例如雨和潮溼。 我想每分鐘發一次數值,一分鐘下雨,一分鐘溼度。 下面的代碼通常與delay(5000);兩個工作,但一旦我有類似delay(60000);節點顯然開始只出版雨水和跳過溼度(我有一個mosquitto_sub -h myIP -v -t '#'運行監聽傳遞消息。MQTT client.publish()和delay()

這是我loop()所有傳感和發送情況:

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

也許您的連接在等待60秒後關閉?你是否添加了'Serial'調試來確定'client'對象('boolean PubSubClient :: connected()')的狀態,並且如果在'delay()'之後到達了代碼? –

+0

只是說明:而不是'humid_str.toCharArray(humid,humid_str.length()+ 1); client.publish(humidTopic,humid);''你可以使用'client.publish(humidTopic,humid_str.c_str())',或者你可以直接使用'val2'的'sprintf()'而不是'humid',後者是聲明爲具有足夠大尺寸的'char []'類型,從而避免了由'String'造成的動態內存使用。 –

+0

您可以通過http://arduino.stackexchange.com/獲得更多的信息。 – phuzi

回答

1

你會得到一個MQTT_CONNECTION_TIMEOUT如果你不MQTT_KEEPALIVE秒(一般爲15秒)內調用client.loop()函數

確保。以更短的時間間隔調用client.loop()。使用一個計數器來計數到60或更好地使用計時器功能,如Ticker庫。