我正在使用Arduino IDE来编程ESP8266,该ESP8266连接到许多传感器。最终目标是通过MQTT发布传感器数据。
我有一个带有传感器名称的数组:
const char* sensorIDArray[] = { // Used for the MQTT string
"DS18B20_1",
"DS18B20_2",
"DS18B20_3",
"DHT22_t",
"DHT22_h",
"Hygrometer_1",
"Hygrometer_1",
"Hygrometer_1",
"Hygrometer_1",
"Battery"
};
我有另一个带有一些传感器读数的数组:
float readingsArray[10]; //Saving the last measurement
/* Array element reminder:
*
* readingsArray[0] = DS18B20_1
* readingsArray[1] = DS18B20_2
* readingsArray[2] = DS18B20_3
* readingsArray[3] = DHT22_t
* readingsArray[4] = DHT22_h
* readingsArray[5] = Hygrometer_1
* readingsArray[6] = Hygrometer_2
* readingsArray[7] = Hygrometer_3
* readingsArray[8] = Hygrometer_4
* readingsArray[9] = Battery
*/
然后,我试图通过循环浏览数组的每个元素来将读数发送到MQTT客户端:
char readingVal;
for (int i = 0; i<10; i++) {
dtostrf(readingsArray[i], 7, 2, readingVal); //convert float to string
char* topic = "ESPlant/" + sensorIDArray[i]; //concatenate MQTT topic
client.publish(topic, readingVal); //publish MQTT topic and sensor reading
delay(10); //delay to ease burden on MQTT server.
}
我是C 和Arduino的新手。尽管有很多小时的谷歌搜索,但我对char
,char*
和两者的数组感到非常困惑。对于上面的参数readingVal
,client.publish
仅限于字符串(!!!(。错误消息是:
从" char"转换为" char*" [-fpermissive]
正如其他人在评论中所暗示的那样,阅读一些Arduino教程不会受到伤害。如果您不熟悉C"字符串",则绝对应该尝试避开它们。
实际上是为那些真正不知道C/C 的人创建的。正如您所知道的那样如果您不在C/C 上,则
dtoStrf((是一个相当复杂的功能。例如,最后一个参数应该是"缓冲区",足够大以保持转换的结果。在您的示例中,您将通过一个指针,根本没有内存分配。您可以使用字符串避免使用。
字符串允许您仅适用于以下内容(来自此处的教程(
int sensorValue = analogRead(A0);
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);
当您达到需要将字符串传递给期望char*(c/c 字符串(的函数时,您就可以做类似的事情。
someFunctionNeedingACharArray(stringOne.c_str());
C_STR((方法将字符串转换为C/C 样式char*" String"
希望这会有所帮助。