DS18B20 без библиотеки (Arduino)

DS18B20 это датчик температуры с цифровым последовательным интерфейсом 1-Wire.

Основные характеристики датчика:

  • Погрешность измерения не больше 0,5 °С (для температур от -10 °С до +85 °С)
  • Температурный диапазон измерений от -55 С до +125 °С
  • Датчик питается напряжением от 3,3 В до 5 В.
  • Разрешающая способность от 9 до 12 бит
  • Каждый датчик обладает своим уникальным серийным кодом (адрес)
  • Не требуются дополнительные внешние элементы.
  • Можно подключить сразу до 127 датчиков к одной линии связи.
  • Информация передается по протоколу 1-Wire.

Схема подключения

При использовании модуля устанавливать подтягивающий резистор не нужно, он уже установлен на плате модуля.

Использование стандартной библиотеки DallasTemperature позволяет достаточно просто взаимодействовать с датчиками температуры DS18B20, но время измерения при использовании этой библиотеки достаточно большое. Ниже представлен скетч в котором используется только библиотека OneWire для управления шиной 1-Wire, при этом время измерения датчика заметно меньше при разрешении датчика 12 бит.

#include <OneWire.h>  // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire  ds(A0); // Вход датчика
 
void setup() {
  lcd.init();
  lcd.backlight();
}
 
void loop() {
  lcd.setCursor(0, 0); lcd.print(dsRead(0), 2); // Опрос датчика 1
  //  lcd.setCursor(0,1);lcd.print(dsRead(1),2);// Опрос датчика 2
}
 
float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}

Скетч может поддерживать до 8 датчиков подключенных к одному входу. Для вывода температуры используется функция dsRead(0) в которой необходимо указать номер датчика. Для примера показания датчика выводятся на LCD1602 (I2C).

Вывод серийного номера датчика (адреса) и температуры в монитор порта:

#include <OneWire.h>
OneWire  ds(A0);
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  Serial.println(dsRead(0), 2); // Опрос датчика 1
  delay(1000); 
}
 
float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
 
  for( int i = 0; i < 8; i++) {
 Serial.print(' ');
 Serial.print(addr[kol][i], HEX);
 }
   Serial.print(" "); kol++;
  } 
 
 
 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}

Для удобства использования я упаковал выше показанный код в библиотеку — http://forum.rcl-radio.ru/misc.php?action=pan_download&item=735&download=1

Пример использования №1:

#include <DS18B20_RCL.h>

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

void loop() {
  Serial.println(dsRead(A0,0), 2); // вход датчика, номер датчика
  delay(5000);
}

Пример использования №2 (вывод температуры на TM1637):

#include <DS18B20_RCL.h>
#include <STM32_TM1637.h>                // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
   STM32_TM1637 tm(2,3);// CLK, DIO

void setup() {
  tm.brig(7); // ЯРКОСТЬ 0...7
}

void loop() {
   tm.print_float(dsRead(A0,0),1,  0,0,0,0); 
   delay(1000);
}

Добавить комментарий

Войти с помощью: