Как изменить разрядность ds18b20

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

Пнд, 08/02/2016 — 00:57

#1

lex2k

Offline

Зарегистрирован: 17.12.2015

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

в setup

sensors.setResolution(Thermometer1, 10); 

пологаю что так

  • Войдите на сайт для отправки комментариев

Пнд, 08/02/2016 — 04:31

#2

bwn

Offline

Зарегистрирован: 25.08.2014

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

  • Войдите на сайт для отправки комментариев

Пнд, 08/02/2016 — 09:03

#3

ЕвгенийП

ЕвгенийП аватар

Offline

Зарегистрирован: 25.05.2015

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

Коллеги, вроде всё сказали. Хочу только добавить: вообще-то у него точность по даташиту — полградуса, так может и пусть? На меньшем разрешении быстрее измеряет.

  • Войдите на сайт для отправки комментариев

Пнд, 08/02/2016 — 09:11

#4

bwn

Offline

Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

Коллеги, вроде всё сказали. Хочу только добавить: вообще-то у него точность по даташиту — полградуса, так может и пусть? На меньшем разрешении быстрее измеряет.

Евгений, не соглашусь с Вами. Точность и разрядность разные вещи. Постоянное отклонение от фактической температуры никак не препятствует производить замер с требуемым разрешением. Ведь никто не мешает произвести поверку конкретного экземпляра и вносить эту поправку в измерения. ИМХО.

  • Войдите на сайт для отправки комментариев

Пнд, 08/02/2016 — 10:27

#5

ЕвгенийП

ЕвгенийП аватар

Offline

Зарегистрирован: 25.05.2015

bwn,

я не об этом. Я о том, что если у прибора точность 0,5 градуса, то, скажем, показывать результат на экране с более, чем одной цифрой после запятой просто не имеет смысла. Поэтому высокая там разрядность или поменьше, как бы разницы особой нет. Правда, это при условии, что точность у него не зависит от разрядности и всегда 0,5 градуса.

Кстати, по поводу фразы : «если у прибора точность 0,5 градуса, то, скажем, показывать результат на экране с более, чем одной цифрой после запятой просто не имеет смысла» — она родилась из реальной практики. Я тут не так давно делал термостат для травления плат в персульфате (нужно держать 50С). Там контроллером работала ATtiny45. Памяти у неё не густо, и когда не стало влезать я посмотрел кто её отжирает. Выяснил, что DallasTemperature непосрественно перед возвращением готового результата, преобразовывает его к double, чтобы умножить на коэффициент. Нигде больше double у меня не использовался и получалось, что из-за этого несчастного умножения у меня притягивается добрых полтора килобайта кода библиотеки работы с плавающей точкой. Переделал возвращаемый результат таким образом: всё только в целых числах, но возвращается температура, умноженная на 10. Все сравнения делаю с учётом этого (допустим целевая температура не 50С, а 500). А при выводе температуры на семисегментник, просто нагло добавляю во вторую справа цифру десятичную точку. Всё отлично работает и полтора килобайта сэкономил.

  • Войдите на сайт для отправки комментариев

Пнд, 08/02/2016 — 11:23

#6

bwn

Offline

Зарегистрирован: 25.08.2014

ЕвгенийП, надстройкой над OneWire я принципиально не пользуюсь. Не вижу в ней смысла.
Для визуального отображения, больше одного знака после запятой бессмысленно, а чаще и он лишний. А вот для математики и обработки и три не лишних. Для того же ректификатора, надо держаться в коридоре 0,2-0,3 градуса, здесь уже используется полная разрядность. А точность как раз не важна, ибо порог стабилизации даже в течении дня сдвигается, а значит эталоном является относительная замеренная температура.
В последних разработках, тоже от float-ов избавился, жрут много, толку мало.))))
И кстати декларируемые 0,5гр. это крайний случай. Проверял комплектно из разных партий, обычно разброс не более 0,2гр, а это уже медицинский термометр.))))

  • Войдите на сайт для отправки комментариев

Втр, 09/02/2016 — 21:31

#7

Prototipnew

Offline

Зарегистрирован: 07.02.2016

Как вообщем програму написать эти команды я видел в библиотеке тоже. Блин я тоже могу так ответить.

  • Войдите на сайт для отправки комментариев

Втр, 09/02/2016 — 21:33

#8

Prototipnew

Offline

Зарегистрирован: 07.02.2016

Дайте конкретную программу для его зброса.

  • Войдите на сайт для отправки комментариев

Втр, 09/02/2016 — 22:10

#9

bwn

Offline

Зарегистрирован: 25.08.2014

Дай, на той неделе хером подавился. Вставляешь в Setup, что я написал, и будет счастье. Адрес не забудь прописать.

  • Войдите на сайт для отправки комментариев

Втр, 09/02/2016 — 23:05

#10

ЕвгенийП

ЕвгенийП аватар

Offline

Зарегистрирован: 25.05.2015

Prototipnew пишет:

Дайте конкретную программу для его зброса.

Конкретные программы дают в разделе «ищу исполнителя».

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 01:35

#11

MacSim

Offline

Зарегистрирован: 28.11.2012

Что-ж жадные все такие…людям библиотеки подавай, без #инклюд готовая программа      не работает

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

ззззззззбрасывайте

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

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 08:40

#12

MacSim

Offline

Зарегистрирован: 28.11.2012

.ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 думаю что это у него не заработает. ну не напечатает он одинпровод.АШ

и спросит где аддр брать…

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 02:23

#13

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 02:25

#14

Prototipnew

Offline

Зарегистрирован: 07.02.2016

Я уже делал так спасибо к вам претензий нет. Сам допер

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 02:25

#15

Prototipnew

Offline

Зарегистрирован: 07.02.2016

MacSim пишет:

Что-ж жадные все такие…людям библиотеки подавай, без #инклюд готовая программа      не работает

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

ззззззззбрасывайте

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

Я уже делал так спасибо к вам претензий нет. Сам допер

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 02:35

#16

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить….

  • Войдите на сайт для отправки комментариев

Ср, 10/02/2016 — 09:21

#17

MacSim

Offline

Зарегистрирован: 28.11.2012

Prototipnew пишет:

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

возможно у вас в коде настройка на 9 стоит, ее «выкинуть надо»

какуой код используете, бибилиотеку?

  возможно вы используете подсчет температуры от 9 бит, в то время как датчик дает 12.( raw считается от 9 бит, остальные выкидываются). и от флоат уюти надо к инт, быстрее работать будет.

в библиотеке <DallasTemperature.h> есть пример, на сериал кидается на какую разрядность запрограмирован датчик. или можете спросить его BEh и почитать ответ, послушать все 9 не прерывая, он все сам раззззззкажет.

https://yandex.ru/search/?text=18b20%20datasheet&lr=213 первая ссылка, даже по русски

и не надо ззззбрасывать, надо бит 5 и 6 регистра конфигурации установить в 11 и меньше юзать чужие проги, не разобравшийсь в них. попробуйте с нуля написать его опрос(я не говорю ванваре.Х выкинуть, с ее использованием) поймете, что где лежит у 1820 и как это что-то доставать и куда что-то класть.

даташит вам в помощь, да прибудет с вами СИ

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 21:30

#18

Prototipnew

Offline

Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить….

Ну куда вставить скажи слушаю? В сетаб вставлял в цыкл вставлял куда еще бля.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 21:31

#19

Prototipnew

Offline

Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить….

Ну куда вставить скажи слушаю? В сетаб вставлял в цыкл вставлял куда еще бля.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 21:40

#20

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

вставить в сетап , один раз прошить прогу ( датчик запомнит разрядность преобразования ) , убрать это из сетапа…
да , датчики с конвейра идут под разрешение 12 , что-то у тибя в другом проблема , мне кажется….

код покажи уж :)

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 21:47

#21

bwn

Offline

Зарегистрирован: 25.08.2014

Действительно, прогу показывай. Этот кусок из работающего кода. Там при запуске, для автоопределения датчиков у меня два раза разрядность изменяется сперва на 9, потом на 12 бит. Все работает. Покажи как кодил для изменения и свою программу в которой на 9 бит возвращается.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:01

#22

Prototipnew

Offline

Зарегистрирован: 07.02.2016

SU-27-16 пишет:

вставить в сетап , один раз прошить прогу ( датчик запомнит разрядность преобразования ) , убрать это из сетапа…
да , датчики с конвейра идут под разрешение 12 , что-то у тибя в другом проблема , мне кажется….

код покажи уж :)

#include <OneWire.h>

OneWire ds(2);

byte addr1[8];

void setup() {

  ds.reset();

  ds.select(addr1);

  ds.write(0x4E);

  ds.write(0x7F); // верх и низ для аварийных температур

  ds.write(0xFF);

  ds.write(0x60); // это разрядность конвертации

  ds.write(0x48);

}

void loop() {

  // put your main code here, to run repeatedly:

}

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:14

#23

bwn

Offline

Зарегистрирован: 25.08.2014

Супер, а что значит byte addr1[8]; ? Где в него адрес заносится?

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:15

#24

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

Действительно, прогу показывай. Этот кусок из работающего кода. Там при запуске, для автоопределения датчиков у меня два раза разрядность изменяется сперва на 9, потом на 12 бит. Все работает. Покажи как кодил для изменения и свою программу в которой на 9 бит возвращается.

В этом варианте все работает но я хочу уйти от библиотеки далас. Мне надо место сэкономить и она тормозит систему.

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:15

#25

bwn

Offline

Зарегистрирован: 25.08.2014

То, что я дал это OneWire, надстройкой вообще не пользуюсь.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:16

#26

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

Супер, а что значит byte addr1[8]; ? Где в него адрес заносится?

Если один датчик используется то его можно описать так. Она ищет все датчики которые есть, независимо от адреса.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:18

#27

bwn

Offline

Зарегистрирован: 25.08.2014

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:22

#28

bwn

Offline

Зарегистрирован: 25.08.2014

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

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:25

#29

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

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

Я вкурсе. А он меняется прикинь? Пока не вставиш эту строку: sensors.setResolution(insideThermometer, 12);

Я ж не зря это все говорю может.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:27

#30

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>

OneWire ds(2);

byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};

void setup() {

  ds.reset();

  ds.select(addr1);

  ds.write(0x4E);

  ds.write(0x7F); // верх и низ для аварийных температур

  ds.write(0xFF);

  ds.write(0x60); // это разрядность конвертации

  ds.write(0x48);

}

void loop() {

  // put your main code here, to run repeatedly:

}

Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:29

#31

bwn

Offline

Зарегистрирован: 25.08.2014

Там где у тебя byte addr1[8] пропиши код датчика руками. Потом запусти обычный пример, без твоей проги и посмотри, изменится или нет. В Далласовской библиотке не знаю, переписывает в EEPROM датчика или нет. В моем куске записывает.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:32

#32

bwn

Offline

Зарегистрирован: 25.08.2014

Prototipnew пишет:

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>

OneWire ds(2);

byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};

void setup() {

  ds.reset();

  ds.select(addr1);

  ds.write(0x4E);

  ds.write(0x7F); // верх и низ для аварийных температур

  ds.write(0xFF);

  ds.write(0x60); // это разрядность конвертации

  ds.write(0x48);

}

void loop() {

  // put your main code here, to run repeatedly:

}

Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.

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

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:32

#33

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

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

Пока ипользую Далас и ту строку все нормально она походу сразу конвертирует через библу. Но я хочу избавится от библы Далас.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:34

#34

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

Prototipnew пишет:

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>

OneWire ds(2);

byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};

void setup() {

  ds.reset();

  ds.select(addr1);

  ds.write(0x4E);

  ds.write(0x7F); // верх и низ для аварийных температур

  ds.write(0xFF);

  ds.write(0x60); // это разрядность конвертации

  ds.write(0x48);

}

void loop() {

  // put your main code here, to run repeatedly:

}

Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.

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

В другом

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:44

#35

bwn

Offline

Зарегистрирован: 25.08.2014

Попробуй после изменения этот код запустить.

#include <OneWire.h>
#include <EEPROM.h>
#include <avr/wdt.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
 byte flag[2];    // Флаги для обслуживания датчиков Даллас
 byte addr[9];
 int Temp [5][2]; // Массив переменных температуры
 
 const byte led=13; //Пин световой индикации
 const byte alarm=9; // Пин звуковой индикации


void setup(void) {
  //wdt_disable(); //Отключить собаку
  //delay(2000);
  
  //wdt_enable(WDTO_2S); // Взвести собаку на 2 секунды
  
  pinMode(led, OUTPUT);
  pinMode(alarm, OUTPUT);
  digitalWrite(led, HIGH);
  digitalWrite(alarm, LOW);
  
  Serial.begin(9600);
  
  colDall();
  obnColDall();
  addrDall();
  svAddrDall();
  addrDall();
  prinDall();
}

//***Проверка количества датчиков Даллас******
void colDall(){
  Serial.println("Vhod colDall");
  while ( ds.search(addr) ){ //Цикл перебора адресов датчиков
    flag[0]++; //Увеличение переменной числа датчиков
    ledBlink(1000);
  }
  if (flag[0] > 5) { //Условие превышения максимального количества
  //Если мало, увеличить размерность массива
    Serial.println("Mnogo datchikov"); //Здесь сообщение и обработка ошибки
    delay (5000); //Задержка для перезагрузки
  }
} 
//***----------------------------------------------------------------------------------

//***Функция обновления количества датчиков Даллас*****
void obnColDall() {
  if (flag[0] != EEPROM.read(1023)){ //Количество датчиков не соответствует запомненному
    Serial.println("Rabota obnColDall");
    if (EEPROM.read(1023) == 255 || EEPROM.read(1023) == 0){ //если количество датчиков не указано
      EEPROM.write( 1023, flag[0]); //Записать количество датчиков
      flag[0] = 0; //Сбросить флаг 
      flag[1] = 1; //Установить флаг.
      ledBlink(1000);
    }
    else {
      int i;
      for (i = 1022; i > (1022-(EEPROM.read(1023)*9)); i--){ //Перебор ячеек для адресов датчиков
        EEPROM.write(i, 255); //Очистка ячейки
        flag[1] = 1; //Установить флаг
        ledBlink(1000);
      }
        EEPROM.write(1023, flag[0]); //Записать новое количество датчиков
        flag[1] = 1; //Установить флаг
        flag[0] = 0; //Сбросить флаг
      }
  }
}
//--------------------------------------------------

//****Функция обновления адресов датчиков Даллас***

void addrDall(){
  Serial.println("Vhod addrDall");
  byte i;
  addr[8]=0; //Очистка байта признака датчика
  if (flag[0] == 0){ //Проверка флага
    Serial.println("Rabota Pishem adresa");
    while ( ds.search(addr) ){ //Цикл считывания адресов датчиков
      for ( i = 0; i < 9; i++ ){ //Перебор байтов адреса
        EEPROM.write(1022-flag[0]*9-i, addr[i]); //Запись байта считанного адреса
        ledBlink(1000);
     }
      flag[0]++; //Увеличить переменную количества датчиков
    }
    flag[1] = 1; //Установить флаг
  } 
}
//--------------------------------------------------

//***Функция сверки адресов датчиков Даллас****
void svAddrDall(){
  Serial.println("Vhod svAddrDall");
  byte i;
  flag[0]=0; //Сбросить флаг
  while ( ds.search(addr) ){ //Цикл считывания адреса датчика
    for (i = 0; i < 8; i++) {
      ledBlink(1000);
      if (addr[i] != EEPROM.read(1022-flag[0]*9-i)){ //Если считанный байт не равен записанному
        Serial.println("Adres ne raven");
        flag[0] = 0; //Сбросить флаг.
        ds.reset_search(); //Обнулить счетчик адресов
        return; //Выход
      }
    }
    flag[0]++; //Увеличить переменную количества адресов
  }
}
//---------------------------------------------------

//***Функция принадлежности Даллас*****
void prinDall() {
  Serial.print("Vhod prinDall");
  Serial.print("  ");
  Serial.println(flag[1],DEC);
  byte i = 0;
  if (EEPROM.read(1014) == 0 || EEPROM.read(1014) == 255) { //Проверка записей принадлежности 
    if (flag[1] == 1) {
      Serial.println("Perezagruzka");//Здесь сообщение о перезагрузке
      delay(2500);
    }
    int prinTemp[5][2]; // Временный массив температур
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
      adresDall(flag[0]); //Считать адрес Далласа
      razrDall(0x00); //Изменить на 9 бит разрешение  
    }
    dallRead(100);//Конвертация температур
    delay(110);
    dallRead(100);//Считывание температур
    ledBlink(1000);//Мигнуть и пнуть собаку
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
      prinTemp[flag[0]][0] = Temp[flag[0]][0]; //Присвоение временной температуры
      prinTemp[flag[0]][1] = 0; //Очистка признака
    }
    flag[1] = 0; //Обнуляем, для устранения влияния 
    //от использования в функции чтения температуры
    while (flag[1] == 0) { //Цикл проверки датчиков
      ledBlink(1000);
      Serial.print("Dat "); //Здесь функция отображения номера датчика
      Serial.println(i+1,DEC);
      dallRead(100);
      for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор массива температур
        if (prinTemp[flag[0]][1] == 0) { //Проверка на признак принадлежности датчика
          if(Temp[flag[0]][0] - prinTemp[flag[0]][0] > 299) { //Проверка факта нагрева датчика
            prinTemp[flag[0]][1] = i+1; //Присвоение значения признака
            i++; //Увеличиваем значение признака
          }
        }
      }
      flag[1] = 1; //Установка флага окончания цикла проверки
      for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
        if (prinTemp[flag[0]][1] == 0){ //Если есть датчики без признака
          flag[1] = 0; //Флаг окончания цикла сбросить
        }
      }
      if (i == (EEPROM.read(1023)-1)) { //Остался один датчик без признака
        for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
          if (prinTemp[flag[0]][1] == 0) { //Определяем датчик без признака
            prinTemp[flag[0]][1] = i+1; //Записываем признак
          }
        }
      }    
    }
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { //Перебор количества датчиков
      EEPROM.write((1023-flag[0]*9-9), prinTemp[flag[0]][1]); //Запись байта признака 
      Temp[flag[0]][0] = prinTemp[flag[0]][0]; //Присвоение значения температуры
      Temp[flag[0]][1] = prinTemp[flag[0]][1]; //Присвоение значения признака 
      adresDall(flag[0]); //Считать адрес Далласа
      razrDall(0x60); //Изменить на 12 бит разрешение  
    }  
  }
}
          
//--------------------------------------------------

//****Функция считывания адреса Далласа*****
void adresDall(byte number){
  byte i;
  for ( i = 0; i < 8; i++ ){ //Перебор номеров байтов адреса
        addr[i] = EEPROM.read(1022-number*9-i); //Считываем записанный байт в переменную адреса датчика
        ledBlink(1000);
  } 
}
//-------------------------------------------------

//***Функция изменения разрядности Даллас****
void razrDall(byte raz) {
  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F);
  ds.write(0xFF);
  ds.write(raz);
  ds.write(0x48);
}
//------------------------------------------------

//******Функция инд.свтодиодом************* 
void ledBlink(unsigned long interval)
{
  static unsigned long prevTime = 0;
  if (millis()-prevTime > interval)    //Проверка условия
  {
    prevTime = millis();
    //wdt_reset(); //Очистка собаки
    digitalWrite(led,!digitalRead(led)); //Инверсия значения
  }
}
//-------------------------------------------------      
        
//***Функция считывания температуры c Далласов*****
void dallRead(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) { //Проверка заданного интервала
  static boolean flagDall = 0; //Признак операции
  prevTime = millis();
  flagDall =! flagDall; //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    flag[1] = 1; //Время возврата в секундах
  }
  else {
    byte i;
    int temp;
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор количества датчиков
        adresDall(flag[0]); //Получение адреса датчика
     ds.reset();
     ds.select(addr);
     ds.write(0xBE); //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
     Temp[flag[0]][0] = temp*100/4/4; //Температура в целочисленном формате *100
     //два знака после запятой.
     flag[1] = 10; //Время возврата в секундах
     }
   }
  }
}
//--------------------------------------------------
     
      
  
  
  
  
void loop() {
  ledBlink(1000);
  
  dallRead(flag[1]*1000);
  Serial.println(flag[1],DEC);
  Serial.println(Temp[0][0]/100.0,2);
  Serial.println(Temp[1][0]/100.0,2);
  Serial.println(Temp[2][0]/100.0,2);
  Serial.println(Temp[3][0]/100.0,2);
  Serial.println(" ");
  delay(900);
  
}

Для Атмеги328

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:54

#36

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

Попробуй после изменения этот код запустить.


Для Атмеги328

Сначала все работает. Только выключаю с юсб и включаю снова, снова только по половинке показывает.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:56

#37

Prototipnew

Offline

Зарегистрирован: 07.02.2016

Prototipnew пишет:

bwn пишет:

Попробуй после изменения этот код запустить.


Для Атмеги328

Сначала все работает. Только выключаю с юсб и включаю снова, снова только по половинке показывает.

Я уже думаю может часы реального времени нужно поставить?

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 22:59

#38

bwn

Offline

Зарегистрирован: 25.08.2014

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:00

#39

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

может быть в датчике «блокнот» убитый , ничо не запоминает ? другой есть ? третий , четвёртый….
ЧРВ — не нужны они датчику

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:03

#40

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем…Понятно ну ладно спасибо. Куплю другой датчик.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:05

#41

bwn

Offline

Зарегистрирован: 25.08.2014

Prototipnew пишет:

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем…Понятно ну ладно спасибо. Куплю другой датчик.

Так когда умрет совсем, тогда и купишь. Чем тебя эти пять строчек напрягают?

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:16

#42

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

Prototipnew  , можешь код из #30 доделать чтобы в Сериал выводился весь блокнот датчика ?
что-то здеся не так…..

и уйди с пина 2 ( и 3 ) — если выкладываешь не весь код то может быть прерывания тибе , коду :) мешают ?

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:20

#43

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

этот пример что в Сериал выдаёт ?
покажи….

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:23

#44

Prototipnew

Offline

Зарегистрирован: 07.02.2016

bwn пишет:

Prototipnew пишет:

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем…Понятно ну ладно спасибо. Куплю другой датчик.

Так когда умрет совсем, тогда и купишь. Чем тебя эти пять строчек напрягают?

Ты не поверишь))))))))) То же самое строки не помогли)) Бля…ахаха

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:26

#45

Штирлиц

Штирлиц аватар

Offline

Зарегистрирован: 13.06.2015

 Мож ну его этот датчик , к чертовой матери. Мож лучше с блинком  поиграться топикстартеру, а потом и с блинком без делей.Если бы датчик читать умел — уже бы и сам поменял разрядность и без загрузки скетчей…Не умея менять разрядность датчика , имеем желание иметь температуру с тысячными градуса. .

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:27

#46

Штирлиц

Штирлиц аватар

Offline

Зарегистрирован: 13.06.2015

SU-27-16 пишет:


этот пример что в Сериал выдаёт ?
покажи….

А что -такое СЕРИАЛ?

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:32

#47

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

Ctrl + Shift + M
пардон , просто я так его называю :)

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:32

#48

bwn

Offline

Зарегистрирован: 25.08.2014

Штирлиц пишет:

 Мож ну его этот датчик , к чертовой матери. Мож лучше с блинком  поиграться топикстартеру, а потом и с блинком без делей.Если бы датчик читать умел — уже бы и сам поменял разрядность и без загрузки скетчей…Не умея менять разрядность датчика , имеем желание иметь температуру с тысячными градуса. .

После тех пяти строчек проблема на 9 будет вернуться. Но возвращается, если только ТС ничего не умалчивает. Ощущение, что у него в EEPROM датчика не пишется.

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:35

#49

SU-27-16

SU-27-16 аватар

Offline

Зарегистрирован: 13.08.2012

  • Войдите на сайт для отправки комментариев

Чт, 11/02/2016 — 23:37

#50

Штирлиц

Штирлиц аватар

Offline

Зарегистрирован: 13.06.2015

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

  • Войдите на сайт для отправки комментариев
  • 1
  • 2
  • следующая ›
  • последняя »

Разрешающая способность датчика температуры DS18B20 может быть задана в регистре конфигурации. Возможны варианты: 9, 10, 11 и 12 битов.

От этого параметра зависит точность измерения температуры. Но при повышении разрешения увеличивается и время измерения. Для каждой конкретной задачи лучше выбирать свою разрешающую способность датчика.

Регистр конфигурации загружается при включении питания из внутреннего EEPROM датчика DS18B20. Можно, конечно, программировать EEPROM датчика в устройстве, к которому он подключен, но это лишняя операция, занимающая время и ресурсы. Практичнее запрограммировать конфигурацию датчика отдельно.

Для этого я написал не большую программу. Она загружается в плату Arduino UNO R3 и получается простой программатор.

Датчик DS18B20 подключается по такой схеме.

ProgDs18b20_5.PNG
ProgDs18b20_5.PNG (6.53 КБ) 12050 просмотров

Я выбрал выводы, для того чтобы датчик можно было просто вставить в соседние контакты разъема платы. Туда же вставляется резистор сопротивлением 4,3 кОм.

ProgDs18b20_4.JPG
ProgDs18b20_3.JPG

Загружается программа в плату. Открывается монитор последовательного порта Arduino IDE. Скорость 9600 бод.
Программа в цикле считывает состояние датчика: температуру и разрешающую способность (в разрядах).

ProgDs18b20_1.PNG

Для программирования необходимо послать команду:

    D=0 , для установки разрешения 9 бит;
    D=1 , для установки разрешения 10 бит;
    D=2 , для установки разрешения 11 бит;
    D=3 , для установки разрешения 12 бит.

В окне монитора должно появиться сообщение ”Programming” и произойти собственно программирование. После этого будут отображаться новые данные разрешения датчика.

ProgDs18b20_2.PNG

Все остальные команды программа проигнорирует.
Вот скетч программы.

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

// программирование датчика DS18B20
#include <OneWire.h>

OneWire sensDls (13);  // датчик подключен к выводу 13

byte buffData[9];  // буфер данных
float temperature;  // измеренная температура

void setup() {
  Serial.begin(9600); // инициализируем порт, 9600 бод 
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
}

void loop() { 

  // перезагрузка данных из EEPROM
  sensDls.reset();  // сброс шины
  sensDls.write(0xCC, 0); // пропуск ROM
  sensDls.write(0xB8, 0); // запись EEPROM
  delay(20);

  // чтение данных из датчика
  sensDls.reset();  // сброс шины
  sensDls.write(0xCC, 0); // пропуск ROM
  sensDls.write(0x44, 0); // инициализация измерения
  delay(900);  // пауза 0,9 сек
  sensDls.reset();  // сброс шины
  sensDls.write(0xCC, 0); // пропуск ROM 
  sensDls.write(0xBE, 0); // команда чтения памяти датчика 
  sensDls.read_bytes(buffData, 9);  // чтение памяти датчика, 9 байтов

  if ( OneWire::crc8(buffData, 8) == buffData[8] ) {  // проверка CRC
    // данные правильные
    Serial.print("T= ");
    Serial.print((float)((int)buffData[0] | (((int)buffData[1]) << 8)) * 0.0625 + 0.03125);

        Serial.print("   Digits= ");
    if ( (buffData[4] & 0x60) == 0) Serial.println("9");
    else if ( (buffData[4] & 0x60) == 0x20) Serial.println("10");
    else if ( (buffData[4] & 0x60) == 0x40) Serial.println("11");
    else if ( (buffData[4] & 0x60) == 0x60) Serial.println("12");
  }

    else { 
    // ошибка CRC
    Serial.println("Read error");
  }   

  // проверка данных для программирования
  if( Serial.available() != 0) {
    delay(10);

    if( Serial.available() == 5) {
      // все правильно, 5 байтов

      if ( (Serial.read() == 'D') && (Serial.read() == '=') ) {

              char x = Serial.read();
        if ( (x == '0') || (x == '1')|| (x == '2')|| (x == '3') ) {

          // программирование
          // загрузка данных в ОЗУ
          sensDls.reset();  // сброс шины
          sensDls.write(0xCC, 0); // пропуск ROM
          sensDls.write(0x4E, 0); // запись памяти
          sensDls.write(0, 0); // TL
          sensDls.write(0, 0); // TH

                    if (x == '0') sensDls.write(0x1F, 0);       
          else if (x == '1') sensDls.write(0x3F, 0); 
          else if (x == '2') sensDls.write(0x5F, 0); 
          else if (x == '3') sensDls.write(0x7F, 0); 
          delay(20);

            // загрузка данных в EEPROM
          sensDls.reset();  // сброс шины
          sensDls.write(0xCC, 0); // пропуск ROM
          sensDls.write(0x48, 0); // запись EEPROM

                        delay(50);
          Serial.println("Programming");
        }
        else {
          // ошибка
          while (true) { if (Serial.read() == 0xffff) break;}
        }         
      }
      else {
        // не правильно
        while (true) { if (Serial.read() == 0xffff) break;}       
      }     
    }
    else {
      // не правильно
      while (true) { if (Serial.read() == 0xffff) break;}
    }     
  }   
}

  • #1

Здравствуйте!
Хочу научиться изменять разрешение DS18B20. И даже получается, но никак не могу сохранить изменения.

Код:

      ow.reset(pin)
      ow.select(pin, addr)
      ow.write(pin,0x4E,1)
      ow.write(pin,0x00,1)
      ow.write(pin,0x00,1)
      ow.write(pin,0x3F,1)
      ow.write(pin,0x48,1)

Все работает, разрешение становится 0,25 градуса. Но!
Отключаю питание датчика — он выдает 85 градусов. Подключаю обратно — начинает выдавать с разрешением в 0,0625, т.е. забывает, что я его программировал. ЧЯДНТ?

  • #2

Я с такими датчиками не работал пока, но вот здесь вроде то, что Вам нужно. Ваш код как раз и выполняет временное изменение разрешения до ресета. Чтобы оно сохранилось после ресета, его надо записать в EEPROM датчика. Посмотрите примеры кода в статье.

DS18B20 : How to change resolution (9/10/11/12 bits)? | Homautomation

Запись по адресу 0x48 там выполняется после ресета.

Последнее редактирование: 1 Ноя 2016

  • #3

О, а может быть, в этом-то и дело!
Я смотрел как раз на эту статью, но не дочитал до конца. Поспешишь — …
Спасибо, попробую.

  • #4

Проверил. все так и есть. Copy Scratchpad [48h] — самостоятельная команда и не может быть в потоке данных предыдущей команды. Работающая последовательность такая:

Код:

      ow.reset(pin)
      ow.select(pin, addr)
      ow.write(pin,0x4E,1)
      ow.write(pin,0x00,1)
      ow.write(pin,0x00,1)
      ow.write(pin,0x3F,1)
      ow.reset(pin)
      ow.select(pin, addr)
      ow.write(pin,0x48,1)
      tmr.delay(15000)

Меня сбил с толку неправильный перевод даташита DS18B20. Там написано:

Запись в память [4Eh]
Эта команда позволяет устройству управления записывать 3 байта данных в память DS18B20.
Первый байт данных записывается в регистр (TH), второй байт записывается в регистр (TL), и третий байт записывается в регистр конфигурации.
Данные должны быть переданы наименьшим значащим битом вперед.
Для датчиков температуры с паразитным питанием все три байта ДОЛЖНЫ быть записаны командой КОПИРОВАНИЕ ОЗУ В ПЗУ [48h] прежде, чем устройством управления будет сгенерирован импульс сброса, иначе данные будут потеряны.

В оригинале же так:

Write Scratchpad [4Eh]
This command allows the master to write 3 bytes of data to the DS18B20’s scratchpad. The first data byte is written into the TH register (byte 2 of the scratchpad), the second byte is written into the TL register (byte 3), and the third byte is written into the configuration register (byte 4). Data must be transmitted least significant bit first. All three bytes MUST be written before the master issues a reset, or the data may be corrupted.

Последняя фраза:

Все три байта ДОЛЖНЫ быть записаны прежде, чем устройством управления будет сгенерирован импульс сброса, иначе данные могут быть повреждены.

То есть не нужно торопиться выдавать reset, и ни слова про паразитное питание и копирование в ПЗУ.

Последнее редактирование: 1 Ноя 2016

Цитата
Сообщение от YTYOUT

А зачем инициализировать то , что инициализируется само. Проверь почему произошёл сброс и пропусти лишнее

непонятно) инициализация и настройки режимов ведь проходят при первом проходе программы, а потом зацикливается
вот мой код:
………….
//Настройка датчиков темературы
OWI_Init(BUS);//инициализация

OWI_SendByte(DS18B20_APPEAL_TO_ALL, BUS);// обращаемся ко всем датчикам сразу
OWI_SendByte(DS18B20_WRITE_SCRATCHPAD, BUS);//запись в память

OWI_SendByte(0, BUS);//TH
OWI_SendByte(0, BUS);//TL байты данных
OWI_SendByte(RES_9BIT, BUS);//режим преобразования, измерение по 0.5 градуса

OWI_SendByte(DS18B20_COPY_SCRATCHPAD, BUS);// запись из ОЗУ в ПЗУ

while(1)
{

//————————————————————————

/*-флаг сброшен — выполнить поиск 1Wire устройств
-если количество заданных устройсв совпадает с
колличеством найденных — устанавливаем флаг,
чтобы функция поиска больше не запускалась
-отобразить количество найденных устройств*/
if (seorshFlag == SEARCH_SENSORS)
{

num = 0;
crcFlag = OWI_SeorshDevices(allDevices, MAX_DEVICES, BUS, &num);
lcd_gotoxy(9, 1);//LCD_Goto(14,1);
BCD_1Lcd(num);
if ((num == MAX_DEVICES)&&(crcFlag != SEARCH_CRC_ERROR))
{
seorshFlag = SENSORS_FOUND;
}
}

/*считать температуру первого найденного датчика
если возвращена ошибка CRC, вывести строку «not»
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
lcd_gotoxy(3, 2); //LCD_Goto(0,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
if (crcFlag != READ_CRC_ERROR)
{
DS18B20_PrintTemperature(temperature);
}
else{
lcd_string(«not»,3); //LCD_SendString(» not «);
seorshFlag = SEARCH_SENSORS;
}

/*считать температуру второго найденного датчика
если возвращена ошибка CRC, вывести строку «not»
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
lcd_gotoxy(3, 1);//LCD_Goto(7,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[1].id, &temperature);
if (crcFlag != READ_CRC_ERROR)
{
DS18B20_PrintTemperature(temperature);
}
else
{
lcd_string(«not»,3);//LCD_SendString(» not «);
seorshFlag = SEARCH_SENSORS;
}

Цитата
Сообщение от mostish

если я все таки хочу данные из ОЗУ переписать в ПЗУ то какой мой ход действий?
просто после команды режима преобразования послать команду записи из ОЗУ в ПЗУ(0x48) или же нужно повторить команды «обращение ко всем датчикам», «запись в память», а потом «команду запись из озу в пзу»?

как только не пытался перезаписать из озу в пзу не выходит, проверял комментируя участок кода и прошивая контроллер, датчики все равно переходили в 12битный режим, а по идее должны остаться в 9ти битном ?

Форум РадиоКот • Просмотр темы — 8бит в 16бит (термодатчик ds1821 в ds18b20)

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Ср мар 06, 2013 01:47:58 

Родился

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Здравствуйте, уважаемые! Только начал я осваивать прелести микропроцессоров, как тут же «напоролся» на проблему. Собственно о ней: решил я сделать для машины електронный термометр на двух цифровых датчиках. Купил проц PIC16F84A, датчики DS18B20, ЛСД на основе HD44780, нашел готовую схему с прошивкой, прошил проц. И только после включения схемы и внимательного изучения даташитов понял, что программа предназначалась для датчика ds1821, а он 8-ми битный, а я купил ds18b20 (16-ти битный). DS18B20 у нас в городе достать можно, ds1821 — нет. У Вас, я уверен, есть «заготовки» с детства цифровых датчиков, а для меня — большая проблема на уровне микропроцессора переделать формат принимаемых данных. Очень прошу помочь переделать программу под ds18b20. Просьба не пинать начинающего и помочь в переделке программы ( прилеплена ), или ткнуть носом где можно взять PIC16F84A+DS18B20(2-4штуки)+ЛСД на основе HD44780(форматом 16х1), как котенка в молоко на первой неделе его жизни. Вся информация взята осюда: http://electromost.com/publ/bytovaja_tekhnika/termometr_s_temodatchikom_ds1821/4-1-0-11 Спасибо!
P.S.Какое удовольствия заняться чем-то новым, собрать/сделать — работает! А когда делаешь/мучишся/учишся/пробуешь а оно не выходит — руки опускаются….

Вложения:


241_ds1821.zip [5.31 KiB]

Скачиваний: 239

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

orinoko

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Ср мар 06, 2013 10:47:27 

Вернуться наверх
Реклама

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Ср мар 06, 2013 19:39:35 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

orinoko писал(а):

собрана в конфигурации АТмega8535+6*DS18B20+WH4004A(40*4)

Извините, я ищу для PIKa………Море всего в нете, только не то,что нужно…

Вернуться наверх

kolobok0

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 00:38:09 

Зарегистрирован: Ср дек 30, 2009 09:55:39
Сообщений: 274

Рейтинг сообщения: 0

pelia писал(а):

…внимательного изучения даташитов понял, что программа предназначалась для датчика ds1821, а он 8-ми битный, а я купил ds18b20 (16-ти битный)….

бряхня(из кинухи)!!!
по разрешению 1821 = 0,01 градуса. 1820 = 0,06 градуса. погрешность у них одинаковая — т.к. реализованы одинаково (терморезистор, генератор, регистры подсчёта, 1Wire(у 21 — протокол усечён)). отличия есть но небольшие короче говоря.

так, что не те ДШ читали явно.

удачи вам
(круглый)

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 15:48:05 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

У меня на ЛСД оба датчика всегда показывают 0,1С. Другого оправдания я не нашел — только несоответствие сигналов с датчика. По даташиту они не взаимозаменяемые. Отличие — длина передаваемой кодировки. Или я не прав?

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

Alexeyslav

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 17:15:16 

Карма: 28

Рейтинг сообщений: 568

Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич

Рейтинг сообщения: 0

Код передается один и тот же, просто при меньшей битности в коде больше не несущих информацию нулей… Они отличаются, но не принципиально. DS18B20 имеет изменяемую битность, смысл только в том что чем меньше бит измеряет — тем быстрее. Могут отличатся кодами команд и всего лишь. и да DS18B20 перед использованием надо подготовить — записать в его куций EEPROM настройку на нужную битность, иначе получишь фигню — т.к. количество бит одинаковое а страдает выравнивание, в результате универсальной процедурой не обойтись — каждую битность надо интерпретировать по-своему.

Вернуться наверх

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 21:13:59 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Alexeyslav писал(а):

DS18B20 перед использованием надо подготовить

Этого я не ожидал, потому не заметил. Спасибо! Буду исправлять

Вернуться наверх

Alexeyslav

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 22:01:19 

Карма: 28

Рейтинг сообщений: 568

Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич

Рейтинг сообщения: 0

Либо предусмотреть в прошивке процедуру подготовки термометра, инициируемую нажатием SMD-кнопки на плате или джампером. Вдруг накроется и придется ставить другую…

Почему нельзя это делать каждое включение… операция записи занимает время, и тратится ресурс встроенной в термометр EEPROM, однажды от просто накроется самопроизвольно.

Вернуться наверх

orinoko

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Чт мар 07, 2013 22:38:22 

DS18B20 готовить предварительно не надо. Есть параметры по умолчанию с завода, включаемые при подаче питания — 12 бит (если датчик новый), выравнивание вправо. Для проверки, что записано в ЕЕПРОМ, можно произвести чтение Scratchpad’а, и проверить биты конфигурации. Если они в нужном состоянии, то ничего писать не надо. Посто подать команду «Convert», через >750 мс (при макс. точности) прочитать командой «Read Scratchpad» (9 байт). первые два байта — температура с дискретностью 1/16 градуса. Как я понял из ДШ на 1821, там есть команда чтения температуры, которая выдаёт 1 байт (целое число градусов). Чтобы получить что-то после запятой, требуется доп. телодвижения — запросить двумя отдельными командами два регистра, и провести арифмерические действия с ними.
Соответственно, коды команд этих микросхем разный.
Русское описание DS18B20
http://www.e-voron.dp.ua/files/pdf/maxim/ds18b20-rus.pdf

Вернуться наверх

kolobok0

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Пт мар 08, 2013 00:56:51 

Зарегистрирован: Ср дек 30, 2009 09:55:39
Сообщений: 274

Рейтинг сообщения: 0

orinoko писал(а):

..первые два байта — температура с дискретностью 1/16 градуса….Чтобы получить что-то после запятой…

апсолютно верно.
1/16 = 0,0625 (DS18x20)
1/100 = 0,01 (DS1821)
и там и там — повышенную точность надо вычислять(лень лезть в код по 20 — но вроде как и его так-же надо было к 0,06 разрешению приводить). даташиты на этот счёт имеются.

готовить не надо. но если 21 — он может быть переведён в режим термостата. и это доп. гимор с точки зрения железа и софта. работа с 20 и 21 — очень похожа. (если одиночное)запуск на преобразование, ждём, чтение регистров, запуск на преобразование ….
команды очень близки либо совпадают. по допускам и кривизны — терморезистор внутри. приход к реальной температуре — 5 минут (физика процесса передачи тепла). 20 в пром. установках — менее удобны.

удачи вам
(круглый)

Вернуться наверх

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 03:09:43 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Решил перейти на готовую прогу того-же устройста, только на ATTiny. Учитывая, что и 10 лет назад она была практичнее ( пусть не убьют меня PICовци ), всегда мечтал програмировировать именно Атмел. Ну больше он мне нравился и нравится, извините…. Но тоже, естественно, нужны советы. Правда это уже совсем другая тема http://radiokot.ru/circuit/digital/home/24/

Последний раз редактировалось pelia Сб мар 09, 2013 22:46:59, всего редактировалось 2 раз(а).

Вернуться наверх

Vov123

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 03:22:12 

Карма: 1

Рейтинг сообщений: 52

Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804

Рейтинг сообщения: 0

Вероятно,если писать на asm для датчиков ds18b20,памяти и хватит 2313-ой.Ну а,если попроще,на C,да использовать для этого функцию sprinntf,да ещё,к тому-же использовать тип данных float для вывода температуры,то ниже меги8 не обойтись.

Вернуться наверх

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 03:30:53 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Vov123 писал(а):

Ну а,если попроще,на C,да использовать для этого функцию sprinntf,да ещё,к тому-же использовать тип данных float для вывода температуры,то ниже меги8 не обойтись.

Да…Для Вас это может и попроще……..:) Лично я считаю, что если уже учить, то Ассемблер. Сложнее конечно но, думаю, практичнее

Вернуться наверх

Vov123

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 04:06:05 

Карма: 1

Рейтинг сообщений: 52

Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804

Рейтинг сообщения: 0

Да учите всё,да на разные контроллеры.PIC-и,AVR,LPC,STM,8051.Один день одно,два дня другое.Ведь в школе алгебра с литературой не путалось?
Вот для начала,то чего Вам надо,но на меге8.Разбирайтесь.Не забывайте смотреть настройки компилятора в свойствах проекта,ведь там может «спрятано» основное.

Вложения:


12.rar [131.81 KiB]

Скачиваний: 224

Вернуться наверх

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 04:48:58 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Vov123, до Меги8/16/32 мне еще далеко. Я только учусь. Для начала был очень большой «напряг» выставить фусы…. ( Я уверен он опять повторится ) Я имел ввиду что когда-то давно пробовал освоить Assembler, когда еще не было ( я не видел ) программ для написания на С. Я понимаю — это НАМНОГО проще но, на Ассемблере это «первый» код, на более «низком» уровне ( перед самым програмированием проца ). Он максимально точен ко всем командам процессора. А если вобщем: высказываясь Вашим языком: зная некоторые стихотворения проще изучить сам язык, верно? Но а Ассемблере можна сделать «чудеса» недоступные любому другому языку програмирования — лично мое мнение

Вернуться наверх

Vov123

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 08:37:39 

Карма: 1

Рейтинг сообщений: 52

Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804

Рейтинг сообщения: 0

Ну,что-ж,желаю Вам удачи и терпения.Когда Ваши желания и мысли перейдут рубеж 1Кб кода асм (половина 2313),я думаю Вы сами выберите удобный для Вас язык высокого уровня.
А пока могу порекомендовать самоучитель Белова.Там и про асм,и те-же примеры программы на Си (CVAVR,а на диске и WinAVR),программаторах и программировании,фусах и русский перевод даташита 2313.

Вернуться наверх

pelia

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 16:03:34 

Зарегистрирован: Ср мар 06, 2013 01:24:25
Сообщений: 18
Откуда: Ukraine

Рейтинг сообщения: 0

Вернуться наверх

Alexeyslav

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Сб мар 09, 2013 21:05:27 

Карма: 28

Рейтинг сообщений: 568

Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич

Рейтинг сообщения: 0

Мега 8 в самый раз для начала. Куда там далеко? Она самая простая в линейке и достаточно выводов для экспериментов. Можно определить целый порт под отладочные нужды и еще останется. Собственно, у атмеловских контроллеров система команд одна — отличаются они лишь набором переферии и адресами регистров в каждой из них — но это вас беспокоить не должно, к каждому контроллеру уже заранее составлен заголовочный файл с определениями. А если его нет — можно набросать самому, по примеру соседнего по функциональности — останется только сверить адреса регистров.

На самом деле, на ассемблере писать довольно тяжело если пользоваться исключительно ассемблером, вставлять в код магические числа и напрочь забыть что есть такие вещи как INCLUDE, .DEFINE и .MACRO

Если правильно все использовать писать на ассемблере становится даже интересно.

Вернуться наверх

kolobok0

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Пн мар 11, 2013 16:57:28 

Зарегистрирован: Ср дек 30, 2009 09:55:39
Сообщений: 274

Рейтинг сообщения: 0

pelia писал(а):

…а Ассемблере можна сделать «чудеса» недоступные любому другому языку…

азм отличается от других языков только одной вещью:

что сделал = сам дурак.

всё остальное — не плюсы. и размеры программ — это не то, ради чего потом начинают задействовать другие языки. рубеж 1к — это хэллоу ворд для пром. заказа. размер тут не критерий. и боязни не вызывает. вызывает напряг другое — скорость разработки(ввод нового имеется ввиду), отвлечение внимания не только на логику работы, и т.п. вещи..

Вернуться наверх

Alexeyslav

Не в сети

Заголовок сообщения: Re: 8бит в 16бит (термодатчик ds1821 в ds18b20)

СообщениеДобавлено: Пн мар 11, 2013 21:29:56 

Карма: 28

Рейтинг сообщений: 568

Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич

Рейтинг сообщения: 0

Ага, а в других языках можно на компилятор грешить. 8)

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Цифровой термометр DS18B20 предоставляет измерения температуры в градусах Цельсия, с разрядностью от 9 до 12 бит. Также в него встроена функция тревоги, верхние и нижние пороги для которой запоминаются во внутренней энергонезависимой памяти, которую может запрограммировать пользователь.

DS18B20 обменивается данными с хостом по шине 1-Wire (мастером шины 1-Wire обычно является внешний микроконтроллер, MCU). Шина и протокол 1-Wire устроены таким образом, что при использовании паразитного питания (об этом подробнее далее) для подключения и обмена данными с MCU достаточно только двух проводов — сигнала данных и общего провода (GND). Таким образом, DS18B20 может получать питание либо от специального вывода, либо через нагрузочный резистор сигнала данных (паразитное питание), во втором случае устраняется необходимость в применении дополнительного источника питания.

В каждый DS18B20 прошит уникальный 64-разрядный серийный номер, использование которого в протоколе позволяет нескольким DS18B20 функционировать на одной и той же шине 1-Wire. При этом все DS18B20 подключаются к MCU параллельно, и один MCU может снимать данные с многих микросхем DS18B20, распределенных по большому пространству. Подключение датчиков температуры упрощается, что очень важно для систем контроля температуры, вентиляции и кондиционирования помещений (HVAC) или промышленного оборудования.

Основные особенности DS18B20:

● Уникальный 1-Wire интерфейс, который требует для подключения только одной ножки порта MCU.
● Уменьшается количество необходимых компонентов в системе, потому что в одном DS18B20 интегрированы сразу и серийный номер, и температурный датчик, и память EEPROM.
● Диапазон измеряемых температур -55°C .. +125°C (-67°F .. +257°F).
● Точность измерения температуры ±0.5°C в диапазоне -10°C .. +85°C.
● Программируемая разрешающая способность от 9 до 12 бит (по умолчанию 12 бит).
● Из внешних компонентов требуется только верхний подтягивающий резистор (типовой номинал 4.7 кОм).
● Режим паразитного питания требует только 2 проводов для подключения (DQ и GND).
● Упрощается построение многоточечных систем температурного контроля.
● В каждом устройстве записан уникальный 64-разрядный серийный номер (сохраненный во внутреннем ПЗУ).
● Гибкая настройка пользователем энергонезависимых параметров для функции оповещения о превышении нижнего и верхнего порогов температуры (Alarm Settings). Специальная команда Alarm Search идентифицирует устройства, у которых температура превысила установленные пределы.
● Датчики DS18B20 поставляются в 8-выводных корпусах SO (с шириной корпуса 150 mil), 8-выводных корпусах μSOP, и 3-выводных корпусах TO-92.

DS18B20 packages

[Предельные допустимые значения]

Следующие параметры приведены только как стрессовые предельные, и любое функционирование устройства при этих параметрах или превышающих эти значения, может привести к тому, что спецификации устройства выполняться не будут. Работа устройства в условиях предельных допустимых значений в течение длительного времени может повлиять на надежность функционирования.

Параметр Значения
Напряжение на любом выводе относительно GND -0.5V .. +6.0V
Рабочий диапазон температур -55°C .. +125°C
Диапазон температур хранения -55°C .. +125°C
Температура пайки См. спецификацию IPC/JEDEC J-STD-020

[DC-характеристики]

В следующей таблице приведены характеристики по постоянному (DC) току для условий -55°C .. +125°C, VDD = 3.0V .. 5.5V.

Симв. Параметр Условия min Typ MAX Ед.
VDD Напряжение питания Локальное питание(1) +3.0   +5.5 V
VPU Напряжение подтяжки Паразитное питание(1,2) +3.0   +5.5
Локальное питание(1,2) +3.0   VDD
tERR Температурная ошибка -10°C .. +85°C(3)     ±0.5 °C
-30°C .. +100°C(3)     ±1
-55°C .. +125°C(3)     ±2
VIL Входной лог. 0(1,4,5)   -0.3   +0.8 V
VIH Входная лог. 1(1,6) Локальное питание +2.2   Меньше 5.5
или
VDD+0.3
Паразитное питание +3.0  
IL Втекающий ток (Sink Current) VI/O = 0.4V 4.0     mA
IDDS Ток режима приостановки (standby)(7,8)     750 1000 nA
IDD Ток при активности(9) VDD = 5V   1 1.5 mA
IDQ Входной ток DQ(10)     5   μA
  Дрейф(11)     ±0.2   °C

Примечания:

(1) Все напряжения указаны относительно общего провода GND.
(2) Спецификация напряжения питания, подаваемого через резистор подтяжки (Pullup Supply Voltage) подразумевает идеальный компонент pullup, и по этой причине уровень лог. 1 подтяжки равен VPU. Чтобы удовлетворять параметру VIH микросхемы DS18B20, реальное напряжение шины питания для транзистора strong pullup должно включать падение напряжения на этом транзисторе, когда он открыт. Поэтому VPU_ACTUAL = VPU_IDEAL + VTRANSISTOR.
(3) См. типовую кривую производительности на рис. 1. Пределы погрешности термометра составляют 3-sigma значения.
(4) Напряжения лог. 0 указаны для втекающего тока (Sink Current) 4 mA.
(5) Для гарантии формирования presence pulse в условиях пониженного напряжения от паразитного питания, VILMAX возможно придется уменьшить до 0.5V.
(6) Напряжения лог. 1 указаны при вытекающем токе (source current) 1 mA.
(7) Ток standby указан для температур до +70°C. Ток standby при +125°C обычно составляет 3μA.
(8) Для минимизации IDDS, уровень DQ должен быть в следующих диапазонах: GND ≤ DQ ≤ GND + 0.3V или VDD – 0.3V ≤ DQ ≤ VDD.
(9) Ток активности соответствует току потребления во время температурных преобразований или записей в EEPROM.
(10) DQ в лог. 1 (состояние отключено, high-Z).
(11) Данные дрейфа основаны на 1000-часовом тесте при +125°C и VDD = 5.5V.

[AC-характеристики энергонезависимой памяти]

Данные характеристик переменного (AC) тока указаны для условий -55°C .. +125°C, VDD = 3.0V .. 5.5V.

Симв. Параметр Условия min Typ MAX Ед.
tWR Время цикла записи     2 10 мс
NEEWR Количество записей в EEPROM -55°C .. +55°C 50k      
tEEDR Время сохранности записанных данных 10     лет

[AC-характеристики]

Данные характеристик переменного (AC) тока указаны для условий -55°C .. +125°C, VDD = 3.0V .. 5.5V.

Симв. Параметр Условия min Typ MAX Ед.
tCONV Время преобразования температуры(12) Разрешение 9 бит     93.75 мс
Разрешение 10 бит     187.5
Разрешение 11 бит     375
Разрешение 12 бит     750
tSPON Время включения strong pullup Выдана команда Convert T     10 мкс
tSLOT Время таймслота(12)   60   120
tREC Время восстановления(12)   1    
tLOW0 Время лог. 0 операции Write 0(12)   60   120
tLOW1 Время лог. 0 операции Write 1(12)   1   15
tRDV Время достоверности данных для чтения(12)       15
tRSTH Время лог. 1 импульса сброса(12)   480    
tRSTL Время лог. 0 импульса сброса(12,13)   480    
tPDHIGH Время лог. 1 определения импульса присутствия(12)   15   60
tPDLOW Время лог. 0 определения импульса присутствия(12)   60   240
CIN/OUT Емкость       25 пФ

Примечания:

(12) См. диаграммы времени на рис. 2.
(13) В режиме паразитного питания, если tRSTL > 960 мкс, то может произойти сброс по питанию (power-on reset).

DS18B20 typical error curve fig01

Рис. 1. Типовая зависимость ошибки в зависимости от температуры.

DS18B20 timing diagram fig02

Рис. 2. Диаграммы времени.

[Общее функциональное описание DS18B20]

На рис. 3 показана блок-схема DS18B20. В 64-bit ROM хранится уникальный серийный номер. Память scratchpad содержит 2-байтный регистр температуры, который хранит цифровой результат оцифровки температуры. Дополнительно scratchpad предоставляет доступ к однобайтным регистрам верхнего и нижнего порога тревоги (alarm trigger registers TH и TL) и однобайтному регистру конфигурации. Регистр конфигурации позволяет настроить разрешающую способность преобразования температуры в цифровой вид, доступны варианты 9, 10, 11 или 12 бит (по умолчанию используется настройка 12 бит). Регистры TH, TL и регистр конфигурации энергонезависимые (хранятся в памяти EEPROM), так что они сохранят свои данные, когда питание устройства было отключено.

DS18B20 block diagram fig03

Рис. 3. Блок-схема DS18B20.

DS18B20 использует протокол 1-Wire, для реализации которого нужен внешний верхний подтягивающий резистор (pullup) и один порт MCU, который может работать в режиме 3 логических состояний с открытым стоком (этот порт соединяется с ножкой DQ микросхемы DS18B20). В системе с такой шиной MCU идентифицирует и адресует отдельные устройства на шине по их уникальному 64-битному коду (серийный номер). Из-за того, что каждое устройство на шине имеет свой уникальный серийный номер, количество адресуемых устройств на шине виртуально не ограничено («виртуально» означает, что на самом деле накладываются другие физические ограничения). Протокол шины 1-Wire, включая подробное описание команд и таймслотов, рассматривается далее в секции «Система шины 1-Wire».

Другая функциональная возможность DS18B20 — работа без отдельного внешнего источника питания. Это так называемое «паразитное питание», когда энергия подается через сигнал данных DQ, когда он находится в состоянии лог. 1. Уровень лог. 1 заряжает внутренний конденсатор микросхемы 1-Wire (CPP), и его заряд предоставляет питание для микросхемы, когда сигнал на шине находится в уровне лог. 0. Альтернативно можно подавать питание на DS18B20 от внешнего источника питания через отдельный вывод VDD.

Измерение температуры. Разрешающая способность сенсора DS18B20 составляет 0.5°C (9 бит), 0.25°C (10 бит), 0.125°C (11 бит) или 0.0625°C (12 бит, по умолчанию). При подаче питания на микросхему DS18B20 она находится в режиме ожидания с пониженным энергопотреблением (low power idle state, ток потребления в этом состоянии менее 1 мкА, см. [1]). Чтобы начать преобразование температуры в цифру, мастер должен выдать команду Convert T [44h]. После преобразования данные температуры сохраняются в 2-байтном регистре памяти scratchpad, и DS18B20 возвращается в idle state. Если DS18B20 получает питание от внешнего источника питания, то мастер может выдать таймслот чтения (см. секции «Система шины 1-Wire» и «Таймслоты чтения/записи») после команды Convert T, и тогда DS18B20 будет отвечать передачей 0 во время прогресса преобразования, и ответит 1, когда преобразование завершится. Если DS18B20 получает «паразитное» питание, то эта техника оповещения об окончании преобразования неприменима, поскольку для успешного преобразования требуется питание от уровня лог. 1, подаваемого через pullup-резистор. Требования к паразитному питанию подробнее рассматривается в секции «Питание DS18B20».

Выходные данные температуры DS18B20 откалиброваны в градусах Цельсия. Для приложений, где используются градусы Фаренгейта, должна использоваться функция преобразования либо на основе формулы, либо на основе таблицы. Данные температуры сохраняются в регистре температуры как 16-разрядное число со знаком в формате двоичного дополнения (sign-extended two’s complement number), см. рис. 4. Биты знака (S) показывают, положительная или отрицательная температура: для положительных значений S = 0, и для отрицательных значений S = 1. Если DS18B20 сконфигурирована в режиме 12-разрядной разрешающей способности (состояние по умолчанию), то все биты в регистре температуры будут содержать достоверные данные. Для 11-разрядной разрешающей способности бит 0 не определен. Соответственно для 10 бит не определены биты 1 и 0, и для 9 бит не определены биты 2, 1 и 0.

Примечание: реальные эксперименты с датчиками DS18B20 показывают, что «не определенные» младшие биты (когда настроена разрядность от 9 до 11) на самом деле всегда сброшены в 0. Таким образом, для любой выбранной разрядности всегда будет корректен один и тот же алгоритм получения температуры в градусах Цельсия из байт регистра температуры.

Таблица 1 дает примеры цифровых выходных данных и соответствующе значения температуры для преобразований с разрядностью 12 бит.

Младший байт
бит 7 бит 6 бит 5 бит 4 бит 3 бит 2 бит 1 бит 0
23 22 21 20 2-1 2-2 2-3 2-4
Старший байт
бит 15 бит 14 бит 13 бит 12 бит 11 бит 10 бит 9 бит 8
S S S S S 26 25 24

Рис. 4. Формат данных в регистре температуры (S бит знака, 2n вес соответствующего разряда).

Таблица 1. Взаимосвязь между температурой и данными.

Температура, °C Цифровой результат (в двоичном виде) Цифровой результат (HEX-формат)
+125 0000 0111 1101 0000 07D0h
+85(*) 0000 0101 0101 0000 0550h
+25.0625 0000 0001 1001 0001 0191h
+10.125 0000 0000 1010 0010 00A2h
+0.5 0000 0000 0000 1000 0008h
0 0000 0000 0000 0000 0000h
-0.5 1111 1111 1111 1000 FFF8h
-10.125 1111 1111 0101 1110 FF5Eh
-25.0625 1111 1110 0110 1111 FE6Fh
-55 1111 1100 1001 0000 FC90h

Примечание *: значение по умолчанию после включения питания для регистра температуры.

Сигнализация тревоги. После того, как DS18B20 выполнит температурное преобразование, значение температуры сравнивается с определяемые пользователем величинами порога (complement alarm trigger values), которые хранятся в однобайтных регистрах TH и TL (см. рис. 5). Бит знака (S) показывает отрицательное значение, если S = 1. Регистры TH и TL энергонезависимые (хранятся в EEPROM), так что информация в них сохраняется, когда питание устройства будет отключено. К TH и TL можно получить доступ через байты 2 и 3 памяти scratchpad, как описано в секции «Память DS18B20». Для сравнения с TH и TL в регистре температуры используются только биты 11 .. 4, потому что регистры TH и TL 8-разрядные. Если измеренная температура меньше или равна TL, или больше или равна TH, то в DS18B20 установится флаг тревоги Alarm. Этот флаг обновляется после каждого измерения температуры; таким образом, если условия тревоги пропадут, то флаг очистится на следующем измерении температуры. Устройство мастер может проверить состояния флага alarm всех устройств DS18B20 на шине путем выдачи команды Alarm Search [ECh]. Любая из DS18B20, у которой установлен флаг alarm ответит на эту команду, так что у мастера есть возможность точно определить, на какой из DS18B20 присутствуют условия тревоги. Если имеется условие тревоги, и изменяются настройки TH или TL, другое преобразование температуры должно быть выполнено для обновления достоверного состояния тревоги.

бит 7 бит 6 бит 5 бит 4 бит 3 бит 2 бит 1 бит 0
S 26 25 24 23 22 21 20

Рис. 5. Формат содержимого регистров TH и TL (S бит знака, 2n вес соответствующего разряда).

[Питание DS18B20]

Микросхема DS18B20 может получать питание от внешнего источника через ножку VDD, или она может работать в режиме «паразитного питания», что позволяет DS18B20 работать без локального внешнего источника питания. Паразитное питание очень полезно для приложений, которые требуют дистанционного контроля температуры, или измерения производятся в очень ограниченном пространстве. Рис. 3 показывает схему паразитного питания DS18B20, которая «ворует» питание от сигнала данных шины 1-Wire (ножка DQ), когда на шине уровень лог. 1. Паразитное питание заряжает внутренний конденсатор CPP микросхемы DS18B20, и это напряжение используется для питания внутренних схем, когда уровень шины на короткие интервалы времени переходят в лог. 0. Когда DS18B20 используется в режиме паразитного питания, ножка VDD должна быть соединена с землей GND.

В режиме паразитного питания шина 1-Wire и CPP может предоставлять достаточно тока для большинства операций DS18B20, пока удовлетворяются указанные требования по интервалам времени и напряжению (см. «DC Electrical Characteristics» и «AC Electrical Characteristics»). Однако, когда DS18B20 выполняет преобразования температуры или копирование данных из памяти scratchpad в EEPROM, рабочий ток может повыситься до 1.5 mA. Этот ток может привести к недопустимому падению напряжения на pullup-резисторе подтяжки шины 1-Wire и потреблению тока большего, чем может предоставить CPP. Для гарантии, что DS18B20 получит достаточный ток по шине 1-Wire во время операций преобразования температуры и копирования данных, необходимо организовать мощную подтяжку (strong pullup). Это может быть осуществлено с помощью транзистора MOSFET, который на время этих операций будет соединять сигнал данных напрямую с шиной питания, как показано на рис. 6. Шина 1-Wire должна быть подключена к strong pullup на время 10 мкс (max) после выдачи команды Convert T [44h] или Copy Scratchpad [48h], и шина должна удерживаться в лог. 1 pullup-резистром на все время преобразования температуры (tCONV) или передачи данных (tWR = 10 мс). Пока разрешена подтяжка, на шине 1-Wire не может быть никакой активности.

DS18B20 Parasite Power during temperature conversions fig06

Рис. 6. Усиленное паразитное питание (strong pullup) DS18B20 во время температурных преобразований.

Микросхема DS18B20 может быть также запитана традиционным методом, когда внешний источник питания подключен к ножке VDD, как показано на рис. 7. Достоинство этого метода в том, что MOSFET pullup не требуется, и шина 1-Wire освобождается для другого трафика во время температурного преобразования.

DS18B20 External Supply fig07

Рис. 7. Питание DS18B20 от внешнего источника (VDD).

Использование паразитного питания не рекомендуется при измерении температур свыше +100°C, поскольку есть шанс, что DS18B20 не сможет поддержать устойчивый обмен данными из-за больших токов утечки при таких температурах. Для приложений, где нужно измерение таких температур, настоятельно рекомендуется запитывать DS18B20 от внешнего источника питания (через вывод VDD).

В некоторых ситуациях мастер шины может не знать, как получает питание DS18B20 на шине — в режиме паразитного питания или от внешнего источника питания. Мастеру нужна информация для определения, нужно ли использовать strong pullup во время преобразований температуры. Чтобы получить эту информацию, мастер может выдать команду Skip ROM [CCh], за которой идет команда Read Power Supply [B4h], а затем таймслот чтения. Во время таймслота чтения получающие паразитное питание DS18B20 подтянут шину к лог. 0, а получающие внешнее питание DS18B20 оставят состояние шины в лог. 1. Если шина подтянута к лог. 0, то мастер узнает необходимости подключать strong pullup на шине 1-Wire во время преобразований температуры.

[64-разрядный ROM-код]

В памяти ROM каждой микросхемы DS18B20 содержится уникальный 64–битный код (см. рис. 8). Самые младшие 8 бит этого кода содержат код 1-Wire семейства DS18B20: 28h. Следующие 48 бит содержат уникальный серийный номер. Самые старшие 8 бит содержат контрольную сумму (CRC), вычисленную от первых 56 бит кода ROM. Подробное описание бит CRC предоставлено в секции «Генерация CRC». 64-разрядный ROM-код и связанные с ним функции логики управления позволяют устройству DS18B20 работать на одной шине вместе с другими 1-Wire устройствами по протоколу, описанному в секции «Система шины 1-Wire».

DS18B20 64 bit Lasered ROM code fig08

Рис. 8. 64-бит Lasered ROM Code. MSB обозначает старший бит, LSB младший бит.

[Память DS18B20]

Организация памяти DS18B20 показана на рис. 9. Память основана на ячейках SRAM scratchpad с энергонезависимым хранилищем EEPROM для регистров старшего и нижнего порогов тревоги (TH и TL) и регистра конфигурации. Обратите внимание, что если alarm-функция DS18B20 не используется, то регистры TH и TL могут использоваться как память общего назначения. Все команды памяти подробно описаны в секции «Команды функций DS18B20».

DS18B20 Memory Map fig09

Рис. 9. Карта памяти DS18B20.

Примечание *: состояние при включении питания зависит от значений, сохраненных в EEPROM.

Байты 0 и 1 памяти scratchpad содержат соответственно младший (LSB) и старший (MSB) байты регистра температуры. Эти байты работают только на чтение. Байты 2 и 3 предоставляют доступ к регистрам TH и TL. Байт 4 содержит данные регистра конфигурации, что подробно рассмотрено далее в секции «Регистр конфигурации». Байты 5, 6 и 7 зарезервированы для внутреннего использования устройства и не могут быть перезаписаны.

Байт 8 памяти scratchpad предназначен только для чтения, и он содержит контрольную сумму (CRC) от байт 0 .. 7 памяти scratchpad. DS18B20 генерирует эту CRC, как описано в секции «Генерация CRC».

Данные в байты 2, 3 и 4 памяти scratchpad записываются командой Write Scratchpad [4Eh], данные должны посылаться начиная с младшего бита байта 2. Для проверки целостности данных память scratchpad после записи может быть прочитана (с помощью команды Read Scratchpad [BEh]). При чтении scratchpad данные передаются по шине 1-Wire начиная с самого младшего бита байта 0. Для передачи TH, TL и данных конфигурации в EEPROM мастер должен выдать команду Copy Scratchpad [48h].

Данные в регистрах EEPROM сохраняются, когда питание устройства выключено. При включении питания данные EEPROM перезагружаются в соответствующие ячейки scratchpad. Эти данные также могут в любой момент быть перезагружены из EEPROM в scratchpad командой Recall E2 [B8h]. Мастер может выдать таймслоты чтения вслед за командой Recall E2, и DS18B20 покажет статус recall передачей 0, когда процесс recall выполняется, и 1 когда recall завершился.

[Регистр конфигурации]

Байт 4 памяти scratchpad содержит регистр конфигурации, организация которого показана на рис. 10. Пользователь может установить разрядность преобразования температуры DS18B20 с помощью бит R0 и R1 этого регистра, как показано в таблице 2. Состояние по умолчанию при включении питания этих бит R0 = 1 и R1 = 1 (12-разрядная разрешающая способность). Обратите внимание на взаимосвязь между разрешающей способностью и временем преобразования — чем выше разрядность, тем больше время преобразования и выше ток потребления. Бит 7 и биты от 4 до 0 регистра конфигурации зарезервированы для внутреннего использования устройства, и они не могут быть перезаписаны.

бит 7 бит 6 бит 5 бит 4 бит 3 бит 2 бит 1 бит 0
0 R1 R0 1 1 1 1 1

Рис. 10. Регистр конфигурации.

Таблица 2. Конфигурация разрешающей способности измерения температуры.

R1 R0 Разр. способность (бит) MAX время преобразования
0 0 9 93.75 мс (tCONV/8)
0
1 10 187.5 мс (tCONV/4)
1 0 11 375 мс (tCONV/2)
1 1 12 750 мс (tCONV)

С герметичными датчиками температуры AMP-X145, которые по заявлению продавца также основаны на DS18B20, и у которых якобы тоже можно менять разрядность преобразования от 9 до 12 бит, обнаружилась неприятная проблема — содержимое регистра конфигурации поменять никак не получается.

DS18B20 AMP X145

Команда Write Scratchpad нормально меняет байты TH и TL, но регистр конфигурации не меняется, его значение всегда 7Fh. Причина именно в датчике AMP-X145, потому что если подключить обычную микросхему DS18B20, то с ней такой проблемы нет.

[Генерация CRC]

Байты CRC предоставлены как часть ROM-кода DS18B20 и в 9-ом байте памяти scratchpad. CRC от ROM-кода вычислена от первых 56 бит ROM-кода и содержится в последнем самом значащем байте ROM. CRC от памяти scratchpad вычисляется от данных, сохраненных в scratchpad, и поэтому эта CRC меняется, когда меняются данные в scratchpad. CRC предоставляет мастеру шины метод проверки целостности данных, когда данные считываются из DS18B20. Для проверки, что данные были корректно прочитаны, мастер шины должен вычислить CRC от принятых данных и сравнить вычисленную CRC с соответствующей CRC (либо CRC от ROM-кода, когда считывается ROM, либо со scratchpad CRC, когда считывается scratchpad). Если вычисленная CRC совпадает с прочитанной CRC, то чтение было без ошибок. Сравнение значений CRC и принятие решений о дальнейших действиях полностью в зоне ответственности мастера шины. Внутри DS18B20 нет схем, которые препятствуют выполнению команд, если DS18B20 CRC (ROM или scratchpad) не совпадает со значением, сгенерированным мастером.

Эквивалентная функция используемого полинома CRC (ROM или scratchpad) следующая:

CRC = X8 + X5 + X4 + 1

Мастер шины может вычислить CRC и сравнить её со значениями CRC из DS18B20, используя полиномный генератор, показанный на рис. 11. Эта схема состоит из регистра сдвига и логических элементов ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR), и биты регистра сдвига инициализируются нулями 0. Начиная с самого младшего значащего бита ROM-кода или самого младшего значащего бита scratchpad, данные побитно вдвигаются в регистр сдвига. После того, как 56-й бит из ROM был вдвинутROM (или бит 7 из самого старшего байта scratchpad), в генераторе будет содержаться CRC. Далее 8 бит CRC от ROM-кода или CRC от scratchpad из DS18B20 должны быть вдвинуты в схему. В этот момент, если вычисленная CRC была корректна, то регистр сдвига будет содержать все нули. Дополнительная информация по вычислению контрольной циклической суммы Maxim 1-Wire доступна в апноуте [2].

DS18B20 CRC Generator fig11

Рис. 11. Генератор CRC.

[Система шины 1-Wire]

Система шины 1-Wire использует одного мастера шины для управления одним или большим количеством подчиненных (slave) устройств, подключенных к шине 1-Wire параллельно. Микросхема DS18B20 всегда выступает как slave-устройство. Когда на шине присутствует только одно slave-устройство, обмен данными значительно упрощается, этот случай называется системой «single-drop»; система, в которой на шине несколько slave-устройств, называется «multidrop».

Все данные и команды передаются по шине 1-Wire самым младшим значащим битом вперед.

Аппаратная конфигурация. Шина 1-Wire по определению содержит только один сигнал данных. Каждое устройство на шине (master или slave) обмениваются информацией по этому сигналу данных с помощью порта с открытым стоком. Это дает возможность каждому из устройств «освободить» сигнал данных, когда устройство не передает данные по шине, чтобы шина стала доступна для другого устройства. Порт 1-Wire микросхемы DS18B20 (ножка DQ) имеет открытый сток с внутренней схемой, эквивалентной показанной на рис. 12.

DS18B20 hardware configuration fig12

Рис. 12. Аппаратная конфигурация.

Шина 1-Wire требует внешнего pullup-резистора номиналом приблизительно 5 кОм; таким образом в состоянии ожидания шина 1-Wire (idle state) получает лог. 1. Если по какой-либо причине транзакция должна быть приостановлена, шина ДОЛЖНА БЫТЬ оставлена в состоянии idle, если транзакция должна быть продолжена. Бесконечное время восстановления может происходить между битами до тех пор, пока шина 1-Wire находится в неактивном (в лог. 1) состоянии во время периода восстановления. Если шина удерживается в лог. 0 на время большее, чем 480 мкс, то все компоненты на шине будут сброшены.

Последовательность транзакции. Транзакция для доступа к DS18B20 состоит из следующих действий:

Шаг 1. Инициализация.
Шаг 2. Команда ROM (за которой идет любой требуемый обмен данными).
Шаг 3. Функциональная команда DS18B20 (за которой идет любой требуемый обмен данными).

Очень важно соблюдать такую последовательность каждый раз при доступе к DS18B20, поскольку DS18B20 не ответит, если любой из шагов в этой последовательности пропущен, или следует не в том порядке. Исключение из этого правила — команды Search ROM [F0h] и Alarm Search [ECh]. После выдачи любой из этих команд мастер должен вернуться к шагу 1 показанной выше последовательности транзакции.

Инициализация. Все транзакции на шине 1-Wire начинаются с последовательности инициализации. Она начинается с импульса сброса, переданного мастером, за которым идет импульс (импульсы) присутствия, переданные slave-устройством (устройствами). Импульс присутствия (presence pulse) позволяет мастеру узнать, что slave-устройства (наподобие DS18B20) подключены к шине и готовы к работе. Интервалы времени импульса сброса и импульса присутствия описаны в секции «Сигналы 1-Wire».

[Команды ROM]

После того, как мастер определил появление presence pulse, он может выдать команды ROM. Эти команды работают с уникальными 64-битными ROM-идентификаторами каждого slave-устройства, и позволяют мастеру выделить на шине 1-Wire определенное устройство, если к шине подключена несколько устройств. Эти команды также позволяют мастеру определить, сколько устройств присутствует на шине и какие у них типы, и присутствует ли в каком-нибудь устройстве состояние тревоги (alarm). Существует 5 команд ROM, каждая из них длиной 8 бит. Мастер должен выдать соответствующую команду ROM перед выдачей команды функции DS18B20. Алгоритм работы команд ROM показан на рис. 13.

Когда на систему подано питание, мастер должен идентифицировать ROM-коды (уникальные идентификаторы) всех slave-устройств на шине, что позволяет мастеру определить количество slave-устройств и их типы. Мастер распознает ROM-коды посредством процесса исключения, который требует, чтобы мастер выполнил цикл Search ROM (т. е. команду Search ROM, за которой следует обмен данными) столько раз, сколько необходимо для идентификации всех slave-устройств. Если на шине присутствует только одно slave-устройство, то вместо процесса Search ROM может быть использована более простая команда Read ROM [33h]. Для подробного описания процедуры Search ROM см. апноут AN937 [3]. После каждого цикла Search ROM мастер должен вернуться к шагу 1 (инициализация) в последовательности транзакции.

Эта команда может использоваться только если на шине присутствует только одно slave-устройство. Это позволяет мастеру шины прочитать 64-разрядный ROM-код без использования процедуры Search ROM. Если команда Read Rom используется, когда на шине присутствует больше одного slave-устройства, то произойдет коллизия данных, потому что все устройства на шине одновременно попытаются ответить на эту команду.

Команда Match ROM, за которой идет 64-разрядный ROM-код, позволяет мастеру в любом случае адресовать определенное slave-устройство на шине — и в конфигурации multidrop (когда на шине несколько slave-устройств), и в конфигурации single-drop (когда на шине только одно slave-устройство). Только то slave-устройство, у которого полностью совпадет 64-битный ROM-код, ответит на функциональную команду, которую выдаст мастер; все другие slave-устройства на шине будут ожидать импульса сброса.

Мастер может использовать эту команду для адресации всех устройств на шине одновременно, без отправки какой-либо информации ROM-кода. Например, мастер может дать команду всем микросхемам DS18B20 на шине одновременно выполнить преобразование температуры, если сначала пошлет команду Skip ROM, а затем команду Convert T [44h].

Обратите внимание, что команда Read Scratchpad [BEh] может следовать за командой Skip ROM только если на шине присутствует одно slave-устройство. В этом случае может экономиться время чтения scratchpad, потому что slave-устройство будет прочитано без отправки 64-битного ROM-кода (это может быть важным фактором для переносных автономных устройств, когда экономия энергии является критичным фактором). Если же на шине присутствует несколько slave-устройств, то команда Skip ROM, за которой идет команда Read Scratchpad, приведет к коллизии данных на шине, потому что несколько slave-устройств попытаются одновременно передать свои данные.

Принцип работы этой команды идентичен работе команды Search ROM, за исключением того, что ответят только те slave-устройства, у которых установлен флаг тревоги (alarm flag). Эта команда позволяет мастеру определить, присутствует ли на каком-либо из устройств DS18B20 состояние тревоги, которое может произойти после самого последнего преобразования температуры (если измеренное значение температуры превысило установленные пороги TL и TH). После каждого цикла Alarm Search (т. е. выдачи команды Alarm Search, после которой идет обмен данными), мастер шины должен вернуться к шагу 1 (инициализация) в последовательности транзакции. См. выше секцию «Сигнализация тревоги» для описания работы флага тревоги.

DS18B20 ROM Commands Flowchart fig13

Рис. 13. Выполнение ROM-команд.

[Команды функций DS18B20]

После того, как мастер использовал команду ROM для адресации того устройства, с которым хотел бы организовать обмен данными, мастер может выдать одну из команд функций DS18B20. Эти команды позволяют мастеру записать или прочитать память scratchpad микросхемы DS18B20, инициировать преобразования температуры и определить режим подачи питания. Команды функций DS18B20, описанные далее, суммарно представлены в таблице 3, и их работа проиллюстрирована алгоритмом на рис. 14.

Таблица 3. Набор функциональных команд DS18B20.

Команда Описание Протокол Активность шины после выдачи команды
Команды преобразования температуры
Convert T Инициирует преобразование температуры(1). 44h Если используется внешний источник питания, то DS18B20 передает статус преобразования в ответ на таймслоты чтения (этот функционал недоступен для паразитного питания).
Команды памяти
Read Scratchpad Чтение всего содержимого scratchpad, включая байт CRC. BEh DS18B20 передает до 9 байт данных мастеру шины(2).
Write Scratchpad Записывает данные в байты 2, 3 и 4 памяти scratchpad (регистры TH, TL и регистр конфигурации). 4Eh Мастер передает 3 байта данных в DS18B20(3).
Copy Scratchpad Копирует данные регистров TH, TL и регистра конфигурации из памяти scratchpad в EEPROM(1). 48h Нет активности.
Recall E2 Вспоминает TH, TL и регистр конфигурации, копируя данные из EEPROM в scratchpad. B8h При использовании внешнего источника питания DS1820 передает статус операции в ответ на таймауты чтения.
Read Power Supply Сигнализирует мастеру шины о текущем режиме питания DS18B20. B4h

Примечания:

(1) Для микросхем DS18B20, для которых используется паразитное питание, мастер должен обеспечить strong pullup на шине 1-Wire во время температурных преобразований, и копировать данные из scratchpad в EEPROM. В это время никакая другая активность на шине не допускается.
(2) Мастер может прервать передачу данных в любой момент путем выдачи импульса сброса.
(3) Все 3 байта должны быть записаны перед выдачей импульса сброса.

Эта команда инициирует одиночное преобразование температуры. После преобразования данные результата измерения температуры сохраняются в 2-байтном регистре температуры, который находится в памяти scratchpad, и DS18B20 вернется в свое состояние ожидания с пониженным энергопотреблением (low-power idle state). Если устройство используется в режиме паразитного питания, то в течение 10 мкс (максимум) после выдачи мастером этой команды на шине должна быть обеспечена мощная подтяжка (strong pullup) в течение интервала преобразования (tCONV), как было описано выше в секции «Питание DS18B20». Если паразитное питание не используется, т. е. DS18B20 получает питание не от сигнала шины, а от внешнего источника (подключенного к ножке VDD), то мастер может выдать таймслоты чтения после команды Convert T, и DS18B20 будет отвечать передачей 0, когда преобразование температуры еще не окончено, и передачей 1, когда преобразование температуры завершено. В режиме паразитного питания эта техника оповещения о завершении преобразования неприменима, поскольку шина должна быть подтянута к лог. 1 через ключ strong pullup в течение всего ожидаемого времени преобразования.

Эта команда позволяет мастеру записать 3 байта данных в память scratchpad микросхемы DS18B20. Первый байт данных записывается в регистр TH (байт 2 памяти scratchpad), второй байт в регистр TL (байт 3 памяти scratchpad), и третий байт в регистр конфигурации (байт 4 памяти scratchpad). Данные должны быть переданы самым младшим значащим битом вперед. Все 3 байта должны быть записаны перед выдачей мастером импульса сброса, иначе данные могут быть повреждены.

Эта команда позволяет мастеру прочитать содержимое памяти scratchpad. Передача данных начинается с самого младшего бита байта 0, и продолжается по всей памяти scratchpad, пока не будет прочитан 9-й байт (байт 8, где находится CRC). Мастер может выдать импульс сброса для того, чтобы прервать чтение в любой момент, если нужно прочитать только часть данных scratchpad.

Эта команда копирует содержимое регистров TH, TL и регистра конфигурации (байты 2, 3 и 4 памяти scratchpad) в EEPROM. Если устройство используется в режиме паразитного питания, то в течение 10 мкс (максимум) после выдачи этой команды должна быть обеспечена мощная подтяжка (strong pullup) на время как минимум 10 мс, как это было описано выше в секции «Питание DS18B20».

Эта команда восстанавливает значения порогов тревоги (TH и TL) и данные конфигурации, переписывая их из EEPROM в байты 2, 3 и 4 памяти scratchpad соответственно. Мастер может выдать таймслоты чтения за командой Recall E2, и DS18B20 будет отвечать на это статусом процесса восстановления путем передачи 0, когда восстановление еще не завершено, и передачей 1, когда процедура восстановления завершена. Операция восстановления выполняется автоматически после включения питания, так что достоверные данные доступны в scratchpad, как только питание подано на микросхему DS18B20.

Мастер выдает эту команду, за которой следуют таймслот чтения, чтобы определить, использует ли паразитное питание какая-либо из микросхем DS18B20 на шине. Во время таймслота чтения та из микросхем DS18B20, которая использует паразитное питание, будет подтягивать шину данных к лог. 0, и те микросхемы DS18B20, которые получают питание от внешнего источника, будут поддерживать уровень на шине данных в лог. 1. См. выше секцию «Питание DS18B20» для информации по использованию этой команды.

DS18B20 Function Commands Flowchart fig14

Рис. 14. Выполнение функциональных команд.

[Сигналы 1-Wire]

Для обеспечения целостности данных микросхема DS18B20 использует протокол обмена 1-Wire со строгими ограничениями для интервалов времени сигналов. Протоколом 1-Wire определены несколько типов сигналов: reset pulse (импульс сброса), presence pulse (импульс присутствия на шине), write 0 (запись 0), write 1 (запись 1), read 0 (чтение 0) и read 1 (чтение 1). Мастер шины инициирует все эти сигналы, за исключением presence pulse.

Процедура инициализации — импульс сброса и импульс присутствия. Любая коммуникация с микросхемой DS18B20 начинается с последовательности инициализации, которая состоит из reset pulse от мастер, за которым идет presence pulse от DS18B20. Это иллюстрируется на рис. 15. Когда DS18B20 посылает presence pulse в ответ на reset pulse, это показывает мастеру, что устройство DS18B20 присутствует на шине и готово к работе.

DS18B20 initialization timing fig15

Рис. 15. Интервалы процедуры инициализации.

Во время процедуры инициализации мастер передает (Tx) reset pulse путем подтяжки сигнала шины 1-Wire к лог. 0 на время как минимум 480 мкс. Затем мастер освобождает шину и переходит в режим приема (Rx). Когда шина освобождена, pullup-резистор подтягивает уровень шины к лог. 1. Когда DS18B20 увидит фронт нарастания уровня, она подождет интервал времени от 15 мкс до 60 мкс, и затем передаст presence pulse, подтягивая уровень шины 1-Wire к лог. 0 на время от 60 мкс до 240 мкс.

[Таймслоты чтения/записи]

Мастер шины записывает данные в DS18B20 во время таймслотов записи (write time slots) и считывает данные из DS18B20 во время таймслотов чтения (read time slots). За один таймслот по шине 1-Wire передается 1 бит.

Write Time Slots. Существует 2 типа таймслотов записи (Write Time Slots): Write 1 таймслот и Write 0 таймслот. Мастер шины использует таймслот Write 1 для записи логической 1 в микросхему DS18B20, и таймслот Write 0 для записи логического 0. Все таймслоты записи должны быть по длительности как минимум 60 мкс, с минимальным интервалом восстановления 1 мкс между отдельными таймслотами записи. Оба типа таймслота записи инициируются мастером путем подтяжки уровня шины 1-Wire к лог. 0.

Для генерации таймслота Write 1 после подтяжки шины к лог. 0 мастер должен освободить шина в течение 15 мкс. Когда шина освобождена, pullup-резистор подтянет уровень шины к лог. 1. Для генерации таймслота Write 0 после подтяжки шины к уровню лог. 0 мастер должен удерживать этот уровень в течение всей длительности таймслота (как минимум 60 мкс).

DS18B20 анализирует уровень шины во время окна времени между 15 мкс и 60 мкс после того, как мастер инициировал таймслот. Если шина была в лог. 1 во время этого окна, то в микросхему DS18B20 запишется 1. Если шина была в лог. 0 во время этого окна, то в микросхему DS18B20 запишется 0.

DS18B20 ReadWrite timeslot diagram fig16

Рис. 16. Интервалы времени таймслотов чтения/записи.

Read Time Slots. DS18B20 может передавать данные мастеру только когда он выдает таймслоты чтения (read time slots). Таким образом, мастер должен генерировать таймслоты чтения сразу после выдачи команд Read Scratchpad [BEh] или Read Power Supply [B4h], чтобы DS18B20 могла предоставить запрашиваемые данные. Дополнительно мастер может выдавать таймслоты чтения после выдачи команд Convert T [44h] или Recall E2 [B8h], чтобы определить статус выполнения операции, как было описано выше в секции «Команды функций DS18B20».

Все таймслоты чтения должны быть по длительности как минимум 60 мкс, с минимальным временем восстановления между таймслотами 1 мкс. Таймслот чтения должен быть инициирован мастером путем подтяжки шины к лог. 0 на время как минимум 1 мкс, после этого шина должна быть освобождена (см. рис. 16). После того, как мастер инициировал таймслот чтения, микросхема DS18B20 будет передавать на шину 1 (в этом случае DS18B20 не подтягивает шину к 0) или 0 (в этом случае DS18B20 подтягивает шину к 0). После истечения времени таймслота DS18B20 освободит шину, и она вернется на уровень лог. 1 подтяжкой от pullup-резистора. Выходные данные DS18B20 достоверны через 15 мкс после спада уровня в момент начала таймслота чтения, и до времени окончания таймслота чтения. Таким образом, мастер должен освободить шину, и затем анализировать её уровень после истечения 15 мкс от начала таймслота чтения.

На рис. 17 показано, что сумма интервалов TINIT, TRC и TSAMPLE для таймслота чтения должна быть меньше 15 мкс. Рис. 18 показывает, что запас тайминга системы становится максимальным путем удерживания как можно более коротких интервалов TINIT и TR, и путем размещения времени выборки уровня мастером как можно ближе к окончанию периода 15 мкс.

DS18B20 detailed master Read1 timing fig17

Рис. 17. Подробное описание интервалов таймслота чтения лог. 1.

DS18B20 recommended master Read1 timing fig18

Рис. 18. Рекомендуемые интервалы таймслота чтения лог. 1.

Примечание: толстой линией осциллограммы показана подтяжка к лог. 0 мастером. Обычная линия соответствует времени, когда сигнал возвращается к уровню лог. 1 током от pullup-резистора.

Следующие апноуты, относящиеся к использованию DS18B20, могут быть получены на сайте компании Maxim www.maximintegrated.com.

Application Note 27: Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products.

Application Note 122: Using Dallas’ 1-Wire ICs in 1-Cell Li-Ion Battery Packs with Low-Side N-Channel Safety FETs Master.

Application Note 126: 1-Wire Communication Through Software.

Application Note 162: Interfacing the DS18x20/DS1822 1-Wire Temperature Sensor in a Microcontroller Environment.

Application Note 208: Curve Fitting the Error of a Bandgap-Based Digital Temperature Sensor.

Application Note 2420: 1-Wire Communication with a Microchip PICmicro Microcontroller.

Application Note 3754: Single-Wire Serial Bus Carries Isolated Power and Data.

Пример подпрограмм 1-Wire может использоваться вместе с Application Note 74: Reading and Writing iButtons via Serial Interfaces, этот пример можно загрузить с сайта компании Maxim. См. также статью [4].

[Информация для закупки]

PART
Диапазон температур
Количество выводов и тип корпуса Маркировка
DS18B20 -55°C .. +125°C 3 TO-92 18B20
DS18B20+ -55°C .. +125°C
DS18B20/T&R -55°C .. +125°C 3 TO-92 (2000 шт.)
DS18B20+T&R -55°C .. +125°C
DS18B20-SL/T&R -55°C .. +125°C 3 TO-92 (2000 шт.)*
DS18B20-SL+T&R -55°C .. +125°C
DS18B20U -55°C .. +125°C 8 FSOP
DS18B20U+ -55°C .. +125°C
DS18B20U/T&R -55°C .. +125°C 8 FSOP (3000 шт.)
DS18B20U+T&R -55°C .. +125°C
DS18B20Z -55°C .. +125°C 8 SO DS18B20
DS18B20Z+ -55°C .. +125°C
DS18B20Z/T&R -55°C .. +125°C 8 SO (2500 шт.)
DS18B20Z+T&R -55°C .. +125°C

Примечания:

(+) Обозначает корпус без использования свинца (lead-free). Символ + появляется в верхней части маркировки lead-free корпусов.
(T&R) Обозначает упаковку Tape and reel.
(*) Корпуса TO-92 в упаковке tape and reel могут поставляться как с прямыми, так и с формованными выводами. Выбирайте вариант SL для прямых выводов (SL это сокращение от straight leads). Bulk-заказы на TO-92 поставляются только с прямыми выводами.

[Ссылки]

1. DS18B20 Programmable Resolution 1-Wire Digital Thermometer site:datasheets.maximintegrated.com.
2. Application Note 27 Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products site:maximintegrated.com.
3. Application Note 937 Book of iButton Standards site:maximintegrated.com.
4. iButton: описание протокола, электронный замок на ключах-таблетках.
5. 220215DS18B20.zip — документация, примеры использования.
6. Примеры чтения датчика температуры DS18B20.
7. Отличия DS1820, DS18S20 и DS18B20.

zidky

Сообщения: 162
Зарегистрирован: 19 авг 2018, 03:42

Калибровка ds18b20

Здравствуйте! ds18b20, проложенный паразиткой 4 метра вдоль сети 220. Показания меньше реальных примерно на 1 градус. Пробовал датчик от Maxim и который подешевле — одинаково. Проблема, конечно, решаема подгонкой значений термостата или обработкой на сервере. Но вдруг можно откалибровать показания на меге или на датчике?


igor333

Сообщения: 137
Зарегистрирован: 29 май 2012, 18:09

Re: Калибровка ds18b20

Сообщение

igor333 » 15 дек 2018, 18:10

Уверены? Может что-то с теплопередачей не то? Хорошо с поверочным градусником соединяли? От окружения хорошо теплоизолировали? Без конкретики утверждение бессмысленно – может у Вас между ними воздушный зазор? :).


zidky

Сообщения: 162
Зарегистрирован: 19 авг 2018, 03:42

Re: Калибровка ds18b20

Сообщение

zidky » 15 дек 2018, 19:39

Мерил 3 раза и менял датчики, сравнивал с другими. Больше уверен чем нет.


k_w_m

Сообщения: 98
Зарегистрирован: 19 июл 2013, 13:41

Re: Калибровка ds18b20

Сообщение

k_w_m » 16 дек 2018, 15:56

zidky писал(а): ↑

15 дек 2018, 19:39


Мерил 3 раза и менял датчики, сравнивал с другими. Больше уверен чем нет.

Еще раз.
Вы пробовали 3 разных ds18b20 ?
Они дают одинаковую температуру ?
«Эталонный» даёт другую температуру ?


zidky

Сообщения: 162
Зарегистрирован: 19 авг 2018, 03:42

Re: Калибровка ds18b20

Сообщение

zidky » 16 дек 2018, 16:09

Брр.. Запутал уже всех?
Есть 3 датчика. Один установлен и показания верны с эталонным. Другие 2 пробовал на другую шину и оба дают примерно на градус меньше, сравнивая с эталонным и с первым датчиком соответственно. Виню в этом 2 жильный провод, проложенный рядом с 220 вольт.

Еще непонятки с датчиками по паразитке на расстояния 10-15 метров. Старая железяка для 1wire их 6 штук ловит легко даже шиной, а мега не ловит даже по одному -0,06 показывает или теряет хаотично.

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


Andry

Сообщения: 212
Зарегистрирован: 23 мар 2017, 10:41

Re: Калибровка ds18b20

Сообщение

Andry » 16 дек 2018, 16:26

Виню в этом 2 жильный провод, проложенный рядом с 220 вольт.Не вините:))) Если б и было то просто отваливался или очень большая разница в показаниях.А градус туда сюда это точно не провод.


Andry

Сообщения: 212
Зарегистрирован: 23 мар 2017, 10:41

Re: Калибровка ds18b20

Сообщение

Andry » 16 дек 2018, 16:28

По проводах идет цыфра и там нет аналоговых наводок.И глюки там совершенно другие.


Burst

Сообщения: 112
Зарегистрирован: 25 янв 2018, 13:22
Откуда: Балашиха

Re: Калибровка ds18b20

Сообщение

Burst » 20 фев 2019, 13:25

А точность HTU21D и BME280 кто-нибудь сравнивал? У меня HTU21D стоял на улице, стал явно подглючивать, решил поставить для проверки новый HTU21D и в параллель ему BME280 (стоят вместе в одном корпусе). Датчики очевидно не калиброваны и значения показывают немного разные, вот только дельта между значениями все время разная и от чего зависит не совсем понятно. Ниже графики разницы температур и температур с самих датчиков.

Вложения
delta.png
delta.png (14.36 КБ) 4308 просмотров
S2.2_2.17_T.png
S2.2_2.17_T.png (12.84 КБ) 4308 просмотров


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 21 фев 2019, 06:17

Разве в умном доме нужна такая точность? Особенно уличной температуры… Я бы больше доверился Бошевскому датчику. У меня 2-й год на улице вместе стоят BME280 и DS18B20, да разница есть, но она реально не существенна! DS18B20 имеет бОльшую инерционность — это видно по графикам. Но момент в другом — обратите внимание как BME280 стал отдавать давление и влажность — вот это настораживает. Конечно у меня эта MegaD время от времени перезагружается, но при этом DS18B20 отдает температуру очень стабильно, хотя BME280 температуру тоже отдает очень стабильно.

Датчики_DS18B20_BME280.jpg
Датчики_DS18B20_BME280.jpg (179.2 КБ) 4265 просмотров


Burst

Сообщения: 112
Зарегистрирован: 25 янв 2018, 13:22
Откуда: Балашиха

Re: Калибровка ds18b20

Сообщение

Burst » 21 фев 2019, 12:35

В том то и дело, что точность какая-то… непонятная. За сутки разница между показаниями датчиков колебалась от 0.4 до 1.4 градусов. Для решения надеть куртку или пуховик точность достаточная, а вот для алгоритмов обогрева в области пограничных температур (15-20 градусов) хотелось бы какой-нибудь определенности. BME280 я только три дня как подключил, поэтому особой статистики не набрал, но никаких всплесков не наблюдается. На HTU21D был один раз — видимо контакт плохой и датчик отвалился, после этого облудил все провода, которые зажимаются в колодки и перезажал, больше такого не наблюдал. Дискретизация кстати на графиках какая? У меня идет чтение раз в минуту, а на графики, которые привел выше, выводится среднее за 5 минут. Поставлю наверное тоже DS18B20 для температуры на улице, у них за все время никаких глюков не наблюдал, все кривые гладенькие. Насчет инерционности DS18B20 только не понял — что имеете в виду? У них разрядность АЦП ниже конечно, но для практических целей вполне достаточно.
Ниже температура с начала года — среднее, минимальное и максимальное значение за интервал, видно что всплесков нет.

Вложения
S2.2_m.png
S2.2_m.png (59.59 КБ) 4226 просмотров

Последний раз редактировалось Burst 21 фев 2019, 13:20, всего редактировалось 1 раз.


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 21 фев 2019, 13:19

Burst писал(а): ↑

21 фев 2019, 12:35


В том то и дело, что точность какая-то… непонятная. За сутки разница между показаниями датчиков колебалась от 0.4 до 1.4 градусов. Для решения надеть куртку или пуховик точность достаточная, а вот для алгоритмов обогрева в области пограничных температур (15-20 градусов) хотелось бы какой-нибудь определенности. BME280 я только три дня как подключил, поэтому особой статистики не набрал, но никаких всплесков не наблюдается. На HTU21D был один раз — видимо контакт плохой и датчик отвалился, после этого облудил все провода, которые зажимаются в колодки и перезажал, больше такого не наблюдал. Дискретизация кстати на графиках какая? У меня идет чтение раз в минуту, а на графики, которые привел выше, выводится среднее за 5 минут. Поставлю наверное тоже DS18B20 для температуры на улице, у них за все время никаких глюков не наблюдал, все кривые гладенькие. Насчет инерционности DS18B20 только не понял — что имеете в виду? У них разрядность АЦП ниже конечно, но для практических целей вполне достаточно.

Дискретность — по изменению значения, поэтому плавающая. Инерционность — имел ввиду, что как будто DS18B20 не промерзает так как BME280. Хотя с учетом того сколько это длилось, то скорее всего все зависит от калибровки. Я в свое время решил, что все отопление будет работать на основе DS18B20 (тем более MegaD только с ним поддерживает локальный/удаленный термостат). HTU21D в сравнении с DS18B20 меня не впечатлили, поэтому им отдал на откуп управление системой вентиляции. Ну а BME280 понадобился только для измерения атмосферного давления с установкой на улице (обычная распаячная коробка с перфорацией снизу), но как показала практика — довольно точный и надежный датчик.

Датчики_DS18B20_BME280_Крупно.jpg
Датчики_DS18B20_BME280_Крупно.jpg (51.02 КБ) 4228 просмотров


pr200sd

Сообщения: 15
Зарегистрирован: 02 мар 2019, 23:50

Re: Калибровка ds18b20

Сообщение

pr200sd » 03 мар 2019, 12:43

Alex_Jet писал(а): ↑

21 фев 2019, 06:17


Но момент в другом — обратите внимание как BME280 стал отдавать давление и влажность — вот это настораживает. Конечно у меня эта MegaD время от времени перезагружается, но при этом DS18B20 отдает температуру очень стабильно, хотя BME280 температуру тоже отдает очень стабильно.

А что именно настораживает? Я увидел очень похожую картину, если речь про «зубцы» то возможно это связано с обработкой данных уже после датчика. У меня было так когда делал преобразования из целого числа во float и на определенной комбинации значений были проблемы.

g1.png
g1.png (70.71 КБ) 4119 просмотров
g2.png
g2.png (64.5 КБ) 4119 просмотров

Вот пример данных с одних и тех же датчиков.


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 04 мар 2019, 12:08

pr200sd писал(а): ↑

03 мар 2019, 12:43


А что именно настораживает?

Речь про провал в 0 у давления и в 100 у влажности. Поэтому настораживает — это с течением времени что-то происходит с датчиком или с MegaD, которую использую для получения данных с датчиков.


Burst

Сообщения: 112
Зарегистрирован: 25 янв 2018, 13:22
Откуда: Балашиха

Re: Калибровка ds18b20

Сообщение

Burst » 04 мар 2019, 13:01

Alex_Jet писал(а): ↑

04 мар 2019, 12:08

pr200sd писал(а): ↑

03 мар 2019, 12:43


А что именно настораживает?

Речь про провал в 0 у давления и в 100 у влажности. Поэтому настораживает — это с течением времени что-то происходит с датчиком или с MegaD, которую использую для получения данных с датчиков.

У меня недолго пока работают, но никаких всплесков по давлению на BME280 не наблюдаю.

S2_17_1_w.png
S2_17_1_w.png (11.49 КБ) 4072 просмотра


pr200sd

Сообщения: 15
Зарегистрирован: 02 мар 2019, 23:50

Re: Калибровка ds18b20

Сообщение

pr200sd » 04 мар 2019, 13:03

Alex_Jet писал(а): ↑

04 мар 2019, 12:08

pr200sd писал(а): ↑

03 мар 2019, 12:43


А что именно настораживает?

Речь про провал в 0 у давления и в 100 у влажности. Поэтому настораживает — это с течением времени что-то происходит с датчиком или с MegaD, которую использую для получения данных с датчиков.

Что-то мне подсказывает, что проблема у этого явления в обработке, вот те «зубцы» как раз это подтверждают. Провалы и у меня наблюдаются похожие, понаблюдаю еще и подумаю как программно отстроиться.


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 04 мар 2019, 13:18

pr200sd писал(а): ↑

04 мар 2019, 13:03


Что-то мне подсказывает, что проблема у этого явления в обработке, вот те «зубцы» как раз это подтверждают. Провалы и у меня наблюдаются похожие, понаблюдаю еще и подумаю как программно отстроиться.

У меня никакой обработки нет — в БД пишется только то что приходит от контроллера, причем пишется только если значение изменилось по сравнению с предыдущим. А то что у меня происходит — это налицо какой-то сбой либо в датчики, либо в MegaD. Поскольку как только я «обновляю» коэффициенты для BME280, то некоторое время (2-3-4 недели) ошибочных показаний не бывает.


Burst

Сообщения: 112
Зарегистрирован: 25 янв 2018, 13:22
Откуда: Балашиха

Re: Калибровка ds18b20

Сообщение

Burst » 06 мар 2019, 19:03

Продолжаю наблюдать за показаниями HTU21D и BME280. Ниже графики разницы показаний температуры и влажности. Явно видно что разница показаний влажности линейно снижается! Т.е. похоже по этому параметру датчики либо как-то перекалибруются, либо кто-то из них начинает деградировать. По температуре такого не наблюдается.

Разница показаний температура.png
Разница показаний температура.png (12.79 КБ) 4017 просмотров
Разница показаний влажности.png
Разница показаний влажности.png (14.42 КБ) 4017 просмотров


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 05 июн 2019, 06:52

У меня интересный случай с китайским герметичным DS18B20 — первый раз не обратил внимания что было, но датчик изменил свой адрес! Был 666877911402, стал 666877911400… на сервере поправил этот момент и забыл до вчерашнего дня — энергетики надолго отключили электричество, АКБ ИБП разрядились и весь дом «потух». И какого же было мое удивление, когда после подачи электричества снова пришла авария по этому датчику! Он вернул «взад» свой адрес…на сервере был прописан 666877911400, а MegaD отдавала 666877911402!
И да еще интересный момент по BME280, подключенному к этому же контроллеру… после перезагрузки контроллера при запросе cmd=all, по порту с BME280 (выбран этот dev) MegaD отдает показания вот так — temp:18.78/press:742.97/hum:72.486. Я немного в замешательстве. Позже перезагружу контроллер или попробую обновить прошивку (сейчас на нем — 4.34b6).
И еще — после долгого отключения электроэнергии датчик DS18B20 в корпусе ТО-92, который смонтирован в коробке на улице вместе с BME280 ожил и работает уже сутки… (я его так и не перепаял — решил проблемы сценариев программным способом, благо BME280 работал без сбоев).


Erik

Сообщения: 555
Зарегистрирован: 08 ноя 2017, 08:55

Re: Калибровка ds18b20

Сообщение

Erik » 05 июн 2019, 13:23

Вот казалось бы, чего проще — не вешать в одном месте два датчика?
Ан нет! :mrgreen:


Alex_Jet

Сообщения: 1238
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Калибровка ds18b20

Сообщение

Alex_Jet » 05 июн 2019, 13:35

Erik писал(а): ↑

05 июн 2019, 13:23


Вот казалось бы, чего проще — не вешать в одном месте два датчика?
Ан нет! :mrgreen:

По мне — так для таких критичных систем как отопление обязательно нужно по два датчика иметь в зонах, где происходит управление нагревателями. Ну а 2 датчика на улице — это «то что доктор прописал» — в мороз особо не полезешь на северную сторону дома чтобы что-то там с датчиком сделать…


Понравилась статья? Поделить с друзьями:
  • Как изменить разрешено только чтение
  • Как изменить разрешенную максимальную массу автомобиля
  • Как изменить разрешенное использование земельного участка сельхозназначения
  • Как изменить разрешения файла через cmd
  • Как изменить разрешения на ноуте