Подключение 2х датчиков DHT11 к mega

Slavaiz
Offline
Зарегистрирован: 10.02.2017

Доброго времени суток всем, помогите пожалуйста разобраться с кодом. Не получается прописать скейч для одновременной работы 2х датчиков dht11 и вывод показателей на 2004А I2C. Плата arduino Mega.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Выкладывайте что есть

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

Mr.Privet пишет:

Выкладывайте что есть

я запретил.

Slavaiz
Offline
Зарегистрирован: 10.02.2017

Пока есть рабочий код на один датчик : 

//Тестировалось на Arduino IDE 1.0.5
#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 4      // Датчик DHT11 подключен к цифровому пину номер 4
 
byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};    
 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);   // Задаем адрес и размерность дисплея
 
void setup()
{
  lcd.begin(20,4);                  // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
                                    // Создаем символ под номером 1
}
 
void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("H=  % ");     // Выводим текст
  lcd.setCursor(2, 0); 
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("T=  C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(2, 1);             
  lcd.print(DHT.temperature,1);  
 
  int chk;    
  ; // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:  
    lcd.clear(); 
    lcd.print("Checksum error");  
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear(); 
    lcd.print("Time out error");
    break;
  default:
    lcd.clear(); 
    lcd.print("Unknown error");
    break;
  }
  delay(1000);                     
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Mr.Privet пишет:

Выкладывайте что есть

Так сказано же - "не получается". Если бы что-то было, а так ... сами выкладывайте как надо :)

Slavaiz
Offline
Зарегистрирован: 10.02.2017

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Slavaiz пишет:

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

Вы так в этом уверены? Не много же Вы знаете о программировании.

А пока, изучите вот это и выложите код как положено.

Slavaiz
Offline
Зарегистрирован: 10.02.2017

Да, я только осваиваю программирование и на этом сайте недавно.

//Тестировалось на Arduino IDE 1.0.5
#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 4      // Датчик DHT11 подключен к цифровому пину номер 4
 
byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};    
 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);   // Задаем адрес и размерность дисплея
 
void setup()
{
  lcd.begin(20,4);                  // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
                                    // Создаем символ под номером 1
}
 
void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("H=  % ");     // Выводим текст
  lcd.setCursor(2, 0); 
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("T=  C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(2, 1);             
  lcd.print(DHT.temperature,1);  
 
  int chk;    
  ; // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:  
    lcd.clear(); 
    lcd.print("Checksum error");  
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear(); 
    lcd.print("Time out error");
    break;
  default:
    lcd.clear(); 
    lcd.print("Unknown error");
    break;
  }
  delay(1000);                     
}

 

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

ЕвгенийП пишет:

Slavaiz пишет:

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

Вы так в этом уверены? Не много же Вы знаете о программировании.

А пока, изучите вот это и выложите код как положено.

истинные слова, при переходе с ШИМ на ЦАП проще было всё с нуля переписать и, код как бы в два раза сократился )))

Никогда не делал, но попробовал бы так:
 

dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 4      // Датчик DHT11 подключен к цифровому пину номер 4
dht11 DHT1;               // Объявление переменной класса dht11
#define DHT11_1_PIN 5     // 2 Датчик DHT11 подключен к цифровому пину номер 5

 

Slavaiz
Offline
Зарегистрирован: 10.02.2017

А как вывести на экран показания датчиков ? 

На этот каод выдаёт ошибку

#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;                             // Объявление переменной класса dht11
#define DHT11_PIN 4         // Датчик DHT11 №1 подключен к цифровому пину номер 4
dht11 DHT1;                           // Объявление переменной класса dht11
#define DHT11_1_PIN 5     // Датчик DHT11 №2 подключен к цифровому пину номер 5

byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};    
 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);   // Задаем адрес и размерность дисплея

void setup()
{
  lcd.begin(20,4);                  // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
                                    // Создаем символ под номером 1
}

void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("H=  % ");              // Выводим текст
  lcd.setCursor(2, 0); 
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("T=  C ");            // Выводим текст, 
  lcd.setCursor(2, 1);             
  lcd.print(DHT.temperature,1);  

   lcd.setCursor(0, 2);              // Устанавливаем курсор в начало 3 строки
  lcd.print("H=  % ");              // Выводим текст
  lcd.setCursor(2, 2); 
  lcd.print(DHT1.humidity, 1);
  lcd.setCursor(0, 3);              // Устанавливаем курсор в начало 4 строки
  lcd.print("T=  C ");              // Выводим текст, 
  lcd.setCursor(2, 3);             
  lcd.print(DHT1.temperature,1); 

  int chk;     // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);        // Чтение данных 1го датчика 
  chk = DHT.read(DHT11_1_PIN5);   // Чтение данных 2го датчика 


  
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:  
    lcd.clear(); 
    lcd.print("Checksum error");  
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear(); 
    lcd.print("Time out error");
    break;
  default:
    lcd.clear(); 
    lcd.print("Unknown error");
    break;
  }
  delay(1000);                     
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Эта конструкция точно неправильная!

Во первых название пина для второго датчика,
во вторых, наверное переменных надо две chk и chk1
тогда и блоков проверки надо два, или если оставить одну переменную, считали с первого датчика, проверям, считали со второго датчика, проверяем
А интернет пишет, что между чтениями датчиков должно пройти не менее 2 секунд, а что в описании на вашу библиотеку, кстати какую именно используете?
 

int chk;     // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);        // Чтение данных 1го датчика 
  chk = DHT.read(DHT11_1_PIN5);   // Чтение данных 2го датчика 

 

YaFikus
Offline
Зарегистрирован: 20.02.2017

Мб поможет кому. Делал метеостанцию на 2 DTH11. + датчик света с дискретным выходом на отключение подсветки ночью.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

#include "DHT.h"
#define DHTPIN 2  // Номер пина к которому подкл. датчик 1
#define DHTPIN2 4 // Номер пина к которому подкл. датчик 2
DHT dht(DHTPIN, DHT11);    // Инициализируем датчик 1
DHT dht2(DHTPIN2, DHT11);  // Инициализируем датчик 2

int inPin = 7;                   // датчик света на входе 7
int val = 0;                     // переменная для хранения значения

byte simvol[8] = {   //кодируем символ градуса
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};

void setup()
{
 
  pinMode(inPin, INPUT);         //  устанавливает режим работы - вход для 7го вход/выхода (pin)
  lcd.init();                     
  lcd.createChar(1, simvol);    // добавляем символ дисплею
}
void loop()
{
 delay(2000); // 2 секунды задержки
 val = digitalRead(inPin);      // считываем значение с входа датчика света
 if (val == LOW) lcd.backlight();
 else lcd.noBacklight();

 
  float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  float h2 = dht2.readHumidity(); //Измеряем влажность
  float t2 = dht2.readTemperature(); //Измеряем температуру

  
  lcd.setCursor(0, 0);
  lcd.print("In:        ");
  lcd.setCursor(5, 0);
  lcd.print(t, 0);
  lcd.setCursor(7, 0);
  lcd.print(char(1));
  lcd.setCursor(8, 0);
  lcd.print("C");
  lcd.setCursor(10, 0);
  lcd.print(h, 0);
  lcd.setCursor(12, 0);
  lcd.print(" %  ");
  
  lcd.setCursor(0, 1);
  lcd.print("Out:        ");
  lcd.setCursor(5, 1);
  lcd.print(t2, 0);
  lcd.setCursor(7, 1);
  lcd.print(char(1));
  lcd.setCursor(8, 1);
  lcd.print("C");
  lcd.setCursor(10, 1);
  lcd.print(h2, 0);
  lcd.setCursor(12, 1);
  lcd.print(" %  ");

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
byte simvol[8] = {   //кодируем символ градуса
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};

мошт, я тебя удивлю, канеш, но в китайском LCD1602, есть символ градуса, его код 0xDF.

	Screen.setCursor(0, 1);
	Screen.printf("Left side: %d%cC", glbTemperature, 0xDF);

 

YaFikus
Offline
Зарегистрирован: 20.02.2017

Буду знать теперь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:
в китайском LCD1602, есть символ градуса
Так там поди градус какого-нить Цельсия, а нам-то по Траллесу надобно :-)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

 а нам-то по Траллесу надобно :-)

Я до таких градусов еще не допился. У меня простые.