Skocz do zawartości
Pieterlpl

Wysyłanie kilku wartości przez MQTT

Pomocna odpowiedź

Cześć. Mam mały problem z wysyłaniem kilku odczytanych parametrów na serwer przy pomocy protokołu MQTT. Jeden parametr (w tej chwili w kodzie jest to TEMPERATURA) jest bezproblemowo przesyłany, natomiast gdy chcę dorzucić kolejne (WILGOTNOSC, CISNIENIE) w taki sposób jak mam to w swoim programie, nie przesyłają się żadne wartości. Czy korzystaliście może kiedyś z biblioteki PubSubClient i udało się Wam przesyłać naraz kilka wartości? Może jest jakiś błąd w składni w tym moim programie? Z góry dziękuję za pomoc.

#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <PubSubClient.h>

#define WIFISSID "SSID" // Put your WifiSSID here
#define PASSWORD "PASS" // Put your wifi password here
#define TOKEN "TOKEN" // Put your Ubidots' TOKEN
#define MQTT_CLIENT_NAME "RandomName" // MQTT client Name, please enter your own 8-12 alphanumeric character ASCII string; 
                                           //it should be a random and unique ascii string and different from all other devices

/****************************************
 * Define Constants
 ****************************************/
#define TEMPERATURA "temperatura"
#define CISNIENIE "cisnienie"
#define WILGOTNOSC "wilgotnosc"
#define DEVICE_LABEL "esp32" // Assig the device label

char mqttBroker[]  = "things.ubidots.com";
char payload[100];
char topic[150];
char topicSubscribe[100];
// Space to store values to send
char str_temperaturaC[10];
char str_cisnienie[10];
char str_wilgotnosc[10];

Adafruit_BME280 bme; // I2C
float temperaturaC = 0;
float cisnienie = 0;
float wilgotnosc = 0;

/****************************************
 * Auxiliar Functions
 ****************************************/
WiFiClient ubidots;
PubSubClient client(ubidots);

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    
    // Attemp to connect
    if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) {
      Serial.println("Connected");
      client.subscribe(topicSubscribe);
    } else {
      Serial.print("Failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 2 seconds");
      // Wait 2 seconds before retrying
      delay(2000);
    }
  }
}

/****************************************
 * Main Functions
 ****************************************/
void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFISSID, PASSWORD);
  bme.begin(0x76);
  pomiaryBME280();
  
  Serial.println();
  Serial.print("Wait for WiFi...");
  
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  
  Serial.println("");
  Serial.println("WiFi Connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  client.setServer(mqttBroker, 1883);

  sprintf(topicSubscribe, "/v1.6/devices/%s/%s/lv", DEVICE_LABEL, TEMPERATURA, CISNIENIE, WILGOTNOSC);
  
  client.subscribe(topicSubscribe);
}

void loop() {
  if (!client.connected()) {
    client.subscribe(topicSubscribe);   
    reconnect();
  }
  pomiaryBME280();
  sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
  sprintf(payload, "%s", ""); // Cleans the payload
  sprintf(payload, "{\"%s\":", TEMPERATURA); // Adds the variable label
  //sprintf(payload, "{\"%s\":", CISNIENIE); // Adds the variable label
  //sprintf(payload, "{\"%s\":", WILGOTNOSC); // Adds the variable label
  
  /* 4 is mininum width, 2 is precision; float value is copied onto str_sensor*/
  dtostrf(temperaturaC, 4, 2, str_temperaturaC);
  dtostrf(cisnienie, 4, 2, str_cisnienie);
  dtostrf(wilgotnosc, 4, 2, str_wilgotnosc);
  
  sprintf(payload, "%s {\"value\": %s}}", payload, str_temperaturaC); // Adds the value
  //sprintf(payload, "%s {\"value\": %s}}", payload, str_cisnienie); // Adds the value
  //sprintf(payload, "%s {\"value\": %s}}", payload, str_wilgotnosc); // Adds the value
  Serial.println("Publishing data to Ubidots Cloud");
  client.publish(topic, payload);
  client.loop();
  delay(1000);
}

void pomiaryBME280() 
{
  temperaturaC = bme.readTemperature();
  cisnienie = bme.readPressure() / 100;
  wilgotnosc = bme.readHumidity();
  
  Serial.print("Temperatura = ");
  Serial.print(temperaturaC, 2);
  Serial.print(" *C; ");
 
  Serial.print("Ciśnienie = ");
  Serial.print(cisnienie, 2);
  Serial.print("hPa; ");

  Serial.print("Wilgotność = ");
  Serial.print(wilgotnosc, 2);
  Serial.print("% ");
}

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...