我有8个AM2301传感器,可以使用this DHT library进行单独读取,并且示例代码已根据我的要求进行了修改。这意味着必须对每个传感器执行类似的操作(这会导致很多重复代码)。
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t,h;
t = dht.readTemperature();
h = dht.readHumidity();
现在,我正在尝试重构代码,以便拥有一个DHT对象数组,可以对其进行迭代以声明,初始化和读取(从float数组中)值。
在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”(INIT传感器)之后就锁定了代码执行。目标平台是ATSAMD21。
我不是专业的C / C ++程序员,所以这里可能有我遗漏或忽略的内容。我需要一些帮助,以弄清自己在做错什么,以及是否有更好的方法可以做到这一点。
编辑:按照接受的答案中的建议使用vector
,我可以得到一个可迭代的对象列表。但是,该程序仍然锁定。似乎此特定问题与DHT库不喜欢多个动态对象有关。现在到github ...
答案 0 :(得分:1)
c ++为您提供了大量的对象存储类型,以帮助您完成这类事情。看到DHT **am2301;
通常可以用std::vector
之类的东西代替,RAII被设计为对象的向量。假设您已经说过:
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t = dht.readTemperature();
正常工作,那么您可以轻松地生成这些读数类型的向量,如下所示:
std::vector<DHT> am2301; // My vector
for (auto i = 0; i < 8; ++i) {
am2301.emplace_back(SENSORS[i], DHT_TYPE); // Create the objects in place with the
// correct constructor arguments. std::vector
// takes care of memory allocation.
am2301[i].begin(); // Start the object
}
float t = am2301[5].readTemperature(); // Use the vector
这省去了以后记住删除对象的麻烦,并为您提供了更多使用该矢量的灵活性。像这样的类型的使用是c ++ pandas.Series.astype
中最强大的功能之一。