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, поэтому я думаю, что моя проблема как-то связана с этим, но я понятия не имею, как судить о том, подходит ли библиотека для моего приложения.

Порядок контактов = S, +, - Моя проводка[[[[[[[[[[[[p

, 👍1

Обсуждение

Есть ли на вашей плате DHT11 подтягивающий резистор? Для вывода данных требуется подтягивающий резистор (подойдет 4,7 кОм) до 5 В., @hcheung

Вы пробовали другую библиотеку, чтобы исключить проблемы с оборудованием?, @StarCat


2 ответа


0

Подключите датчик, как показано на этой схеме (включая резистор 10 кОм!): Датчик DHT к UNO
Обратите внимание на пустой разъем напротив подключаемого модуля макетной платы. и используйте следующий тестовый скетч с этой библиотекой:

// Пример тестового скетча для датчика влажности/температуры 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


1

В функцию setup() необходимо добавить следующую строку кода:

 dht.begin();
,