Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
viktor6
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 10, 2017 22:56:31

Re: Всё по DS18(B/S)20.

Сообщение viktor6 »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3258100#p3258100"]Усы уже кудрявые(
как кодируется и раскодируется температура с сия девайса?[/uquote]
Честно я не понимаю о чем вы говорите. Датчики просто присоединены кабелем 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 $
Реклама
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: Всё по DS18(B/S)20.

Сообщение Feruz »

Всем привет! Смотрю здесь люди пытаются запустить датчик на пониженных тактовых частотах микроконтроллера? У меня удалось запустить от 128 кГц. https://github.com/FeruzTopalov/ds18b20-pocket-thermo
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

viktor6 писал(а):Честно я не понимаю о чем вы говорите.
Ну "Малинка" жу не умеет сама по себе датчики обслуживать. Ей нужен код. Покажите его.
viktor6
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 10, 2017 22:56:31

Re: Всё по DS18(B/S)20.

Сообщение viktor6 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3258129#p3258129"]
viktor6 писал(а):Честно я не понимаю о чем вы говорите.
Ну "Малинка" жу не умеет сама по себе датчики обслуживать. Ей нужен код. Покажите его.[/uquote]
Да вроде как умеет.
Может я чтото не так понимаю. Код вроде как нужен только для вывода данных.
Спойлер

Код: Выделить всё

pi@raspberrypi:~/myproject $ cat temperature.py
import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while True:
    print(read_temp())
    time.sleep(1)
pi@raspberrypi:~/myproject $
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS18(B/S)20.

Сообщение BOB51 »

Если более одного датчика на веточке то каждый канал перед обращением к датчику обязан провести "именной вызов" того датчика, к которому обращается.
В случае с одиночным эта процедура для сокращения проблем с протоколом весьма часто не проводится.
Возможно в том и ошибки зарыты.
8)
Реклама
viktor6
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 10, 2017 22:56:31

Re: Всё по DS18(B/S)20.

Сообщение viktor6 »

Ребята а может один из датчиков (4) не правильно работать и поэтому выдавать помехи в линию?
На данный момент подключено всего три датчика (3,4,5). Есть подозрения что только один (4) датчик через некоторое время выдает температуру 127 градусов.
Короче говоря буду наблюдать так ли это.
Реклама
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Честно я не понимаю о чем вы говорите. Датчики просто присоединены кабелем UTP к raspberry pi3.
да я вообще не из Вашей проблемы. Я считал данные в двоичном коде, мне этот код нужно преобразовать в понятный обычному человеку вид.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

ROMan2947 писал(а):Я считал данные в двоичном коде, мне этот код нужно преобразовать в
Любое число можно представить во множестве счислений - хот в двоичном, хоть в десятичном, ... Но значение этого числа от этого будет неизменным.
Вообще, двоичную систему придумали для удобства хранения, а не для того, чтобы на форуме переводили из неё числа в другую систему. Системы разные - значение одно ! Запомните это !

Что касается датчика. Данные он выдаёт уже в удобоваримом формате. Их просто нужно занести в знаковую переменную один к одному - сразу получаем температуру.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Данные он выдаёт уже в удобоваримом формате.
Ну считал я 0b0000000110001000 == 392==0x188 и где тут температура?
а если 392*0,0625=24,5 вот это более похоже на правду.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Всё по DS18(B/S)20.

Сообщение akl »

Аlex писал(а):Данные он выдаёт уже в удобоваримом формате. Их просто нужно занести в знаковую переменную один к одному - сразу получаем температуру.
Разве? Для получения температуры с разрешением 1ºC, нужно код разделить на 16, т.к. 0,0625*16=1
Последний раз редактировалось akl Ср дек 13, 2017 15:18:04, всего редактировалось 1 раз.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Их просто нужно занести в знаковую переменную один к одному - сразу получаем температуру.
Этот процесс можно на примере показать?

Добавлено after 2 minutes 30 seconds:
нужно код разделить на 16.
16 это к чему относится? 16 битный код?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

akl писал(а):
сразу получаем температуру.
Разве? Для получения температуры с разрешением 1ºC, нужно код разделить на 16
Разве.
Мы, в любом случае, получаем температуру. Пусть и умноженную на что-то там (16 в данном случае), но температуру. Остаётся только привести её к необходимому программисту разрешению.

Добавлено after 3 minutes 11 seconds:
ROMan2947 писал(а):Этот процесс можно на примере показать?
Процесс чего ?
ROMan2947 писал(а):16 это к чему относится?
К разрешению датчика.

Добавлено after 3 minutes 39 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3258820#p3258820"]а если 392*0,0625=24,5 вот это более похоже на правду.[/uquote]Пропустил этот пост.
Ну вот, видите, всё Вы умеете. А спрашиваете как переводить эти данные в пользовательский вид :)
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Re: Всё по DS18(B/S)20.

Сообщение musor »

ПРОДУРА ЧТЕНИЯ DS18(B/S)20. ДОВОЛНО СИЛНОJNKBXFTNCZ ОТ ДРЕВНИХ DS1820ТЕ ДОПУСКАЛИ много волностей в протоколе чтения
эти капризные им надо полностью соблюсти тайминги и процедуру-обязателна фаза запроса датчиков и чтения внутренего ID -даже если датчик 1 нашине или всего 1 -такое упрошени в коде часто дают 127С на нем если процедура обрашения нестандартная или не выдержаны тайминги весма точно 2 глюк датчик имет болезнь саморазогрев и его не надо долбить слишком часто запросами
а вм паузах надо усыплять
tit одно часто фантомное питание не прокатывает на выносе чтоб не долбатца почему врет ...лучше проводки не экономить
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

К разрешению датчика.
в даташите о таком разрешении ни слова,полагаю 16 это 12 битная разрешающая способность?

Добавлено after 4 minutes 36 seconds:
А спрашиваете как переводить эти данные в пользовательский вид 
ну пришлось поюзать,но до истины добраться уж только здесь) :write:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

ROMan2947 писал(а):полагаю 16 это 12 битная разрешающая способность?
Да. При 12-ти битах, 4 бита остаются в дробной части от целых. А 4 бита - это 16.
Если будете считывать начиная с 5-ого по счёту бита - получите разрешение в 1 градус, с 4-ого бита - в 0.5 градуса. С 1-ого бита - получаем разрешение в 0.0625 градуса, т.б. в 1/16-ую.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

В регистре температуры на знак температуры выделено пять бит.Вопрос: достаточно ли проверять знак по одному из этих битов?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение WiseLord »

Ничего подобного, никаких битов отдельно под знак не выделено. Там просто int16_t число, равное температуре с точностью до коэффициента 16 (или 2 для DS18B20).
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение ARV »

уже не один раз писал, как определить температуру по данным...

Код: Выделить всё

uint8_t scratchpad[9]; // сюда считываются данные из датчика
int16_t *temp = (void*)scratchpad; // по указателю будет температура

// считали данные, проверили CRC. если все ОК, берем *temp и делим на 16 или иной коэффициент в зависимости
// от типа датчика - имеем готовую температуру со знаком.

float temperature = *temp / 16.0;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

уже не один раз писал, как определить температуру по данным...
На мое огромное удивление температура отображается исправно,причем и при отрицательной температуре :) Но все же есть одно,НО... очень хочется на своей LCD видеть не только целые,но и десятые доли)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Код: Выделить всё

uint8_t scratchpad[9]; // сюда считываются данные из датчика
int16_t temp = *(int16_t*)scratchpad; // читаем температуру в temp 

// считали данные, проверили CRC. если все ОК, берем *temp и делим на 16 или иной коэффициент в зависимости
// от типа датчика - имеем готовую температуру со знаком.

temp *=10;
temp /=16;
Теперь в temp лежит температура с десятыми, умноженная на 10.

Вывод :

Код: Выделить всё

printf("%d.%d", temp/10, temp%10);
Ну или любым другим способом.
Ответить

Вернуться в «Периферия»