【发布时间】:2019-09-07 16:14:18
【问题描述】:
我有 8 个 AM2301 传感器,我可以使用 this DHT library 单独读取它们,并根据我的要求修改示例代码。这意味着必须为每个传感器执行类似的操作(这会导致大量重复代码)。
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t,h;
t = dht.readTemperature();
h = dht.readHumidity();
现在我正在尝试重构我的代码,以便拥有一个 DHT 对象数组,我可以对其进行迭代以声明、初始化和读取值(到浮点数组中)。
在检查了stackoverflow 上的一些线程等之后,我想出了两个可以编译的代码版本。
这是我的代码的相关部分。整个源(基于 PlatformIO)是uploaded here。
SERIAL.print("Reading sensors: ");
uint32_t startTime = millis();
uint8_t SENSORS[] = { PIN_SENSOR0, PIN_SENSOR1, PIN_SENSOR2, PIN_SENSOR3,
PIN_SENSOR4, PIN_SENSOR5, PIN_SENSOR6, PIN_SENSOR7 };
SERIAL.println("INIT SENSORS");
/* Please disregard this snippet.
// I was trying various things before posting here and messed up.
DHT am2301[8];
uint8_t i;
for (i=0; i<8; i++){
*am2301[i] = DHT(SENSORS[i], DHT_TYPE);
am2301[i]->begin();
}
*/
// This locks up
DHT **am2301;
am2301 = new DHT* [8];
uint8_t i;
for (i=0; i<8; i++){
am2301[i] = new DHT(SENSORS[i], DHT_TYPE);
am2301[i]->begin();
}
但是,这两种样式都会在打印“INIT SENSORS”之后锁定代码执行。目标平台是 ATSAMD21。
我不是专业的 C/C++ 程序员,所以我可能在这里遗漏或忽略了一些东西。我需要一些帮助来弄清楚我做错了什么,以及是否有更好的方法来做到这一点。
编辑:按照接受的答案中的建议使用vector,我能够拥有一个可迭代的对象列表。但是,程序仍然锁定。似乎这个特殊问题与不喜欢多个动态对象的 DHT 库有关。现在去 github...
【问题讨论】:
-
请忽略带有
am2301[i]->begin();的sn-p。在将其发布到此处之前,我正在尝试一些不同的东西,结果搞砸了。在这一点上,我只想要一个 DHT 数组,我可以使用 (PIN_SENSORx, DHT_TYPE) 和 begin() 来初始化并从中读取。