PubSubClient. передача значений
- Войдите на сайт для отправки комментариев
Втр, 03/09/2019 - 19:01
Всем привет. Не могу разобраться, как правильно передавать данные функцией 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, но не могу понять как это сделать. Прошу помощи
как ругается? матом?
весь скетч выложите и текст ошибки
#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: }Тобсик, client.publish какие параметры принимает? Какова типа?
ругается на temp
как я понимаю, в качестве второго аргумента функция ожидает char, но не могу понять как это сделать. Прошу помощи
он не на temp ругается. а на то что строки типа char* нельзя складывать оператором "+". Пользуйтесь функцией sprintf, или сначала формируйте String складыванием строк, а потом преобразуйте String в char*
Спасибо!
Релизовал таким способом:
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); } }Через snprintf() было бы дешевле по ресурсам.
Через snprintf() было бы дешевле по ресурсам.
это ЕСП, там пофиг :)