Приветствую. Стал "счастливым обладателем" датчика 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 - не помогает. уж простите за нубизм но поможите люди добрыя...
У меня с этой связкой, тоже была подобная фигня. Я подключил датчик с стандартной библиотекой из примера в Вики, всё было нормально, хотя как и на картинке, очень много таймаутов... Когда собрал это всё с LCD, выкинул из программы обработку ошибок, но и без неё всё видно. При включении по первому запросу он гарантированно выдаёт данные, а потом они очень долго не меняются, значит вместо них идут ошибки. Но эта ситуация продолжалась пару первых включений. А потом количество ошибок вошло в привычный процент, и прибор стал нормально показывать. Произошло оно само, поэтому ничего не исправлял. Вообще довольно странный датчик.
Вообще, это было больше недоумение, чем руководство к действию Я собственно не совсем корректно выразился, я не обработку ошибок убрал, а вывод их на экран... Спасибо, за ссылку, ничего особо принципиально нового не увидел, но появляющиеся библиотеки для Arduino IDE 1.0, это ценно.
Провозился вчера весь вечер с ним, но так и не добился нормальной работы этого датчика... Пришел к выводу что это зря потраченные деньги.
Настроение бодрое, полёт нормальный Вы пробовали запускать этот датчик в классическом комплекте? DHT11, Arduino, Терминал на компе + Стандартная библиотека с стандартным примером ? Вот мой результат: Вот результат полученый nailxx При таком, странном для меня, количестве таймаутов, датчик вполне работоспособен. Если не удаётся получить такой результат без других внешних (возможно мешающих) компонентов, как то: LCD, MAX DS1820, то датчик скорее всего неисправен...
хм, действительно... взяв "чистый" код из вики получилось: Код (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% при этом провода от других устройств не отключал! ладно буду копать дальше в этом направлении.
Я, как зануда страшный, первое, что сделал, это достал лабораторный термометр и положил его рядом. У меня всё точно. Это может означать, что у вас его кто-то греет, я например, не случайно расположил датчик, как на картинке. Есть у меня ещё вот такая хреновина: Так вот на ней, большой чип, это драйвер дисплея, он греется, а датчик обозначеный DigTher меряет температуру воздуха, секунд десять, а потом плата нагревается и он уже её температуру меряет...
Подключил датчик все работает, залез в библиотеки но там тоже не нашел как сделать температуру поточнее не 26 градусов а чтобы выдавало скажем 26.8
Не знаю что у вас за хрень, но лично у меня этот датчик с самого начала прекрасно пахал и постоянно выдает и температуру и влажность, кстати довольно точно(проверял большим настенным барометром с градусником и гигрометром), а таймаут бывает где то раз в 5 мин, не чаще
Так и должно быть! http://wiki.amperka.ru/сенсоры:dht Error: start failed (stage 1) означает что датчик хочет считать показания. Error: start failed (stage 2) означает что датчик готов к отдаче данных.
Код (Text): Не знаю что у вас за хрень, но лично у меня этот датчик с самого начала прекрасно пахал и постоянно выдает и температуру и влажность, кстати довольно точно(проверял большим настенным барометром с градусником и гигрометром), а таймаут бывает где то раз в 5 мин, не чаще:cool: Это точно. У меня так же.