Здравствуйте уважаемые участники форума!
Надеюсь эта ветка еще живая. Может кто-то уже сталкивался с такой проблемой. Приладил я датчик SHT15. Были всякие косяки, но это уже пройдено. В комнатных условиях работает без нареканий. Но при размещении датчика на улице (за окном примерно -3С) примерно после остывания датчика до 0С он начинает слать непонятные данные, завышенные, в какой-то степени похожие на переполнение буфера. Вот фрагмент: первый столбец - температура, второй - целое двухбайтовое число принимаемое с датчика, третье - пересчитанная влажность в % с температурной компенсацией (данные сняты с 10-сек интервалом):
-0.875 , 3549 , 96.862
-0.937 , 3841 , 102.021
-1.375 , 4035 , 105.052
-1.750 , 4085 , 105.708
-1.750 , 269 , 5.848
-1.687 , 331 , 8.125
-1.500 , 377 , 9.806
-1.500 , 401 ,10.675
Помогите если кто знает, в чем тут может быть дело? До приведенных данных влажность равномерно возрастает от комнатных 50% до 99 и так далее, потом скачкообразно рушится до единиц процентов, снова растет и данные стабилизируется на уровне 20-25%.
Прошу помощи с датчиком SHT15
-
Andrei_kzn
- Родился
- Сообщения: 4
- Зарегистрирован: Сб ноя 30, 2013 19:19:56
- Реклама
Re: Прошу помощи с датчиком SHT15
Если в среднем столбце данные влажности, то скорее всего (в предположении исправности сенсора) в неправильном чтении этих данных из сенсора. Посудите сами, значение в 4-й строке близко к максимуму (4095) и таким в умеренном климате быть не может. Не видя программы сказать точнее сложно. Я-бы начал с вывода сырых данных температуры и влажности из датчика, посчитал-бы сам по формулам какие значения температуры и влажности должны получиться и сверил их с показаниями прибора. Тогда будет больше информации для локализации ошибки.
-
Andrei_kzn
- Родился
- Сообщения: 4
- Зарегистрирован: Сб ноя 30, 2013 19:19:56
Re: Прошу помощи с датчиком SHT15
Надеюсь, что датчики исправны, тем более у меня их два и оба ведут себя схожим образом. Ниже размещаю фрагмент программы с момента отправки команды на измерение влажности: (В1 - CLK, B2 - DATA)
while ((PINB) & (1<<PB2)) {asm("nop");} // ожидание сигнала о готовности данных
kod = 0;
for (i = 1; i < 18; i++)
{
if ((i == 9)) {DDRB |= (1 << PB2); PORTB &=~(1 << PB2); _delay_ms(0.005);} // НА ВЫХОД, СОСТОЯНИЕ "0"
PORTB |= (1 << PB1); _delay_ms(0.01); // 8
if ((i == 9)) {DDRB &=~(1 << PB2); PORTB |= (1 << PB2);} // НА ВХОД С ПОДТЯЖКОЙ
PORTB &=~(1 << PB1); _delay_ms(0.005); // 9
if ((i == 5) && ((PINB) & (1<<PB2))) kod = kod + 2048; // старший разряд
if ((i == 6) && ((PINB) & (1<<PB2))) kod = kod + 1024; // разряд
if ((i == 7) && ((PINB) & (1<<PB2))) kod = kod + 512; // разряд
if ((i ==8) && ((PINB) & (1<<PB2))) kod = kod + 256; // разряд
if ((i ==10) && ((PINB) & (1<<PB2))) kod = kod + 128; // разряд
if ((i ==11) && ((PINB) & (1<<PB2))) kod = kod + 64; // разряд
if ((i ==12) && ((PINB) & (1<<PB2))) kod = kod + 32; // разряд
if ((i ==13) && ((PINB) & (1<<PB2))) kod = kod + 16; // разряд
if ((i ==14) && ((PINB) & (1<<PB2))) kod = kod + 8; // разряд
if ((i ==15) && ((PINB) & (1<<PB2))) kod = kod + 4; // разряд
if ((i ==16) && ((PINB) & (1<<PB2))) kod = kod + 2; // разряд
if ((i ==17) && ((PINB) & (1<<PB2))) kod = kod + 1; // младший разряд
_delay_ms(0.005);
}
DDRB &=~(1 << PB2); PORTB |= (1 << PB2); // НА ВХОД, ПОДТЯЖКА
vlazhnost = -4 + 0.0405*kod - 0.0000028*kod*kod;
Может сдесь есть какая-то ошибка, но при комнатной температуре все работает стабильно на протяжении многих часов, да и на улице, если температура не ниже +1..+2С. Есть одна особенность в данных - переменная kod всегда принимает нечетное значение! Буду очень благодарен, если вы заметите ошибку или предложите направление дальнейших действий по выяснению причины.
while ((PINB) & (1<<PB2)) {asm("nop");} // ожидание сигнала о готовности данных
kod = 0;
for (i = 1; i < 18; i++)
{
if ((i == 9)) {DDRB |= (1 << PB2); PORTB &=~(1 << PB2); _delay_ms(0.005);} // НА ВЫХОД, СОСТОЯНИЕ "0"
PORTB |= (1 << PB1); _delay_ms(0.01); // 8
if ((i == 9)) {DDRB &=~(1 << PB2); PORTB |= (1 << PB2);} // НА ВХОД С ПОДТЯЖКОЙ
PORTB &=~(1 << PB1); _delay_ms(0.005); // 9
if ((i == 5) && ((PINB) & (1<<PB2))) kod = kod + 2048; // старший разряд
if ((i == 6) && ((PINB) & (1<<PB2))) kod = kod + 1024; // разряд
if ((i == 7) && ((PINB) & (1<<PB2))) kod = kod + 512; // разряд
if ((i ==8) && ((PINB) & (1<<PB2))) kod = kod + 256; // разряд
if ((i ==10) && ((PINB) & (1<<PB2))) kod = kod + 128; // разряд
if ((i ==11) && ((PINB) & (1<<PB2))) kod = kod + 64; // разряд
if ((i ==12) && ((PINB) & (1<<PB2))) kod = kod + 32; // разряд
if ((i ==13) && ((PINB) & (1<<PB2))) kod = kod + 16; // разряд
if ((i ==14) && ((PINB) & (1<<PB2))) kod = kod + 8; // разряд
if ((i ==15) && ((PINB) & (1<<PB2))) kod = kod + 4; // разряд
if ((i ==16) && ((PINB) & (1<<PB2))) kod = kod + 2; // разряд
if ((i ==17) && ((PINB) & (1<<PB2))) kod = kod + 1; // младший разряд
_delay_ms(0.005);
}
DDRB &=~(1 << PB2); PORTB |= (1 << PB2); // НА ВХОД, ПОДТЯЖКА
vlazhnost = -4 + 0.0405*kod - 0.0000028*kod*kod;
Может сдесь есть какая-то ошибка, но при комнатной температуре все работает стабильно на протяжении многих часов, да и на улице, если температура не ниже +1..+2С. Есть одна особенность в данных - переменная kod всегда принимает нечетное значение! Буду очень благодарен, если вы заметите ошибку или предложите направление дальнейших действий по выяснению причины.
Re: Прошу помощи с датчиком SHT15
http://mcs.uwsuper.edu/sb/Electronics/Humi/
- Реклама
-
Andrei_kzn
- Родился
- Сообщения: 4
- Зарегистрирован: Сб ноя 30, 2013 19:19:56
Re: Прошу помощи с датчиком SHT15
Благодрю за ценные замечания! Завтра попробую разместить опрос состояния пина до сброса SCK в ноль. Для перевода в проценты использовал формулу из скаченного даташита:
3.1 Relative Humidity
To compensate for the non-linearity of the humidity sensor and to obtain the full accuracy it is recommended to convert the readout with the following formula: RHlinear = c1 + c2 •SORH + c3 •SORH
SORH c1 c2 c3
12 bit -4 0.0405 -2.8 * 10-6
8 bit -4 0.648 -7.2 * 10-4
Table 6 Humidity conversion coefficients
Все ссылки в этом посте я уже посмотрел и поскольку при комнатной температре влажность соответствует ральной пока не стал менять способ расчета. К тому же второй столбец свидетельствует о неправильном приеме данных, поскольку считываемые значения приближаются к 4096 и проскакивая это значение снова принимают малые значения с последующим возрастанием.
Как Вы считаете, если я игнорирую дальнейшие данные (CRC) и спустя 10 сек. снова посылаю команды сброса, измерения и передачи данных, то не возникает ли сдесь какая-либа накладка с передаваемыми данными? Еще я не использую внешней подтяжки, а только внутренюю от МК (АТМ16). Других идей у меня пока нет...
3.1 Relative Humidity
To compensate for the non-linearity of the humidity sensor and to obtain the full accuracy it is recommended to convert the readout with the following formula: RHlinear = c1 + c2 •SORH + c3 •SORH
SORH c1 c2 c3
12 bit -4 0.0405 -2.8 * 10-6
8 bit -4 0.648 -7.2 * 10-4
Table 6 Humidity conversion coefficients
Все ссылки в этом посте я уже посмотрел и поскольку при комнатной температре влажность соответствует ральной пока не стал менять способ расчета. К тому же второй столбец свидетельствует о неправильном приеме данных, поскольку считываемые значения приближаются к 4096 и проскакивая это значение снова принимают малые значения с последующим возрастанием.
Как Вы считаете, если я игнорирую дальнейшие данные (CRC) и спустя 10 сек. снова посылаю команды сброса, измерения и передачи данных, то не возникает ли сдесь какая-либа накладка с передаваемыми данными? Еще я не использую внешней подтяжки, а только внутренюю от МК (АТМ16). Других идей у меня пока нет...
Re: Прошу помощи с датчиком SHT15
Вот линк на ДШ SHT15 на сайте производителя. Там в таблице 6 коэффициенты другие.
http://www.sensirion.com/fileadmin/user ... eet_V5.pdf
Никогда не используйте внутренние подтяжки для приема по I2C. Их сопротивление слишком большое и беольшой разброс его. Обязательно поставьте внешний резистор на 4.7К. CRC можно не читать. Вообще, перепишите программу под прием байтов. Вот для информации моя программы для PIC эи MSP430 (под AVR у меня нет):
http://mcs.uwsuper.edu/sb/Electronics/Humi/humi.asm
http://mcs.uwsuper.edu/sb/Electronics/TH430/th430.asm
http://www.sensirion.com/fileadmin/user ... eet_V5.pdf
Никогда не используйте внутренние подтяжки для приема по I2C. Их сопротивление слишком большое и беольшой разброс его. Обязательно поставьте внешний резистор на 4.7К. CRC можно не читать. Вообще, перепишите программу под прием байтов. Вот для информации моя программы для PIC эи MSP430 (под AVR у меня нет):
http://mcs.uwsuper.edu/sb/Electronics/Humi/humi.asm
http://mcs.uwsuper.edu/sb/Electronics/TH430/th430.asm
-
Andrei_kzn
- Родился
- Сообщения: 4
- Зарегистрирован: Сб ноя 30, 2013 19:19:56
Re: Прошу помощи с датчиком SHT15
Огромное спасибо Ser60!
Поправил, потестировал, сравнил с промышленной метеостанцей - всё в полном порядке. Именно Ваше ценное замечание про считывание ножки пока SCK=1 сделало программу работоспособной. Воспользовался Вашей ссылкой на даташит. Разница в результатах расчетов по ранее найденной формуле и по приведенной в нем небольшая, порядка 0,5% и поскольку я так и не придумал где найти идеально точное значение для сравнения, то трудно сделать вывод какую из формул применять правильнее. Но временные диаграммы в нем приведены гораздо лучши и понятнее.
Еще раз спасибо! Удачи во всех делах!
Поправил, потестировал, сравнил с промышленной метеостанцей - всё в полном порядке. Именно Ваше ценное замечание про считывание ножки пока SCK=1 сделало программу работоспособной. Воспользовался Вашей ссылкой на даташит. Разница в результатах расчетов по ранее найденной формуле и по приведенной в нем небольшая, порядка 0,5% и поскольку я так и не придумал где найти идеально точное значение для сравнения, то трудно сделать вывод какую из формул применять правильнее. Но временные диаграммы в нем приведены гораздо лучши и понятнее.
Еще раз спасибо! Удачи во всех делах!


