Как правильно соединить

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Максим B, 5 апр 2013.

  1. Максим B

    Максим B Гуру

    Всем привет. Я новичок в arduino. Есть Arduino Uno v3, и датчик температуры и влажности DTH11. Как правильно подключить датчик к arduino и получить данные с датчика??? Спасибо. Если есть литература или готовые примеры с картинками - киньте ссылку.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

  3. Sand

    Sand Нерд

    Привет, вот мой код, вывод температуры на экран от амперки 16x4
    Код (Text):
    #include <DHT.h>
    #include <LiquidCrystal.h>
     
    dht DHT;
     
    #define DHT11_PIN A0
    int ledPin = 2;
     
    LiquidCrystal lcd(4,5, 10,11,12,13);
     
    void setup()
    {
      lcd.begin(20,4);
      //pinMode(ledPin, OUTPUT);
      // start serial port at 9600 bps:
      /*Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
      Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");*/
    }
     
    void loop()
    {
      lcd.setCursor(0, 0);
      // READ DATA
      int chk = DHT.read11(DHT11_PIN);
      switch (chk)
      {
        case DHTLIB_OK:
                    lcd.print("Sensor connected.");
                    break;
        case DHTLIB_ERROR_CHECKSUM:
                    lcd.print("Checksum error");
                    break;
        case DHTLIB_ERROR_TIMEOUT:
                    lcd.print("Sensor connection");
                    lcd.setCursor(0, 1);
                    lcd.print("timed out error");
                    break;
        default:
                    lcd.print("Unknown error");
                    break;
      }
      // DISPLAY DATA
      // данные последнего измерения можно считать соответствующими
      // методами
      if (chk == DHTLIB_OK)
      {
        lcd.setCursor(0, 1);
        lcd.print("Temperature = ");
        lcd.print(DHT.temperature);
        lcd.print("C ");
       
        lcd.setCursor(0, 2);
        // print the number of seconds since reset:
        lcd.print("Humidity = ");
        lcd.print(DHT.humidity);
        lcd.print("%");
        lcd.setCursor(0, 3);
        /*if (DHT.temperature > 25)
        {
          digitalWrite(ledPin,HIGH);
        }
        else
        {
          digitalWrite(ledPin,LOW);
        }*/
      }
     
      delay(1000);
    }
    //
    // END OF FILE
    //
     
    Вот тут более полная инфа по этому датчику и там же библиотека и примеры кода
    http://playground.arduino.cc/Main/DHT11Lib
     
  4. Максим B

    Максим B Гуру

    Megakoteyka - это я видел, только вот платы расширения которая там над arduino у меня нету ((( . Sand за код спасибо - будем разбираться
     
  5. Sand

    Sand Нерд

  6. Максим B

    Максим B Гуру

    И у меня нету дисплея (((
     
  7. Sand

    Sand Нерд

    А провода папа - папа есть? Берешь три провода таких, и соединяешь Analog 0, землю и +V ардуины с соответствующими проводами датчика и все. Там же синий провод на датчике? Это для аналоговых пинов. Черный на землю, красный на питание ардуины и все.
     
  8. Sand

    Sand Нерд

    Выбросите из кода все, что связано с Liquid, будет без дисплея
     
  9. Максим B

    Максим B Гуру

    Sand пасиб.
     
  10. Sand

    Sand Нерд

    Да, это один из первых моих скетчей для ардуино, там внизу стоит delay, такие задержки нужно убирать и делать что то типа:
    currTime = millis();
    if (currTime >= loopTime + 1000)
    {
    // 1 секунда прошла, делаем что либо
    loopTime = currTime;
    }

    // Тут идут основные действия в цикле
     
  11. roggedhorse

    roggedhorse Гик

    Удачный пример использования delay (как узнать дату завтрашнего дня с помощью delay)

    Код (Text):
    void get_tomorrow_date( struct timeval *date ) {
      sleep(86400); // 60 * 60 * 24
      gettimeofday( date, 0 );
    }
     
    Мерзкий Гуру и Megakoteyka нравится это.
  12. Максим B

    Максим B Гуру

    эх все равно не получается. Соединил напрямую проводами из комплекта: Arduino Uno v3 с DTH11 таким образом -> синий провод с аналоговым входом A0, черный с землей, красный с 5V. Скачал библиотеку которая https://github.com/amperka/dht по этой ссылке (брал с сайта amperka). и вот такие ошибки при компиляции:

    example:6: error: 'DHT' does not name a type
    example.ino: In function 'void setup()':
    example:14: error: 'sensor' was not declared in this scope
    example.ino: In function 'void loop()':
    example:23: error: 'sensor' was not declared in this scope
    example:27: error: 'DHT_ERROR_OK' was not declared in this scope
    example:35: error: 'DHT_ERROR_START_FAILED_1' was not declared in this scope
    example:38: error: 'DHT_ERROR_START_FAILED_2' was not declared in this scope
    example:41: error: 'DHT_ERROR_READ_TIMEOUT' was not declared in this scope
    example:44: error: 'DHT_ERROR_CHECKSUM_FAILURE' was not declared in this scope



    помогите очень хочу его подключить. Спасибо
     
  13. Sand

    Sand Нерд

    Вот тут библиотека, которая у меня заработала
    http://playground.arduino.cc/Main/DHT11Lib

    Если что по ссылке будет непонятно, пишите. Там указано какие файлы куда положить
     
  14. Максим B

    Максим B Гуру

    Sand а если в программировнии на си полный "o" ??? как собрать библиотеку илим исходники может есть?? ))) Спасибо что помогаешь
     
  15. Максим B

    Максим B Гуру

    #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()
    {
    DDRC |= _BV(DHT11_PIN);
    PORTC |= _BV(DHT11_PIN);

    Serial.begin(9600);

    Serial.println("Ready");
    }

    void loop()
    {
    byte dht11_dat[5];
    byte dht11_in;
    byte i;

    PORTC &= ~_BV(DHT11_PIN);
    delay(18);
    PORTC |= _BV(DHT11_PIN);
    delayMicroseconds(40);

    DDRC &= ~_BV(DHT11_PIN);
    delayMicroseconds(40);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(dht11_in){
    Serial.println("dht11 start condition 1 not met");
    return;
    }
    delayMicroseconds(80);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(!dht11_in){
    Serial.println("dht11 start condition 2 not met");
    return;
    }
    delayMicroseconds(80);
    // now ready for data reception
    for (i=0; i<5; i++)
    dht11_dat = 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];
    // check check_sum
    if(dht11_dat[4]!= dht11_check_sum)
    {
    Serial.println("DHT11 checksum error");
    }

    Serial.print("Current humdity = ");
    Serial.print(dht11_dat[0], DEC);
    Serial.print(".");
    Serial.print(dht11_dat[1], DEC);
    Serial.print("% ");
    Serial.print("temperature = ");
    Serial.print(dht11_dat[2], DEC);
    Serial.print(".");
    Serial.print(dht11_dat[3], DEC);
    Serial.println("C ");

    delay(2000);
    }




    код рабочий
     
  16. Максим B

    Максим B Гуру

    Но у меня данный код показывает влжность 28 и температуру 28, хотя на самом деле в квартире 23 ((
     
  17. Максим B

    Максим B Гуру

    ЧТо бы не создавать новую тему - как потом пользовать данные с контроллера на пк не закачивая по новой программу??
     
  18. mike_KH

    mike_KH Гик

    Попробуйте подключить sd shield и карту sd и в автономном режиме записывать все данный на нее
     
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    Включаете контроллер, в порт компа начинают сыпаться данные. Можете принимать их при помощи любого монитора порта или написать собственную программу.
     
  20. RUBA

    RUBA Нуб

    Вот рабочий, мне понравился он
    Код (Text):
    #define DHT11_PIN 0 // Устанавливаем для работы 0 аналоговый порт

    byte read_dht11_dat()

    {
      byte i = 0;
      byte result=0;
      for(i=0; i< 8; i++)
      {
        while(!(PINC & _BV(DHT11_PIN)))
        {
        }; // Ждем, пока на 0 аналоговом порте не будет '1'
        delayMicroseconds(30);
        if(PINC & _BV(DHT11_PIN)) // Если после 30 мкс на 0 аналоговом порте до сих пор '1'
          result |=(1<<(7-i)); // Записываем результат
        while((PINC & _BV(DHT11_PIN))); // Ждем окончания '1'
      }
      return result;
    }


    void setup()
    {
      DDRC |= _BV(DHT11_PIN); // Устанавливаем 0 аналоговый порт, как output
      PORTC |= _BV(DHT11_PIN); // Устанавливаем начальное значение порта в '1'
      Serial.begin(9600);
      Serial.println("Ready");
    }

    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); // Устанавливаем 0 аналоговый порт, как input
      delayMicroseconds(40);
      dht11_in = PINC & _BV(DHT11_PIN); // считываем только 0 порт
      if(dht11_in)
      {
        Serial.println("dht11 start condition 1 not met"); // Ждем ответ от DHT:  LOW
        delay(1000);
        return;
      }
      delayMicroseconds(80);
      dht11_in = PINC & _BV(DHT11_PIN); //
      if(!dht11_in)
      {
        Serial.println("dht11 start condition 2 not met"); // Ждем второй ответ от DHT: HIGH
        return;
      }
      delayMicroseconds(80);// Готовимся к приему данных
      for (i=0; i<5; i++)
      {
        dht11_dat[i] = read_dht11_dat();
      } // Получаем 40 бит данных
      DDRC |= _BV(DHT11_PIN); // Устанавливаем 0 аналоговый порт в положение output, после того, как все данные получены
      PORTC |= _BV(DHT11_PIN); // Устанавливаем значение этого порта в '1', после того, как все данные получены
      byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// Проверяем контрольную сумму
      if(dht11_dat[4]!= dht11_check_sum)
      {
        Serial.println("DHT11 checksum error");
      }
      Serial.print("Humdity-");
      Serial.print(dht11_dat[0], DEC);
      Serial.print("% ");
      Serial.print("Temp-");
      Serial.print(dht11_dat[2], DEC);
      Serial.println("C ");
      delay(4000); // Время ожидания датчика
    }
     
    Последнее редактирование: 6 фев 2014