А с чем сравниваем-то? Холодильник вроде не прозрачный... А любое расстояние между головкой контрольного термометра и датчиком уже может дать погрешность. Плюс инерционность до одной минуты ( а то и более ) за счет теплоотвода в виде массы корпуса, кондера, изоляционных материалов и подводящих проводников. И на закусь характеристики разброса параметров из даташита +/-0.5С... Бывает даже между двумя датчиками расхождение. Собственно каждый будет в абсолютной повторяемости измеренное значение держать, но относительно эталона то значение может отличаться в +/- пол градуса.
Ежли датчик запытать охота - попробуй вот эту игрушку сваять http://radiokot.ru/forum/download/file.php?id=209413
правда датчик там ds18b20 и 12-битовый диапазон при замере (без округления - дробная часть просто внаглую не учитывается при индикации).
И ещё... не забывать о правилах округления...
Даже если индикация только с точностью до целых, всегда есть дробная часть которая и является причиной "бытовых споров" о расхождении с бытовыми термометрами от одного до двух градусов. Особо с отрицательными - минус 4,4 это -4, а -4,5 уже -5. В простейших программах такие требования не учитываются, так что по факту большинство любительских программ дают точность показаний +/-1 градус.
Врет не более, чем указано в характеристике. Просто выждать надо минутку-две от момента стабилизации показаний. Да и сам холодильник/морозильник штука с гистерезисом в минимум 4 градуса от точки включения компрессора до достижения максимальной температуры после его отключения.
Плюс зависимость от загрузки рабочего объёма и разница в расположении измерительных головок датчиков.
И не забудь про задержку перед повторным включением компрессора - иначе движку аллес капут будет.
Народ, неделю мучаю датчик - не сдаётся , вернее не отвечает. Подскажите, может что не так делаю.
Датчик 18B20 в железной капсуле с метровым хвостом, подключение 3 проводное, подтяжка 4к7.
Пишу на pic16 asm. Приведу сначала все подпрограммы, что я написал. Подпрограммы задержек приводить не буду. Там все как часы Кварц 4 МГц. Спойлер
call Wire1_Reset
btfss flags, slave_pres
call DS18B20_ERROR ; индикация; из этой подпрограммы не выходит
movlw 0xCC ; команда "skip rom"
movwf W1B ; так как датчик на шине всего один
call Wire1_Send_byte
movlw 0x44 ; команда "convert t"
movwf W1B
call Wire1_Send_byte
call pause_1s
movlw 0xBE ; команда "read scratchpad"
movwf W1B
call Wire1_Send_byte
call Wire1_Recieve_byte
movf W1B, W
movwf LSB
call Wire1_Recieve_byte
movf W1B, W
movwf MSB
call Wire1_Reset ; нужны только первые 2 байта, останавливаем передачу
В итоге импульс Presence я получаю, когда датчик подключен и получаю сообщение об ошибке, когда не подключен. Все нормально.
Далее пропускаю ром-код и шлю команду "начать преобразование". Жду секунду, считываю только первые 2 байта ОЗУ. Считывается число 127, т. е. все единицы. Очевидно, что команду он не распознал. Либо косяки в подпрограммах, но я уже много раз все перепроверил. Не могу понять в чем дело.
Последний раз редактировалось Dmitriy Karpov Чт авг 20, 2015 11:56:11, всего редактировалось 1 раз.
Ну не пинайте сильно. Я еще не разобрался что к чему.
А ресетить надо после преобразования? Там в даташите ресетят, но зачем непонятно. ОЗУ при ресете не стирается?
Нет, это комнатная. Рядом китайские часы-градусник 23С показывают.
Думаю надо ему что-нить записать в ОЗУ и потом это считать и посмотреть что получится.
Оставляю такую вероятность, но я уже процедуры BIN_to_BCD и BCD_to_ASCII много раз проверял и десяток значений подставлял. Выводится все верно.
СRC пока еще не реализовал.
Это хорошо. Только перед этим данные надо немножко подвигать.
Так что более верно для начала вывести в двоичном или HEX-формате и вручную пересчитать что же он присылает.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Попробовал записать TH, TL и config и считать. Числа другие, причем в 2 раза меньше записанных (как и температура из LSB, MSB). Походу где-то я сдвигаю лишний раз.