DHT11 fail

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем redmaxs, 26 дек 2011.

  1. redmaxs

    redmaxs Нуб

    Приветствую.

    Стал "счастливым обладателем" датчика DHT11... Но!
    При использовании библиотеки предлагаемой в инструкции и взятой проге от туда жеш при первом опросе выдает и температуру и влажность, но все последующие опросы глосят "Error: start failed (stage 1)". Иных источников инфы по нему не нашел и от того вопрошаю здесь: как с этим бороться и что эти ошибки означают?
    Привожу свой "код":

    Код (Text):
    #include <OneWire.h>
    #include <LiquidCrystal.h>
    #include <PID_v1.h>
    #include <dht.h>

    DHT sensor = DHT();

    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
    OneWire ds(10); // on pin 10
    #define MAX_DS1820_SENSORS 2
    byte addr[MAX_DS1820_SENSORS][8];

    double Setpoint, Input, Output, Adding=100.0, TTTemp;
    double consKp=20.0, consKi=5.0, consKd=0.0, LR=0.0;

    int HighByte, LowByte, TReading, SignBit, Tc_100, N, P;

    int PIDMode = AUTOMATIC;

    PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);


    void setup(void) {

    pinMode(9, OUTPUT);
    Input = 29.0;
    Setpoint = 33.0;
    sensor.attach(A0);
    myPID.SetMode(PIDMode);
    lcd.begin(20, 4, 1);
    if (!ds.search(addr[0])) {
    ds.reset_search();
    delay(250);
    return; }
    if ( !ds.search(addr[1])) {
    ds.reset_search();
    delay(250);
    return;
    }
    }

    void loop(void) {
    byte i;
    byte present = 0;
    byte data[12];
    byte addr[8];

    sensor.update();

    if ( !ds.search(addr)) {
    ds.reset_search();
    return;}

    ds.reset();
    ds.select(addr);
    ds.write(0x44,1); // start conversion, with parasite power on at the end
    present = ds.reset();
    ds.select(addr);
    ds.write(0xBE); // Read Scratchpad

    for ( i = 0; i < 9; i++) { // we need 9 bytes
    data = ds.read(); }
    LowByte = data[0];
    HighByte = data[1];
    TReading = (HighByte << 8) + LowByte;
    SignBit = TReading & 0x8000; // test most sig bit
    if (SignBit) // negative
    { TReading = (TReading ^ 0xffff) + 1; // 2's comp }
    Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
    TTTemp = Tc_100 / 100.0; // + (Tc_100 % 100)/100; //float(Whole) + (float(Fract) / 100);
    Input = TTTemp;

    myPID.Compute();

    lcd.cursor();
    lcd.blink();
    lcd.setCursor(0,1);
    lcd.print("PV=");
    lcd.setCursor(4,1);
    lcd.print(TTTemp);
    if (SignBit) // If its negative
    {lcd.setCursor(3,1);
    lcd.print("-");}
    lcd.setCursor(0,2);
    lcd.print("SP=");
    lcd.setCursor(4,2);
    lcd.print(Setpoint);
    lcd.setCursor(0,3);
    lcd.print("LQ=");
    lcd.setCursor(3,3);
    lcd.print(Output);
    lcd.setCursor(10,1);
    if (myPID.GetMode())
    { lcd.print("AUTO");}
    else
    { lcd.print("MANUAL");}
    lcd.setCursor(10,2);
    lcd.print("Kp=");
    lcd.setCursor(14,2);
    lcd.print(myPID.GetKp());
    lcd.setCursor(10,3);
    lcd.print("Ki=");
    lcd.setCursor(14,3);
    lcd.print(myPID.GetKi());

    switch (sensor.getLastError())
    {
    case DHT_ERROR_OK:
    char msg[128];
    // данные последнего измерения можно считать соответствующими
    // методами
    sprintf(msg, "T=%dC, H=%d%%",
    sensor.getTemperatureInt(), sensor.getHumidityInt());
    lcd.print(msg);
    break;
    case DHT_ERROR_START_FAILED_1:
    lcd.print("Er:start fail1");
    break;
    case DHT_ERROR_START_FAILED_2:
    lcd.print("Er:start fail2");
    break;
    case DHT_ERROR_READ_TIMEOUT:
    lcd.print("Er:read timeout");
    break;
    case DHT_ERROR_CHECKSUM_FAILURE:
    lcd.print("Er:checksum error");
    break;
    }
    analogWrite(9, int(Output));
    }
    PS: ставил делей и на 1000 и на 2000 - не помогает.
    уж простите за нубизм но поможите люди добрыя...
     
  2. Dmitriy Kunin

    Dmitriy Kunin Гик

    У меня с этой связкой, тоже была подобная фигня.
    Я подключил датчик с стандартной библиотекой из примера в Вики, всё было нормально, хотя как и на картинке, очень много таймаутов...
    Когда собрал это всё с LCD, выкинул из программы обработку ошибок, но и без неё всё видно.
    При включении по первому запросу он гарантированно выдаёт данные, а потом они очень долго не меняются, значит вместо них идут ошибки.
    Но эта ситуация продолжалась пару первых включений.
    А потом количество ошибок вошло в привычный процент, и прибор стал нормально показывать.
    Произошло оно само, поэтому ничего не исправлял.
    Вообще довольно странный датчик.
    [​IMG]
     
  3. redmaxs

    redmaxs Нуб

    Спасибо, попробую вечером убрать обработчик ошибок и подождать.
     
  4. redmaxs

    redmaxs Нуб

    Кстати, нарыл тут поболее инфы про этот датчик.
    Неплохо было бы добавить ее в вики...
     
  5. Dmitriy Kunin

    Dmitriy Kunin Гик

    Вообще, это было больше недоумение, чем руководство к действию :)
    Я собственно не совсем корректно выразился, я не обработку ошибок убрал, а вывод их на экран...
    Спасибо, за ссылку, ничего особо принципиально нового не увидел, но появляющиеся библиотеки для Arduino IDE 1.0, это ценно.
     
  6. redmaxs

    redmaxs Нуб

    Провозился вчера весь вечер с ним, но так и не добился нормальной работы этого датчика...
    Пришел к выводу что это зря потраченные деньги.:(
     
  7. Dmitriy Kunin

    Dmitriy Kunin Гик

    Настроение бодрое, полёт нормальный :)
    Вы пробовали запускать этот датчик в классическом комплекте?
    DHT11, Arduino, Терминал на компе + Стандартная библиотека с стандартным примером ?
    Вот мой результат:
    [​IMG]
    Вот результат полученый nailxx
    [​IMG]
    При таком, странном для меня, количестве таймаутов, датчик вполне работоспособен.
    Если не удаётся получить такой результат без других внешних (возможно мешающих) компонентов, как то: LCD, MAX DS1820, то датчик скорее всего неисправен...
     
  8. redmaxs

    redmaxs Нуб

    хм, действительно...
    взяв "чистый" код из вики получилось:
    Код (Text):
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 30%
    Temperature = 26C, Humidity = 30%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Error: read timeout
    Error: read timeout
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
    Temperature = 26C, Humidity = 31%
     
    при этом провода от других устройств не отключал!
    ладно буду копать дальше в этом направлении.
     
  9. redmaxs

    redmaxs Нуб

    и еще, в квартире все термометры показывают 16 градусов а этот 26...
     
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    Я, как зануда страшный, первое, что сделал, это достал лабораторный термометр и положил его рядом.
    У меня всё точно.
    Это может означать, что у вас его кто-то греет, я например, не случайно расположил датчик, как на картинке.
    Есть у меня ещё вот такая хреновина:
    [​IMG]
    Так вот на ней, большой чип, это драйвер дисплея, он греется, а датчик обозначеный DigTher меряет температуру воздуха, секунд десять, а потом плата нагревается и он уже её температуру меряет...
     
  11. Dmitriy Kunin

    Dmitriy Kunin Гик

    Как у нас сухо везде, около тридцати, при норме ближе к шестидесяти...
     
  12. link26

    link26 Нуб

    Подключил датчик все работает, залез в библиотеки но там тоже не нашел как сделать температуру поточнее не 26 градусов а чтобы выдавало скажем 26.8
     
  13. <Lame>

    <Lame> Гик

    Не знаю что у вас за хрень, но лично у меня этот датчик с самого начала прекрасно пахал и постоянно выдает и температуру и влажность, кстати довольно точно(проверял большим настенным барометром с градусником и гигрометром), а таймаут бывает где то раз в 5 мин, не чаще:cool:
     
  14. Так и должно быть!
    http://wiki.amperka.ru/сенсоры:dht
    Error: start failed (stage 1)
    означает что датчик хочет считать показания.
    Error: start failed (stage 2)
    означает что датчик готов к отдаче данных.
     
  15. Код (Text):
    Не знаю что у вас за хрень, но лично у меня этот датчик с самого начала прекрасно пахал и постоянно выдает и температуру и влажность, кстати довольно точно(проверял большим настенным барометром с градусником и гигрометром), а таймаут бывает где то раз в 5 мин, не чаще:cool:
    Это точно. У меня так же.