ESP32 не может считывать данные с датчиков DHT11, MH-Z19C

Я получил MH-Z19C (CO2 ppm) (техническое описание ) и датчики DHT11 (температуры) с Ebay и следовали онлайн-инструкциям, чтобы установить его с моей платой ESP32 (ESP32). ).

Я использую макетную плату и источник питания 5 В/3,3 В для питания датчиков, а ESP32 подключается к компьютеру через USB.

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

Я также пытался напрямую подключить DHT11 к 3,3 В моей платы, но это ничего не изменило.

Как вы "отлаживаете" аппаратное обеспечение? Нет ли способа узнать, что вы делаете неправильно? Вы должны сделать все правильно, иначе ничего не получится?

Журналы серийного монитора:

0 ppm
Failed to read from DHT sensor

Соединения MH-Z19C:

  • VIN/Земля <-> Блок питания 5В +/- соответственно
  • TX <-> ESP32 RX2
  • Прием <-> ESP32 TX2

Соединения DHT11:

  • Контакт 1 <-> Питание 3,3 В
  • Контакт 2 <-> Подтяжка 10 кОм <-> ESP32 D2
  • Контакт 4 <-> Земля

Ссылка:

  • https://randomnerdtutorials.com/esp32-dht11-dht22-temperature- датчик влажности-arduino-ide/
  • https://www.electroniclinic.com/mh-z19b- ndir-co2-sensor-with-arduino-mhz19b/
  • Распиновка ESP32

Установлены библиотеки:

  • библиотека датчиков DHT от Adafruit
  • MH-Z19 Джонатана Демпси
// Пример тестового скетча для различных датчиков влажности/температуры DHT
// Автор: ladyada, общественное достояние

// ТРЕБУЕТСЯ следующие библиотеки Arduino:
// - Библиотека датчиков DHT: https://github.com/adafruit/DHT-sensor-library
// - Унифицированная библиотека датчиков Adafruit: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"
#include <SoftwareSerial.h>
#include <MHZ19.h>
#include <Wire.h>


// пин для чтения uart
#define RX_PIN 16  // вывод Rx, к которому подключен вывод MHZ19 Tx.
#define TX_PIN 17 // вывод Tx, к которому подключен вывод MHZ19 Rx.

#define DHTPIN 2     // Цифровой контакт, подключенный к датчику DHT
// Feather HUZZAH ESP8266 примечание: используйте контакты 3, 4, 5, 12, 13 или 14 --
// Контакт 15 может работать, но DHT должен быть отключен во время загрузки программы.

#define DHTTYPE DHT11   // DHT 11

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

void setup() {
  Serial.begin(9600);

  // Запуск датчика СО2
  mySerial.begin(9600);                               // (пример Uno) устройство для серийного запуска MH-Z19
  myMHZ19.begin(mySerial);                                // *Ссылка на Serial(Stream) должна быть передана в библиотеку begin().
  myMHZ19.autoCalibration();                              // Включаем автокалибровку (OFF autoCalibration(false))
}


void read_dht() { 
  
  /////// ДАТЧИК DHT \\\\\\
  // Чтение температуры или влажности занимает около 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"));

}

void loop() {
  // Подождите несколько секунд между измерениями.
  delay(5000);

  int CO2;
  // Запрос CO2 (в ppm)
  CO2 = myMHZ19.getCO2();
  Serial.println(String(CO2) + " ppm");

  read_dht();
}

MH-Z19C с Ebay Выводы MH-Z19C Выводы DHT11 проводка dht11

, 👍1

Обсуждение

тестируйте только один датчик за раз... используйте пример кода в библиотеке, @jsotola

Пробовал по одному датчику. Я посмотрю пример библиотеки., @Adam Cherti

Вам не нужно использовать SoftwareSerial для MH-Z19. Вы можете использовать второй встроенный аппаратный последовательный порт Serial2., @StarCat

В вашем setup() нет dht.begin(), поэтому ваш DHT11 никогда не инициализируется должным образом. Посмотрите на пример кода, например здесь: [https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino](https://github.com/adafruit/DHT -sensor-library/blob/master/examples/DHTtester/DHTtester.ino)., @StarCat

На самом деле я сейчас использую dht.begin(), но при копировании/редактировании кода в SO он потерялся. К сожалению, я также безуспешно пытался использовать HardwareSerial., @Adam Cherti


1 ответ


1

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

Как выполнить "отладку" аппаратное обеспечение? Нет ли способа узнать, что вы делаете не так? Вы должны сделать все правильно, иначе ничего не получится?

Нет, это слишком сложно. Мне нравится разделяй и властвуй и последовательно тестировать.

Как уже упоминалось, тестируйте один датчик за раз.

Чтобы проиллюстрировать это, я разобрал старые ESP32 и DHT22 и приступил к их подключению в соответствии с вашим примером.

Вот соединения:

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

Просматривая код, я убеждаюсь, что в нем указано:

#define DHTPIN 2     // Цифровой контакт, подключенный к датчику DHT.
#define DHTTYPE DHT22   // DHT 22 (AM2302), AM2321

и дважды проверяю правильность подключения. Как видите, у меня есть подтягивающий резистор на линии передачи данных.... +3,3 В с одной стороны резистора, а другая сторона идет к выводу данных DHT и к выводу ESP GPIO2 (см. картинки?) .

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

Humidity: 32.40%  Temperature: 23.40°C 74.12°F  Heat index: 22.64°C 72.75°F
Humidity: 32.70%  Temperature: 23.30°C 73.94°F  Heat index: 22.54°C 72.57°F
Humidity: 33.30%  Temperature: 23.30°C 73.94°F  Heat index: 22.55°C 72.60°F
Humidity: 34.10%  Temperature: 23.30°C 73.94°F  Heat index: 22.58°C 72.64°F
Humidity: 34.30%  Temperature: 23.30°C 73.94°F  Heat index: 22.58°C 72.65°F

...и если я дышу на датчик, правая влажность подскакивает....выглядит хорошо.

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

Если я могу заставить что-то работать, тогда я должен начать подозревать DHT - у меня есть что-то еще для тестирования?... и так далее и тому подобное.

Затем я повторил бы тот же процесс с датчиком CO2.

Тогда я бы попытался использовать их оба одновременно.

Надеюсь, это поможет.

,

Таким образом, я в основном воспроизвел вашу настройку точно так же, как с DHT и резистором, соединяющим PIN-код с 3,3 В, так же, как и вы. Я все еще получаю температуру 0,00°C и влажность 0,00%, так что он получает показания, не сбоит, но показание всегда равно 0, очень странно. Я это знаю, потому что если я отсоединяю провода, то получаю "ошибка при считывании температуры", "ошибка при считывании влажности". также следовал этому [примеру](https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino), чтобы получить информацию о датчиках, и он печатает версию драйвера и диапазон в порядке., @Adam Cherti

Завтра выложу фото с проводами., @Adam Cherti

Ок добавил фото., @Adam Cherti

Интересно, ваш dht11 был поврежден раньше? Если бы у вас был известный хороший, это было бы очень полезно., @DrG

Насколько мне известно, нет. Я никогда не использовал его раньше. Если честно, меня больше интересует датчик MH-Z19C. Я выполнил некоторые действия по устранению неполадок, следуя этому [примеру "кодов ошибок"](https://github.com/WifWaf/MH-Z19/tree/master/examples/ErrorCodes) из библиотеки, и мне кажется, что код ошибки 3 , что означает «Полученные данные не соответствуют ожидаемому обычному синтаксису»., @Adam Cherti