Mega328 и DHT22

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 433
Зарегистрирован: Пт янв 14, 2011 13:27:12
Откуда: Калуга

Сообщение vitalyadm »

Приветствую товарищи. Есть вопрос "на засыпку", столкнулся с неожиданной проблемой. При чтении значений с датчика DHT22, выходит ерундистика в плане влажности, с температурой всё нормально, а влажность когда 1%, когда сильно занижена, например 7-9%. При чём, с DHT11 такой ерунды нет, с ним показания нормальные. Было перепробовано порядка 7- ми датчиков и со всеми одно и то же, то 1% влажности, то 7 - 9%. Если его подержать над паром, значение влажности резко растёт. Но при этом, в комнате, кажет каких- то 7%. может кто сталкивался с таким или подскажет мысль? ;)



Вот код:

dht_counter - счётчик, увеличиваемый по таймеру 1 раз в секунлду


#define MAX_TIMEOUT_DHT 6
#define EXT_DHT_DDR DDRD.3
#define EXT_DHT_OUT PORTD.3
#define EXT_DHT_IN PIND.3


unsigned char ext_dht_read()
{
unsigned char i, j;
unsigned char data[ 5 ];
dht_counter = 0;

//=============MCU send START
EXT_DHT_DDR = 1;
EXT_DHT_OUT = 1;
delay_ms( 500 );
EXT_DHT_DDR = 1;
EXT_DHT_OUT = 0;
delay_ms(20);
EXT_DHT_DDR = 0;
delay_us(40);
//=============check DHT response
if ( EXT_DHT_IN != 0 ) return 0;

while( EXT_DHT_IN == 0)
{
//может зависнуть - смотрим счётчик таймаута
if ( dht_counter >= MAX_TIMEOUT_DHT ) return 0;
}

delay_us(80);

while( EXT_DHT_IN != 0)
{
//может зависнуть - смотрим счётчик таймаута
if ( dht_counter >= MAX_TIMEOUT_DHT ) return 0;
}


//===============receive 40 data bits
for ( j = 0; j < 5; j++ )
{
data[ j ] = 0;

for( i = 0; i < 8; i++ ) {

while( EXT_DHT_IN == 0)
{
//может зависнуть - смотрим счётчик таймаута
if ( dht_counter >= MAX_TIMEOUT_DHT ) return 0;
}

delay_us (33);

if ( EXT_DHT_IN != 0 ) data[ j ] |= ( 1 << ( 7 - i ) );

while( EXT_DHT_IN != 0)
{
//может зависнуть - смотрим счётчик таймаута
if ( dht_counter >= MAX_TIMEOUT_DHT ) return 0;
}
}
}

if ( (unsigned char) ( data[ 0 ] + data[ 1 ] + data[ 2 ] + data[ 3 ] ) != data[ 4 ] ) return 0;

// если значения по указанным индексам = 0, то это ДХТ11
if ( data[ 1 ] == 0 && data[ 3 ] == 0 ) {
ext_tmpr = data[ 2 ] * 10;
ext_humm = data[ 0 ] * 10;
}

// если нет. то это ДХТ22
else {
ext_tmpr = ( data[ 2 ] & 0x7F ) * 256 + data[ 3 ];
ext_humm = ( data[ 0 ] * 256 ) + data[ 1 ];
if ( data[ 2 ] & 0x80 ) ext_tmpr *= -1;
}

// если получены все нули, значит ошибка чтения данных
if ( ext_tmpr == 0 && ext_humm == 0 ) return 0;

return 1;//checksum
}

Да, кстати, отключение прерываний на время считываний данных результатов не дало, при моделировании в протеусе- показывает всё сотка в сотку, но протеус штука такая, доверять особо нельзя.
Реклама
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

vitalyadm писал(а):подержать над паром, значение влажности резко растёт.
Растёт до какой величины? До положенных 100%?
По коду особо не смотрел, ибо я использую замер времени и работал на прерываниях по изменению значения. А не на задержках как тут. :)
Будем считать, что прием данных сделан точно - осциллографом ты увидел все биты ответа, и они совпали с полученными контроллером байтами.

Попробуй проверить питание датчика. Правда, у тебя не ошибка "99%", а обратная.
Но, а вдруг оно? http://etrivia.ru/news/O-vybore-bloka-pitaniya
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 433
Зарегистрирован: Пт янв 14, 2011 13:27:12
Откуда: Калуга

Сообщение vitalyadm »

mas123 писал(а):
vitalyadm писал(а):подержать над паром, значение влажности резко растёт.
Растёт до какой величины? До положенных 100%?
По коду особо не смотрел, ибо я использую замер времени и работал на прерываниях по изменению значения. А не на задержках как тут. :)
Будем считать, что прием данных сделан точно - осциллографом ты увидел все биты ответа, и они совпали с полученными контроллером байтами.
Ну собственно по коду здесь тоже самое, основывается на изменении состояния при чтении данных. Осциллографа увы нет, влажность да, до 90% поднимается. Собственно напряг именно тот факт, что чтение данных проходит нормально, контрольная сумма совпадает, все 40 бит приходят, значит все биты были приняты в нужном виде и правильно, иначе функция вышла бы с ошибкой (в случае не совпадения по сумме или нехватки какого- то бита из 40 необходимых).
mas123 писал(а):Попробуй проверить питание датчика. Правда, у тебя не ошибка "99%", а обратная.
Но, а вдруг оно? http://etrivia.ru/news/O-vybore-bloka-pitaniya
Дельно, согласен, нужно будет опробовать. Спасибо.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн дек 15, 2014 19:04:08
Откуда: г. Пермь

Сообщение Andry_67 »

Возможно сдох сенсор влажности. У меня тоже такой датчик проработал около года потом стал показывать влажность 1%. Только осенью когда шли дожди показания немного увеличивались. Температуру показывает правильно. Сейчас жду из Китая новый датчик.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

Andry_67 писал(а):Возможно сдох сенсор влажности.
А датчик не был подвержен вибрациям? Говорят, они их не любят.
У меня на машине подобный умер когда-то (тоже "влажный" канал накрылся), грешу на питание и вибрацию.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 433
Зарегистрирован: Пт янв 14, 2011 13:27:12
Откуда: Калуга

Сообщение vitalyadm »

Andry_67 писал(а):Возможно сдох сенсор влажности. У меня тоже такой датчик проработал около года потом стал показывать влажность 1%. Только осенью когда шли дожди показания немного увеличивались. Температуру показывает правильно. Сейчас жду из Китая новый датчик.
Датчиков было сразу 7 штук, 2 из них показывали 1%, остальные весьма заниженную влажность 7 - 11%
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн дек 15, 2014 19:04:08
Откуда: г. Пермь

Сообщение Andry_67 »

Насчет вибрации сомневаюсь. Там вроде какое-то напыление чувствительное к влажности. Возможно оно быстро деградирует или какое-нибудь насекомое залезло.
Ответить

Вернуться в «AVR»