2016-07-26 5 views
0

私のホームオートメーションプロジェクトに問題があります。私は、私のブラインドを制御したいと思うaliexpressからnodeMCU v3を買った。nodeMCUで繰り返されるブローカーメッセージ

これは私が使用しているコードです。私はArduino IDEを使ってこのコードをnodeMCUに送ります。

#include <ESP8266WiFi.h> 
#include <PubSubClient.h> 
#include <SimpleTimer.h> 

// MQTT Server 
const char* ssid = "****"; 
const char* password = "****"; 
const char* mqtt_server = "****"; 


char message_buff[100]; 
int photoValue = 0; 
int rainValue = 0; 
int photo = A0; 
int rain = D6; 
int relayUp = D7; 
int relayDown= D8; 
long interval = 10000; 
long previousMillis = 0; 

WiFiClient espClient; 
PubSubClient client(espClient); 

void setup_wifi() { 
    delay(10); 
    WiFi.begin(ssid, password); 
    while (WiFi.status() != WL_CONNECTED) { 
    delay(500); 
    } 
} 

void setup() { 

    pinMode(photo, INPUT); 
    pinMode(rain, INPUT); 
    pinMode(relayUp, OUTPUT); 
    pinMode(relayDown, OUTPUT); 

    digitalWrite(relayUp ,LOW); 
    digitalWrite(relayDown, LOW); 
    setup_wifi(); 
    client.setServer(mqtt_server, 1883); 
    client.setCallback(callback); 
} 
void reconnect() { 
    // Loop until we're reconnected 
    while (!client.connected()) { 
    if (client.connect("ESP8266Client")) { 
     client.subscribe("home/relayBlinds"); 
    } else { 
     delay(5000); 
    } 
    } 
} 

void loop() { 

    if (!client.connected()) { 
    // Connect (or reconnect) to mqtt broker on the openhab server 
    reconnect(); 
    } 
// Read Photo- and Rain-sensors 
    photoValue = analogRead(photo); 
    rainValue = analogRead(rain); 

    // publish Temperature reading every 10 seconds 
    unsigned long currentMillis = millis(); 
    if (currentMillis - previousMillis > interval) { 
    previousMillis = currentMillis; 

    // publish Photo 
    String pubStringPhoto = String(photoValue); 
    pubStringPhoto.toCharArray(message_buff, pubStringPhoto.length()+1); 
    client.publish("home/photo", message_buff); 

    // publish Rain 
    String pubStringRain = String(rainValue); 
    pubStringRain.toCharArray(message_buff, pubStringRain.length()+1); 
    client.publish("home/rain", message_buff); 
    } 
    client.loop(); 
} 


void callback(char* topic, byte* payload, unsigned int length) { 
// MQTT inbound Messaging 
int i = 0; 

    // create character buffer with ending null terminator (string) 
    for(i=0; i<length; i++) { 
    message_buff[i] = payload[i]; 
    } 
    message_buff[i] = '\0'; 

    String msgString = String(message_buff); 

    if (msgString == "BLINDSUP") { 
    digitalWrite(relayUp ,HIGH); 
    delay(5000); 
    digitalWrite(relayUp ,LOW); 
    } else if (msgString == "BLINDSDOWN") { 
    digitalWrite(relayDown ,HIGH); 
    delay(5000); 
    digitalWrite(relayDown ,LOW); 
    } 
} 

コントローラとしてopenHABを使用したラズベリーパイが計画されていました。私はmosquittoとopenHABを設定するためにいくつかのガイドを使いました。私はいつも同じ結果を得ています。

これはどうなるのですか?:nodeMCUが自分のWi-Fiに接続し、雨と写真の両方の値を公開します。私は問題なくopenHAB GUIでそれらを読むことができます。

openHABの起動ボタンを押してBLINDSUPまたはBLINDSDOWNを公開すると、メッセージは問題なく届き、私の蚊帳端末にメッセージが表示されます。予期しない結果が起き始める時です。同じメッセージが、自分のnodeMCUに複数回配信され、それが蚊帳端末に表示されることはありません。

は、私はそれがこのように作用するであろう理由を見つけるためにしようとしていると私はラインので、それがあると思う:

if (!client.connected()) { 

がfalseでnodeMCUが再接続し、何らかの形で同じメッセージを取得します。しかし、それは常に最初のメッセージです。 BLINDSUPを送ってからBLINDSDOWNを送ると、BLINDSUPは永久に登録されます。

私は本当にこれを修正する方法がありませんし、助けていただければ幸いです。 nodeMCUへ

URLそれがとにかく場合に役立ちます:nodeMCU

答えて

0

きれいなセッションとMQTTブローカーに接続してみてください。おそらく、retainフラグがtrueに設定されたトピックを公開したとします。

このようにすると、nodeMCUがブローカに接続し、保持されているトピックにサブスクライブすると、ブローカは最後に保持されたメッセージを配信します。

関連する問題