Проблема получения данных о температуре с датчиков DS18B20 1-Wire

Привезли мне с алиэкпресса 6 датчиков DS18B20. По три штуки из двух разных партий (разные заказы).
С виду одинаковые: провода чёрный, красный и жёлтый. Длина кабеля 3 м. Подключал по схеме без паразитного питания: чёрный - земля, красный +5В, жёлтый - W2 (в конфигурации поставил W2 terminal mode Module type 1-Wire master )
Три из них (похоже, что из одной посылки, но не уверен, т.к. не сообразил не смешивать датчики) работают как положено: показывают ID и температуру, похожую на температуру в комнате, + при нагревании рукой температура изменяется соответствующе.
Но с тремя другими - проблема: WB показывает их ID, но температура определяется неадекватно - у одного около “минус 78”, у второго - около " минус 60", у третьего - “плюс 16”
в логах отладочной консоли появлялись сообщения вида

[19219.917022] w1_slave_driver 28-3c01d075554b: Read failed CRC check

И всё бы ничего, и я бы сослался на брак, и отписал продавцу, если бы я не подключил их к Arduino, запустил в ней стандартный скетч из примеров библиотеки 1-Wire для DS18B20, и он мне не выдал нормальные показания

23:40:43.704 ->   Data = 1 45 1 55 5 7F A5 A5 66 6D  CRC=6D
23:40:43.738 ->   Temperature = 20.31 Celsius, 68.56 Fahrenheit
23:40:43.771 -> No more addresses.
23:40:43.804 -> 
23:40:44.036 -> ROM = 28 6B 63 75 D0 1 3C 93
23:40:44.036 ->   Chip = DS18B20
23:40:45.032 ->   Data = 1 45 1 55 5 7F A5 A5 66 6D  CRC=6D
23:40:45.065 ->   Temperature = 20.31 Celsius, 68.56 Fahrenheit
23:40:45.098 -> No more addresses.
23:40:45.131 -> 
23:40:45.364 -> ROM = 28 6B 63 75 D0 1 3C 93
23:40:45.364 ->   Chip = DS18B20
23:40:46.359 ->   Data = 1 45 1 55 5 7F A5 A5 66 6D  CRC=6D
23:40:46.392 ->   Temperature = 20.31 Celsius, 68.56 Fahrenheit
23:40:46.425 -> No more addresses.
23:40:46.459 -> 
23:40:46.691 -> ROM = 28 6B 63 75 D0 1 3C 93
23:40:46.691 ->   Chip = DS18B20
23:40:47.719 ->   Data = 1 45 1 55 5 7F A5 A5 66 6D  CRC=6D
23:40:47.752 ->   Temperature = 20.31 Celsius, 68.56 Fahrenheit
23:40:47.785 -> No more addresses.

для всех трёх проблемных датчиков (ну и беспроблемных - тоже)

Из чего я могу предположить, что проблема всё-таки где-то на уровне работы драйвера wb-mqtt-w1.

N.B. в схеме с Arduino вывод данных датчика (жёлтый провод) подключался по схеме из этой статьи - с резистором на 4.7 кОм

P.S. переключение датчиков на вход W1 ничего не поменяло

Драйвер является оберткой для стандартного модуля ядра owfs. В owfs - есть что-нибудь при подключении датчиков?

как это посмотреть? я думаю, было бы быстрее, если бы были сразу инструкции, что нужно сделать ))

Добрый день!

  1. А попробуйте пожалуйста подключить эти датчики по двухпроводной схеме. Это когда провода земли и питания соединены вместе и подключены к земле.
    Я видел в природе датчики, которые работают только с паразитным питанием.

  2. Попробуйте пожалуйста подключать по одному датчику.

Ещё может быть проблема в датчиках с таймингами.

По owfs: у нас не owfs, а ядерный драйвер, но принцип тот же: мы используем обычный код из линукса, который там уже лет пятнадцать у всех работает.

“read failed crc check” - это как раз от него. Посмотреть в обход wb-mqtt-w1 можно через /sys/bus/w1/devices и т.д., температура в “файлах” w1_slave

В том то и дело, что те же датчики работают с Arduino без паразитного питания.
но попробую.

Попробуйте пожалуйста подключать по одному датчику.

я так и пробовал. все шесть я подключал строго по одному, по очереди каждый.

Посмотреть в обход wb-mqtt-w1 можно через /sys/bus/w1/devices и т.д., температура в “файлах” w1_slave

что искать? значение температуры из драйвера?

Ещё может быть проблема в датчиках с таймингами.

в чём она заключается и что с ней делать (если это она) и как? ))

1 лайк

не, так не работает вообще, датчик не определяется вовсе

вот “нездоровый” датчик

root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d075636b/w1_slave 
1e fb 55 05 7f a5 a5 66 50 : crc=50 YES
1e fb 55 05 7f a5 a5 66 50 t=-78125

вот “здоровый”

root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-06201933c620/w1_slave 
4f 01 4b 46 7f ff 0c 10 46 : crc=46 YES
4f 01 4b 46 7f ff 0c 10 46 t=20937

куда ещё можно копать? )

А на датчиках точно написано 18b20?
Именно “b”?
Хотя - нет, сигнатура чиатется верно.

на гильзах ничего не написано

вышеупомянутый ардуино-скетч выдаёт

15:12:32.596 -> ROM = 28 92 1E 75 D0 1 3C F6
15:12:32.596 ->   Chip = DS18B20
15:12:33.624 ->   Data = 1 65 1 55 5 7F A5 A5 66 C5  CRC=C5
15:12:33.657 ->   Temperature = 22.31 Celsius, 72.16 Fahrenheit

согласно своему коду

как ещё определить? ))

Вижу в выводе ардуино

А из owfs

и

Тот же датчик на owfs что показывает?

вот выше я приводил последний пример из ардуино

15:12:32.596 -> ROM = 28 92 1E 75 D0 1 3C F6
15:12:32.596 ->   Chip = DS18B20
15:12:33.624 ->   Data = 1 65 1 55 5 7F A5 A5 66 C5  CRC=C5
15:12:33.657 ->   Temperature = 22.31 Celsius, 72.16 Fahrenheit

повесил тот же датчик к WB

root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d0751e92/w1_slave 
[52211.384094] w1_master_driver w1_bus_master1: w1_search: max_slave_count 64 reached, will continue next search.
46 fc 55 05 7f a5 a5 66 d4 : crc=d4 YES
46 fc 55 05 7f a5 a5 66 d4 t=-59625
root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d0751e92/w1_slave 
41 fc 55 05 7f a5 a5 66 04 : crc=04 YES
41 fc 55 05 7f a5 a5 66 04 t=-59937
root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d0751e92/w1_slave 
43 fc 55 05 7f a5 a5 66 82 : crc=82 YES
43 fc 55 05 7f a5 a5 66 82 t=-59812
root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d0751e92/w1_slave 
3b fc 55 05 7f a5 a5 66 1d : crc=1d YES
3b fc 55 05 7f a5 a5 66 1d t=-60312
root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# cat 28-3c01d0751e92/w1_slave 
43 fc 55 05 7f a5 a5 66 82 : crc=82 YES
43 fc 55 05 7f a5 a5 66 82 t=-59812

ну и JFI

root@wirenboard-AEAY7RAZ:/sys/bus/w1/devices# xxd -p 28-3c01d0751e92/id 
28921e75d0013cf6

Ну итого:

  • в линуксе и в ардуинке в data одинаковые все настройки.
  • в данных в линуксе действительно валидный пакет. В этих данных действительно датчик отдаёт отрицательные значения, по даташиту.
  • в ардуине отдаёт положительные

Очевидно, что датчики не настоящие. У настоящих другой id и другие значения в reserved байтах. Я бы не стал разбираться, выкинул, и купил бы нормальные датчики.

Что можно сделать:

1 лайк

да, пишет, что неоригинальные и т.п. )
причём про те, которые работают с WB - тоже, но там просто меньше scratchpad-байтов не ok…

в целом - понятно ) спасибо

однако, интересно почему в ардуино-то работает? )) то бишь, в чём разница при работе в линуксе? если бы разобрался в чём именно, я бы смог, возможно, подкрутить модуль ядра, например, чтобы он делал как ардуина )))))

что это может дать (теоретически)?

Возможно - температура будет “более правильной”. Но это так, для развлечения.

Тогда - подключита на линию логический анализатор, снимите обмен, сравните.

а какой тип вам написал тот скетч? По описанию у вас похоже на " Family D2: Noisy Rubbish", а там пишут про магию:

  • Chips are sensitive to the way power is applied [5]. E.g. to power up from all pins attached to GND, it seems to be a good idea to leave Data and power pin floating for a bit (e.g., 100 ms) before actually applying a voltage to the power pin and Data [5].

первый скетч

3:53:22.090 -> 28-92-1E-75-D0-01-3C-F6: ROM does not follow expected pattern 28-xx-xx-xx-xx-00-00-crc. Error.
23:53:22.190 ->   Scratchpad Register: 90/01/55/05/7F/A5/A5/66/B4
23:53:22.223 ->   Info only: Scratchpad bytes 2,3,4 (55/05/7F):  not Maxim default values 4B/46/7F.
23:53:22.322 ->   Scratchpad byte 5 (0xA5):  should have been 0xFF according to datasheet. Error.
23:53:22.388 ->   Scratchpad byte 6 (0xA5):  unexpected value. Error.
23:53:22.455 ->   Scratchpad byte 7 (0x66):  should have been 0x10 according to datasheet. Error.
23:53:22.554 ->   0x4E modifies alarm registers:  ok.
23:53:22.588 ->   0x4E accepts 10 bit resolution:  ok.
23:53:22.621 ->   0x4E preserves reserved bytes:  ok.
23:53:22.654 ->   0x4E accepts 12 bit resolution:  ok.
23:53:22.720 ->   0x4E preserves reserved bytes:  ok.
23:53:22.753 ->   Checking byte 6 upon temperature change: not necessary. Skipped.
23:53:22.820 ->   --> Sensor appears to be counterfeit based on 4 deviations.
23:53:22.886 -> 
23:53:22.886 -> ------------------------------------------------

второй -

23:53:29.623 -> classify_fake_DS18B20.ino version 2020/05/25
23:53:29.656 -> 
23:53:29.656 -> This sketch performs a minimal test to classify
23:53:29.723 ->   1-wire sensors attached to pin 3 according to
23:53:29.756 ->   https://github.com/cpetrich/counterfeit_DS18B20/
23:53:29.822 ->   assuming they belong to one of the DS18B20
23:53:29.855 ->   Families in circulation in 2019.
23:53:29.889 ->   The script evaluates the sensors based on their
23:53:29.955 ->   response to undocumented function codes.
23:53:29.988 ->   Proceed at your own risk!
23:53:30.021 -> 
23:53:30.021 ->   Make sure power pin is connected to either Vcc or GND.
23:53:30.088 ->   Hit enter to start analysis.
23:53:30.121 -> 
23:53:46.348 -> 28-92-1E-75-D0-01-3C-F6: Family D2 (Clone w/o parasitic power).

да, вы правы ))

хотя

всё же про Family D1: Noisy Rubbish with Supercap

P.S. а вот те, что “работают” с WB - Family B1
JFI

00:08:40.517 -> 28-75-8C-7E-19-20-06-E2: ROM does not follow expected pattern 28-xx-xx-xx-xx-00-00-crc. Error.
00:08:40.617 ->   Scratchpad Register: 50/05/4B/46/7F/FF/7F/10/FF
00:08:40.649 ->   Info only: Scratchpad bytes 2,3,4 (4B/46/7F):  Maxim default values.
00:08:40.716 ->   Scratchpad byte 5 (0xFF):  ok.
00:08:40.749 ->   Scratchpad byte 6 (0x7F):  unexpected value. Error.
00:08:40.815 ->   Scratchpad byte 7 (0x10):  ok.
00:08:40.848 ->   0x4E modifies alarm registers:  ok.
00:08:40.881 ->   0x4E accepts 10 bit resolution:  ok.
00:08:40.948 ->   0x4E preserves reserved bytes:  no, got: FF/3F/10. Error.
00:08:41.014 ->   0x4E accepts 12 bit resolution:  ok.
00:08:41.047 ->   0x4E preserves reserved bytes:  no, got: FF/7F/10. Error.
00:08:41.114 ->   Checking byte 6 upon temperature change: not necessary. Skipped.
00:08:41.180 ->   --> Sensor appears to be counterfeit based on 4 deviations.
00:08:41.246 -> 
00:08:41.246 -> ------------------------------------------------
00:08:47.816 -> classify_fake_DS18B20.ino version 2020/05/25
00:08:47.849 -> 
00:08:47.849 -> This sketch performs a minimal test to classify
00:08:47.915 ->   1-wire sensors attached to pin 3 according to
00:08:47.949 ->   https://github.com/cpetrich/counterfeit_DS18B20/
00:08:48.015 ->   assuming they belong to one of the DS18B20
00:08:48.048 ->   Families in circulation in 2019.
00:08:48.081 ->   The script evaluates the sensors based on their
00:08:48.147 ->   response to undocumented function codes.
00:08:48.181 ->   Proceed at your own risk!
00:08:48.214 -> 
00:08:48.214 ->   Make sure power pin is connected to either Vcc or GND.
00:08:48.280 ->   Hit enter to start analysis.
00:08:48.313 -> 
00:08:50.005 -> 28-75-8C-7E-19-20-06-E2: Family B1 (Clone).

Советую попробовать датчик WB-M1W2. В свое время столкнулся с аналогичной проблемой при подключении датчиков ds18b20 к штатным портам WB. В итоге перешел на WB-M1W2, с ними проблем никаких нет, подключал разные партии датчиков, все ок. На штатных же портах периодически термодатчики зависают и постоянно с ними какие-то проблемы. На данный момент у меня 1 датчик только подключен к штатному порту, а остальные все к WB-M1W2.

спасибо за совет ))
была такая мысль, но т.к. это доп. затраты с непредсказуемым результатом, не стал развивать…
но после вашего совета, наверное, попробую )