У меня есть 8x датчики AM2301, которые я могу читать по отдельности, используя эту библиотеку DHT и пример кода, модифицированный по моему требованию. Это подразумевает необходимость делать что-то подобное для каждого датчика (что приводит к большому количеству повторяющихся кодов).
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t,h;
t = dht.readTemperature();
h = dht.readHumidity();
Теперь я пытаюсь реорганизовать свой код, чтобы у меня был массив объектов DHT, которые я могу перебрать, чтобы объявить, инициализировать и прочитать значения (в массивы с плавающей точкой).
После проверки некоторых потоков в stackoverflow и т. Д. Я предложил две версии моего кода, которые компилируются.
Вот соответствующая часть моего кода. Весь исходный код (на основе PlatformIO) загружен здесь .
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 ...