Чтение DHT22 перезагружает arduino

adafruit dht22

У меня довольно странное поведение библиотеки DHT.

У меня датчик DHT22. Если его сигнальный кабель не подключен, считывание показаний датчика вызывает проблемы: Arduino перезагружается или зависает в непредсказуемых местах.

Если я снова подключу сигнальный кабель, проблема исчезнет.

Это нормальное поведение или какая-то ошибка? Я думаю, что неудачное чтение влияет на какую-то часть Памяти.

ПС. Проект довольно большой, и я не могу поделиться здесь кодом.

Случилось так, что я нашел доказательства того, что этот объект влияет на чужую память. Посмотрите на этот код:

DV("pClock->isInited 3", pClock->isInited); // печатает 1
dht1.readHumidity();
DV("pClock->isInited 4", pClock->isInited); // напечатать 0 !!!!
// между этими строками больше ничего вызывать нельзя.

// DV — это макрос, который печатает метку и значение.
// Оба объекта созданы до этого.

DHT dht1(11, DHT22);
…
dht1.begin();
…
pClock = new ZhClock(); // использует RTC_DS1307
pClock->init(&rtc); // rtc — это RTC_DS1307

, 👍1

Обсуждение

Это не нормальное поведение. Какое оборудование вы используете, к каким контактам вы подключили DHT22 и какую библиотеку DHT используете?, @StarCat

@StarCat Я использую Arduino nano CH340. Библиотека DHT, поставляемая с Arduino IDE. Пробовал контакты D11 и A2., @zhekaus

Это библиотека DHT от Adafruit (устанавливается через менеджер библиотек)? Я не думаю, что есть библиотека DHT, которая входит в стандартную комплектацию Arduino IDE. A2 и D11 должны работать нормально. Но что вы ожидаете от него при отключении сигнального кабеля? Библиотека должна возвращать ошибку (значения NaN, возвращаемые температурой и влажностью), когда DHT не подключен. Как вы справляетесь с этими ошибками? Если вы продолжите использовать значения NaN, возвращаемые библиотекой, вы испортите все последующие вычисления. Также помните, что вы не можете читать с DHT22 чаще, чем раз в 2 секунды., @StarCat

@StarCat Почему я не могу читать больше одного раза? Может ли это быть источником проблемы? Предполагалось, что я получаю неверные результаты, но это не может привести к утечке памяти. Да, это библиотека от Adafruit, я ошибался., @zhekaus

Я имел в виду, что ваш код должен ждать не менее 2 секунд после его чтения, прежде чем снова читать DHT (технически: 0,5 Гц или меньше)., @StarCat

@StarCat, значит, это не так. Посмотрите, пожалуйста, обновленное описание., @zhekaus

Что бы вы ни говорили, теперь я знаю, что библиотека Adafruit DHT — худшая библиотека, которую я когда-либо встречал! Бывает, что простой вызов чтения тратит огромное количество памяти! Около 280 байт или около того. Позор, позор, позор!, @zhekaus

@zhekaus Вы говорите об оперативной памяти или памяти программ? Что вы имеете в виду под потерей памяти? Когда вы не используете библиотеку, компилятор оптимизирует ее. Когда вы затем измените свой скетч, чтобы он действительно использовался, компилятор поместит библиотеку (или только необходимые ее части), что приведет к увеличению размера скетча и отчасти к большему использованию ОЗУ., @chrisl

@chrisl, я говорю об оперативной памяти, очевидно. Нехватка оперативной памяти убивает устройство. Загляните в dht.cpp, метод DHT::read, и вы сами это увидите. Я уверен, что, например, uint32_t cycles[80]; вам что-то говорит ;-)., @zhekaus

Для библиотеки Adafruit DHT требуется около 390 байт свободной оперативной памяти. Проверьте, так ли это у вас., @evgard


1 ответ


Лучший ответ:

1

Эта проблема обычно возникает при нехватке оперативной памяти. Библиотеки Adafruit тратят много памяти. Вы должны быть очень осторожны при запуске их программ, если у вас не хватает памяти.

Я предлагаю вам попробовать другую библиотеку, которая довольно старая, но использует гораздо меньше памяти для чтения данных датчика DHT: https://github.com/markruys/arduino-DHT

,

Ага! Это решило мою проблему!, @zhekaus