Arduino MKR1000 и DHT11 не дают правильного вывода для температуры и влажности

Я пытался следовать этому учебнику, чтобы подключить Arduino MKR1000 к датчику температуры и влажности DHT11, но мой выход состоит из 0 или 255 для обоих значений. Я пробовал несколько различных схем проводов, но ни один, кажется, не работает. Вот моя текущая настройка:

И вот мой код:

// Примерный тестовый скетч для различных датчиков влажности/температуры DHT

#include "DHT.h"

#define DHTPIN A0     // к какому цифровому контакту мы подключены; МОЖЕТ БЫТЬ ПРОБЛЕМА

// Раскомментируйте любой тип, который вы используете!
#define DHTTYPE DHT11
//#define DHTTYPE DHT22
//#define DHTTYPE DHT21

// Подсоедините контакт 1 (слева) датчика к +5 В
// ПРИМЕЧАНИЕ: Если вы используете плату с логикой 3,3 В, например Arduino Due, подключите вывод 1
// до 3,3 В вместо 5 В!
// Подсоедините контакт 2 датчика к любому вашему DHTPIN-контакту
// Подсоедините контакт 4 (справа) датчика к ЗАЗЕМЛЕНИЮ
// Подсоедините резистор 10K от контакта 2 (данные) к контакту 1 (питание) датчика

// Инициализировать датчик DHT.
// Обратите внимание, что более старые версии этой библиотеки использовали необязательный третий параметр для
// настройки таймингов для более быстрых процессоров.  Этот параметр больше не нужен
// поскольку текущий алгоритм чтения DHT настраивается на работу с более быстрыми процессами. (DHTPIN, DHTTYPE);

void setup() {
    Serial.begin(9600);
    Serial.println("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("Failed to read from DHT sensor!");
        return;
    }

    // Вычислить индекс тепла в градусах Фаренгейта (по умолчанию)
    float hif = dht.computeHeatIndex(f, h);
    // Вычислить тепловой индекс в градусах Цельсия (isFahreheit = false)
    float hic = dht.computeHeatIndex(t, h, false);

    Serial.print("Humidity: ");   Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print(f);
    Serial.print(" *F\t");
    Serial.print("Heat index: ");
    Serial.print(hic);
    Serial.print(" *C ");
    Serial.print(hif);
    Serial.println(" *F");
}

А вот схема Arduino MKR1000:

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

ОБНОВЛЕНИЕ: Вот моя настройка с 2 10k резисторами параллельно добавлена:

, 👍1

Обсуждение

1. Отформатируйте код, пожалуйста. 2.Is ваша связь с правлением надежна? Это выглядит не очень хорошо., @smajli

Вы только что просунули провода через отверстия на Arduino? Это ненадежное соединение. Штифты слишком узкие (или отверстия слишком широкие), чтобы обеспечить плотный контакт. Попробуйте припаять соединения к Arduino., @Wirewrap

@Wirewrap Я думал об этом, но он прекрасно работает с другими датчиками., @Spencer Goff


1 ответ


0

У меня идентичный датчик, так что у меня есть для вас два предложения.

  1. Я не вижу подтягивающего резистора 5 тысяч Ом ни на одной из загруженных вами фотографий. Вы могли бы сначала попробовать добавить его и посмотреть, решит ли это проблему.

  1. Существует несколько версий библиотеки DHT11 для Arduino. Это то, что сработало для меня: https://github.com/adidax/dht11. Взгляните на этот ответ для примера скетча: Датчик DHT11 Arduino Uno не смог считывать данные с датчика DHT.

Обновление: Подключите линию передачи данных датчика к цифровому контакту 3 на вашем Arduino MKR1000.

// в линии передачи данных используется подтягивающий резистор 5 Ком.
// Датчик работает при 5 В постоянного тока.
// Линия передачи данных подключается к контакту Arduino Uno 3.

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 3

// Калибровка датчика. Начните с 0 для каждого.
const int HumidityCorrection = -10;          // -10 сработало с моим датчиком.
const int CelsiusTemperatureCorrection = 2;  // 2 работал с моим датчиком.

const float FahrenheitTemperatureCorrection = CelsiusTemperatureCorrection * 1.8;

// Обновлять последовательный дисплей каждые 60 секунд.
const float UpdateSerialDisplay = 60000;

// Преобразование по Цельсию в Фаренгейт.
double Fahrenheit(double celsius){
  return 1.8 * celsius + 32;
}

void setup(){
  Serial.begin(9600);
  // Минимальное рекомендуемое время ожидания хороших данных-1 секунда.
  delay(2000);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
}

void loop(){
  Serial.println("");
  int chk = DHT11.read(DHT11PIN);
  switch(chk){
    case DHTLIB_OK: 
      //Serial.println("OK"); 
      break;
    case DHTLIB_ERROR_CHECKSUM: 
      Serial.println("Read sensor: Checksum error"); 
      break;
    case DHTLIB_ERROR_TIMEOUT: 
      Serial.println("Read sensor: Time out error"); 
      break;
    default: 
      Serial.println("Read sensor: Unknown error"); 
      break;
  }

  Serial.print("Humidity: ");
  Serial.print("\t");
  Serial.print(DHT11.humidity + HumidityCorrection);
  Serial.println(" %");

  Serial.print("Temperature: ");
  Serial.print("\t");
  Serial.print(DHT11.temperature + CelsiusTemperatureCorrection);
  Serial.println(" C");

  Serial.print("Temperature: ");
  Serial.print("\t");
  Serial.print(round(Fahrenheit(DHT11.temperature) + FahrenheitTemperatureCorrection));
  Serial.println(" F");

  delay(UpdateSerialDisplay);
}
,

1. Хорошо, у меня есть резистор 5k и я поставил его на линии между контактами 1 и 2 на DHT11. Никаких изменений. Это то, куда я должен его положить? Не совсем уверен, как прочитать диаграмму, которую вы опубликовали. Я обновлю исходный вопрос с помощью этой новой договоренности., @Spencer Goff

2. Я попробовал этот скетч с помощью библиотеки, которую вы рекомендовали, и получил множество ошибок. Я с радостью опубликую эти ошибки, если будет похоже, что моя проводка подходит., @Spencer Goff

@Спенсер Гофф Резистор находится в нужном месте, но это 10к Ом, а не 5к Ом. Добавьте еще один параллельно. Диаграмма, которую я опубликовал, взята из спецификации DHT11: http://www.micropik.com/PDF/dht11.pdf. Я обновлю свой ответ скетчем, чтобы проверить датчик. Скетч будет работать ТОЛЬКО с этой библиотекой: https://github.com/adidax/dht11., @VE7JRO

Ладно, спасибо за скетч. Тогда я попробую найти пару 10 резисторов завтра., @Spencer Goff

Я добавил два параллельных резистора по 10 К (как показано в обновленном вопросе), но я получаю вывод с надписью "Не удалось прочитать с датчика DHT!", @Spencer Goff

@Spencer Goff Это сообщение об ошибке поступает из вашего скетча (в разделе"И вот мой код:"). Попробуйте датчик со скетчем, который я предоставил, используя 2 библиотечных файла, найденных здесь: https://github.com/adidax/dht11. У меня идентичный датчик, и он работает с моим тестовым скетчем и этими 2 библиотечными файлами., @VE7JRO

Хорошо, вот мой вывод сейчас @VE7JRO : ТЕСТОВАЯ ПРОГРАММА DHT11 ВЕРСИЯ БИБЛИОТЕКИ: 0.4.1 Датчик считывания: Ошибка времени ожидания Влажность: -10 % Температура: 2 С Температура: 36 F `, @Spencer Goff

@Спенсер Гофф Значения, которые вы получаете (-10% и 2 ° C), являются "Значениями калибровки датчика", которые работали с моим датчиком. Вы можете установить переменные "Коррекция влажности" и "Коррекция температуры по Цельсию" равными 0. Это не решит проблему, поэтому следующее, что нужно сделать, - убедиться, что провод передачи данных подключен к цифровому контакту 3 (на вашем рисунке показано, что он подключен к A0), и убедиться, что все ваши подключения к источнику питания и заземлению в порядке. Если у вас есть доступ к осциллографу, вы можете отслеживать сигнал, поступающий от датчика, и сравнивать его с техническими данными., @VE7JRO

Да, я это заметил. Я попробовал ваши предложения по вводу, а также изменил #define DHT11PIN на другие контакты, но безуспешно. Я думаю, у меня просто плохой датчик. Спасибо за вашу помощь, хотя, возможно, когда-нибудь я получу новый датчик., @Spencer Goff