Как подключить два датчика DHT22

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Здравствуйте.

 

Подскажите каким образом можно считывать информацию с двух датчиком DHT22 на Arduini UNO R3. Насколько я понял каждый датчик подключается к своему пину. Вопро в том как прописать это в коде?

Я прописываю каждый датчик на свой пин 2 и 3 и объявляю две переменных dhta и dhtb. Правильно ли будет сделать так?:

#include "DHT.h"

#define DHTPINa 2     // what pin we're connected to
#define DHTPINb 3     // what pin we're connected to

// Uncomment whatever type you're using!

#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dhta(DHTPINa, DHTTYPE);
DHT dhtb(DHTPINb, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float ha = dhta.readHumidity();
  float ta= dhta.readTemperature();

float hb = dhtb.readHumidity();
  float tb= dhtb.readTemperature();

 

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Оказываетс явсе раскурено до нас.

http://arduino.ru/forum/programmirovanie/6-datchikov-dht11-na-odnom-pine

Lakomich
Offline
Зарегистрирован: 13.06.2014

подключение двух датчиков DHT22 AM2302

с выводом значений в порт..   задействованы пин 5 и пин 6  , можно брать любые , у меня мега2560

показывают температуру почти одинаковую)))  разница в 0.4 градуса

 

#include <dht.h>

dht DHT;

#define DHT22a_PIN 5
#define DHT22b_PIN 6

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.print("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  Serial.println("   datchika");
}

void loop()
{
  // READ DATA
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22a_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
   
 
 
  // DISPLAY DATA
 
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t\t");
  Serial.print(DHT.temperature, 1);
  Serial.println("           temp1 ");


 


  // READ DATA  второй датчик!!!
  Serial.print("DHT22, \t");
  int chk2 = DHT.read22(DHT22b_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
  
  // вывод в порт значений с датчика2 - "temp2"

  Serial.print(DHT.humidity, 1);
  Serial.print(",\t\t");
  Serial.print(DHT.temperature, 1);
  Serial.println("         temp2  ");

  delay(3000);// задержка 3сек
  
  
  

}

 

xedoss
Offline
Зарегистрирован: 16.07.2014

Здравствуйте, столкнулся с такой проблемой делаю вычитку датчиков в основном цикле loop у меня 3 датчика DHT22 время которое затрачиваться на чтения датчиков приблизительно 500мс и того получаться что полторы секунды читается все датчики в то время задержка влияет на отображения на LCD экране (часы rtc ds1302) секунд и чтения нажатия на аналоговые кнопки. Arduino mega 2560 | LCD key shild

Zmeiy
Offline
Зарегистрирован: 06.09.2014

Здравствуйте, подскажите новичку.

нахватался везде помаленьку, получился такой скетч

Управление влажностью в гараже включением вытяжного вентилятора

Два датчика DHT22 первый в гараже, второй на улице. Не знаю какой параметр нужно вставить чтобы реле вентилятора включалось когда влажность в гараже выше чем на улице(выделил жирным в скетче), но только если влажность в гараже более 50%. И если не трудно, как добавить таймер работы вентилятора(в случае если он не может сбить влажность до нужного уровня) Температура с датчиков пока носит только информационный характер

#include <LiquidCrystal.h> // Библиотека управления экраном 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#include "DHT.h" // Библиотека датчика DHT22 температуры и влажности

 

#define DHTPINa 2     // Считывающий пин с датчика 1

#define DHTPINb 3     // Считывающий пин с датчика 2

#define DHTTYPE DHT22   // DHT 22  (AM2302)

#define hPIN 5 // Пин управления реле вентилятора

DHT dhta(DHTPINa, DHTTYPE); // Создаем объект dhta датчик 1

DHT dhtb(DHTPINb, DHTTYPE); // Создаем объект dhtb датчик 2

 

int hStatus = HIGH; // определяем переменную, отвечающую за состояние реле вентилятора HIGH=выкл, LOW=вкл 

 

void setup() // инициализация основных данных 

dhta.begin(); // Инициализируем датчик 1

dhtb.begin(); // Инициализируем датчик 2

pinMode(hPIN, OUTPUT); 

lcd.begin(16,2); // устанавливаем размеры экрана 

void loop() // зацикливание (код управляющей программы) 

float ha = dhta.readHumidity(); // Считываем влажность датчика 1

float hb = dhtb.readHumidity(); // Считываем влажность датчика 2

float ta = dhta.readTemperature(); // Считываем температуру датчика 1

float tb = dhtb.readTemperature(); // Считываем температуру датчика 2

if (ha < hb ) hStatus = HIGH; else hStatus = LOW; // Если влажность датчика 1 выше влажности датчика 2 , то статус реле вентилятора=Вкл, в противном случае Выкл 

digitalWrite(hPIN, hStatus); 

 

lcd.setCursor(0,0); // устанавливаем позицию курсора на экране 

lcd.print(ta, 1); lcd.print("C "); lcd.print(ha, 1); lcd.print("%");// Выводим информацию с датчика 1 

lcd.setCursor(0,1);

lcd.print(tb, 1); lcd.print("C "); lcd.print(hb, 1); lcd.print("%");// Выводим информацию с датчика 2 

lcd.setCursor(15,1);lcd.print((hStatus == LOW) ? "*":" "); // Выводим индикатор работы реле вентелятора 

delay(500); // Задержка в пол секунды 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

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

millis()

Radjah
Offline
Зарегистрирован: 06.08.2014

xedoss пишет:

Здравствуйте, столкнулся с такой проблемой делаю вычитку датчиков в основном цикле loop у меня 3 датчика DHT22 время которое затрачиваться на чтения датчиков приблизительно 500мс и того получаться что полторы секунды читается все датчики в то время задержка влияет на отображения на LCD экране (часы rtc ds1302) секунд и чтения нажатия на аналоговые кнопки. Arduino mega 2560 | LCD key shild

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

В итоге и часы нормально "ходят", и показания читаются.

kovden16
Offline
Зарегистрирован: 26.10.2014

Radjah пишет:

xedoss пишет:

Здравствуйте, столкнулся с такой проблемой делаю вычитку датчиков в основном цикле loop у меня 3 датчика DHT22 время которое затрачиваться на чтения датчиков приблизительно 500мс и того получаться что полторы секунды читается все датчики в то время задержка влияет на отображения на LCD экране (часы rtc ds1302) секунд и чтения нажатия на аналоговые кнопки. Arduino mega 2560 | LCD key shild

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

В итоге и часы нормально "ходят", и показания читаются.

 

Подскажите...как это сделать...Как повесить "вывод на таймер"??

Такая же проблема с трёх датчиков DHT22...часы на ЛДС "тормозят"...

Radjah
Offline
Зарегистрирован: 06.08.2014

DHT22 опрашиваются сравнительно долго.

kovden16
Offline
Зарегистрирован: 26.10.2014

Как повесить "вывод на таймер"??

Куда копать? В сторону millis() или... куда..?
avton
avton аватар
Offline
Зарегистрирован: 11.05.2014
Radjah
Offline
Зарегистрирован: 06.08.2014

Так сложно вбить в гугл "arduino timer library"?

Или "новичкам" уже законодательно запрещено использовать мозги?

kovden16
Offline
Зарегистрирован: 26.10.2014

Radjah - ПОШЁЛ НАХУЙ, УМНИК!

kovden16
Offline
Зарегистрирован: 26.10.2014

Законодатель....

kovden16
Offline
Зарегистрирован: 26.10.2014

 

 

ОЧЕНЬ БЛАГОДАРЮ...

Radjah
Offline
Зарегистрирован: 06.08.2014

Вот это бомбануло! %)

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Добрый день! Я уже неделю ковыряюсь в интернете, чтобы понять, можно ли вообще подключить два датчика: но один из них DHT11, а один DHT22. И как? Желательно со скетчем. Ибо я пока чайник. Спасибо!

PS Обещаю не ругаться и не обижаться на критику в мою сторону)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Да - можно, каждый датчик на отдельный вывод.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Мне бы код, или хотя бы начало, как их прописать и какую библиотеку использовать, их несколько и в каких-то надо писать тип датчика, а в каких- то не надо

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Могу вам еще раз скопировать приведенный выше код. Сам подключал два DHT11 - с кодом аналогичным первом сообщении, работали.

Библиотеку эту брал https://yadi.sk/d/rcexdmxadBxXN

Естественно она только для DHT11

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

У меня один 11, а другой 22

Radjah
Offline
Зарегистрирован: 06.08.2014

Есть вот такая еще https://github.com/adafruit/DHT-sensor-library

Тип датчика устанавливается при объявлении.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Тоесть мне надо просто раскомментировать сразу две строки?

woodart
Offline
Зарегистрирован: 07.12.2015

Все здравствуйте!

Подключил таки два разных датчика...

Может пригодится кому.

#include "DHT.h"
#include <PCD8544RUS2.h> // переделанная библиотека дисплея NOKIA 5110 с кирилицей

//#define DHTPIN 2
//#define DHTTYPE DHT22

DHT dht1(2, DHT22);
DHT dht2(8, DHT11);
static PCD8544RUS2 lcd;

void setup() {
  //  Serial.begin(9600);  
  //  Serial.println("DHTxx test!");

  lcd.begin(84, 48);

  dht1.begin();
  dht2.begin();
}

void loop() {

  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();

  if (isnan(t1) || isnan(h1)) {
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Failed to read from DHT1");

    //    Serial.println("Failed to read from DHT");
  }
  else if (isnan(t2) || isnan(h2)) {
    //lcd.clear();
    lcd.setCursor(0, 2);
    lcd.print("Failed to read from DHT2");

    //    Serial.println("Failed to read from DHT");
  }
  else {
    //lcd.clear();
    //-----------------dht 1
    lcd.setCursor(0, 0);
    lcd.print("Влаж1 ");
    lcd.print(h1);
    lcd.print(" %\t");

    lcd.setCursor(0, 1);
    lcd.print("Темп1 ");
    lcd.print(t1);
    lcd.print(" *C");
    //-----------------dht 2
    lcd.setCursor(0, 2);
    lcd.print("Влаж2 ");
    lcd.print(h2);
    lcd.print(" %\t");

    lcd.setCursor(0, 3);
    lcd.print("Темп2 ");
    lcd.print(t2);
    lcd.print(" *C");

    //    Serial.print("Humidity: ");
    //    Serial.print(h);
    //    Serial.print(" %\t");
    //    Serial.print("Temperature: ");
    //    Serial.print(t);
    //    Serial.println(" *C");
  }
}