DHT11 возвращает бессмысленные значения
Я пытаюсь получить показания влажности и температуры (в конечном итоге, чтобы запустить систему запотевания), но значения продолжают возвращаться как 0C и 0% влажности (в целом). Первоначально я использовал датчик am2320 и аналоговые контакты. Здесь я использовал следующий код:
#include "dht.h"
#define dht_apin A2 // Датчик аналогового вывода подключен к
#define MIST 7
#define LIGHT 2
dht DHT;
void setup(){
pinMode(MIST, OUTPUT);
pinMode(LIGHT, OUTPUT);
Serial.begin(9600);
delay(500);//Задержка загрузки системы
Serial.println("DHT11 Humidity & temperature Sensor\n\n");
delay(1000);//Подождите, прежде чем получить доступ к датчику
}//конец "настройки()"
void loop(){
//Начало программы
DHT.read11(dht_apin);
Serial.print("Current humidity = ");
Serial.print(DHT.humidity);
Serial.print("% ");
Serial.print("temperature = ");
Serial.print(DHT.temperature);
Serial.println("C ");
delay(5000); // Подождите 5 секунд перед повторным доступом к датчику.
}
//Самое быстрое должно быть раз в две секунды.
// конец цикла()
}
Подумав, что датчик мог не работать, я попытался использовать другой датчик (DHT11) и, следуя инструкциям, получил тот же результат, используя этот код:
#include <dht11.h>
#define DHT11PIN 4
dht11 DHT11;
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println();
int chk = DHT11.read(DHT11PIN);
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (C): ");
Serial.println((float)DHT11.temperature, 2);
delay(2000);
}
// end loop()
Arduino питается от настенной розетки, а также подключен к моему компьютеру через USB (я читал, что иногда USB не обеспечивает достаточного питания). Странно то, что примерно через 1 минуту я получил приемлемые результаты (влажность ~ 50%, температура 22 ° C). Затем я попытался добавить цикл if, чтобы включить светодиод, если влажность упадет ниже 60% (думая, что я мог бы использовать тот же код для управления реле для включения системы запотевания). Светодиод загорелся, но показания вернулись к 0% влажности и 0C. С тех пор я удалил эту петлю, но не могу получить разумные измерения. Если я меняю сигнальный контакт, я иногда получаю новые показания влажности 255% и 255°C, но я не смог достоверно повторить это.
Для проводки: S к контакту, + к 5В, - к GND
Примечание. Я испробовал все аналоговые контакты и "обычные" контакты, поэтому код может обозначать что-то другое на моем изображении. При тестировании я трижды проверил правильность сигнального контакта в коде для моей конфигурации проводки. Я также пробовал с другим Arduino с тем же результатом. Я новичок в этом, но код в значительной степени копипаст, и есть только 3 провода. Я читал, что существует много библиотек DHT, поэтому я думаю, что моя проблема как-то связана с этим, но я понятия не имею, как судить о том, подходит ли библиотека для моего приложения.
[[[[[[[[[[[[p
@sumbody32point5, 👍1
Обсуждение2 ответа
Подключите датчик, как показано на этой схеме (включая резистор 10 кОм!):
Обратите внимание на пустой разъем напротив подключаемого модуля макетной платы.
и используйте следующий тестовый скетч с этой библиотекой:
// Пример тестового скетча для датчика влажности/температуры DHT
#include "DHT.h"
#define DHTPIN 4 // Цифровой контакт, подключенный к датчику DHT
#define DHTTYPE DHT11 // DHT 11
// Подключаем контакт 1 (левый) датчика к +5В
// ПРИМЕЧАНИЕ. При использовании платы с логикой 3,3 В, такой как Arduino Due, подключите контакт 1 к 3,3 В вместо 5 В!
// Подключите контакт 2 датчика к вашему DHTPIN
// Подключите контакт 4 (справа) датчика к ЗАЗЕМЛЕНИЮ
// Подключите резистор 10K от контакта 2 (данные) к контакту 1 (питание) датчика
// Инициализировать датчик DHT.
// Обратите внимание, что более ранние версии этой библиотеки принимали необязательный третий параметр для
// настроить тайминги для более быстрых процессоров. Этот параметр больше не нужен
// поскольку текущий алгоритм чтения DHT настраивается для работы с более быстрыми процессами.
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("DHTxx test!"));
dht.begin();
}
void loop() {
// Подождите несколько секунд между измерениями.
delay(2000);
// Чтение температуры или влажности занимает около 250 миллисекунд!
// Показания датчика также могут быть «старыми» до 2 секунд (это очень медленный датчик)
float h = dht.readHumidity();
// Чтение температуры в градусах Цельсия (по умолчанию)
float t = dht.readTemperature();
// Чтение температуры в градусах Фаренгейта (isFahrenheit = true)
float f = dht.readTemperature(true);
// Проверяем, не завершились ли какие-либо операции чтения, и выходим досрочно (чтобы повторить попытку).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Расчет теплового индекса в Фаренгейтах (по умолчанию)
float hif = dht.computeHeatIndex(f, h);
// Расчет теплового индекса в градусах Цельсия (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}
2 проблемы: 1.) Код выдает «ошибка компиляции для платы Arduino» (полное сообщение об ошибке внизу) 2.) У меня есть только 3 контакта для подключения, а не четыре. Должен ли я попробовать резистор на сигнальный контакт? Технический паспорт https://www.velleman.eu/downloads/29/vma311_a4v01.pdf Полный код ошибки, @sumbody32point5
В файле из LIBRARY LOCATION/DHT_sensor_library-1.3.8/DHT_U.cpp:15:0: LIBRARY LOCATION/DHT_U.h:36:10: фатальная ошибка: Adafruit_Sensor.h: нет такого файла или каталога #include <Adafruit_Sensor.h> ^~~~~~~~~~~~~~~~~~~~ компиляция прекращена. статус выхода 1 Ошибка компиляции для платы Arduino Uno., @sumbody32point5
@ sumbody32point5, вы видите какой-нибудь резистор на коммутационной плате датчика? Если нет, то добавьте единицу между signal и Vcc., @Sim Son
Вам нужна дополнительная библиотека, установленная по запросу — прочитайте сообщение об ошибке: Adafruit_Sensor.h: Нет такого файла или каталога. Добавьте библиотеку Adafruit_Sensor. Установите ее с помощью IDE через диспетчер библиотек., @Codebreaker007
@ Codebreaker007 Извините, что это было глупо с моей стороны - получил библиотеку. Вывод теперь «Тест DHTxx! Не удалось прочитать с датчика DHT!» На плате есть резистор, так что не думаю, что дело в нем. Чтобы быть уверенным, я измерил сопротивление между VCC и линией передачи данных и получил около 10 кОм. Я использую контакт 4, как в вашем коде, и пробовал другие контакты. Я получил одно чтение, в котором вывод был «Чтение с датчика DHT» (одна единственная строка), но затем он вернулся к «Не удалось прочитать с датчика DHT». Есть ли способ использовать мультиметр, чтобы проверить, все ли работает?, @sumbody32point5
также я измерил 0,13 мА в сигнальном проводе, поэтому я подумал, что это означает, что данные отправляются, @sumbody32point5
Если ваш датчик припаян к печатной плате, это может быть капля холодного припоя или несоединяющийся контакт на макетной плате. Вы можете попробовать провести сигнальный провод напрямую к датчику и проверить. Если это работает, проверьте пайку или контактные соединения. Неисправный датчик - это наименьшее возможное решение., @Codebreaker007
Я думаю, что это может быть так - я не мог получить реальное показание, но вывод изменился с «не удалось прочитать датчик DHT» на «тест DHTxx!» но затем вернулся к исходному выводу. Датчики довольно дешевы - я мог бы получить второй, попробовать ту же конфигурацию, и, если она сработает, попробовать перепаять оригинал (я предполагаю, что, вероятно, все испорчу). Я очень ценю вашу помощь и терпение @codebreaker., @sumbody32point5
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Есть ли на вашей плате DHT11 подтягивающий резистор? Для вывода данных требуется подтягивающий резистор (подойдет 4,7 кОм) до 5 В., @hcheung
Вы пробовали другую библиотеку, чтобы исключить проблемы с оборудованием?, @StarCat