Программирование регистра конфигурации датчика температуры DS18B20.

Вопросы по средствам измерения температуры
Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение Эдуард » 21 янв 2017, 23:32

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

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

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

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

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

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


Я выбрал выводы, для того чтобы датчик можно было просто вставить в соседние контакты разъема платы. Туда же вставляется резистор сопротивлением 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;}
    }     
  }   
}


Аватара пользователя
Witmarkthogy
Сообщения: 2
Зарегистрирован: 25 янв 2017, 22:10

Программирование регистра кон…

Сообщение Witmarkthogy » 04 фев 2017, 02:24

Спасибо за ответ. Т.е. я могу быть уверенным, что значение регистра будет новым уже при сканировании следующей после mov-а строки??

Jamessat
Сообщения: 1
Зарегистрирован: 17 май 2017, 11:16

Программирование регистра конфигурации датчика температуры DS18B20

Сообщение Jamessat » 01 июн 2017, 07:34

У меня тоже там разъм, но только датчика температуры почему то нет. И в салоне нигде не показывает температуру. Может кто сам ставил датчик температуры?

PERM
Сообщения: 6
Зарегистрирован: 19 янв 2020, 03:32

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение PERM » 19 янв 2020, 03:38

Доброго времени суток, код работает, отправляет данные. А вот команды не видит.
Screenshot_19.png

PERM
Сообщения: 6
Зарегистрирован: 19 янв 2020, 03:32

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение PERM » 19 янв 2020, 03:53

Ура заработало, как всегда всем на заметку, показывайте узкие места программирования....
Screenshot_21.png
Screenshot_21.png (6.06 КБ) 10995 просмотров
Screenshot_20.png

Датчик потупел капитально.

PERM
Сообщения: 6
Зарегистрирован: 19 янв 2020, 03:32

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение PERM » 19 янв 2020, 03:58

Вопщем СПСИБО!! Сохраню скеч себе, но в 9 битном разрешении датчик очень тупит, если устраивает то можно использовать, дома в квартире, для более тонких процессов увы, только на 12 битном разрешении работать.

PERM
Сообщения: 6
Зарегистрирован: 19 янв 2020, 03:32

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение PERM » 19 янв 2020, 04:00

Screenshot_22.png
Screenshot_22.png (3.46 КБ) 10994 просмотра

denisand
Сообщения: 1
Зарегистрирован: 04 фев 2020, 20:59

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение denisand » 04 фев 2020, 21:13

Здравствуйте. Такой вопрос: есть прибор измеритель температуры, работает в связке с датчиками ds1820, ds18s20. По ошибке закупили датчики в герметичном исполнении но ds18b20. Теперь при подключении температура отображается, но без точки: например вместо 25.5, показывает 255 и т.д. Попытался проделать вышеуказанную процедуру, перевел ds18b20 с 12 бит на 9 бит. Все ок, значение в битах перевелось, датчик стал грубее, но точка так и не появилась. Подскажите можно ли ещё чего прописать в датчик ds18b20, чтоб он стал как ds1820, ds18s20? В частности реально ли заставить его чтоб и точку передавал? Спасибо

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение Эдуард » 04 фев 2020, 21:56

Здравствуйте!
У датчиков DS18S20 следующий формат измеренной температуры:
1.PNG

У DS18B20
2.PNG


В этом и проблема.

Chipmaster
Сообщения: 1
Зарегистрирован: 06 дек 2022, 05:57

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение Chipmaster » 06 дек 2022, 06:23

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

Снимок.JPG

Перепробовал пригоршню датчиков от разных поставщиков, две платы Arduino UNO R3 (обе - оригинал) - все одно: "Read Error".
- Датчики заведомо рабочие - все проверены в моем изделии, все работают, но 12бит.
- Обе Ардуины тоже в порядке.
- Подтягивающий резистор 4к7 стоит.
- Питание Ардуины пробовал и только от USB и от внешнего источника.
- Библиотека "OneWire.h" версии 2.3.7 (крайняя) с сайта arduino.cc
Кто что посоветует?

sarge
Сообщения: 1
Зарегистрирован: 03 июл 2023, 09:31

Re: Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение sarge » 03 июл 2023, 09:34

Нужно ещё и не забыть о том, чтобы провести поверку. Дабы быть уверенным в том, что измерения точные показывает датчик. Ну или откалибровать https://www.poverka-ndt.ru/kalibrovka-sredstv-izmerenij/ средство измерения при необходимости.


Вернуться в «Датчики температуры»

Кто сейчас на конференции

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