Модуль датчика температуры DS18B20

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 23 декабря 2017, 21:34

Модуль датчика температуры DS18B20.png
Модуль датчика температуры DS18B20
Модуль датчика температуры DS18B20.png (343.88 КБ) 1473 просмотра

Характеристики

Питание
напряжение 3…5,5 В
ток 10 мА
Диапазон измерения температуры -55…125 °С
Разрешающая способность 9…12 бит
Точность ±0,5 °С в диапазоне -10…+85 °С
Время измерения при разрешающей способности 12 бит составляет 0,75 с
контакты

VCC — для подключения3.3- 5в питания
GND — для подключения к минусу (GND)
DQ — выход данных


Предназначен для работы совместно с микроконтроллером. Основной компонент – микросхема ds18b20, преобразующая температуру корпуса в информацию передаваемую по последовательной двухпроводной шине данных 1-Wire. На шину данных можно установить несколько таких датчиков используя один вывод МК. Модуль датчика температуры ds18b20 применяется для измерения температуры воздуха в помещении и на открытом воздухе.
[center]i love you [s]mxIni[/s] Mysql[/center]


Arduino
Сержант
Сержант
Аватара
Arduino
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 19 апреля 2017
С нами: 6 лет 11 месяцев

#2 Arduino » 16 июня 2019, 11:55

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

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

#include <OneWire.h>                  // Библиотека протокола 1-Wire
#include <DallasTemperature.h>        // Библиотека для работы с датчиками DS*

#define ONE_WIRE_BUS 8               // Шина данных на 8 пине

OneWire oneWire(ONE_WIRE_BUS);        // Создаем экземпляр объекта протокола 1-WIRE - OneWire
DallasTemperature sensors(&oneWire);  // На базе ссылки OneWire создаем экземпляр объекта, работающего с датчиками DS*

void setup(void)
{
  Serial.begin(9600);                 // Настраиваем Serial для отображения получаемой информации
  sensors.begin();                    // Запускаем поиск всех датчиков
}

void loop(void)
{
 
  Serial
.println("Requesting temperatures...");
  sensors.requestTemperatures();      // Запускаем измерение температуры на всех датчиках
  
  
// Когда температура измерена её можно вывести
  // Поскольку датчик всего один, то запрашиваем данные с устройства с индексом 0
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
}

Результат:
DS18B20 в монитор порта.PNG
DS18B20 в монитор порта
DS18B20 в монитор порта.PNG (15.48 КБ) 1154 просмотра


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

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

#include <OneWire.h>                    // Библиотека протокола 1-Wire
#include <DallasTemperature.h>          // Библиотека для работы с датчиками DS*

#define ONE_WIRE_BUS 8                // Шина данных на 8 пине
#define TEMPERATURE_PRECISION 9         // Точность измерений в битах (по умолчанию 12)
#define DEVICE_COUNT 10                 // Количество устройств на шине. Необходимо объявить заранее, так как
                                        // среда Arduino не поддерживает динамические массивы, лучше указать заведомо
                                        // большее количество - все равно будет использоваться количество, которое
                                        // определил МК - в переменной int deviceCount

OneWire oneWire(ONE_WIRE_BUS);          // Создаем экземпляр объекта протокола 1-WIRE - OneWire
DallasTemperature sensors(&oneWire);    // На базе ссылки OneWire создаем экземпляр объекта, работающего с датчиками DS*
DeviceAddress deviceAddresses[DEVICE_COUNT]; // Создаем массив для хранения адресов датчиков

int deviceCount = 0;                    // Переменная для хранения количества датчиков

void setup(void)
{
  Serial.begin(9600);                   // Настраиваем Serial для отображения получаемой информации
  Serial.println("Locating devices...");
  sensors.begin();                      // Запускаем поиск всех датчиков на шине

  deviceCount = (int)sensors.getDeviceCount();              // Получаем количество найденных датчиков
  Serial.println("Found " + String(deviceCount) + " devices."); // Показываем количество найденных датчиков

  // Получаем режим питания датчиков - паразитное или обычное
  Serial.print("Parasite power is: ");
  Serial.println(sensors.isParasitePowerMode() ? "ON" : "OFF"); // Выводим режим питания


  for (int i = 0; i < deviceCount; i++) {     // Заполняем массив адресами устройств
    if (!sensors.getAddress(deviceAddresses[i], i)) {                     // Если не удалось получить идентификатор
      Serial.println("Unable to find address for Device " + String(i));   // Выдаем сообщение об этом
    }
    else {                                                                // Все нормально - идентификатор получен
      // Основные данные
      Serial.print("Address for Device " + String(i+1) + ": ");
      printAddress(deviceAddresses[i]);                                   // Выводим адрес каждого устройства
      Serial.print("\n");
      
      sensors
.setResolution(deviceAddresses[i], TEMPERATURE_PRECISION);   // Для каждого датчика задаем точность TEMPERATURE_PRECISION (9 бит)
      Serial.print("Device " + String(i+1) + " Resolution: ");

      Serial.println(sensors.getResolution(deviceAddresses[i]), DEC);     // Проверяем, удалось ли изменить точность

      // Тревога
      Serial.print("Device " + String(+ 1) + " Alarms: ");
      printAlarms(deviceAddresses[i]);              // Вывод информации о параметрах тревоги
      Serial.println();
  
      sensors
.setHighAlarmTemp(deviceAddresses[i], 20); //Задаем новые пороговые значения тревоги
      sensors.setLowAlarmTemp(deviceAddresses[i], -10); //Задаем новые пороговые значения тревоги
    
      Serial
.print("Device " + String(+ 1) + " New Alarms: ");
      printAlarms(deviceAddresses[i]);              // Вывод информации о новой информации
      Serial.println();
    }
  }
  Serial.println("================================================="); 
}


void loop(void)
{
  Serial.println("Requesting temperatures...");
  sensors.requestTemperatures();                    // Запускаем измерение температуры на всех датчиках

  //// Когда температура измерена её можно вывести
  //// Поскольку датчик всего один, то запрашиваем данные с устройства с индексом 0
  //Serial.print("Temperature for the device 1 (index 0) is: ");
  //Serial.println(sensors.getTempCByIndex(0));

  for (int i = 0; i < deviceCount; i++) {         // Перебираем все устройства
    
    
// Вывод температуры информации с каждого датчика
    float tempC = sensors.getTempCByIndex(i);     // Получаем данные по порядковому номеру
    Serial.println("Temperature for the device " + String(+ 1) + " (by index " + String(i) + ") is: " + String(tempC));

    tempC = sensors.getTempC(deviceAddresses[i]); // Либо по адресу устройства
    Serial.print("Temperature for the device " + String(+ 1) + " (by adress ");
    printAddress(deviceAddresses[i]);
    Serial.println(") is: " + String(tempC));

    Serial.print("Complex info: ");
    printData(deviceAddresses[i]);                // Можно воспользоваться функцией для вывода информации

    // Проверка состояния тревоги - если событие тревоги зафиксировано, 
    // то появится уведомление об этом
    // базируется на функции sensors.hasAlarm(deviceAddress)
    checkAlarm(deviceAddresses[i]);               // Проверяем каждый датчик на состояние тревоги
  
    Serial
.print("\n\n");
  }
}


//=========================================================================================
//=                                 Дополнительные функции                                =
//=========================================================================================
// Функция вывода идентификатора датчика
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
//=========================================================================================
// Функция вывода температуры датчика по его идентификатору
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}
//=========================================================================================
// Функция вывода точности датчика по его идентификатору
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();
}
//=========================================================================================
// Функция вывода всей информации о датчике по его идентификатору
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}
//=========================================================================================
// Функция вывода информации о параметрах тревоги
void printAlarms(uint8_t deviceAddress[])
{
  char temp;
  temp = sensors.getHighAlarmTemp(deviceAddress);
  Serial.print("High Alarm: ");
  Serial.print(temp, DEC);
  Serial.print("C/");
  Serial.print(DallasTemperature::toFahrenheit(temp));
  Serial.print("F | Low Alarm: ");
  temp = sensors.getLowAlarmTemp(deviceAddress);
  Serial.print(temp, DEC);
  Serial.print("C/");
  Serial.print(DallasTemperature::toFahrenheit(temp));
  Serial.print("F");
}
//=========================================================================================
// Функция вывода информации о состоянии тревоги
void checkAlarm(DeviceAddress deviceAddress)
{
  if (sensors.hasAlarm(deviceAddress))
  {
    Serial.print("ALARM: ");
    printData(deviceAddress);
  }

Результат:
DS18B20 в монитор порта 2.PNG
DS18B20 в монитор порта 2
DS18B20 в монитор порта 2.PNG (23 КБ) 1154 просмотра


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Аппаратная часть»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 4 гостя