От этого параметра зависит точность измерения температуры. Но при повышении разрешения увеличивается и время измерения. Для каждой конкретной задачи лучше выбирать свою разрешающую способность датчика.
Регистр конфигурации загружается при включении питания из внутреннего EEPROM датчика DS18B20. Можно, конечно, программировать EEPROM датчика в устройстве, к которому он подключен, но это лишняя операция, занимающая время и ресурсы. Практичнее запрограммировать конфигурацию датчика отдельно.
Для этого я написал не большую программу. Она загружается в плату Arduino UNO R3 и получается простой программатор.
Датчик DS18B20 подключается по такой схеме.
Я выбрал выводы, для того чтобы датчик можно было просто вставить в соседние контакты разъема платы. Туда же вставляется резистор сопротивлением 4,3 кОм.
Загружается программа в плату. Открывается монитор последовательного порта Arduino IDE. Скорость 9600 бод.
Программа в цикле считывает состояние датчика: температуру и разрешающую способность (в разрядах).
Для программирования необходимо послать команду:
- D=0 , для установки разрешения 9 бит;
D=1 , для установки разрешения 10 бит;
D=2 , для установки разрешения 11 бит;
D=3 , для установки разрешения 12 бит.
Все остальные команды программа проигнорирует.
Вот скетч программы.
Код: Выделить всё
// программирование датчика 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;}
}
}
}