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 резисторами параллельно добавлена:
@Spencer Goff, 👍1
Обсуждение1 ответ
У меня идентичный датчик, так что у меня есть для вас два предложения.
- Я не вижу подтягивающего резистора 5 тысяч Ом ни на одной из загруженных вами фотографий. Вы могли бы сначала попробовать добавить его и посмотреть, решит ли это проблему.
- Существует несколько версий библиотеки 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
- Датчик температуры MKR1000 и DS18B20
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Сокращение времени считывания показаний датчиков температуры DS18B20.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
1. Отформатируйте код, пожалуйста. 2.Is ваша связь с правлением надежна? Это выглядит не очень хорошо., @smajli
Вы только что просунули провода через отверстия на Arduino? Это ненадежное соединение. Штифты слишком узкие (или отверстия слишком широкие), чтобы обеспечить плотный контакт. Попробуйте припаять соединения к Arduino., @Wirewrap
@Wirewrap Я думал об этом, но он прекрасно работает с другими датчиками., @Spencer Goff