合并Azure IoT Hub与AHT20传感器代码时出现变量未声明范围错误求助
合并Azure IoT Hub与AHT20传感器代码时出现变量未声明范围错误求助
你猜的完全没错!问题核心就是变量作用域的问题,我来给你拆解清楚:
你在loop()函数里声明的sensors_event_t humidity, temp;是局部变量,它的作用范围只限于loop()函数内部,而publishMessage()是一个独立的函数,根本看不到这两个变量,所以编译器才会报错说它们“未声明”。
给你两种简单的解决办法,你可以根据需求选择:
方法一:把变量提升为全局变量
这种方法适合你希望每次loop循环都更新传感器数据的场景:
- 在所有函数的外面(比如在
Adafruit_AHTX0 aht;这一行下面)添加全局变量声明:
sensors_event_t humidity, temp;
- 然后修改
loop()函数,删掉原来的局部变量声明,直接使用全局变量:
void loop() { // 删掉这一行:sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); // 直接更新全局变量里的数据 // 后面的代码保持不变... }
这样publishMessage()就能正常访问这两个全局变量了。
方法二:在发布函数内部读取传感器数据
这种方法更符合代码封装的习惯,只在需要发布消息时才读取最新的传感器数据:
直接修改publishMessage()函数,把读取传感器数据的逻辑移到函数内部:
void publishMessage() { Serial.println("Publishing message"); // 在这里读取最新的传感器数据 sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); // 发送消息的代码保持不变 mqttClient.beginMessage("devices/" + deviceId + "/messages/events/"); mqttClient.print("T: "); mqttClient.print(temp.temperature, 1); mqttClient.println(" °C"); mqttClient.print("H: "); mqttClient.print(humidity.relative_humidity, 1); mqttClient.println(" %"); mqttClient.endMessage(); }
同时记得把loop()里的sensors_event_t humidity, temp;和对应的aht.getEvent调用删掉,避免重复读取。
两种方法都能解决你的编译错误,选哪种取决于你的需求:如果需要在loop的其他地方也用到传感器数据,就用全局变量;如果只在发布消息时需要,方法二更高效。
备注:内容来源于stack exchange,提问作者Anders Wien
相关产品推荐
相关产品推荐

