我正在使用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*
和两者的数组感到非常困惑。 client.publish
仅限于上面的参数readingVal
的仅字符串(!!!)。错误消息是:
从'char'无效转换为'char *'[-fpermissive]
答案 0 :(得分:1)
正如其他人在评论中暗示的那样,阅读一些Arduino教程并不会有什么坏处。如果你不熟悉c“字符串”,你一定要试着避开它们。
String类实际上是为那些不熟悉c / c ++的人创建的。你似乎知道Arduino语言真的只是c ++,但是他们试图为那些不熟悉它的人简化事情。
如果你没有使用c / c ++,那么dtostrf()是一个相当复杂的函数。例如,最后一个参数应该是一个“缓冲区”,大到足以保存转换结果。在您的示例中,您传递的指针根本没有分配给它的内存。你可以使用String来避免这种情况。
String允许您执行以下操作(来自教程here)
int sensorValue = analogRead(A0);
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);
当你到达需要将String传递给期望char *(c / c ++字符串)的函数的点时,你可以做类似的事情。
someFunctionNeedingACharArray(stringOne.c_str());
c_str()方法将String转换为c / c ++样式char *“string”
希望这有帮助。