В железе это выглядит примерно так:
Реализовано авто определение количества подключенных NTC-термисторов. На самой шине 1Wire так же могут присутствовать и датчики DS18B20.
Диапазон от -25 до +125 гр.С. Разрешение, из за нелинейности термисторов, тоже нелинейно:
Скрытый текст
до -11 гр.С = 0.0185 - 0.0090до +25 гр.С = 0.0090 - 0.0035
до +80 гр.С = 0.0035 - 0.005
до +108 гр.С = 0.005 - 0.01
до +125 гр.С = 0.01 - 0.016
Немного пояснений по самому алгоритму:
При включении происходит авто определение подключенных датчиков и присвоение им внутренних серийных номеров.
Занимает этот процесс 24 миллисекунды, соответственно устройство автоматики (или иной контроллер) не должно ранее этого периода начать определять присутствие и идентифицировать цифровые датчики на шине. Если модуль прошиваем по UART и оставляем штатный для платы загрузчик, то время до начала идентификации надо увеличить как минимум до 500 миллисекунд.
Далее все идет практически по стандартному протоколу 1Wire. Сам опрос и расчеты для 8 датчиков занимает 300 миллисекунд.
Так же стоит уточнить как передаем показания с полной точностью. В самой посылке от датчика летит 9 байт, в первых двух температура с разрешением как и у DS18B20 (0.0625), а вот в третьем и четвертом как раз полная разрядность наших измерений (15 бит вместо 12 у DS`ок). В данных ячейках у реальных датчиков хранятся значения для режима термостата, нижний и верхний порог температур, используется данный режим обычно только если датчик работает автономно, соответственно с чистой совестью можем их использовать в своих целях ))). Пользоваться этим можно так:
Скрытый текст
Пример для стандартной Ардуиновской библиотеки:byte data[9];
for ( i = 0; i < 9; i++) {
data = ds.read();
}
int16_t raw_15 = (data[3] << 0x08) | data[2];
float Temperature = (float)raw_15 / 256.0; // значение с разрядностью до 0.004
ПО написано в среде Arduino версии 1.8.5, SDK для платы Arduino Pro Mini (контроллер ATmega328P) 1.6.20. Думаю так проще для повторения.
Проверена работа на автоматиках LuckyBox, Contronius, просто на отдельной Ардуиновской платке для опроса DS`ок с библиотекой OneWire, и на схеме с PIC контроллером используемом совершенно не для наших задач. Работу с автоматиками опубликованными на данном форуме не проверял.
Схема, печатная плата и исходники ПО в архиве ниже. Плата разработана для возможности изготовить "на коленке". Основные компоненты - это готовые модули с AliExpress: Arduino Pro Mini 16Mhz 5v и 2 платки АЦП ADS1115 в узком корпусе, резисторы и конденсаторы типоразмера 0805. Библиотеки в ПО кстати интегрированы, чтобы лишних танцев с бубном не происходило )))
pro_mini_ntc.zip
Подправил прошивку и добавил модель корпуса для печати, так что архив заменил.
Теперь корректно отрабатывает команда на конвертацию температуры (0x44), ну и еще некоторые болячки либы “OneWireHub” подправил.
Изменились серийники "подставных" датчиков.
Скрытый текст
Предопределены следующие серийники:1-й датчик = 0x28, 0x10, 0x55, 0x44, 0x33, 0x22, 0x01, (0xD8)
2-й датчик = 0x28, 0x20, 0x55, 0x44, 0x33, 0x22, 0x02, (0xD7)
3-й датчик = 0x28, 0x30, 0x55, 0x44, 0x33, 0x22, 0x03, (0xD2)
4-й датчик = 0x28, 0x40, 0x55, 0x44, 0x33, 0x22, 0x04, (0xC9)
5-й датчик = 0x28, 0x50, 0x55, 0x44, 0x33, 0x22, 0x05, (0xCC)
6-й датчик = 0x28, 0x60, 0x55, 0x44, 0x33, 0x22, 0x06, (0xC3)
7-й датчик = 0x28, 0x70, 0x55, 0x44, 0x33, 0x22, 0x07, (0xC6)
8-й датчик = 0x28, 0x80, 0x55, 0x44, 0x33, 0x22, 0x08, (0xF5)
Скрытый текст
Возможно использовать следующие типы:B(25/100) = 4300
B(25/100) = 3988
B(25/100) = 3950
B(25/100) = 3625
B(25/100) = 3530
B(25/100) = 3492
B(25/100) = 3380