Библиотека DHT11

shurrup
Offline
Зарегистрирован: 06.01.2014

Друзья, есть у кого нормальная библиотека для датчика температуры и влажности DHT11. Многие перепробывал не работают. Одну скачал, код для примера загрузил, все работала, а теперь уже нет. Вот такое выдает 

C:\Program Files\Arduino\libraries\dht\~$dht.cpp:3: error: stray '\20' in program
C:\Program Files\Arduino\libraries\dht\~$dht.cpp:1: error: 'nout' does not name a type
C:\Program Files\Arduino\libraries\dht\~$dht.cpp:3: error: 'l' does not name a type.
 
Или может кто подскажет что не так. Я новичок 
romeo_b
Offline
Зарегистрирован: 08.11.2013

у меня так работает  

 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  

// датчик на аналогый вход 0

#define DHT11_PIN 0 

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)))
    {
    }; 
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i)); 
    while((PINC & _BV(DHT11_PIN)));
  }
  return result;
}


void setup()
{
  lcd.init();                     
  lcd.backlight();
  DDRC |= _BV(DHT11_PIN); 
  PORTC |= _BV(DHT11_PIN); 
}

void loop()
{
  byte dht11_dat[5];
  byte dht11_in;
  byte i;
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN); 
  delayMicroseconds(40);
  dht11_in = PINC & _BV(DHT11_PIN); 
  if(dht11_in)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("1 not met");
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN); //
  if(!dht11_in)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("2 not met");
    return;
  }

  delayMicroseconds(80);
  for (i=0; i<5; i++)
  { 
    dht11_dat[i] = read_dht11_dat();
  } 

    DDRC |= _BV(DHT11_PIN); 
  PORTC |= _BV(DHT11_PIN); 
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
  if(dht11_dat[4]!= dht11_check_sum)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("checksum");
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("HUM");
  lcd.setCursor(5,0);
  lcd.print(dht11_dat[0], DEC);
  lcd.setCursor(10,0);
  lcd.print("%");
  lcd.setCursor(0,1);
  lcd.print("TEMP");
  lcd.setCursor(5,1);
  lcd.print(dht11_dat[2], DEC);
  lcd.setCursor(10,1);
  lcd.print("C");
  delay(2000); 
}

 

romeo_b
Offline
Зарегистрирован: 08.11.2013
shurrup
Offline
Зарегистрирован: 06.01.2014

Спасибо большое за библиотеки! Я тоже нашел одну, загрузил в ардуино тест программу, работает. Попытался переделать под свои нужды, добавил код чтоб реле срабатывала выше какой-то температуры. Не хочет работать, тоесть температуру и влажность показывает чрез монитор порта, а реле молчит. Может кто подскажет, что не так, я совсем только начинаю изучать. Может конечно не много сразу со сложного, но я с пользой для дела

#include "DHT.h"

DHT dht;
int ven = 33;
void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

  dht.setup(A2); // data pin 2
  
}

void loop()
{
  
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity);
  Serial.print("\t\t");
  Serial.print(temperature);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature));
  if (temperature > 30 ) digitalWrite(ven,HIGH);
  else digitalWrite(ven,LOW);
  delay(1000);

}

 

Sauronkin
Offline
Зарегистрирован: 07.01.2014

Помогите люди добрые!!!

Идея такова : сделать в частном доме вентиляцию , для этого использовал dht11 ( в планах подключить 3 датчика ), датчик движения ( для туалета),  реле и естественно вентилятор.

Проблема в том что при подключенном USB  к компу и открытом окне монитора порта все работает!!! Но как только я подключаю внешнее питание ( блок 12 вольт) ардуинка перестает опрашивать датчик dht11 хотя на пир реагирует реле отлично счелкает выдерживает все паузы.

Не судите строго это первая программа .

Вот что смог неимоверными усилиями слепить :

#include <dht.h> 
#define dht_dpin A0 
dht DHT;
//Время калибровки датчика (10-60 сек. по даташиту)
int calibrationTime = 30;
 
//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;
 
//Пауза, после которой движение считается оконченным
long unsigned int pause = 10000;
 
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
 boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;
 
int pirPin = 2;    //вывод подключения PIR датчика
int ledPin = 13;   //вывод сигнального диода
int relayPin = 4;  //реле пин
 
void setup()
{
    Serial.begin(9600);
    delay(300);
    Serial.println("BJLA>I<HOCTb u TEMIIEPATyPA\n\n");
    delay(700);
   
    pinMode(pirPin, INPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(relayPin, OUTPUT);
   
    //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
    digitalWrite(relayPin, HIGH);
    delay(4000);
    digitalWrite(pirPin, LOW);
   
    //дадим датчику время на калибровку
    for(int i = 0; i < calibrationTime; i++)
    {
        //Во время калибровки будет мигать сигнальный диод
        i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
        delay(1000);
    }
    //По окончанию калибровки зажжем сигнальный диод
    digitalWrite(ledPin, HIGH);
    delay(50);
}
 
void loop()
{
 
Label :
    DHT.read11(dht_dpin);
    Serial.print("BJLA>I<HOCTb = ");
    Serial.print(DHT.humidity);
    Serial.print("%  ");
    Serial.print("TEMIIEPATyPA = ");
    Serial.print(DHT.temperature);
    Serial.println("C  ");
    delay(2000);
    if(digitalRead(pirPin) == HIGH)goto label2 ;
    if(DHT.humidity > 45)
    {
        digitalWrite(relayPin, LOW);
        if(DHT.humidity < 45)
        {
            digitalWrite(relayPin, HIGH);
        }
        
        if (digitalRead(relayPin) == LOW)
        {
            goto Label;
        }
    }
 
   //Если обнаружено движение
    if(digitalRead(pirPin) == HIGH)
    {
      label2 : 
        Serial.print("1");
        //Если до этого момента еще не включили реле
        if(lockLow)
        {
            lockLow = false;
            //Включаем реле.
            //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
            digitalWrite(relayPin, LOW);
            delay(50);
            Serial.print("2");
        }
        Serial.print("3");
        takeLowTime = true;
    }
 
    Serial.print("4");
 
    //Ели движения нет
    if(digitalRead(pirPin) == LOW)
    {
        //Если время окончания движения еще не записано
        if(takeLowTime)
        {
            Serial.print("5");
            lowIn = millis();          //Сохраним время окончания движения
            takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
            Serial.print("6");
        }
        //Если время без движение превышает паузу => движение окончено
        Serial.print("7");
        
        if(!lockLow && millis() - lowIn > pause)
        {
            Serial.print("8");
            //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
            lockLow = true;
            digitalWrite(relayPin, HIGH);
            delay(50);
        }
    }
}
shurrup
Offline
Зарегистрирован: 06.01.2014

Разобрался со свом случаем. Забыл определить 33 ножку как выход

ashhabad
Offline
Зарегистрирован: 01.03.2014

shurrup

код пришлось менять?

напиши текст конечного скетча..

 

ashhabad
Offline
Зарегистрирован: 01.03.2014

поясни

 

shurrup
Offline
Зарегистрирован: 06.01.2014
01 #include "DHT.h"
02  
03 DHT dht;
04 int ven = 33;
05 void setup()
06 {
07   Serial.begin(9600);
08   Serial.println();
09   Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
10  
        pinMode(ven, OUTPUT);    //две строки что забыл  определяет 33 вывод дуины как выход//
        digitalWrite(ven, LOW);   //начальный уровень дуины логический ноль//
11   dht.setup(A2); // data pin 2
12   
13 }
14  
15 void loop()
16 {
17   
18   delay(dht.getMinimumSamplingPeriod());
19  
20   float humidity = dht.getHumidity();
21   float temperature = dht.getTemperature();
22  
23   Serial.print(dht.getStatusString());
24   Serial.print("\t");
25   Serial.print(humidity);
26   Serial.print("\t\t");
27   Serial.print(temperature);
28   Serial.print("\t\t");
29   Serial.println(dht.toFahrenheit(temperature));
30   if (temperature > 30 ) digitalWrite(ven,HIGH);
31   else digitalWrite(ven,LOW);
32   delay(1000);
33  
34 }

я правда уже гораздо более сложный забабахал. а ты что делаешь?

ashhabad
Offline
Зарегистрирован: 01.03.2014

Спасибо за пояснения!

Имею:

 Arduino UNO, DHT11, LCD1602 Keypad Shield? релюши http://www.buyincoins.com/item/27801.html

Требуется скетч с выводом температуры на дисплей (желательно при нажатии влево, вправо были показания по разным датчикам А1, А2,А3, и.т.д.)
при превышении Т 80гр. по дному датчику, срабатывает реле N1, при превышении Т по двум датчикам реле N2.

Думаю затея вполне понятная и не сложная, скетчи по отдельности нужных мне функций встречал, и анализирую (мало времени) вот только объединить бы их в конечный код.....

 З.Ы. И тут где то писали как правильно код скетча вставлять в сообщения...

 

 

shurrup
Offline
Зарегистрирован: 06.01.2014

в верхней строке где пишеш сообщения там значок с красными скобками "вставка и редактирование кода"

MacSim
Offline
Зарегистрирован: 28.11.2012
30   if (temperature > 30 ) digitalWrite(ven,HIGH);
31   else digitalWrite(ven,LOW);

Думается мне температура HIGH and LOW должна быть разная, хотяб на градус (у меня в готовом китайском термоконтроллере минимум устанавливается дельта 2 оС). При температуре в около 30  может получится дребезг на ven ноге. Мк будет ей многократно дергать.

if (temp>30) {on;}

if (temp<28) {off;}

MacSim
Offline
Зарегистрирован: 28.11.2012

Вопрос по библеотеке DHT.h

НЕ хочет она работать если я включаю таймер2.

виснет мк в момент чтения температуры, влажности в 20 строке.

Пляски пока не помогли. Дайте бубен :-)

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

Потому что она тоже этот таймер использует. 0 таймер используется для millis, 1 таймер для PWM. Используйте 1 таймер если у вас PWM не используется.

MacSim
Offline
Зарегистрирован: 28.11.2012

Спасибо, буду пробавать.

Правильно ли я понимаю:

У таймера 0 и 1 общий предделитель. В ардуине настроенный на 64. (ATMega328p)

 

MacSim
Offline
Зарегистрирован: 28.11.2012

NeiroN пишет:

0 таймер используется для millis

1 таймер для PWM.

2 dht

А где про это можно почитать?

A не существует ли готовой библиотеки для dht11 без использования таймеров - на задержках.

 

bwn
Offline
Зарегистрирован: 25.08.2014

MacSim пишет:

NeiroN пишет:

0 таймер используется для millis

1 таймер для PWM.

2 dht

А где про это можно почитать?

A не существует ли готовой библиотеки для dht11 без использования таймеров - на задержках.

 

Она вроде и так, в delay()-ях как барбоска в блохах.

MacSim
Offline
Зарегистрирован: 28.11.2012

Она вроде и так, в delay()-ях как барбоска в блохах.

DHT.h :

#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

/* DHT library

MIT license
written by Adafruit Industries
*/

// how many timing transitions we need to keep track of. 2 * number bits + extra
#define MAXTIMINGS 85

#define DHT11 11
#define DHT22 22
#define DHT21 21
#define AM2301 21

class DHT {
 private:
  uint8_t data[6];
  uint8_t _pin, _type;
  boolean read(void);
  unsigned long _lastreadtime;
  boolean firstreading;

 public:
  DHT(uint8_t pin, uint8_t type);
  void begin(void);
  float readTemperature(bool S=false);
  float convertCtoF(float);
  float readHumidity(void);

};

DHT.cpp

/* DHT library

MIT license
written by Adafruit Industries
*/

#include "DHT.h"

DHT::DHT(uint8_t pin, uint8_t type) {
  _pin = pin;
  _type = type;
  firstreading = true;
}

void DHT::begin(void) {
  // set up the pins!
  pinMode(_pin, INPUT);
  digitalWrite(_pin, HIGH);
  _lastreadtime = 0;
}

//boolean S == Scale.  True == Farenheit; False == Celcius
float DHT::readTemperature(bool S) {
  float f;

  if (read()) {
    switch (_type) {
    case DHT11:
      f = data[2];
      if(S)
          f = convertCtoF(f);
          
      return f;
    case DHT22:
    case DHT21:
      f = data[2] & 0x7F;
      f *= 256;
      f += data[3];
      f /= 10;
      if (data[2] & 0x80)
    f *= -1;
      if(S)
    f = convertCtoF(f);

      return f;
    }
  }
  Serial.print("Read fail");
  return NAN;
}

float DHT::convertCtoF(float c) {
    return c * 9 / 5 + 32;
}

float DHT::readHumidity(void) {
  float f;
  if (read()) {
    switch (_type) {
    case DHT11:
      f = data[0];
      return f;
    case DHT22:
    case DHT21:
      f = data[0];
      f *= 256;
      f += data[1];
      f /= 10;
      return f;
    }
  }
  Serial.print("Read fail");
  return NAN;
}


boolean DHT::read(void) {
  uint8_t laststate = HIGH;
  uint8_t counter = 0;
  uint8_t j = 0, i;
  unsigned long currenttime;

  // pull the pin high and wait 250 milliseconds
  digitalWrite(_pin, HIGH);
  delay(250);

  currenttime = millis();
  if (currenttime < _lastreadtime) {
    // ie there was a rollover
    _lastreadtime = 0;
  }
  if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
    return true; // return last correct measurement
    //delay(2000 - (currenttime - _lastreadtime));
  }
  firstreading = false;
  /*
    Serial.print("Currtime: "); Serial.print(currenttime);
    Serial.print(" Lasttime: "); Serial.print(_lastreadtime);
  */
  _lastreadtime = millis();

  data[0] = data[1] = data[2] = data[3] = data[4] = 0;
 
  // now pull it low for ~20 milliseconds
  pinMode(_pin, OUTPUT);
  digitalWrite(_pin, LOW);
  delay(20);
  cli();
  digitalWrite(_pin, HIGH);
  delayMicroseconds(40);
  pinMode(_pin, INPUT);

  // read in timings
  for ( i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while (digitalRead(_pin) == laststate) {
      counter++;
      delayMicroseconds(1);
      if (counter == 255) {
        break;
      }
    }
    laststate = digitalRead(_pin);

    if (counter == 255) break;

    // ignore first 3 transitions
    if ((i >= 4) && (i%2 == 0)) {
      // shove each bit into the storage bytes
      data[j/8] <<= 1;
      if (counter > 6)
        data[j/8] |= 1;
      j++;
    }

  }

  sei();
 
  /*
  Serial.println(j, DEC);
  Serial.print(data[0], HEX); Serial.print(", ");
  Serial.print(data[1], HEX); Serial.print(", ");
  Serial.print(data[2], HEX); Serial.print(", ");
  Serial.print(data[3], HEX); Serial.print(", ");
  Serial.print(data[4], HEX); Serial.print(" =? ");
  Serial.println(data[0] + data[1] + data[2] + data[3], HEX);
  */

  // check we read 40 bits and that the checksum matches
  if ((j >= 40) &&
      (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
    return true;
  }
 

  return false;

}

Вот и я не пойму. Вроде таймер не один не используется.

 

bwn
Offline
Зарегистрирован: 25.08.2014

А прерывания вы не включаете? У меня температуру отдает, но при ее считывании диммер помаргивает. Как раз с delay() проблема.

MacSim
Offline
Зарегистрирован: 28.11.2012

Прерывания включаю. и 1 и 2.

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

Считавать с датчика надо между включениями разрядов дисплея.

На своей мини столкнулся с тем, что похоже реально она работает на 2Mhz (кварц16 и похоже включен предделитель на8). это тоже тормозит процесс. Думаю надо перепрошивать. А еще использовать прямой доступ к портам.

Библиотека для датчика, ту которую выложил выше г-но. Нах каждый раз проверять какой у меня датчик(как будто в процессе работы я его меняю) и проверять в чем в цельчиях или ф-гейтах выводить?

Библиотеку начал коцать. Уже половину выкинул. Мучаю дальше.

deftvk
Offline
Зарегистрирован: 27.05.2016

MacSim пишет:
Библиотеку начал коцать. Уже половину выкинул. Мучаю дальше.

А с нуля написать проблемно? вроде ничего сложного - http://codius.ru/articles/187#a21

dhog1
Offline
Зарегистрирован: 01.03.2016

Ну отчего ж "проблемно"? Совсем нет.

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

MacSim
Offline
Зарегистрирован: 28.11.2012

MacSim пишет:

На своей мини столкнулся с тем, что похоже реально она работает на 2Mhz (кварц16 и похоже включен предделитель на8). это тоже тормозит процесс. Думаю надо перепрошивать. А еще использовать прямой доступ к портам.

не тут ошибся 16и есть

deftvk
Offline
Зарегистрирован: 27.05.2016

dhog1 пишет:

Сходил по ссылке. Спасибо, повеселили. Казалось бы действительно, ничего сложного.

Рассказали бы что веселого, чтобы опыт некорректный не перенимать?

MacSim
Offline
Зарегистрирован: 28.11.2012

deftvk пишет:

dhog1 пишет:

Сходил по ссылке. Спасибо, повеселили. Казалось бы действительно, ничего сложного.

Рассказали бы что веселого, чтобы опыт некорректный не перенимать?

жизнь веселая, смотришь ищешь знакомые букАвы и иногда находишь.

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

dhog1
Offline
Зарегистрирован: 01.03.2016

2 deftvk

Ну начиналось-то интригующе

deftvk пишет:

А с нуля написать проблемно? вроде ничего сложного - http://codius.ru/articles/187#a21

Вдруг, наконец, кто-то перестал копипастить говнокод и написал что-то стоющее, оригинальное, пуркуа бы и не па? Но вам удалось переписать код от Rob Tillaart (вы сами даете на него ссылку, где в скетче пытаетесь прикрутить 7-индикатор) э-ээ... специфично, без улыбки не прочтешь. Кстати, отчего ж его ("свой") не использовать в своих-то примерах?

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

deftvk
Offline
Зарегистрирован: 27.05.2016

dhog1 пишет:

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

Автор по ссылке, ИМХО, дает код для разбора начинающим и пониманию работы датчика, и "худшее исполнение" также преследовало именно эту цель, а не мало кому понятный из начинающих "С++ жесткач" с прерываниями и программированием потоков - это тема другого обсуждения...

dhog1
Offline
Зарегистрирован: 01.03.2016

2 deftvk

Мало кто из "начинающих" вообще читает код, судя по этому и другим форумам, предпочитая готовые решения. Ну в целом это нормально, соответствует парадигме проекта "ардуино".

Но, размещая на этом форуме ссылку, вы ведь меньше всего хотели о DHT11 поговорить, не правда ли?

Поэтому компенсируя мою язвительность (следствие дурного характера), очень коротко скажу. Понравилось в целом, четкий и лаконичный дизайн, внятный и грамотный язык без провинциального "... намедни пришла с али микруха и решил я ее тута потестить", разумная компиляция материалов, видео как пруф работы кода и т.п.  Если хватит сил продолжить, не забросить - вот тогда и критиковать можно будет.