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

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

Сообщение 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 $
Реклама
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Сообщение Feruz »

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

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

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

Сообщение 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 $
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15615
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение viktor6 »

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

Сообщение ROMan2947 »

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

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

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

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

Сообщение ROMan2947 »

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

Сообщение akl »

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

Сообщение ROMan2947 »

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

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

Сообщение А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]Пропустил этот пост.
Ну вот, видите, всё Вы умеете. А спрашиваете как переводить эти данные в пользовательский вид :)
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

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

Сообщение ROMan2947 »

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

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

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

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

Сообщение ROMan2947 »

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

Сообщение WiseLord »

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

Сообщение ARV »

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

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

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

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

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

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

Сообщение ROMan2947 »

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

Сообщение А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);
Ну или любым другим способом.
Контактная информация:
Ответить

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