Привезли мне с алиэкпресса 6 датчиков DS18B20. По три штуки из двух разных партий (разные заказы).
С виду одинаковые: провода чёрный, красный и жёлтый. Длина кабеля 3 м. Подключал по схеме без паразитного питания: чёрный - земля, красный +5В, жёлтый - W2 (в конфигурации поставил W2 terminal mode Module type 1-Wire master )
Три из них (похоже, что из одной посылки, но не уверен, т.к. не сообразил не смешивать датчики) работают как положено: показывают ID и температуру, похожую на температуру в комнате, + при нагревании рукой температура изменяется соответствующе.
Но с тремя другими - проблема: WB показывает их ID, но температура определяется неадекватно - у одного около “минус 78”, у второго - около " минус 60", у третьего - “плюс 16”
в логах отладочной консоли появлялись сообщения вида
И всё бы ничего, и я бы сослался на брак, и отписал продавцу, если бы я не подключил их к 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, а ядерный драйвер, но принцип тот же: мы используем обычный код из линукса, который там уже лет пятнадцать у всех работает.
“read failed crc check” - это как раз от него. Посмотреть в обход wb-mqtt-w1 можно через /sys/bus/w1/devices и т.д., температура в “файлах” w1_slave
в линуксе и в ардуинке в data одинаковые все настройки.
в данных в линуксе действительно валидный пакет. В этих данных действительно датчик отдаёт отрицательные значения, по даташиту.
в ардуине отдаёт положительные
Очевидно, что датчики не настоящие. У настоящих другой id и другие значения в reserved байтах. Я бы не стал разбираться, выкинул, и купил бы нормальные датчики.
да, пишет, что неоригинальные и т.п. )
причём про те, которые работают с 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.
спасибо за совет ))
была такая мысль, но т.к. это доп. затраты с непредсказуемым результатом, не стал развивать…
но после вашего совета, наверное, попробую )