DHT11 датчик температуры и влажности

t1000
Offline
Зарегистрирован: 27.04.2011

Кто-то ставил себе такие? Поделитесь опытом 

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Я не ставил, но тоже к нему присматривался в рамках идеи автоматизации небольшой любительской гидропонной установки. Так что любая инфа интересна. Я так понимаю там до 20 метров можно линию делать. И есть готовый класс для общения с датчиком http://arduino.cc/playground/Main/DHT11Lib

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

так есть теперь и у меня такая штука, с чего начать копать огород? В виде готового сенсора от дфробота.

Из железа оригинальная мега2560 на ней висит сенсор шилд от дфробота. 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

 Подключил, всё заработало. Там главное быть внимательным. Теперь буду встраивать всё это дальше) Этот датчик явно не для UNO размер тестового скетча вышел почти 8кБ

NooBAsTiK
Offline
Зарегистрирован: 16.09.2011

А можете нарисовать как подсоеденять все это хозяйство и если можно что бы МК регулировала обороты вентилятора в зависимости от влажности?!

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Arduino ULN2003 motor в google даст много схем включения простых кулеров. Какая мощность вентилятора, нужна ли регулировка частоты вращения? А вообще есть библиотека которая выдаёт значения температуры и влажности. Подставляете эти значения в код программы для управления мотором через ШИМ ардуино. А там уже ваша фантазия и потребности

NooBAsTiK
Offline
Зарегистрирован: 16.09.2011
Zveruga
Offline
Зарегистрирован: 29.09.2011

Adessit пишет:

так есть теперь и у меня такая штука, с чего начать копать огород? В виде готового сенсора от дфробота.

А где и по чем брали?

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

10$ брал под заказ, если надо то могу помочь, если с Украины вы Zveruga

Zveruga
Offline
Зарегистрирован: 29.09.2011

Adessit пишет:

10$ брал под заказ, если надо то могу помочь, если с Украины вы Zveruga

Да, Киев (пользуясь случаем привет Одессе-маме)

maus
Offline
Зарегистрирован: 10.01.2012

 Киеву привет ... а что ты с ним (датчиком) делаешь? я пока в размышлениях на тему умного дома ...

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

Ставил, датчик часто выдаёт ошибки а так норм, лучше dht 22 бери

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

Да бывает у него такое зато стоит меньше бакса за шт. Там у него есть контрольная сумма - я использовал библиотеку которая только когда все ОК обновляет показания. Для выносного варианта самое то, потому что шина цифровая.

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

NeiroN пишет:

Да бывает у него такое зато стоит меньше бакса за шт. Там у него есть контрольная сумма - я использовал библиотеку которая только когда все ОК обновляет показания. Для выносного варианта самое то, потому что шина цифровая.

А не могли бы вы кинуть ссылку на библиотеку и скетч?

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

Вот мой тестовый скетч  Вебсервер на ENC28J60+2xDHT11+AnalogIN

/*
 * Arduino ENC28J60 Ethernet shield DHCP client test
 */

#include <EtherShield.h>
#include <DHT11.h>

// Please modify the following lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
// how did I get the mac addr? Translate the first 3 numbers into ascii is: TUX
static uint8_t mymac[6] = { 
  0x54,0x55,0x58,0x12,0x34,0x56 };
static uint8_t myip[4] = { 
  192,168,0,2 };
static uint8_t mynetmask[4] = { 
  255,255,255,0 };

// Default gateway. The ip address of your DSL router. It can be set to the same as
// websrvip the case where there is no default GW to access the 
// web server (=web server is on the same lan as this host) 
static uint8_t gwip[4] = { 
  192,168,0,1};

static uint8_t dnsip[4] = { 
  192,168,0,1 };
static uint8_t dhcpsvrip[4] = { 
  0,0,0,0 };

#define DHCPLED 13

// listen port for tcp/www:
#define PORT 80

#define BUFFER_SIZE 1023
static uint8_t buf[BUFFER_SIZE+1];

EtherShield es=EtherShield();
DHT11 s1(8);
DHT11 s2(9);

boolean link;
uint8_t state;
uint16_t reup;
uint16_t time;
uint16_t delayVal;
uint16_t dat_p;
int dht_s1, dht_s2;

const char http200[] PROGMEM = 
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

const char http404[] PROGMEM =
"HTTP/1.0 404 Not Found\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>404 Page Not Found</h1>";

const char page_index[] PROGMEM =
"<html><head><title>Arduino ENC28J60 Ethernet Shield V1.0</title>\r\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n"
"</head><body>\r\n"
"<h1>Arduino ENC28J60 Ethernet Shield V1.0</h1>\r\n"
"Проверка "
"<a href=\"/analog\">аналоговые входы</a>&nbsp; <a href=\"/dht\">DHT11 датчик</a>\r\n"
"</body></html>";

// themp
uint16_t print_dht(uint8_t *buf, uint16_t plen)
{
  char rbuf[254];
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>Weater</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body>\r\n"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<h1>S1</h1>\r\n"));
  sprintf(rbuf, "<h2>Темпиратура: %d&deg;C<br>Влажность: %d%%</h2>\r\n", s1.getCelsius(), s1.getHumidity());
  plen=es.ES_fill_tcp_data(buf,plen,rbuf);
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<h1>S2</h1>\r\n"));
  sprintf(rbuf, "<h2>Темпиратура: %d&deg;C<br>Влажность: %d%%</h2>\r\n", s2.getCelsius(), s2.getHumidity());
  plen=es.ES_fill_tcp_data(buf,plen,rbuf);
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</body></html>\r\n"));
  return(plen);
  
  
}

// prepare the webpage by writing the data to the tcp send buffer
uint16_t print_analog(uint8_t *buf, uint16_t plen)
{
  char rbuf[254];
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>Analog inputs</title></head><body><table><tr><th>In</th><th>Val</th></tr>\r\n"));
  for(int i=0;i<=15;i++){
    sprintf(rbuf, "<tr><td>%d</td><td>%d</td></tr>\r\n", i, analogRead(i));
    plen=es.ES_fill_tcp_data(buf,plen,rbuf);
  }
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</table></body></html>\r\n"));
  return(plen);
}
void setup() {

  Serial.begin(9600);
  Serial.println("DHCP Client test");
  pinMode( DHCPLED, OUTPUT);
  digitalWrite( DHCPLED, HIGH);    // Turn it off

  for( int i=0; i<6; i++ ) {
    Serial.print( mymac[i], HEX );
    Serial.print( i < 5 ? ":" : "" );
  }
  Serial.println();
  
  delayVal = 1000;
  time = 0;
  reup = 0;
  // Initialise SPI interface
  es.ES_enc28j60SpiInit();

  // initialize enc28j60
  Serial.println("Init ENC28J60");
  es.ES_enc28j60Init(mymac);

  Serial.println("Init done");

  Serial.print( "ENC28J60 version " );
  Serial.println( es.ES_enc28j60Revision(), HEX);
  if( es.ES_enc28j60Revision() <= 0 ) {
    Serial.println( "Failed to access ENC28J60");

    while(1);    // Just loop here
  }
  Serial.print("Link state: ");
  Serial.println(es.ES_enc28j60linkup());
  link = es.ES_enc28j60linkup();
  if (link)state = init_eth();

}

uint8_t init_eth() {
  Serial.println("Requesting IP Address");
  // Get IP Address details
  uint8_t res = es.allocateIPAddress(buf, BUFFER_SIZE, mymac, PORT, myip, mynetmask, gwip, dhcpsvrip, dnsip );
  if(res  > 0 ) {
    // Display the results:
    Serial.print( "My IP: " );
    printIP( myip );
    Serial.println();

    Serial.print( "Netmask: " );
    printIP( mynetmask );
    Serial.println();

    Serial.print( "DNS IP: " );
    printIP( dnsip );
    Serial.println();

    Serial.print( "GW IP: " );
    printIP( gwip );
    Serial.println();
  } 
  else {
    Serial.println("Failed to get IP address");
  }
  es.ES_init_ip_arp_udp_tcp(mymac,myip, PORT);
  return res;
}

// Output a ip address from buffer
void printIP( uint8_t *buf ) {
  for( int i = 0; i < 4; i++ ) {
    Serial.print( buf[i], DEC );
    if( i<3 )
      Serial.print( "." );
  }
}

void loop(){
  if(reup > 10000){
    reup = 0; 
    if(link != es.ES_enc28j60linkup()){
      delayVal = 1000;
      link = es.ES_enc28j60linkup();
      if(link)state = init_eth();
    }
  }
  dht_s1 = s1.update();
  dht_s2 = s2.update();
  // read packet, handle ping and wait for a tcp packet:
  if (link)
    dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));

  /* dat_p will be unequal to zero if there is a valid 
   * http get */
  if(dat_p != 0){
    // tcp port 80 begin
    String data = (char *)&(buf[dat_p]);
    if (data.indexOf("GET / ")!= -1){
      // head, post and other methods:
      dat_p=es.ES_fill_tcp_data_p(buf,0,http200);
      dat_p=es.ES_fill_tcp_data_p(buf,dat_p,page_index);
      goto SENDTCP;
    }
    else if(data.indexOf("/analog ") != -1){
      dat_p=es.ES_fill_tcp_data_p(buf,0,http200);
      dat_p=print_analog(buf,dat_p);
      goto SENDTCP;
    }
    else if(data.indexOf("/dht ") != -1){
      dat_p=es.ES_fill_tcp_data_p(buf,0,http200);
      dat_p=print_dht(buf,dat_p);
      goto SENDTCP;
    }
    else if(data.indexOf("/analog/") != -1){
      int start = data.indexOf("/analog/")+8;
      int fin = data.indexOf(" ",start);
      String in = data.substring(start,fin);
      char value[4];
      sprintf(value,"%d",analogRead(in.toInt()));
      dat_p=es.ES_fill_tcp_data_p(buf,0,http200);
      dat_p=es.ES_fill_tcp_data(buf,dat_p,value);
      goto SENDTCP;
    }
    else{
      //Serial.println(data);
      dat_p=es.ES_fill_tcp_data_p(buf,0, http404);
      goto SENDTCP;
    }
SENDTCP:
    es.ES_www_server_reply(buf,dat_p); // send web page data
    // tcp port 80 end
  }
  reup++;
}

Библиотеки с моего яндекс диска

EtherSheild , DHT11

hugoboss317
Offline
Зарегистрирован: 21.03.2013

DHT11. Показания температуры в целых числах. Можно добавить показания десятых долей?

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

hugoboss317, судя по даташиту нет.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ок, спасибо.

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

В десятых просто нет смысла, потому что у них заявленная точность +- 2 градуса

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, действительно. Как по мне в нём термометр вобще безполезен. У меня он сейчас на монтажной вместе с оттарированым по "далласу" терморезистором. При изменении темперадуры в диапозоне 1,8 -1,9 градуса  DHT11 не реагирует вобще.

dinovasya
Offline
Зарегистрирован: 03.10.2013

твой код не компилируется..

'ethershield'  does not name a type

Как пофиксить?

dinovasya
Offline
Зарегистрирован: 03.10.2013

NeiroN пишет:

Вот мой тестовый скетч  Вебсервер на ENC28J60+2xDHT11+AnalogIN


Библиотеки с моего яндекс диска

EtherSheild , DHT11

При  заходе через браузер на адрес

192.168.0.94 Пишет page not found! как решить?

DHCP Client test
54:55:58:12:34:56
Init ENC28J60
Init done
ENC28J60 version 7
Link state: 1
Requesting IP Address
My IP: 192.168.0.94
Netmask: 255.255.255.0
DNS IP: 217.23.176.1
GW IP: 192.168.0.1
 

dinovasya
Offline
Зарегистрирован: 03.10.2013

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

С ними заработало. только вот к каким пинам подключены сетевуха и датчик ?

разобрался. стандартные пины

Ethernet shield подключен к пинам 10,11,12,13 на UNO. (ну и +5V и земля)

#define ENC28J60_CONTROL_CS 10
#define SPI_MOSI 11
#define SPI_MISO 12
#define SPI_SCK 13

Вот что в мониторе порта выходит:

DHCP Client test
54:55:58:12:34:56
Init ENC28J60
Init done
ENC28J60 version 7
Link state: 1
Requesting IP Address
My IP: 192.168.0.94
Netmask: 255.255.255.0
DNS IP: 217.23.176.1
GW IP: 192.168.0.1
 

Как через веб просмотреть?

192.168.0.94 - page not found

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

Для меги писал. В UNO(Nano) оперативки мало - надо переписывать обработку. Not-found потому что на String нехватает оперативки(он пустой получается) - перепеши чтобы в любом случае отдавал инфу  с датчиков. Я плохо разбираюсь в низкоуровневом программировании, поэтому использовал тот метод парсинга который мне понятнее.

Вообще в самой библиотеке есть примеры.

dinovasya
Offline
Зарегистрирован: 03.10.2013

не верится что под Мегу... к меге данная сетевуха подключается к 51, 52,  50 ,53 контактам вроде и там прерывания надо что-то делать.. яподключалкак-то..

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Датчик очень сильно врет ((( Сам такой использую - лучше другой. В квартире реальная температура 22, он показывается 28.

dinovasya
Offline
Зарегистрирован: 03.10.2013

а у меня такое ощущение что он сточностью 1 градус точно работает.. в теплице отлично температуру держал. диапазон изменения 3 градуса взял.. он всегда точно срабатывал  в течении 3-х месяцев..