Усы уже кудрявые( как кодируется и раскодируется температура с сия девайса?
Честно я не понимаю о чем вы говорите. Датчики просто присоединены кабелем UTP к raspberry pi3. В raspberry формируется файл из показаниями датчика. /sys/devices/w1_bus_master1/28-21ee67000900/
Код:
pi@raspberrypi:~ $ cd /sys/devices/w1_bus_master1/28-21ee67000900 pi@raspberrypi:/sys/devices/w1_bus_master1/28-21ee67000900 $ ls driver id name power subsystem uevent w1_slave pi@raspberrypi:/sys/devices/w1_bus_master1/28-21ee67000900 $ cat w1_slave ff 07 ef eb 7f ff 03 10 e1 : crc=e1 YES ff 07 ef eb 7f ff 03 10 e1 t=127937 pi@raspberrypi:/sys/devices/w1_bus_master1/28-21ee67000900 $
Если более одного датчика на веточке то каждый канал перед обращением к датчику обязан провести "именной вызов" того датчика, к которому обращается. В случае с одиночным эта процедура для сокращения проблем с протоколом весьма часто не проводится. Возможно в том и ошибки зарыты.
Ребята а может один из датчиков (4) не правильно работать и поэтому выдавать помехи в линию? На данный момент подключено всего три датчика (3,4,5). Есть подозрения что только один (4) датчик через некоторое время выдает температуру 127 градусов. Короче говоря буду наблюдать так ли это.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:2 Медали: 1
ROMan2947 писал(а):
Я считал данные в двоичном коде, мне этот код нужно преобразовать в
Любое число можно представить во множестве счислений - хот в двоичном, хоть в десятичном, ... Но значение этого числа от этого будет неизменным. Вообще, двоичную систему придумали для удобства хранения, а не для того, чтобы на форуме переводили из неё числа в другую систему. Системы разные - значение одно ! Запомните это !
Что касается датчика. Данные он выдаёт уже в удобоваримом формате. Их просто нужно занести в знаковую переменную один к одному - сразу получаем температуру.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
akl писал(а):
Цитата:
сразу получаем температуру.
Разве? Для получения температуры с разрешением 1ºC, нужно код разделить на 16
Разве. Мы, в любом случае, получаем температуру. Пусть и умноженную на что-то там (16 в данном случае), но температуру. Остаётся только привести её к необходимому программисту разрешению.
ПРОДУРА ЧТЕНИЯ DS18(B/S)20. ДОВОЛНО СИЛНОJNKBXFTNCZ ОТ ДРЕВНИХ DS1820ТЕ ДОПУСКАЛИ много волностей в протоколе чтения эти капризные им надо полностью соблюсти тайминги и процедуру-обязателна фаза запроса датчиков и чтения внутренего ID -даже если датчик 1 нашине или всего 1 -такое упрошени в коде часто дают 127С на нем если процедура обрашения нестандартная или не выдержаны тайминги весма точно 2 глюк датчик имет болезнь саморазогрев и его не надо долбить слишком часто запросами а вм паузах надо усыплять tit одно часто фантомное питание не прокатывает на выносе чтоб не долбатца почему врет ...лучше проводки не экономить
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
ROMan2947 писал(а):
полагаю 16 это 12 битная разрешающая способность?
Да. При 12-ти битах, 4 бита остаются в дробной части от целых. А 4 бита - это 16. Если будете считывать начиная с 5-ого по счёту бита - получите разрешение в 1 градус, с 4-ого бита - в 0.5 градуса. С 1-ого бита - получаем разрешение в 0.0625 градуса, т.б. в 1/16-ую.
Ничего подобного, никаких битов отдельно под знак не выделено. Там просто int16_t число, равное температуре с точностью до коэффициента 16 (или 2 для DS18B20).
уже не один раз писал, как определить температуру по данным...
Код:
uint8_t scratchpad[9]; // сюда считываются данные из датчика int16_t *temp = (void*)scratchpad; // по указателю будет температура
// считали данные, проверили CRC. если все ОК, берем *temp и делим на 16 или иной коэффициент в зависимости // от типа датчика - имеем готовую температуру со знаком.
float temperature = *temp / 16.0;
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
уже не один раз писал, как определить температуру по данным...
На мое огромное удивление температура отображается исправно,причем и при отрицательной температуре Но все же есть одно,НО... очень хочется на своей LCD видеть не только целые,но и десятые доли)
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Код:
uint8_t scratchpad[9]; // сюда считываются данные из датчика int16_t temp = *(int16_t*)scratchpad; // читаем температуру в temp
// считали данные, проверили CRC. если все ОК, берем *temp и делим на 16 или иной коэффициент в зависимости // от типа датчика - имеем готовую температуру со знаком.
temp *=10; temp /=16;
Теперь в temp лежит температура с десятыми, умноженная на 10.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения