You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并Azure IoT Hub与AHT20传感器代码时出现变量未声明范围错误求助

合并Azure IoT Hub与AHT20传感器代码时出现变量未声明范围错误求助

你猜的完全没错!问题核心就是变量作用域的问题,我来给你拆解清楚:

你在loop()函数里声明的sensors_event_t humidity, temp;是局部变量,它的作用范围只限于loop()函数内部,而publishMessage()是一个独立的函数,根本看不到这两个变量,所以编译器才会报错说它们“未声明”。

给你两种简单的解决办法,你可以根据需求选择:


方法一:把变量提升为全局变量

这种方法适合你希望每次loop循环都更新传感器数据的场景:

  1. 在所有函数的外面(比如在Adafruit_AHTX0 aht;这一行下面)添加全局变量声明:
sensors_event_t humidity, temp;
  1. 然后修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:25:33