PubSubClient. передача значений

tobsik
tobsik аватар
Offline
Зарегистрирован: 13.03.2019

Всем привет. Не могу разобраться, как правильно передавать данные функцией client.publish();

 

void get_temp() {
int hum_stat;
int humidity = dht.readHumidity();
int temperature = dht.readTemperature();

temp_str = String(temperature);
temp_str.toCharArray(temp, temp_str.length() + 1); 
hum_str = String(humidity); 
hum_str.toCharArray(hum, hum_str.length() + 1);

if (isnan(humidity) || isnan(temperature)) {  // Проверка. 
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 4}");
  } else {
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 4}");
  hum_stat = 0; 
  if (humidity < 30) {hum_stat=2;};
  if (humidity > 70) {hum_stat=3;};
  if (humidity >= 45 && humidity <= 50) {hum_stat=1;};
  client.publish("domoticz/in"", "{\"idx\": 6, \"nvalue\": 0, \"svalue\": \""+ temp + "\"""}");
  
  }


}

ругается на temp

как я понимаю, в качестве второго аргумента функция ожидает char, но не могу понять как это сделать. Прошу помощи

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

как ругается? матом?

весь скетч выложите и текст ошибки

tobsik
tobsik аватар
Offline
Зарегистрирован: 13.03.2019
 error: invalid operands of types 'const char [36]' and 'char [50]' to binary 'operator+'
   client.publish("test", "{\"idx\": 6, \"nvalue\": 0, \"svalue\": \"" + temp +  "\"""}");
 
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>


const char* ssid = ***";//type your ssid
const char* password = ***";//type your password
const char *mqtt_server = "192.168.0.15"; // Имя сервера MQTT
#define mqtt_port 1883 // Порт для подключения к серверу MQTT
#define MQTT_USER "mqtt" // Логи для подключения к серверу MQTT
#define MQTT_PASSWORD "***" // Пароль для подключения к серверу MQTT

#define MQTT_SERIAL_PUBLISH_CH "domoticz/in"

#define DHTPIN 0                                        // Пин к которому подключен датчик
#define DHTTYPE DHT22                                // Используемый датчик DHT 11
DHT dht(DHTPIN, DHTTYPE); 

WiFiClient wifiClient;
PubSubClient client(wifiClient);

String temp_str;
String hum_str;
char temp[50];
char hum[50];

void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    randomSeed(micros());
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(),MQTT_USER,MQTT_PASSWORD)) {
      Serial.println("connected");
        client.publish("domoticz/info", "ESP32Client#1 connected!");
      //client.subscribe(MQTT_SERIAL_RECEIVER_CH);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
        delay(5000);
    }
  }
}
void setup() {
  Serial.begin(115200);
   dht.begin();
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  reconnect();
    pinMode(LED_BUILTIN, OUTPUT);  
    digitalWrite(LED_BUILTIN, HIGH); 
    delay(500); 
    digitalWrite(LED_BUILTIN, LOW); 
    delay(500);
    digitalWrite(LED_BUILTIN, HIGH); 


}

void get_temp() {
int hum_stat;
int humidity = dht.readHumidity();
int temperature = dht.readTemperature();

temp_str = String(temperature);
temp_str.toCharArray(temp, temp_str.length() + 1); 
hum_str = String(humidity); 
hum_str.toCharArray(hum, hum_str.length() + 1);

if (isnan(humidity) || isnan(temperature)) {  // Проверка. 
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 4}");
  } else {
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 4}");
  hum_stat = 0; 
  if (humidity < 30) {hum_stat=2;};
  if (humidity > 70) {hum_stat=3;};
  if (humidity >= 45 && humidity <= 50) {hum_stat=1;};
  client.publish("test", "{\"idx\": 6, \"nvalue\": 0, \"svalue\": \"" + temp +  "\"""}");
  //client.publish("domoticz/in", "{\"idx\": 6, \"nvalue\": 0, \"svalue\": \"" + temp + ";" + hum + ";"+ hum_stat +"\"""}");
  }


}


void loop() {
  // put your main code here, to run repeatedly:
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тобсик, client.publish какие параметры принимает? Какова типа?

b707
Offline
Зарегистрирован: 26.05.2017

tobsik пишет:

ругается на temp

как я понимаю, в качестве второго аргумента функция ожидает char, но не могу понять как это сделать. Прошу помощи

он не на temp ругается. а на то что строки типа char* нельзя складывать оператором "+". Пользуйтесь функцией sprintf, или сначала формируйте String складыванием строк, а потом преобразуйте String в char*

tobsik
tobsik аватар
Offline
Зарегистрирован: 13.03.2019

Спасибо!

Релизовал таким способом: 

 

void get_temp() {
int hum_stat;
int humidity = dht.readHumidity();
int temperature = dht.readTemperature();

temp_str = String(temperature);
temp_str.toCharArray(temp, temp_str.length() + 1); 
hum_str = String(humidity); 
hum_str.toCharArray(hum, hum_str.length() + 1);
String test;
if (isnan(humidity) || isnan(temperature)) {  // Проверка. 
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 4}");
  } else {
  client.publish("domoticz/in", "{\"idx\": 12, \"nvalue\": 1}");
  hum_stat = 0; 
  if (humidity < 30) {hum_stat=2;};
  if (humidity > 70) {hum_stat=3;};
  if (humidity >= 45 && humidity <= 50) {hum_stat=1;};
  test ="{\"idx\": 11, \"nvalue\": 0, \"svalue\": \"" + String(temp) + ";" + String(hum) + ";"+ String(hum_stat) + "\"""}";
  char charsbuf[test.length() + 1];
  test.toCharArray(charsbuf, test.length());
  client.publish("domoticz/in", charsbuf);
   }


}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Через snprintf() было бы дешевле по ресурсам.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Через snprintf() было бы дешевле по ресурсам.

это ЕСП, там пофиг :)